From 432e97e519d53468b5ce0fc9ceea7cf52051eab4 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Wed, 2 Nov 2022 12:29:29 -0700 Subject: [PATCH 01/15] chore: tag backported workspaces during publish script --- scripts/publish.js | 59 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/scripts/publish.js b/scripts/publish.js index fb2ab34e6bc06..62f2217b752bf 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -1,59 +1,58 @@ const semver = require('semver') const log = require('proc-log') const pacote = require('pacote') -const { run, git, npm, pkg, spawn } = require('./util.js') +const { run, git, npm, pkg: cli, spawn } = require('./util.js') const resetdeps = () => npm('run', 'resetdeps') const op = () => spawn('op', 'item', 'get', 'npm', '--otp', { out: true, ok: true }) -const TAGS = { - // cli is always published to next-MAJOR - root: (v) => ({ tag: `next-${semver.major(v)}` }), - // workspaces are always published to latest, except prereleases - workspace: () => ({ tag: 'latest', preTag: 'prerelease' }), +const getVersion = async (s) => { + const mani = await pacote.manifest(s, { preferOnline: true }) + return mani.version +} +const getLatest = async (s) => { + const pack = await pacote.packument(s, { preferOnline: true }) + return pack['dist-tags'].latest +} + +const TAG = { + cli: ({ version }) => `next-${semver.major(version)}`, + workspace: async ({ name, version }) => { + const { prerelease, major } = semver.parse(version) + if (prerelease.length) { + return 'prerelease' + } + if (major === await getLatest(name).then(v => semver.major(v))) { + return 'latest' + } + return 'backport' + }, } -const needsPublish = async ({ pkg: { private, name, version }, force, tags: getTags }) => { +const needsPublish = async ({ private, name, version }, { force, getTag }) => { if (private) { return } - const tags = getTags(version) - const tag = semver.parse(version).prerelease.length && tags.preTag - ? tags.preTag - : tags.tag - - if (force) { - return tag - } - - const mani = await pacote.manifest(`${name}@${tag}`, { preferOnline: true }) - if (version !== mani.version) { + const tag = await getTag({ name, version }) + if (force || version !== await getVersion(`${name}@${tag}`)) { return tag } } -const getPublishes = async ({ force }) => { +const getPublishes = async (opts) => { const publish = [] - for (const { name, pkg: ws } of await pkg.mapWorkspaces()) { + for (const { name, pkg } of await cli.mapWorkspaces()) { publish.push({ workspace: name, - tag: await needsPublish({ - force, - pkg: ws, - tags: TAGS.workspace, - }), + tag: await needsPublish(pkg, { ...opts, getTag: TAG.workspace }), }) } publish.push({ - tag: await needsPublish({ - force, - pkg, - tags: TAGS.root, - }), + tag: await needsPublish(cli, { ...opts, getTag: TAG.cli }), }) return publish.filter(p => p.tag) From 50d2ec266a0fc7f71c54b755ed0adfde1ab0a783 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Mon, 7 Nov 2022 11:27:48 -0700 Subject: [PATCH 02/15] chore(node-pr): various fixes and updates for the node PR script (#5818) --- .github/workflows/create-node-pr.yml | 8 +- DEPENDENCIES.md | 3 + package-lock.json | 2022 +++++++++++++++++------ package.json | 3 + scripts/create-node-pr.js | 276 +++- scripts/template-oss/create-node-pr.yml | 8 +- scripts/update-authors.js | 1 + scripts/util.js | 21 +- 8 files changed, 1771 insertions(+), 571 deletions(-) diff --git a/.github/workflows/create-node-pr.yml b/.github/workflows/create-node-pr.yml index f7bf18d8095b7..f5cb5e88c8c2a 100644 --- a/.github/workflows/create-node-pr.yml +++ b/.github/workflows/create-node-pr.yml @@ -9,6 +9,10 @@ on: description: "The npm spec to create the PR from" required: true default: 'latest' + branch: + description: "The major node version to serve as the base of the PR. Should be `main` or a number like `18`, `19`, etc." + required: true + default: 'main' dryRun: description: "Setting this to anything will run all the steps except opening the PR" @@ -23,6 +27,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + with: + fetch-depth: 0 - name: Setup Git User run: | git config --global user.email "npm-cli+bot@github.com" @@ -46,4 +52,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.NODE_PULL_REQUEST_TOKEN }} run: | DRY_RUN=$([ -z "${{ inputs.dryRun }}" ] && echo "" || echo "--dry-run") - node scripts/create-node-pr.js "${{ inputs.spec }}" "$DRY_RUN" + node scripts/create-node-pr.js ${{ inputs.spec }} ${{ inputs.branch }} "$DRY_RUN" diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index 6bdb9fc3a2ebb..1933339759f0a 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -536,6 +536,9 @@ graph LR; npm-->read-package-json; npm-->read; npm-->readdir-scoped-modules; + npm-->remark-gfm; + npm-->remark-github; + npm-->remark; npm-->rimraf; npm-->semver; npm-->smoke-tests; diff --git a/package-lock.json b/package-lock.json index 6376f40669081..ebe6671caa2ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -169,6 +169,9 @@ "licensee": "^9.0.0", "nock": "^13.2.4", "npm-packlist": "^7.0.1", + "remark": "^14.0.2", + "remark-gfm": "^3.0.1", + "remark-github": "^11.2.4", "spawk": "^1.7.1", "tap": "^16.0.1" }, @@ -242,30 +245,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", - "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -290,12 +293,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.5.tgz", - "integrity": "sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.2.tgz", + "integrity": "sha512-SD75PMIK6i9H8G/tfGvB4KKl4Nw6Ssos9nGgYwxbgyTP0iX/Z55DveoH86rmUB/YHTQQ+ZC0F7xxaY8l2OF44Q==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.2", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -318,12 +321,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.20.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -391,31 +394,31 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -461,14 +464,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", - "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", "dev": true, "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.4", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" @@ -560,9 +563,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.4.tgz", - "integrity": "sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz", + "integrity": "sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -586,19 +589,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", - "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", + "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.4", + "@babel/generator": "^7.20.1", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.4", - "@babel/types": "^7.19.4", + "@babel/parser": "^7.20.1", + "@babel/types": "^7.20.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -616,9 +619,9 @@ } }, "node_modules/@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", + "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -645,15 +648,15 @@ } }, "node_modules/@commitlint/cli": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.1.2.tgz", - "integrity": "sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.2.0.tgz", + "integrity": "sha512-kd1zykcrjIKyDRftWW1E1TJqkgzeosEkv1BiYPCdzkb/g/3BrfgwZUHR1vg+HO3qKUb/0dN+jNXArhGGAHpmaQ==", "dev": true, "dependencies": { "@commitlint/format": "^17.0.0", - "@commitlint/lint": "^17.1.0", - "@commitlint/load": "^17.1.2", - "@commitlint/read": "^17.1.0", + "@commitlint/lint": "^17.2.0", + "@commitlint/load": "^17.2.0", + "@commitlint/read": "^17.2.0", "@commitlint/types": "^17.0.0", "execa": "^5.0.0", "lodash": "^4.17.19", @@ -669,9 +672,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.1.0.tgz", - "integrity": "sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.2.0.tgz", + "integrity": "sha512-g5hQqRa80f++SYS233dbDSg16YdyounMTAhVcmqtInNeY/GF3aA4st9SVtJxpeGrGmueMrU4L+BBb+6Vs5wrcg==", "dev": true, "dependencies": { "conventional-changelog-conventionalcommits": "^5.0.0" @@ -729,9 +732,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.1.0.tgz", - "integrity": "sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.2.0.tgz", + "integrity": "sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==", "dev": true, "dependencies": { "@commitlint/types": "^17.0.0", @@ -769,14 +772,14 @@ } }, "node_modules/@commitlint/lint": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.1.0.tgz", - "integrity": "sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.2.0.tgz", + "integrity": "sha512-N2oLn4Dj672wKH5qJ4LGO+73UkYXGHO+NTVUusGw83SjEv7GjpqPGKU6KALW2kFQ/GsDefSvOjpSi3CzWHQBDg==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^17.1.0", - "@commitlint/parse": "^17.0.0", - "@commitlint/rules": "^17.0.0", + "@commitlint/is-ignored": "^17.2.0", + "@commitlint/parse": "^17.2.0", + "@commitlint/rules": "^17.2.0", "@commitlint/types": "^17.0.0" }, "engines": { @@ -784,9 +787,9 @@ } }, "node_modules/@commitlint/load": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.1.2.tgz", - "integrity": "sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.2.0.tgz", + "integrity": "sha512-HDD57qSqNrk399R4TIjw31AWBG8dBjNj1MrDKZKmC/wvimtnIFlqzcu1+sxfXIOHj/+M6tcMWDtvknGUd7SU+g==", "dev": true, "dependencies": { "@commitlint/config-validator": "^17.1.0", @@ -807,18 +810,18 @@ } }, "node_modules/@commitlint/message": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", - "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.2.0.tgz", + "integrity": "sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/parse": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", - "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.2.0.tgz", + "integrity": "sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==", "dev": true, "dependencies": { "@commitlint/types": "^17.0.0", @@ -830,9 +833,9 @@ } }, "node_modules/@commitlint/read": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.1.0.tgz", - "integrity": "sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.2.0.tgz", + "integrity": "sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==", "dev": true, "dependencies": { "@commitlint/top-level": "^17.0.0", @@ -863,13 +866,13 @@ } }, "node_modules/@commitlint/rules": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", - "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.2.0.tgz", + "integrity": "sha512-1YynwD4Eh7HXZNpqG8mtUlL2pSX2jBy61EejYJv4ooZPcg50Ak7LPOyD3a9UZnsE76AXWFBz+yo9Hv4MIpAa0Q==", "dev": true, "dependencies": { "@commitlint/ensure": "^17.0.0", - "@commitlint/message": "^17.0.0", + "@commitlint/message": "^17.2.0", "@commitlint/to-lines": "^17.0.0", "@commitlint/types": "^17.0.0", "execa": "^5.0.0" @@ -1017,17 +1020,16 @@ }, "node_modules/@gar/promisify": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "inBundle": true + "inBundle": true, + "license": "MIT" }, "node_modules/@google-automations/git-file-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@google-automations/git-file-utils/-/git-file-utils-1.2.1.tgz", - "integrity": "sha512-gI3YQg5tYHPEc1aeOuNoCSOQEptbRH7+vc2rxLaq5z854667ev4Mw19mCyi/fh5/DDzomKh3569SshD0dgtnDA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@google-automations/git-file-utils/-/git-file-utils-1.2.2.tgz", + "integrity": "sha512-UGZypVMDGFJjVCVHI5yqZsqZtaTJoYVyZJ9IJ1sF02Hh0QbDCJHPmPXUpKnPWt9NG51U4ws+K56c1d8s+omvFw==", "dev": true, "dependencies": { - "@octokit/rest": "19.0.4", + "@octokit/rest": "19.0.5", "@octokit/types": "^7.5.1", "minimatch": "^5.1.0" }, @@ -1035,16 +1037,31 @@ "node": ">= 14" } }, + "node_modules/@google-automations/git-file-utils/node_modules/@octokit/openapi-types": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", + "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==", + "dev": true + }, + "node_modules/@google-automations/git-file-utils/node_modules/@octokit/types": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", + "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^13.11.0" + } + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -1256,9 +1273,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", @@ -2043,9 +2060,8 @@ }, "node_modules/@npmcli/ci-detect": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-3.0.1.tgz", - "integrity": "sha512-zQ/qTg2eWnGDToPZH5n7FggNlGC2OYWl6TZv/kDZrTttpm3y2bBcybXSIjlr1ne/ecVp4/vmRNxZP7qTMZo90g==", "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -2056,8 +2072,7 @@ }, "node_modules/@npmcli/disparity-colors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/disparity-colors/-/disparity-colors-3.0.0.tgz", - "integrity": "sha512-5R/z157/f20Fi0Ou4ZttL51V0xz0EdPEOauFtPCEYOLInDBRCj1/TxOJ5aGTrtShxEshN2d+hXb9ZKSi5RLBcg==", + "license": "ISC", "dependencies": { "ansi-styles": "^4.3.0" }, @@ -2070,12 +2085,12 @@ "link": true }, "node_modules/@npmcli/eslint-config": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/eslint-config/-/eslint-config-4.0.0.tgz", - "integrity": "sha512-k89vNnv2BcTRRHZhVz18p4S5bLSEyFQAZ+yiPWIiY3CjB8jq+5uyyVZJpt2yScMi57ho9mjZMjsvu1dUIeEdZw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/eslint-config/-/eslint-config-4.0.1.tgz", + "integrity": "sha512-bHsOOLO2UiMb8G4Q968VJjlO4QWXf3SivgN/rQKsbzcS37S7aFWwPph3PwBaTF6O0OlUvjLiM1mzXlz/1jGV9Q==", "dev": true, "dependencies": { - "which": "^2.0.2" + "which": "^3.0.0" }, "bin": { "lint": "bin/index.js" @@ -2090,26 +2105,10 @@ "eslint-plugin-promise": "^6.0.0" } }, - "node_modules/@npmcli/eslint-config/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@npmcli/fs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.0.0.tgz", - "integrity": "sha512-GdeVD+dnBxzMslTFvnctLX5yIqV4ZNZBWNbo1OejQ++bZpnFNQ1AjOn9Sboi+LzheQbCBU1ts1mhEVduHrcZOQ==", "inBundle": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -2119,9 +2118,8 @@ }, "node_modules/@npmcli/git": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz", - "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==", "inBundle": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", @@ -2139,9 +2137,8 @@ }, "node_modules/@npmcli/installed-package-contents": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.1.tgz", - "integrity": "sha512-GIykAFdOVK31Q1/zAtT5MbxqQL2vyl9mvFJv+OGu01zxbhL3p0xc8gJjdNGX1mWmUT43aEKVO2L6V/2j4TOsAA==", "inBundle": true, + "license": "ISC", "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -2155,9 +2152,8 @@ }, "node_modules/@npmcli/map-workspaces": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.0.tgz", - "integrity": "sha512-aaEDwQ+fUH80iNYSDAcKv9lxIFWsgGkLjIPZENyep75hKeAk2CfSbCAZ6IHDDrVlNybvvNmlFjPap6GdTz9cCw==", "inBundle": true, + "license": "ISC", "dependencies": { "@npmcli/name-from-folder": "^1.0.1", "glob": "^8.0.1", @@ -2170,8 +2166,7 @@ }, "node_modules/@npmcli/metavuln-calculator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.0.tgz", - "integrity": "sha512-BBFQx4M12wiEuVwCgtX/Depx0B/+NHMwDWOlXT41/Pdy5W/1Fenk+hibUlMSrFWwASbX+fY90UbILAEIYH02/A==", + "license": "ISC", "dependencies": { "cacache": "^17.0.0", "json-parse-even-better-errors": "^3.0.0", @@ -2184,9 +2179,8 @@ }, "node_modules/@npmcli/move-file": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-3.0.0.tgz", - "integrity": "sha512-mOUBUIXsqAQBfn87vGIjBAve6JmD9PkP9Vdq2SayDqQh2Ol60hnXaBSvT4V6IQiho1otw6SipnVV1fulvOiyKQ==", "inBundle": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -2202,18 +2196,16 @@ }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/package-json": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-3.0.0.tgz", - "integrity": "sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg==", "inBundle": true, + "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0" }, @@ -2223,9 +2215,8 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.1.tgz", - "integrity": "sha512-+hcUpxgx0vEpDJI9Cn+lkTdKLoqKBXFCVps5H7FujEU2vLOp6KwqjLlxbnz8Wzgm8oEqW/u5FeNAXSFjLdCD0A==", "inBundle": true, + "license": "ISC", "dependencies": { "which": "^3.0.0" }, @@ -2235,8 +2226,7 @@ }, "node_modules/@npmcli/query": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.0.tgz", - "integrity": "sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA==", + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -2246,9 +2236,8 @@ }, "node_modules/@npmcli/run-script": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", - "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", "inBundle": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/promise-spawn": "^6.0.0", @@ -2301,28 +2290,28 @@ } }, "node_modules/@octokit/auth-token": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz", - "integrity": "sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz", + "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", "dev": true, "dependencies": { - "@octokit/types": "^7.0.0" + "@octokit/types": "^8.0.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/core": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.5.tgz", - "integrity": "sha512-4R3HeHTYVHCfzSAi0C6pbGXV8UDI5Rk+k3G7kLVNckswN9mvpOzW9oENfjfH3nEmzg8y3AmKmzs8Sg6pLCeOCA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz", + "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==", "dev": true, "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", "@octokit/request": "^6.0.0", "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^8.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, @@ -2331,12 +2320,12 @@ } }, "node_modules/@octokit/endpoint": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.2.tgz", - "integrity": "sha512-8/AUACfE9vpRpehE6ZLfEtzkibe5nfsSwFZVMsG8qabqRt1M81qZYUFRZa1B8w8lP6cdfDJfRq9HWS+MbmR7tw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", + "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", "dev": true, "dependencies": { - "@octokit/types": "^7.0.0", + "@octokit/types": "^8.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, @@ -2345,13 +2334,13 @@ } }, "node_modules/@octokit/graphql": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.1.tgz", - "integrity": "sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", "dev": true, "dependencies": { "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^8.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -2359,18 +2348,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", - "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.3.1.tgz", - "integrity": "sha512-h8KKxESmSFTcXX409CAxlaOYscEDvN2KGQRsLCGT1NSqRW+D6EXLVQ8vuHhFznS9MuH9QYw1GfsUN30bg8hjVA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz", + "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==", "dev": true, "dependencies": { - "@octokit/types": "^7.5.0" + "@octokit/types": "^8.0.0" }, "engines": { "node": ">= 14" @@ -2389,12 +2378,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.6.2.tgz", - "integrity": "sha512-n9dL5KMpz9qVFSNdcVWC8ZPbl68QbTk7+CMPXCXqaMZOLn1n1YuoSFFCy84Ge0fx333fUqpnBHv8BFjwGtUQkA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz", + "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==", "dev": true, "dependencies": { - "@octokit/types": "^7.5.0", + "@octokit/types": "^8.0.0", "deprecation": "^2.3.1" }, "engines": { @@ -2405,14 +2394,14 @@ } }, "node_modules/@octokit/request": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.1.tgz", - "integrity": "sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", + "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", "dev": true, "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^8.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" @@ -2422,12 +2411,12 @@ } }, "node_modules/@octokit/request-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", - "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", + "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", "dev": true, "dependencies": { - "@octokit/types": "^7.0.0", + "@octokit/types": "^8.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -2436,27 +2425,27 @@ } }, "node_modules/@octokit/rest": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.4.tgz", - "integrity": "sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==", + "version": "19.0.5", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz", + "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==", "dev": true, "dependencies": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^4.0.0", + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^5.0.0", "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + "@octokit/plugin-rest-endpoint-methods": "^6.7.0" }, "engines": { "node": ">= 14" } }, "node_modules/@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz", + "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^13.11.0" + "@octokit/openapi-types": "^14.0.0" } }, "node_modules/@tootallnate/once": { @@ -2491,6 +2480,15 @@ "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", "dev": true }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2498,16 +2496,31 @@ "dev": true, "peer": true }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, "node_modules/@types/node": { - "version": "14.18.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz", - "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==", + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -2550,9 +2563,9 @@ "dev": true }, "node_modules/@xmldom/xmldom": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.3.tgz", - "integrity": "sha512-Lv2vySXypg4nfa51LY1nU8yDAGo/5YwF+EY/rUZgIbfvwVARcd67ttCM8SMsTeJy51YhHYavEq+FS6R0hW9PFQ==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.5.tgz", + "integrity": "sha512-0dpjDLeCXYThL2YhqZcd/spuwoH+dmnFoND9ZxZkAYxp1IJUB2GP16ow2MJRsjVxy8j1Qv8BJRmN5GKnbDKCmQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -2566,18 +2579,16 @@ }, "node_modules/abbrev": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "inBundle": true, + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -2586,9 +2597,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2737,9 +2748,8 @@ }, "node_modules/are-we-there-yet": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz", - "integrity": "sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw==", "inBundle": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^4.1.0" @@ -2750,8 +2760,6 @@ }, "node_modules/are-we-there-yet/node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -2767,6 +2775,7 @@ } ], "inBundle": true, + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -2774,9 +2783,8 @@ }, "node_modules/are-we-there-yet/node_modules/readable-stream": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", - "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", "inBundle": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -2834,26 +2842,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2910,6 +2908,16 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "inBundle": true, @@ -2917,8 +2925,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -2933,7 +2939,8 @@ "url": "https://feross.org/support" } ], - "inBundle": true + "inBundle": true, + "license": "MIT" }, "node_modules/before-after-hook": { "version": "2.2.3", @@ -2953,8 +2960,7 @@ }, "node_modules/bin-links": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.1.tgz", - "integrity": "sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA==", + "license": "ISC", "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -3095,9 +3101,8 @@ }, "node_modules/cacache": { "version": "17.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.1.tgz", - "integrity": "sha512-HRnDSZUXB5hdCQc2wuB8eBQPe1a9PVU2Ow8zMTi82NGJZmBGNTSjEGzetlndKlqpVYBa4esdaJ2LH6/uOB4sFQ==", "inBundle": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.0.0", "@npmcli/move-file": "^3.0.0", @@ -3201,9 +3206,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", + "version": "1.0.30001430", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001430.tgz", + "integrity": "sha512-IB1BXTZKPDVPM7cnV4iaKaHxckvdr/3xtctB3f7Hmenx3qYBhGtTZ//7EllK66aKXW98Lx0+7Yr0kxBtIt3tzg==", "dev": true, "funding": [ { @@ -3216,6 +3221,16 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "inBundle": true, @@ -3231,6 +3246,16 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3311,9 +3336,8 @@ }, "node_modules/cli-table3": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "inBundle": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -3360,8 +3384,7 @@ }, "node_modules/cmd-shim": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.0.tgz", - "integrity": "sha512-wx+RWLgiSU6SCDzMtxG0Dv1lsuOcEfqq5SbqAViezaJIkR5sbveKzFU31YnWhqrJx3o3Iu3H0Rq8R00OS3oI+Q==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3664,9 +3687,9 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.1.1.tgz", - "integrity": "sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.2.0.tgz", + "integrity": "sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==", "dev": true, "engines": { "node": ">=12", @@ -3890,9 +3913,9 @@ } }, "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "dependencies": { "decamelize": "^1.1.0", @@ -3900,6 +3923,9 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/decamelize-keys/node_modules/map-obj": { @@ -3912,11 +3938,24 @@ } }, "node_modules/decimal.js": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", - "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", "dev": true }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -4012,6 +4051,15 @@ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -4049,19 +4097,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "peer": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/docopt": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", @@ -4179,9 +4214,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.279.tgz", - "integrity": "sha512-xs7vEuSZ84+JsHSTFqqG0TE3i8EAivHomRQZhhcRvsmnjsh5C2KdhwNKf4ZRYtzq75wojpFyqb62m32Oam57wA==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "node_modules/emoji-regex": { @@ -4429,15 +4464,16 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "peer": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4453,14 +4489,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -4743,9 +4779,9 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.1.tgz", - "integrity": "sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "peer": true, "engines": { @@ -4933,9 +4969,8 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "inBundle": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4948,9 +4983,8 @@ }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "inBundle": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -4993,42 +5027,18 @@ "node": ">=6" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "peer": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5044,9 +5054,8 @@ }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "inBundle": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } @@ -5378,9 +5387,8 @@ }, "node_modules/gauge": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.0.tgz", - "integrity": "sha512-0s5T5eciEG7Q3ugkxAkFtaDhrrhXsCRivA5y8C9WMHWuI8UlMOJg7+Iwf7Mccii+Dfs3H5jHepU0joPVyQU0Lw==", "inBundle": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -5493,9 +5501,8 @@ }, "node_modules/glob": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "inBundle": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5557,27 +5564,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "peer": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.10", "inBundle": true, @@ -5732,9 +5718,8 @@ }, "node_modules/hosted-git-info": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "inBundle": true, + "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -5821,8 +5806,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -5837,7 +5820,8 @@ "url": "https://feross.org/support" } ], - "inBundle": true + "inBundle": true, + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.2.0", @@ -5851,9 +5835,8 @@ }, "node_modules/ignore-walk": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.0.tgz", - "integrity": "sha512-bTf9UWe/UP1yxG3QUrj/KOvEhTAUWPcv+WvbFZ28LcqznXabp7Xu6o9y1JEC18+oqODuS7VhTpekV5XvFwsxJg==", "inBundle": true, + "license": "ISC", "dependencies": { "minimatch": "^5.0.1" }, @@ -5931,9 +5914,8 @@ }, "node_modules/init-package-json": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-4.0.1.tgz", - "integrity": "sha512-+8aiPEdLbTZxVBMeu0qdQ378Yf7Fv6CuoTI2fYOmEN+ND7SLpHUfcKLXuPmrcvLOSUy8SzCnsqoQdMiwN6ijTw==", "inBundle": true, + "license": "ISC", "dependencies": { "npm-package-arg": "^10.0.0", "promzard": "^0.3.0", @@ -6023,6 +6005,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6155,6 +6160,16 @@ "node": ">=8" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -6457,9 +6472,9 @@ } }, "node_modules/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-pksjj7Rqoa+wdpkKcLzQRHhJCEE42qQhl/xLMUKHgoSejaKOdaXEAnqs6uDNwMl/fciHTzKeR8Wm8cw7N+g98A==", + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.2.tgz", + "integrity": "sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==", "dev": true, "dependencies": { "abab": "^2.0.6", @@ -6501,18 +6516,6 @@ } } }, - "node_modules/jsdom/node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/jsdom/node_modules/escodegen": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", @@ -6578,18 +6581,6 @@ "node": ">= 0.8.0" } }, - "node_modules/jsdom/node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/jsdom/node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6659,9 +6650,8 @@ }, "node_modules/json-parse-even-better-errors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", "inBundle": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -6776,6 +6766,15 @@ "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6894,9 +6893,9 @@ } }, "node_modules/licensee/node_modules/@npmcli/arborist": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.6.2.tgz", - "integrity": "sha512-Lyj2g+foWKzrwW2bT/RGO982VR9vb5tlvfD88n4PwWJRrDttQbJoIdcQzN9b+NIBhI1/8iEhC5b8far9U0fQxA==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.6.3.tgz", + "integrity": "sha512-/7hbqEM6YuRjwTcQXkK1+xKslEblY5kFQe0tZ7jKyMlIR6x4iOmhLErIkBBGtTKvYxRKdpcxnFXjCobg3UqmsA==", "dev": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", @@ -6912,6 +6911,7 @@ "bin-links": "^3.0.3", "cacache": "^16.1.3", "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^5.2.1", "json-parse-even-better-errors": "^2.3.1", "json-stringify-nice": "^1.1.4", "minimatch": "^5.1.0", @@ -7026,6 +7026,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { "mkdirp": "^1.0.4", @@ -7204,9 +7205,9 @@ } }, "node_modules/licensee/node_modules/hosted-git-info": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.0.tgz", - "integrity": "sha512-y5aljBDICf0OFQecausUdWGZbLxSaFc012tdP4xe4GcFMeYUrOptSGaTZ21gvIsPUSe1/K9EVKLYwBOSEOPirw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "dependencies": { "lru-cache": "^7.5.1" @@ -7710,6 +7711,16 @@ "dev": true, "peer": true }, + "node_modules/longest-streak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "7.13.2", "inBundle": true, @@ -7750,9 +7761,8 @@ }, "node_modules/make-fetch-happen": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.1.tgz", - "integrity": "sha512-clv3IblugXn2CDUmqFhNzii3rjKa46u5wNeivc+QlLXkGI5FjLX3rGboo+y2kwf1pd8W0iDiC384cemeDtw9kw==", "inBundle": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^17.0.0", @@ -7787,6 +7797,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-table": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.2.tgz", + "integrity": "sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/marked": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", @@ -7812,6 +7832,223 @@ "marked": "^0.7.0" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz", + "integrity": "sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz", + "integrity": "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz", + "integrity": "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz", + "integrity": "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz", + "integrity": "sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz", + "integrity": "sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz", + "integrity": "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -7894,30 +8131,571 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", "dev": true, - "peer": true, - "engines": { - "node": ">= 8" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz", + "integrity": "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==", + "dev": true, + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==", "dev": true, - "peer": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" }, - "engines": { - "node": ">=8.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz", + "integrity": "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==", + "dev": true, + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz", + "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==", + "dev": true, + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz", + "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==", + "dev": true, + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz", + "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==", + "dev": true, + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz", + "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==", + "dev": true, + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -8033,9 +8811,8 @@ }, "node_modules/minipass-fetch": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.0.tgz", - "integrity": "sha512-NSx3k5gR4Q5Ts2poCM/19d45VwhVLBtJZ6ypYcthj2BwmDx/e7lW8Aadnyt3edd2W0ecb+b0o7FYLRYE2AGcQg==", "inBundle": true, + "license": "MIT", "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -8142,6 +8919,15 @@ "node": ">=0.10.0" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "inBundle": true, @@ -8240,9 +9026,8 @@ }, "node_modules/node-gyp": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", "inBundle": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -8264,9 +9049,8 @@ }, "node_modules/node-gyp/node_modules/@npmcli/fs": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "inBundle": true, + "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -8277,9 +9061,8 @@ }, "node_modules/node-gyp/node_modules/@npmcli/move-file": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "inBundle": true, + "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -8290,15 +9073,13 @@ }, "node_modules/node-gyp/node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "inBundle": true + "inBundle": true, + "license": "ISC" }, "node_modules/node-gyp/node_modules/are-we-there-yet": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "inBundle": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -8318,9 +9099,8 @@ }, "node_modules/node-gyp/node_modules/cacache": { "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "inBundle": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -8347,18 +9127,16 @@ }, "node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "inBundle": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/node-gyp/node_modules/cacache/node_modules/glob": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "inBundle": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8375,9 +9153,8 @@ }, "node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "inBundle": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8387,9 +9164,8 @@ }, "node_modules/node-gyp/node_modules/gauge": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "inBundle": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -8425,9 +9201,8 @@ }, "node_modules/node-gyp/node_modules/make-fetch-happen": { "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "inBundle": true, + "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -8463,9 +9238,8 @@ }, "node_modules/node-gyp/node_modules/minipass-fetch": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "inBundle": true, + "license": "MIT", "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -8480,9 +9254,8 @@ }, "node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "inBundle": true, + "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -8495,9 +9268,8 @@ }, "node_modules/node-gyp/node_modules/npmlog": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "inBundle": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -8510,9 +9282,8 @@ }, "node_modules/node-gyp/node_modules/ssri": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "inBundle": true, + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -8522,9 +9293,8 @@ }, "node_modules/node-gyp/node_modules/unique-filename": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "inBundle": true, + "license": "ISC", "dependencies": { "unique-slug": "^3.0.0" }, @@ -8534,9 +9304,8 @@ }, "node_modules/node-gyp/node_modules/unique-slug": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "inBundle": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -8546,9 +9315,8 @@ }, "node_modules/node-gyp/node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "inBundle": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8589,9 +9357,8 @@ }, "node_modules/nopt": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.0.0.tgz", - "integrity": "sha512-e6Qw1rcrGoSxEH0hQ4GBSdUjkMOtXGhGFXdNT/3ZR0S37eR9DMj5za3dEDWE6o1T3/DP8ZOsPP4MIiky0c3QeA==", "inBundle": true, + "license": "ISC", "dependencies": { "abbrev": "^2.0.0" }, @@ -8604,9 +9371,8 @@ }, "node_modules/normalize-package-data": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", @@ -8628,9 +9394,8 @@ }, "node_modules/npm-audit-report": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-4.0.0.tgz", - "integrity": "sha512-k2o5476sLrp94b6Gl819YzlS7LAdb8lgE6yQCysBEji5E3WoUdRve6tiVMLKAPPdLfItU4kOSUycWS5HFTrbug==", "inBundle": true, + "license": "ISC", "dependencies": { "chalk": "^4.0.0" }, @@ -8640,9 +9405,8 @@ }, "node_modules/npm-bundled": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", "inBundle": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, @@ -8652,9 +9416,8 @@ }, "node_modules/npm-install-checks": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.0.0.tgz", - "integrity": "sha512-SBU9oFglRVZnfElwAtF14NivyulDqF1VKqqwNsFW9HDcbHMAPHpRSsVFgKuwFGq/hVvWZExz62Th0kvxn/XE7Q==", "inBundle": true, + "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -8670,18 +9433,16 @@ }, "node_modules/npm-normalize-package-bin": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", - "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-package-arg": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.0.0.tgz", - "integrity": "sha512-7dkh8mRp7s0KwVHKIVJnFCJQ2B34gOGnzgBjDGyprycmARq/82SX/lhilQ95ZuacP/G/1gsS345iAkKmxWBQ2Q==", "inBundle": true, + "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", @@ -8694,9 +9455,8 @@ }, "node_modules/npm-packlist": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.2.tgz", - "integrity": "sha512-d2+7RMySjVXssww23rV5NuIq1NzGvM04OlI5kwnvtYKfFTAPVs6Zxmxns2HRtJEA1oNj7D/BbFXeVAOLmW3N3Q==", "inBundle": true, + "license": "ISC", "dependencies": { "ignore-walk": "^6.0.0" }, @@ -8706,9 +9466,8 @@ }, "node_modules/npm-pick-manifest": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "inBundle": true, + "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -8721,9 +9480,8 @@ }, "node_modules/npm-profile": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-7.0.1.tgz", - "integrity": "sha512-VReArOY/fCx5dWL66cbJ2OMogTQAVVQA//8jjmjkarboki3V7UJ0XbGFW+khRwiAJFQjuH0Bqr/yF7Y5RZdkMQ==", "inBundle": true, + "license": "ISC", "dependencies": { "npm-registry-fetch": "^14.0.0", "proc-log": "^3.0.0" @@ -8734,9 +9492,8 @@ }, "node_modules/npm-registry-fetch": { "version": "14.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.2.tgz", - "integrity": "sha512-TMenrMagFA9KF81E2bkS5XRyzERK4KXu70vgXt5+i8FcrFeLNgNsc6e5hekTqjDwPDkL3HGn/holWcXDMfnFgw==", "inBundle": true, + "license": "ISC", "dependencies": { "make-fetch-happen": "^11.0.0", "minipass": "^3.1.6", @@ -8769,9 +9526,8 @@ }, "node_modules/npmlog": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", - "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", "inBundle": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^4.0.0", "console-control-strings": "^1.1.0", @@ -9122,8 +9878,9 @@ }, "node_modules/opener": { "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } @@ -9268,9 +10025,8 @@ }, "node_modules/pacote": { "version": "15.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.0.6.tgz", - "integrity": "sha512-dQwcz/sME7QIL+cdrw/jftQfMMXxSo17i2kJ/gnhBhUvvBAsxoBu1lw9B5IzCH/Ce8CvEkG/QYZ6txzKfn0bTw==", "inBundle": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -9311,9 +10067,8 @@ }, "node_modules/parse-conflict-json": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.0.tgz", - "integrity": "sha512-ipcKLCmZbAj7n+h9qQREvdvsBUMPetGk9mM4ljCvs5inZznAlkHPk5XPc7ROtknUKw7kO6Jnz10Y3Eec7tky/A==", "inBundle": true, + "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^5.0.1", @@ -9359,6 +10114,30 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9668,18 +10447,16 @@ }, "node_modules/proc-log": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "inBundle": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -9871,17 +10648,15 @@ }, "node_modules/read-cmd-shim": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/read-package-json": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.0.tgz", - "integrity": "sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==", "inBundle": true, + "license": "ISC", "dependencies": { "glob": "^8.0.1", "json-parse-even-better-errors": "^3.0.0", @@ -9894,9 +10669,8 @@ }, "node_modules/read-package-json-fast": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.1.tgz", - "integrity": "sha512-8+HW7Yo+cjfF+md8DqsZHgats2mxf7gGYow/+2JjxrftoHFZz9v4dzd0EubzYbkNaLxrTVcnllHwklXN2+7aTQ==", "inBundle": true, + "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -10185,6 +10959,114 @@ "node": ">=4" } }, + "node_modules/remark": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.2.tgz", + "integrity": "sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "remark-parse": "^10.0.0", + "remark-stringify": "^10.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-github": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/remark-github/-/remark-github-11.2.4.tgz", + "integrity": "sha512-GJjWFpwqdrHHhPWqMbb8+lqFLiHQ9pCzUmXmRrhMFXGpYov5n2ljsZzuWgXlfzArfQYkiKIZczA2I8IHYMHqCA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "mdast-util-to-string": "^3.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-github/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-github/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10358,6 +11240,18 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "funding": [ @@ -10592,9 +11486,9 @@ } }, "node_modules/spawk": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/spawk/-/spawk-1.7.1.tgz", - "integrity": "sha512-qkPqVdPp5ICEeSYKB/qCkwIBB0IWQuouEvYenQvpTq15fqSQgutpH453NjEImrpCWTwQwj2bQjGp8YGHapEiWw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/spawk/-/spawk-1.8.0.tgz", + "integrity": "sha512-/bqxBMj+ldGl/p/hjHW8VRL9DulNQV0bjvB2v6knpG6gq2Y+teLtjpjqpBXQq02o6CCVCeiFP4VjCs0CVlG8Jg==", "dev": true, "engines": { "node": ">=12.0.0" @@ -10731,9 +11625,8 @@ }, "node_modules/ssri": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.0.tgz", - "integrity": "sha512-64ghGOpqW0k+jh7m5jndBGdVEoPikWwGQmBNN5ks6jyUSMymzHDTlnNHOvzp+6MmHOljr2MokUzvRksnTwG0Iw==", "inBundle": true, + "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -12992,9 +13885,8 @@ }, "node_modules/tar": { "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", "inBundle": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -13205,9 +14097,8 @@ }, "node_modules/treeverse": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -13227,6 +14118,16 @@ "integrity": "sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw==", "dev": true }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -13385,9 +14286,9 @@ } }, "node_modules/uglify-js": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.3.tgz", - "integrity": "sha512-JmMFDME3iufZnBpyKL+uS78LRiC+mK55zWfM5f/pWBJfpOttXAqYfdDGRukYhJuyRinvPVAtUhvy7rlDybNtFg==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, "bin": { @@ -13428,11 +14329,41 @@ "punycode": "^2.0.0" } }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "inBundle": true, + "license": "ISC", "dependencies": { "unique-slug": "^4.0.0" }, @@ -13442,9 +14373,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "inBundle": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -13453,10 +14383,23 @@ } }, "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -13491,6 +14434,26 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit/node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", @@ -13565,6 +14528,24 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -13582,9 +14563,8 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", "inBundle": true, + "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -13592,6 +14572,36 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/vfile": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/w3c-xmlserializer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", @@ -13655,9 +14665,8 @@ }, "node_modules/which": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", "inBundle": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -13738,9 +14747,8 @@ }, "node_modules/write-file-atomic": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", - "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", "inBundle": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -13832,9 +14840,9 @@ } }, "node_modules/ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -13900,9 +14908,9 @@ } }, "node_modules/yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -13911,7 +14919,7 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -13970,6 +14978,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "smoke-tests": { "version": "1.0.0", "license": "ISC", diff --git a/package.json b/package.json index 3c2efd351785f..3b0eb95f7c4a4 100644 --- a/package.json +++ b/package.json @@ -206,6 +206,9 @@ "licensee": "^9.0.0", "nock": "^13.2.4", "npm-packlist": "^7.0.1", + "remark": "^14.0.2", + "remark-gfm": "^3.0.1", + "remark-github": "^11.2.4", "spawk": "^1.7.1", "tap": "^16.0.1" }, diff --git a/scripts/create-node-pr.js b/scripts/create-node-pr.js index 26d4c07a793e6..712f71b7ccaef 100644 --- a/scripts/create-node-pr.js +++ b/scripts/create-node-pr.js @@ -1,4 +1,4 @@ -const { join } = require('path') +const { join, basename } = require('path') const fsp = require('fs/promises') const hgi = require('hosted-git-info') const semver = require('semver') @@ -8,11 +8,12 @@ const tar = require('tar') const { cp, withTempDir } = require('@npmcli/fs') const { CWD, run, spawn, git, fs, gh } = require('./util.js') +const NODE_FORK = 'npm/node' // this script expects node to already be cloned to a directory at the cli root named "node" const NODE_DIR = join(CWD, 'node') const gitNode = spawn.create('git', { cwd: NODE_DIR }) -const createNodeTarball = async ({ mani, registryOnly, tag, dir: extractDir }) => { +const createNodeTarball = async ({ mani, registryOnly, localTest, tag, dir: extractDir }) => { const tarball = join(extractDir, 'npm-node.tgz') await pacote.tarball.file(mani._from, tarball, { resolved: mani._resolved }) @@ -28,12 +29,26 @@ const createNodeTarball = async ({ mani, registryOnly, tag, dir: extractDir }) = await fs.rimraf(tarball) // checkout the tag since we need to get files from source. - await git.dirty() - tag && await git('checkout', tag) - for (const path of ['.npmrc', 'tap-snapshots/', 'test/']) { + if (!localTest) { + try { + await git('checkout', tag) + } catch (err) { + log.error('Use the `--local-test` flag to avoid checking out the tag') + throw err + } + } + // currently there is an empty .npmrc file in the deps/npm dir in the node repo + // i do not know why and it might not be used but in order to minimize any + // unnecessary churn, let's create that file to match the old process + await fsp.writeFile(join(extractDir, '.npmrc'), '', 'utf-8') + + // copy our test dirs so that tests can be run + for (const path of ['tap-snapshots/', 'test/']) { await cp(join(CWD, path), join(extractDir, path), { recursive: true }) } + // recreate the tarball as closely as possible to how we would before publishing + // to the registry. the only difference here is the extra files we put in the dir await tar.c({ ...pacote.DirFetcher.tarCreateOptions(mani), cwd: extractDir, @@ -43,82 +58,227 @@ const createNodeTarball = async ({ mani, registryOnly, tag, dir: extractDir }) = return tarball } -const main = async (spec, opts) => withTempDir(CWD, async (tmpDir) => { - const { dryRun, registryOnly, skipCheckout } = opts +const getPrBody = async ({ releases, closePrs }) => { + const useSummary = releases.length > 1 + const releasePath = (v) => `/npm/cli/releases/tag/v${v}` - const mani = await pacote.manifest(`npm@${spec}`, { preferOnline: true }) + // XXX: add links to relevant CI and CITGM runs once we no longer include our tests + let prBody = '' + + if (useSummary) { + const summary = releases.map(r => { + return `[\`npm@${r.version}\`](https://github.com${releasePath(r.version)})` + }) + prBody += `This PR contains changes from: ${summary.join(' ')}\n\n` + } + + if (closePrs.length) { + prBody += `This PR replaces: ${closePrs.map(pr => pr.url).join(' ')}\n\n` + } - const head = { - tag: `v${mani.version}`, - branch: `npm-v${mani.version}`, - host: hgi.fromUrl('npm/node'), - message: `deps: upgrade npm to ${mani.version}`, + if (prBody) { + prBody += '---\n\n' } - log.silly(head) + + for (const { version, body } of releases) { + prBody += useSummary + ? `
${version}\n

\n\n${body}\n\n

\n
` + : body + prBody += '\n' + } + + // These comes from the releases so those link to the raw comparison between tags. + // Since we are putting this in a PR we can change those links back to the releases. + prBody = prBody.replace(/\/npm\/cli\/compare\/v[\w.-]+\.\.\.v([\w.-]+)/g, releasePath('$1')) + + const { remark } = await import('remark') + const { default: remarkGfm } = await import('remark-gfm') + const { default: remarkGithub } = await import('remark-github') + + return remark() + .use(remarkGfm) + .use(remarkGithub, { + repository: 'npm/cli', + // dont link mentions, but anything else make the link an explicit referance to npm/cli + buildUrl: (values, buildUrl) => values.type === 'mention' ? false : buildUrl(values), + }) + .process(prBody) + .then(v => String(v)) +} + +const tokenRemoteUrl = ({ host, token }) => { + // this is a remote url that uses a github token as the username + // in order to authenticate with github + const headRemoteUrl = new URL(host.https()) + headRemoteUrl.username = token + // we have to manually change the protocol. the whatwg url spec + // does not allow changing a special protocol to another one + // but the protocol has to be `https:` without the `git+` + return headRemoteUrl.toString().replace('git+https:', 'https:') +} + +const main = async (spec, branch = 'main', opts) => withTempDir(CWD, async (tmpDir) => { + const { GITHUB_TOKEN } = process.env + const { dryRun, registryOnly, localTest } = opts + + if (!spec) { + throw new Error('`spec` is required as the first argument') + } + + if (!branch) { + throw new Error('`branch` is required as the second argument') + } + + if (!GITHUB_TOKEN) { + throw new Error(`process.env.GITHUB_TOKEN is required`) + } + + await fsp.access(NODE_DIR, fsp.constants.F_OK).catch(() => { + throw new Error(`node repo must be checked out to \`${NODE_DIR}\` to continue`) + }) + + await gh.json('repo', 'view', NODE_FORK, 'url').catch(() => { + throw new Error(`node repo must be forked to ${NODE_FORK}`) + }) + + await git.dirty().catch((er) => { + if (localTest) { + return log.info('Skipping git dirty check due to `--local-test` flag') + } + throw er + }) + + const mani = await pacote.manifest(`npm@${spec}`, { preferOnline: true }) + const packument = await pacote.packument('npm', { preferOnline: true }) + const npmVersions = Object.keys(packument.versions).sort(semver.rcompare) + + const npmVersion = semver.parse(mani.version) + const npmHost = hgi.fromUrl(NODE_FORK) + const npmTag = `v${npmVersion}` + const npmBranch = `npm-${npmTag}` + const npmRemoteUrl = tokenRemoteUrl({ host: npmHost, token: GITHUB_TOKEN }) + const npmMessage = (v = npmVersion) => `deps: upgrade npm to ${v}` const tarball = await createNodeTarball({ mani, + tag: npmTag, dir: tmpDir, registryOnly, - // the only reason this is optional is for testing when updating this script. - // if we checkout an older tag, it won't have the updates we are testing. - tag: skipCheckout ? null : head.tag, + localTest, }) + log.info('tarball path', tarball) - await fsp.access(NODE_DIR, fsp.constants.F_OK).catch(() => { - throw new Error(`node repo must be checked out to \`${NODE_DIR}\` to continue`) - }) + const nodeRemote = 'origin' + const nodeBranch = /^\d+$/.test(branch) ? `v${branch}.x-staging` : branch + const nodeHost = hgi.fromUrl(await gitNode('remote', 'get-url', nodeRemote, { out: true })) + const nodePrArgs = ['pr', '-R', nodeHost.path()] + + await gitNode('fetch', nodeRemote) + await gitNode('checkout', nodeBranch) + await gitNode('reset', '--hard', `${nodeRemote}/${nodeBranch}`) + + const nodeNpmPath = join('deps', 'npm') + const nodeNpmDir = join(NODE_DIR, nodeNpmPath) + const nodeNpmVersion = require(join(nodeNpmDir, 'package.json')).version - const base = { - // we used to send PRs sometimes for old versions to the 14.x staging - // branch. this might not be needed anymore, but this is how we - // would do it, if we needed to send a PR for backport fixes - branch: semver.major(mani.version) <= 8 ? '14.x-staging' : 'main', - remote: 'origin', - host: hgi.fromUrl(await gitNode('remote', 'get-url', 'origin', { out: true })), + // this is the range of all versions included in this update based + // on the current version of npm in node currently. we use this + // to build a list of all release notes and to close any existing PRs + const newNpmVersions = npmVersions.slice( + npmVersions.indexOf(npmVersion.toString()), + npmVersions.indexOf(nodeNpmVersion) + ) + .reverse() + .map((v) => semver.parse(v)) + .filter((version) => version.major === npmVersion.major) + + // get a list of all versions changelogs to add to the body of the PR + // do this before we checkout our branch and make any changes + const npmReleases = await Promise.all(newNpmVersions.map(async (v) => { + // dont include prereleases unless we are updating to a prerlease since we + // manually put all prerelease notes into the first stable major version + if (v.prerelease.length && !npmVersion.prerelease.length) { + return null + } + return { + version: v, + body: await gh.json('release', 'view', `v${v}`, 'body', { quiet: true }).then(r => r.trim()), + } + })).then(r => r.filter(Boolean)) + + log.info('npm versions', newNpmVersions.map(v => v.toString())) + log.info('npm releases', npmReleases.map(u => u.version.toString())) + + await gitNode('branch', '-D', npmBranch, { ok: true }) + await gitNode('checkout', '-b', npmBranch) + await fs.clean(nodeNpmDir) + await tar.x({ strip: 1, file: tarball, cwd: nodeNpmDir }) + await fs.rimraf(join(nodeNpmDir, basename(tarball))) + + await gitNode('add', '-A', nodeNpmPath) + await gitNode('commit', '-m', npmMessage()) + await gitNode('rebase', '--whitespace', 'fix', nodeBranch) + + await gitNode('remote', 'rm', npmHost.user, { ok: true }) + await gitNode('remote', 'add', npmHost.user, npmRemoteUrl) + if (!dryRun) { + await gitNode('push', npmHost.user, npmBranch, '--force') } - log.silly(base) - await gh('repo', 'fork', base.host.path(), '--org', head.host.user, { quiet: true, ok: true }) - await gitNode('fetch', base.remote) - await gitNode('checkout', base.branch) - await gitNode('reset', '--hard', `${base.remote}/${base.branch}`) - await gitNode('branch', '-D', head.branch, { ok: true }) - await gitNode('checkout', '-b', head.branch) + const npmPrs = await gh.json( + ...nodePrArgs, 'list', + '-S', `in:title "${npmMessage('')}"`, + 'number,title,url' + ) + + log.info('Found other npm PRs', npmPrs) - const npmPath = join('deps', 'npm') - const npmDir = join(NODE_DIR, npmPath) - await fs.clean(npmDir) - await tar.x({ strip: 1, file: tarball, cwd: npmDir }) + let existingPr = null + const closePrs = [] - await gitNode('add', '-A', npmPath) - await gitNode('commit', '-m', head.message) - await gitNode('rebase', '--whitespace', 'fix', base.branch) + for (const pr of npmPrs) { + const prVersion = pr.title.replace(npmMessage(''), '').trim() + log.silly('checking existing PR', prVersion, pr) - await gitNode('remote', 'add', head.host.user, head.host.ssh(), { ok: true }) - await gitNode('push', head.host.user, head.branch, '--force') + if (!existingPr && prVersion === npmVersion.toString()) { + existingPr = pr + } else if (newNpmVersions.some(v => v.toString() === prVersion)) { + closePrs.push(pr) + } + } + + log.info('Found exisiting PR', existingPr) + log.info('Found PRs to close', closePrs) - const notes = await gh.json('release', 'view', head.tag, 'body') - log.silly('body', notes) + const prBody = await getPrBody({ releases: npmReleases, closePrs }) const prArgs = [ - 'pr', 'create', - '-R', base.host.path(), - '-B', base.branch, - '-H', `${head.host.user}:${head.branch}`, - '-t', head.message, - ] + nodePrArgs, + (existingPr ? ['edit', existingPr.number] : ['create', '-H', `${npmHost.user}:${npmBranch}`]), + '-B', nodeBranch, + '-t', npmMessage(), + ].flat() if (dryRun) { log.info(`gh ${prArgs.join(' ')}`) - const url = new URL(base.host.browse()) - const compare = `${base.branch}...${head.host.user}:${head.host.project}:${head.branch}` - url.pathname += `/compare/${compare}` - url.searchParams.set('expand', '1') - return url.toString() + return prBody + } + + const newOrUpdatedPr = await gh(prArgs, '-F', '-', { input: prBody, out: true }) + const closeMessage = `Closing in favor of ${newOrUpdatedPr}` + + for (const closePr of closePrs) { + log.info('Attempting to close PR', closePr.url) + try { + await gh(nodePrArgs, 'close', closePr.number, '-c', closeMessage) + } catch (err) { + log.error('Could not close PR', err) + } } - return gh(...prArgs, '-F', '-', { cwd: NODE_DIR, input: notes, out: true }) + return newOrUpdatedPr }) -run(({ argv, ...opts }) => main(argv.remain[0], opts)) +run(({ argv, ...opts }) => main(argv.remain[0], argv.remain[1], opts), { + redact: new RegExp(process.env.GITHUB_TOKEN, 'g'), +}) diff --git a/scripts/template-oss/create-node-pr.yml b/scripts/template-oss/create-node-pr.yml index 23b267d58ee86..3946ba7b264ed 100644 --- a/scripts/template-oss/create-node-pr.yml +++ b/scripts/template-oss/create-node-pr.yml @@ -7,12 +7,16 @@ on: description: "The npm spec to create the PR from" required: true default: 'latest' + branch: + description: "The major node version to serve as the base of the PR. Should be `main` or a number like `18`, `19`, etc." + required: true + default: 'main' dryRun: description: "Setting this to anything will run all the steps except opening the PR" jobs: create-pull-request: - {{> job jobName="Create Node PR" }} + {{> job jobName="Create Node PR" jobCheckout=(obj fetch-depth=0) }} - name: Checkout Node uses: actions/checkout@v3 with: @@ -25,4 +29,4 @@ jobs: GITHUB_TOKEN: $\{{ secrets.NODE_PULL_REQUEST_TOKEN }} run: | DRY_RUN=$([ -z "$\{{ inputs.dryRun }}" ] && echo "" || echo "--dry-run") - node scripts/create-node-pr.js "$\{{ inputs.spec }}" "$DRY_RUN" + node scripts/create-node-pr.js $\{{ inputs.spec }} $\{{ inputs.branch }} "$DRY_RUN" diff --git a/scripts/update-authors.js b/scripts/update-authors.js index 23c4430570c38..fc567b664825a 100755 --- a/scripts/update-authors.js +++ b/scripts/update-authors.js @@ -4,6 +4,7 @@ const { CWD, run, git, fs } = require('./util.js') const main = async () => { const allAuthors = await git('log', '--use-mailmap', '--reverse', '--format=%aN <%aE>', { lines: true, + quiet: true, }) const authors = new Set() diff --git a/scripts/util.js b/scripts/util.js index 7e74eee3fb099..bb8dd48f8c01e 100644 --- a/scripts/util.js +++ b/scripts/util.js @@ -47,7 +47,7 @@ const getArgs = (allArgs) => { const spawn = async (cmd, ...allArgs) => { const { args, - opts: { ok, input, out, lines, quiet, ...opts }, + opts: { ok, input, out, lines, quiet, env, ...opts }, } = getArgs(allArgs) log.info('spawn', `${cmd} ${args.join(' ')}`) @@ -57,10 +57,12 @@ const spawn = async (cmd, ...allArgs) => { const spawnOpts = { stdio: quiet || out || lines ? 'pipe' : 'inherit', cwd: CWD, + env: { ...process.env, ...env }, ...opts, } const proc = cmd === 'git' ? npmGit.spawn(args, spawnOpts) : promiseSpawn(cmd, args, spawnOpts) if (input && proc.stdin) { + log.silly('input', input) proc.stdin.write(input) proc.stdin.end() } @@ -69,12 +71,12 @@ const spawn = async (cmd, ...allArgs) => { if (!ok) { throw err } - log.info('suppressed error', err.message) + log.silly('suppressed error', err) } if (res?.stdout) { res.stdout = res.stdout.toString().trim() - if (res.stdout) { + if (res.stdout && !quiet) { log.silly('stdout', res.stdout) } } @@ -125,16 +127,17 @@ git.dirty = () => npmGit.isClean({ cwd: CWD }).then(async r => { }) const gh = spawn.create('gh') -gh.json = async (...args) => { +gh.json = async (..._args) => { + const { args, opts } = getArgs(_args) const keys = args.pop() - let data = await gh(...args, '--json', keys, { out: true }).then(JSON.parse) + let data = await gh(...args, '--json', keys, { ...opts, out: true }).then(JSON.parse) if (keys.split(',').length === 1) { data = data[keys] } return data } -const run = async (main) => { +const run = async (main, { redact } = {}) => { const argv = {} for (const [k, v] of Object.entries(nopt({}, {}, process.argv))) { argv[k] = v @@ -142,11 +145,13 @@ const run = async (main) => { argv[k.replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = v } + const defaultLevels = ['error', 'warn', 'info'] process.on('log', (l, ...args) => { - if (argv.debug || process.env.CI || l === 'error') { + if (argv.debug || process.env.CI || defaultLevels.includes(l)) { for (const line of formatWithOptions({ colors: true }, ...args).split('\n')) { + const redacted = redact ? line.replace(redact, '***') : line // eslint-disable-next-line no-console - console.error(l.slice(0, 4).toUpperCase(), line) + console.error(l.slice(0, 4).toUpperCase(), redacted) } } }) From 1bff0640ccb8414e2d416a5cf9d64e9ff03c6403 Mon Sep 17 00:00:00 2001 From: Gar Date: Mon, 7 Nov 2022 15:38:19 -0800 Subject: [PATCH 03/15] docs(config): document `npm config fix` (#5819) --- docs/lib/content/commands/npm-config.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/lib/content/commands/npm-config.md b/docs/lib/content/commands/npm-config.md index 270858f8bff8f..5267d49960fe7 100644 --- a/docs/lib/content/commands/npm-config.md +++ b/docs/lib/content/commands/npm-config.md @@ -83,6 +83,16 @@ npm config edit Opens the config file in an editor. Use the `--global` flag to edit the global config. +#### fix + +```bash +npm config fix +``` + +Attempts to repair invalid configuration items. Usually this means +attaching authentication config (i.e. `_auth`, `_authToken`) to the +configured `registry`. + ### Configuration From 878ddfb5b68c03bdcd7d7da8dae92c4947942801 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Thu, 3 Nov 2022 14:32:25 -0700 Subject: [PATCH 04/15] deps: @npmcli/fs@3.1.0 This also removes `readdir-scoped-modules` and `@npmcli/fs` since those are now a part of `@npmcli/fs` --- DEPENDENCIES.md | 22 +- lib/utils/completion/installed-shallow.js | 8 +- node_modules/.gitignore | 4 - node_modules/@npmcli/fs/lib/index.js | 4 + node_modules/@npmcli/fs/lib/move-file.js | 78 ++++++ node_modules/@npmcli/fs/lib/readdir-scoped.js | 20 ++ node_modules/@npmcli/fs/package.json | 8 +- node_modules/asap/CHANGES.md | 70 ------ node_modules/asap/LICENSE.md | 21 -- node_modules/asap/asap.js | 65 ----- node_modules/asap/browser-asap.js | 66 ------ node_modules/asap/browser-raw.js | 223 ------------------ node_modules/asap/package.json | 58 ----- node_modules/asap/raw.js | 101 -------- node_modules/debuglog/LICENSE | 19 -- node_modules/debuglog/debuglog.js | 22 -- node_modules/debuglog/package.json | 21 -- node_modules/dezalgo/LICENSE | 15 -- node_modules/dezalgo/dezalgo.js | 22 -- node_modules/dezalgo/package.json | 46 ---- node_modules/readdir-scoped-modules/LICENSE | 15 -- .../readdir-scoped-modules/package.json | 34 --- .../readdir-scoped-modules/readdir.js | 121 ---------- package-lock.json | 20 +- package.json | 4 +- .../arborist/lib/arborist/build-ideal-tree.js | 6 +- .../arborist/lib/arborist/load-actual.js | 9 +- workspaces/arborist/lib/arborist/reify.js | 2 +- workspaces/arborist/package.json | 3 +- workspaces/arborist/test/arborist/reify.js | 54 +++-- 30 files changed, 168 insertions(+), 993 deletions(-) create mode 100644 node_modules/@npmcli/fs/lib/move-file.js create mode 100644 node_modules/@npmcli/fs/lib/readdir-scoped.js delete mode 100644 node_modules/asap/CHANGES.md delete mode 100644 node_modules/asap/LICENSE.md delete mode 100644 node_modules/asap/asap.js delete mode 100644 node_modules/asap/browser-asap.js delete mode 100644 node_modules/asap/browser-raw.js delete mode 100644 node_modules/asap/package.json delete mode 100644 node_modules/asap/raw.js delete mode 100644 node_modules/debuglog/LICENSE delete mode 100644 node_modules/debuglog/debuglog.js delete mode 100644 node_modules/debuglog/package.json delete mode 100644 node_modules/dezalgo/LICENSE delete mode 100644 node_modules/dezalgo/dezalgo.js delete mode 100644 node_modules/dezalgo/package.json delete mode 100644 node_modules/readdir-scoped-modules/LICENSE delete mode 100644 node_modules/readdir-scoped-modules/package.json delete mode 100644 node_modules/readdir-scoped-modules/readdir.js diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index 1933339759f0a..d4a82a0af1b43 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -12,7 +12,6 @@ graph LR; cacache-->npmcli-move-file["@npmcli/move-file"]; cacache-->ssri; cacache-->unique-filename; - dezalgo-->wrappy; init-package-json-->npm-package-arg; init-package-json-->promzard; init-package-json-->read-package-json; @@ -133,7 +132,6 @@ graph LR; npm-->read-package-json-fast; npm-->read-package-json; npm-->read; - npm-->readdir-scoped-modules; npm-->semver; npm-->ssri; npm-->treeverse; @@ -167,10 +165,10 @@ graph LR; npmcli-arborist-->npm-pick-manifest; npmcli-arborist-->npm-registry-fetch; npmcli-arborist-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-arborist-->npmcli-fs["@npmcli/fs"]; npmcli-arborist-->npmcli-installed-package-contents["@npmcli/installed-package-contents"]; npmcli-arborist-->npmcli-map-workspaces["@npmcli/map-workspaces"]; npmcli-arborist-->npmcli-metavuln-calculator["@npmcli/metavuln-calculator"]; - npmcli-arborist-->npmcli-move-file["@npmcli/move-file"]; npmcli-arborist-->npmcli-name-from-folder["@npmcli/name-from-folder"]; npmcli-arborist-->npmcli-node-gyp["@npmcli/node-gyp"]; npmcli-arborist-->npmcli-package-json["@npmcli/package-json"]; @@ -182,7 +180,6 @@ graph LR; npmcli-arborist-->parse-conflict-json; npmcli-arborist-->proc-log; npmcli-arborist-->read-package-json-fast; - npmcli-arborist-->readdir-scoped-modules; npmcli-arborist-->semver; npmcli-arborist-->ssri; npmcli-arborist-->treeverse; @@ -238,7 +235,6 @@ graph LR; read-package-json-->npm-normalize-package-bin; read-package-json-fast-->json-parse-even-better-errors; read-package-json-fast-->npm-normalize-package-bin; - readdir-scoped-modules-->dezalgo; unique-filename-->unique-slug; ``` @@ -290,8 +286,6 @@ graph LR; columnify-->wcwidth; debug-->ms; defaults-->clone; - dezalgo-->asap; - dezalgo-->wrappy; encoding-->iconv-lite; fs-minipass-->minipass; gauge-->aproba; @@ -535,7 +529,6 @@ graph LR; npm-->read-package-json-fast; npm-->read-package-json; npm-->read; - npm-->readdir-scoped-modules; npm-->remark-gfm; npm-->remark-github; npm-->remark; @@ -591,10 +584,10 @@ graph LR; npmcli-arborist-->npm-pick-manifest; npmcli-arborist-->npm-registry-fetch; npmcli-arborist-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-arborist-->npmcli-fs["@npmcli/fs"]; npmcli-arborist-->npmcli-installed-package-contents["@npmcli/installed-package-contents"]; npmcli-arborist-->npmcli-map-workspaces["@npmcli/map-workspaces"]; npmcli-arborist-->npmcli-metavuln-calculator["@npmcli/metavuln-calculator"]; - npmcli-arborist-->npmcli-move-file["@npmcli/move-file"]; npmcli-arborist-->npmcli-name-from-folder["@npmcli/name-from-folder"]; npmcli-arborist-->npmcli-node-gyp["@npmcli/node-gyp"]; npmcli-arborist-->npmcli-package-json["@npmcli/package-json"]; @@ -608,7 +601,6 @@ graph LR; npmcli-arborist-->promise-all-reject-late; npmcli-arborist-->promise-call-limit; npmcli-arborist-->read-package-json-fast; - npmcli-arborist-->readdir-scoped-modules; npmcli-arborist-->semver; npmcli-arborist-->ssri; npmcli-arborist-->tap; @@ -708,10 +700,6 @@ graph LR; readable-stream-->inherits; readable-stream-->string_decoder; readable-stream-->util-deprecate; - readdir-scoped-modules-->debuglog; - readdir-scoped-modules-->dezalgo; - readdir-scoped-modules-->graceful-fs; - readdir-scoped-modules-->once; rimraf-->glob; semver-->lru-cache; smoke-tests-->minify-registry-metadata; @@ -769,6 +757,6 @@ packages higher up the chain. - pacote, libnpmaccess, libnpmhook, libnpmorg, libnpmsearch, libnpmteam, npm-profile - npm-registry-fetch, libnpmversion - @npmcli/git, make-fetch-happen, @npmcli/config, init-package-json - - @npmcli/installed-package-contents, @npmcli/map-workspaces, cacache, npm-pick-manifest, @npmcli/run-script, read-package-json, readdir-scoped-modules, promzard - - @npmcli/docs, npm-bundled, read-package-json-fast, @npmcli/fs, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, dezalgo, read - - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, semver, @npmcli/move-file, fs-minipass, ssri, unique-slug, @npmcli/promise-spawn, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, wrappy, treeverse, minify-registry-metadata, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate + - @npmcli/installed-package-contents, @npmcli/map-workspaces, cacache, npm-pick-manifest, @npmcli/run-script, read-package-json, promzard + - @npmcli/docs, @npmcli/fs, npm-bundled, read-package-json-fast, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, read + - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, @npmcli/move-file, fs-minipass, ssri, unique-slug, @npmcli/promise-spawn, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, minify-registry-metadata, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate diff --git a/lib/utils/completion/installed-shallow.js b/lib/utils/completion/installed-shallow.js index 686c95e63245e..d59318fe78541 100644 --- a/lib/utils/completion/installed-shallow.js +++ b/lib/utils/completion/installed-shallow.js @@ -1,8 +1,10 @@ -const { promisify } = require('util') -const readdir = promisify(require('readdir-scoped-modules')) +const { readdirScoped } = require('@npmcli/fs') const installedShallow = async (npm, opts) => { - const names = global => readdir(global ? npm.globalDir : npm.localDir) + const names = async global => { + const paths = await readdirScoped(global ? npm.globalDir : npm.localDir) + return paths.map(p => p.replace(/\\/g, '/')) + } const { conf: { argv: { remain } } } = opts if (remain.length > 3) { return null diff --git a/node_modules/.gitignore b/node_modules/.gitignore index b1752b46d3b5e..292e3d4dd1bf8 100644 --- a/node_modules/.gitignore +++ b/node_modules/.gitignore @@ -47,7 +47,6 @@ /are-we-there-yet/node_modules/* !/are-we-there-yet/node_modules/buffer !/are-we-there-yet/node_modules/readable-stream -!/asap !/balanced-match !/base64-js !/bin-links @@ -75,11 +74,9 @@ !/debug/node_modules/ /debug/node_modules/* !/debug/node_modules/ms -!/debuglog !/defaults !/delegates !/depd -!/dezalgo !/diff !/emoji-regex !/encoding @@ -209,7 +206,6 @@ !/read-package-json !/read !/readable-stream -!/readdir-scoped-modules !/retry !/rimraf !/rimraf/node_modules/ diff --git a/node_modules/@npmcli/fs/lib/index.js b/node_modules/@npmcli/fs/lib/index.js index 0dc02f8a3da44..81c746304cc42 100644 --- a/node_modules/@npmcli/fs/lib/index.js +++ b/node_modules/@npmcli/fs/lib/index.js @@ -2,8 +2,12 @@ const cp = require('./cp/index.js') const withTempDir = require('./with-temp-dir.js') +const readdirScoped = require('./readdir-scoped.js') +const moveFile = require('./move-file.js') module.exports = { cp, withTempDir, + readdirScoped, + moveFile, } diff --git a/node_modules/@npmcli/fs/lib/move-file.js b/node_modules/@npmcli/fs/lib/move-file.js new file mode 100644 index 0000000000000..d56e06d384659 --- /dev/null +++ b/node_modules/@npmcli/fs/lib/move-file.js @@ -0,0 +1,78 @@ +const { dirname, join, resolve, relative, isAbsolute } = require('path') +const fs = require('fs/promises') + +const pathExists = async path => { + try { + await fs.access(path) + return true + } catch (er) { + return er.code !== 'ENOENT' + } +} + +const moveFile = async (source, destination, options = {}, root = true, symlinks = []) => { + if (!source || !destination) { + throw new TypeError('`source` and `destination` file required') + } + + options = { + overwrite: true, + ...options, + } + + if (!options.overwrite && await pathExists(destination)) { + throw new Error(`The destination file exists: ${destination}`) + } + + await fs.mkdir(dirname(destination), { recursive: true }) + + try { + await fs.rename(source, destination) + } catch (error) { + if (error.code === 'EXDEV' || error.code === 'EPERM') { + const sourceStat = await fs.lstat(source) + if (sourceStat.isDirectory()) { + const files = await fs.readdir(source) + await Promise.all(files.map((file) => + moveFile(join(source, file), join(destination, file), options, false, symlinks) + )) + } else if (sourceStat.isSymbolicLink()) { + symlinks.push({ source, destination }) + } else { + await fs.copyFile(source, destination) + } + } else { + throw error + } + } + + if (root) { + await Promise.all(symlinks.map(async ({ source: symSource, destination: symDestination }) => { + let target = await fs.readlink(symSource) + // junction symlinks in windows will be absolute paths, so we need to + // make sure they point to the symlink destination + if (isAbsolute(target)) { + target = resolve(symDestination, relative(symSource, target)) + } + // try to determine what the actual file is so we can create the correct + // type of symlink in windows + let targetStat = 'file' + try { + targetStat = await fs.stat(resolve(dirname(symSource), target)) + if (targetStat.isDirectory()) { + targetStat = 'junction' + } + } catch { + // targetStat remains 'file' + } + await fs.symlink( + target, + symDestination, + targetStat + ) + })) + await fs.rm(source, { recursive: true, force: true }) + } +} + +module.exports = moveFile diff --git a/node_modules/@npmcli/fs/lib/readdir-scoped.js b/node_modules/@npmcli/fs/lib/readdir-scoped.js new file mode 100644 index 0000000000000..cd601dfbe7486 --- /dev/null +++ b/node_modules/@npmcli/fs/lib/readdir-scoped.js @@ -0,0 +1,20 @@ +const { readdir } = require('fs/promises') +const { join } = require('path') + +const readdirScoped = async (dir) => { + const results = [] + + for (const item of await readdir(dir)) { + if (item.startsWith('@')) { + for (const scopedItem of await readdir(join(dir, item))) { + results.push(join(item, scopedItem)) + } + } else { + results.push(item) + } + } + + return results +} + +module.exports = readdirScoped diff --git a/node_modules/@npmcli/fs/package.json b/node_modules/@npmcli/fs/package.json index 2eabc35dab33b..28eb613388418 100644 --- a/node_modules/@npmcli/fs/package.json +++ b/node_modules/@npmcli/fs/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/fs", - "version": "3.0.0", + "version": "3.1.0", "description": "filesystem utilities for the npm cli", "main": "lib/index.js", "files": [ @@ -29,8 +29,8 @@ "author": "GitHub Inc.", "license": "ISC", "devDependencies": { - "@npmcli/eslint-config": "^3.0.1", - "@npmcli/template-oss": "4.5.1", + "@npmcli/eslint-config": "^4.0.0", + "@npmcli/template-oss": "4.8.0", "tap": "^16.0.1" }, "dependencies": { @@ -41,7 +41,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" + "version": "4.8.0" }, "tap": { "nyc-arg": [ diff --git a/node_modules/asap/CHANGES.md b/node_modules/asap/CHANGES.md deleted file mode 100644 index f105b91956d15..0000000000000 --- a/node_modules/asap/CHANGES.md +++ /dev/null @@ -1,70 +0,0 @@ - -## 2.0.6 - -Version 2.0.4 adds support for React Native by clarifying in package.json that -the browser environment does not support Node.js domains. -Why this is necessary, we leave as an exercise for the user. - -## 2.0.3 - -Version 2.0.3 fixes a bug when adjusting the capacity of the task queue. - -## 2.0.1-2.02 - -Version 2.0.1 fixes a bug in the way redirects were expressed that affected the -function of Browserify, but which Mr would tolerate. - -## 2.0.0 - -Version 2 of ASAP is a full rewrite with a few salient changes. -First, the ASAP source is CommonJS only and designed with [Browserify][] and -[Browserify-compatible][Mr] module loaders in mind. - -[Browserify]: https://github.com/substack/node-browserify -[Mr]: https://github.com/montagejs/mr - -The new version has been refactored in two dimensions. -Support for Node.js and browsers have been separated, using Browserify -redirects and ASAP has been divided into two modules. -The "raw" layer depends on the tasks to catch thrown exceptions and unravel -Node.js domains. - -The full implementation of ASAP is loadable as `require("asap")` in both Node.js -and browsers. - -The raw layer that lacks exception handling overhead is loadable as -`require("asap/raw")`. -The interface is the same for both layers. - -Tasks are no longer required to be functions, but can rather be any object that -implements `task.call()`. -With this feature you can recycle task objects to avoid garbage collector churn -and avoid closures in general. - -The implementation has been rigorously documented so that our successors can -understand the scope of the problem that this module solves and all of its -nuances, ensuring that the next generation of implementations know what details -are essential. - -- [asap.js](https://github.com/kriskowal/asap/blob/master/asap.js) -- [raw.js](https://github.com/kriskowal/asap/blob/master/raw.js) -- [browser-asap.js](https://github.com/kriskowal/asap/blob/master/browser-asap.js) -- [browser-raw.js](https://github.com/kriskowal/asap/blob/master/browser-raw.js) - -The new version has also been rigorously tested across a broad spectrum of -browsers, in both the window and worker context. -The following charts capture the browser test results for the most recent -release. -The first chart shows test results for ASAP running in the main window context. -The second chart shows test results for ASAP running in a web worker context. -Test results are inconclusive (grey) on browsers that do not support web -workers. -These data are captured automatically by [Continuous -Integration][]. - -![Browser Compatibility](http://kriskowal-asap.s3-website-us-west-2.amazonaws.com/train/integration-2/saucelabs-results-matrix.svg) - -![Compatibility in Web Workers](http://kriskowal-asap.s3-website-us-west-2.amazonaws.com/train/integration-2/saucelabs-worker-results-matrix.svg) - -[Continuous Integration]: https://github.com/kriskowal/asap/blob/master/CONTRIBUTING.md - diff --git a/node_modules/asap/LICENSE.md b/node_modules/asap/LICENSE.md deleted file mode 100644 index ba18c61390db9..0000000000000 --- a/node_modules/asap/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright 2009–2014 Contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. - diff --git a/node_modules/asap/asap.js b/node_modules/asap/asap.js deleted file mode 100644 index f04fcd58fc0b2..0000000000000 --- a/node_modules/asap/asap.js +++ /dev/null @@ -1,65 +0,0 @@ -"use strict"; - -var rawAsap = require("./raw"); -var freeTasks = []; - -/** - * Calls a task as soon as possible after returning, in its own event, with - * priority over IO events. An exception thrown in a task can be handled by - * `process.on("uncaughtException") or `domain.on("error")`, but will otherwise - * crash the process. If the error is handled, all subsequent tasks will - * resume. - * - * @param {{call}} task A callable object, typically a function that takes no - * arguments. - */ -module.exports = asap; -function asap(task) { - var rawTask; - if (freeTasks.length) { - rawTask = freeTasks.pop(); - } else { - rawTask = new RawTask(); - } - rawTask.task = task; - rawTask.domain = process.domain; - rawAsap(rawTask); -} - -function RawTask() { - this.task = null; - this.domain = null; -} - -RawTask.prototype.call = function () { - if (this.domain) { - this.domain.enter(); - } - var threw = true; - try { - this.task.call(); - threw = false; - // If the task throws an exception (presumably) Node.js restores the - // domain stack for the next event. - if (this.domain) { - this.domain.exit(); - } - } finally { - // We use try/finally and a threw flag to avoid messing up stack traces - // when we catch and release errors. - if (threw) { - // In Node.js, uncaught exceptions are considered fatal errors. - // Re-throw them to interrupt flushing! - // Ensure that flushing continues if an uncaught exception is - // suppressed listening process.on("uncaughtException") or - // domain.on("error"). - rawAsap.requestFlush(); - } - // If the task threw an error, we do not want to exit the domain here. - // Exiting the domain would prevent the domain from catching the error. - this.task = null; - this.domain = null; - freeTasks.push(this); - } -}; - diff --git a/node_modules/asap/browser-asap.js b/node_modules/asap/browser-asap.js deleted file mode 100644 index 805c9824605b0..0000000000000 --- a/node_modules/asap/browser-asap.js +++ /dev/null @@ -1,66 +0,0 @@ -"use strict"; - -// rawAsap provides everything we need except exception management. -var rawAsap = require("./raw"); -// RawTasks are recycled to reduce GC churn. -var freeTasks = []; -// We queue errors to ensure they are thrown in right order (FIFO). -// Array-as-queue is good enough here, since we are just dealing with exceptions. -var pendingErrors = []; -var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError); - -function throwFirstError() { - if (pendingErrors.length) { - throw pendingErrors.shift(); - } -} - -/** - * Calls a task as soon as possible after returning, in its own event, with priority - * over other events like animation, reflow, and repaint. An error thrown from an - * event will not interrupt, nor even substantially slow down the processing of - * other events, but will be rather postponed to a lower priority event. - * @param {{call}} task A callable object, typically a function that takes no - * arguments. - */ -module.exports = asap; -function asap(task) { - var rawTask; - if (freeTasks.length) { - rawTask = freeTasks.pop(); - } else { - rawTask = new RawTask(); - } - rawTask.task = task; - rawAsap(rawTask); -} - -// We wrap tasks with recyclable task objects. A task object implements -// `call`, just like a function. -function RawTask() { - this.task = null; -} - -// The sole purpose of wrapping the task is to catch the exception and recycle -// the task object after its single use. -RawTask.prototype.call = function () { - try { - this.task.call(); - } catch (error) { - if (asap.onerror) { - // This hook exists purely for testing purposes. - // Its name will be periodically randomized to break any code that - // depends on its existence. - asap.onerror(error); - } else { - // In a web browser, exceptions are not fatal. However, to avoid - // slowing down the queue of pending tasks, we rethrow the error in a - // lower priority turn. - pendingErrors.push(error); - requestErrorThrow(); - } - } finally { - this.task = null; - freeTasks[freeTasks.length] = this; - } -}; diff --git a/node_modules/asap/browser-raw.js b/node_modules/asap/browser-raw.js deleted file mode 100644 index 9cee7e32eb5d3..0000000000000 --- a/node_modules/asap/browser-raw.js +++ /dev/null @@ -1,223 +0,0 @@ -"use strict"; - -// Use the fastest means possible to execute a task in its own turn, with -// priority over other events including IO, animation, reflow, and redraw -// events in browsers. -// -// An exception thrown by a task will permanently interrupt the processing of -// subsequent tasks. The higher level `asap` function ensures that if an -// exception is thrown by a task, that the task queue will continue flushing as -// soon as possible, but if you use `rawAsap` directly, you are responsible to -// either ensure that no exceptions are thrown from your task, or to manually -// call `rawAsap.requestFlush` if an exception is thrown. -module.exports = rawAsap; -function rawAsap(task) { - if (!queue.length) { - requestFlush(); - flushing = true; - } - // Equivalent to push, but avoids a function call. - queue[queue.length] = task; -} - -var queue = []; -// Once a flush has been requested, no further calls to `requestFlush` are -// necessary until the next `flush` completes. -var flushing = false; -// `requestFlush` is an implementation-specific method that attempts to kick -// off a `flush` event as quickly as possible. `flush` will attempt to exhaust -// the event queue before yielding to the browser's own event loop. -var requestFlush; -// The position of the next task to execute in the task queue. This is -// preserved between calls to `flush` so that it can be resumed if -// a task throws an exception. -var index = 0; -// If a task schedules additional tasks recursively, the task queue can grow -// unbounded. To prevent memory exhaustion, the task queue will periodically -// truncate already-completed tasks. -var capacity = 1024; - -// The flush function processes all tasks that have been scheduled with -// `rawAsap` unless and until one of those tasks throws an exception. -// If a task throws an exception, `flush` ensures that its state will remain -// consistent and will resume where it left off when called again. -// However, `flush` does not make any arrangements to be called again if an -// exception is thrown. -function flush() { - while (index < queue.length) { - var currentIndex = index; - // Advance the index before calling the task. This ensures that we will - // begin flushing on the next task the task throws an error. - index = index + 1; - queue[currentIndex].call(); - // Prevent leaking memory for long chains of recursive calls to `asap`. - // If we call `asap` within tasks scheduled by `asap`, the queue will - // grow, but to avoid an O(n) walk for every task we execute, we don't - // shift tasks off the queue after they have been executed. - // Instead, we periodically shift 1024 tasks off the queue. - if (index > capacity) { - // Manually shift all values starting at the index back to the - // beginning of the queue. - for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { - queue[scan] = queue[scan + index]; - } - queue.length -= index; - index = 0; - } - } - queue.length = 0; - index = 0; - flushing = false; -} - -// `requestFlush` is implemented using a strategy based on data collected from -// every available SauceLabs Selenium web driver worker at time of writing. -// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 - -// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that -// have WebKitMutationObserver but not un-prefixed MutationObserver. -// Must use `global` or `self` instead of `window` to work in both frames and web -// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. - -/* globals self */ -var scope = typeof global !== "undefined" ? global : self; -var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; - -// MutationObservers are desirable because they have high priority and work -// reliably everywhere they are implemented. -// They are implemented in all modern browsers. -// -// - Android 4-4.3 -// - Chrome 26-34 -// - Firefox 14-29 -// - Internet Explorer 11 -// - iPad Safari 6-7.1 -// - iPhone Safari 7-7.1 -// - Safari 6-7 -if (typeof BrowserMutationObserver === "function") { - requestFlush = makeRequestCallFromMutationObserver(flush); - -// MessageChannels are desirable because they give direct access to the HTML -// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera -// 11-12, and in web workers in many engines. -// Although message channels yield to any queued rendering and IO tasks, they -// would be better than imposing the 4ms delay of timers. -// However, they do not work reliably in Internet Explorer or Safari. - -// Internet Explorer 10 is the only browser that has setImmediate but does -// not have MutationObservers. -// Although setImmediate yields to the browser's renderer, it would be -// preferrable to falling back to setTimeout since it does not have -// the minimum 4ms penalty. -// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and -// Desktop to a lesser extent) that renders both setImmediate and -// MessageChannel useless for the purposes of ASAP. -// https://github.com/kriskowal/q/issues/396 - -// Timers are implemented universally. -// We fall back to timers in workers in most engines, and in foreground -// contexts in the following browsers. -// However, note that even this simple case requires nuances to operate in a -// broad spectrum of browsers. -// -// - Firefox 3-13 -// - Internet Explorer 6-9 -// - iPad Safari 4.3 -// - Lynx 2.8.7 -} else { - requestFlush = makeRequestCallFromTimer(flush); -} - -// `requestFlush` requests that the high priority event queue be flushed as -// soon as possible. -// This is useful to prevent an error thrown in a task from stalling the event -// queue if the exception handled by Node.js’s -// `process.on("uncaughtException")` or by a domain. -rawAsap.requestFlush = requestFlush; - -// To request a high priority event, we induce a mutation observer by toggling -// the text of a text node between "1" and "-1". -function makeRequestCallFromMutationObserver(callback) { - var toggle = 1; - var observer = new BrowserMutationObserver(callback); - var node = document.createTextNode(""); - observer.observe(node, {characterData: true}); - return function requestCall() { - toggle = -toggle; - node.data = toggle; - }; -} - -// The message channel technique was discovered by Malte Ubl and was the -// original foundation for this library. -// http://www.nonblocking.io/2011/06/windownexttick.html - -// Safari 6.0.5 (at least) intermittently fails to create message ports on a -// page's first load. Thankfully, this version of Safari supports -// MutationObservers, so we don't need to fall back in that case. - -// function makeRequestCallFromMessageChannel(callback) { -// var channel = new MessageChannel(); -// channel.port1.onmessage = callback; -// return function requestCall() { -// channel.port2.postMessage(0); -// }; -// } - -// For reasons explained above, we are also unable to use `setImmediate` -// under any circumstances. -// Even if we were, there is another bug in Internet Explorer 10. -// It is not sufficient to assign `setImmediate` to `requestFlush` because -// `setImmediate` must be called *by name* and therefore must be wrapped in a -// closure. -// Never forget. - -// function makeRequestCallFromSetImmediate(callback) { -// return function requestCall() { -// setImmediate(callback); -// }; -// } - -// Safari 6.0 has a problem where timers will get lost while the user is -// scrolling. This problem does not impact ASAP because Safari 6.0 supports -// mutation observers, so that implementation is used instead. -// However, if we ever elect to use timers in Safari, the prevalent work-around -// is to add a scroll event listener that calls for a flush. - -// `setTimeout` does not call the passed callback if the delay is less than -// approximately 7 in web workers in Firefox 8 through 18, and sometimes not -// even then. - -function makeRequestCallFromTimer(callback) { - return function requestCall() { - // We dispatch a timeout with a specified delay of 0 for engines that - // can reliably accommodate that request. This will usually be snapped - // to a 4 milisecond delay, but once we're flushing, there's no delay - // between events. - var timeoutHandle = setTimeout(handleTimer, 0); - // However, since this timer gets frequently dropped in Firefox - // workers, we enlist an interval handle that will try to fire - // an event 20 times per second until it succeeds. - var intervalHandle = setInterval(handleTimer, 50); - - function handleTimer() { - // Whichever timer succeeds will cancel both timers and - // execute the callback. - clearTimeout(timeoutHandle); - clearInterval(intervalHandle); - callback(); - } - }; -} - -// This is for `asap.js` only. -// Its name will be periodically randomized to break any code that depends on -// its existence. -rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; - -// ASAP was originally a nextTick shim included in Q. This was factored out -// into this ASAP package. It was later adapted to RSVP which made further -// amendments. These decisions, particularly to marginalize MessageChannel and -// to capture the MutationObserver implementation in a closure, were integrated -// back into ASAP proper. -// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js diff --git a/node_modules/asap/package.json b/node_modules/asap/package.json deleted file mode 100644 index ae9f303bcd15d..0000000000000 --- a/node_modules/asap/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "asap", - "version": "2.0.6", - "description": "High-priority task queue for Node.js and browsers", - "keywords": [ - "event", - "task", - "queue" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/kriskowal/asap.git" - }, - "main": "./asap.js", - "browser": { - "./asap": "./browser-asap.js", - "./asap.js": "./browser-asap.js", - "./raw": "./browser-raw.js", - "./raw.js": "./browser-raw.js", - "./test/domain.js": "./test/browser-domain.js" - }, - "react-native": { - "domain": false - }, - "files": [ - "raw.js", - "asap.js", - "browser-raw.js", - "browser-asap.js" - ], - "scripts": { - "test": "npm run lint && npm run test-node", - "test-travis": "npm run lint && npm run test-node && npm run test-saucelabs && npm run test-saucelabs-worker", - "test-node": "node test/asap-test.js", - "test-publish": "node scripts/publish-bundle.js test/asap-test.js | pbcopy", - "test-browser": "node scripts/publish-bundle.js test/asap-test.js | xargs opener", - "test-saucelabs": "node scripts/saucelabs.js test/asap-test.js scripts/saucelabs-spot-configurations.json", - "test-saucelabs-all": "node scripts/saucelabs.js test/asap-test.js scripts/saucelabs-all-configurations.json", - "test-saucelabs-worker": "node scripts/saucelabs-worker-test.js scripts/saucelabs-spot-configurations.json", - "test-saucelabs-worker-all": "node scripts/saucelabs-worker-test.js scripts/saucelabs-all-configurations.json", - "lint": "jshint raw.js asap.js browser-raw.js browser-asap.js $(find scripts -name '*.js' | grep -v gauntlet)", - "benchmarks": "node benchmarks" - }, - "devDependencies": { - "events": "^1.0.1", - "jshint": "^2.5.1", - "knox": "^0.8.10", - "mr": "^2.0.5", - "opener": "^1.3.0", - "q": "^2.0.3", - "q-io": "^2.0.3", - "saucelabs": "^0.1.1", - "wd": "^0.2.21", - "weak-map": "^1.0.5", - "benchmark": "^1.0.0" - } -} diff --git a/node_modules/asap/raw.js b/node_modules/asap/raw.js deleted file mode 100644 index ae3b892316842..0000000000000 --- a/node_modules/asap/raw.js +++ /dev/null @@ -1,101 +0,0 @@ -"use strict"; - -var domain; // The domain module is executed on demand -var hasSetImmediate = typeof setImmediate === "function"; - -// Use the fastest means possible to execute a task in its own turn, with -// priority over other events including network IO events in Node.js. -// -// An exception thrown by a task will permanently interrupt the processing of -// subsequent tasks. The higher level `asap` function ensures that if an -// exception is thrown by a task, that the task queue will continue flushing as -// soon as possible, but if you use `rawAsap` directly, you are responsible to -// either ensure that no exceptions are thrown from your task, or to manually -// call `rawAsap.requestFlush` if an exception is thrown. -module.exports = rawAsap; -function rawAsap(task) { - if (!queue.length) { - requestFlush(); - flushing = true; - } - // Avoids a function call - queue[queue.length] = task; -} - -var queue = []; -// Once a flush has been requested, no further calls to `requestFlush` are -// necessary until the next `flush` completes. -var flushing = false; -// The position of the next task to execute in the task queue. This is -// preserved between calls to `flush` so that it can be resumed if -// a task throws an exception. -var index = 0; -// If a task schedules additional tasks recursively, the task queue can grow -// unbounded. To prevent memory excaustion, the task queue will periodically -// truncate already-completed tasks. -var capacity = 1024; - -// The flush function processes all tasks that have been scheduled with -// `rawAsap` unless and until one of those tasks throws an exception. -// If a task throws an exception, `flush` ensures that its state will remain -// consistent and will resume where it left off when called again. -// However, `flush` does not make any arrangements to be called again if an -// exception is thrown. -function flush() { - while (index < queue.length) { - var currentIndex = index; - // Advance the index before calling the task. This ensures that we will - // begin flushing on the next task the task throws an error. - index = index + 1; - queue[currentIndex].call(); - // Prevent leaking memory for long chains of recursive calls to `asap`. - // If we call `asap` within tasks scheduled by `asap`, the queue will - // grow, but to avoid an O(n) walk for every task we execute, we don't - // shift tasks off the queue after they have been executed. - // Instead, we periodically shift 1024 tasks off the queue. - if (index > capacity) { - // Manually shift all values starting at the index back to the - // beginning of the queue. - for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { - queue[scan] = queue[scan + index]; - } - queue.length -= index; - index = 0; - } - } - queue.length = 0; - index = 0; - flushing = false; -} - -rawAsap.requestFlush = requestFlush; -function requestFlush() { - // Ensure flushing is not bound to any domain. - // It is not sufficient to exit the domain, because domains exist on a stack. - // To execute code outside of any domain, the following dance is necessary. - var parentDomain = process.domain; - if (parentDomain) { - if (!domain) { - // Lazy execute the domain module. - // Only employed if the user elects to use domains. - domain = require("domain"); - } - domain.active = process.domain = null; - } - - // `setImmediate` is slower that `process.nextTick`, but `process.nextTick` - // cannot handle recursion. - // `requestFlush` will only be called recursively from `asap.js`, to resume - // flushing after an error is thrown into a domain. - // Conveniently, `setImmediate` was introduced in the same version - // `process.nextTick` started throwing recursion errors. - if (flushing && hasSetImmediate) { - setImmediate(flush); - } else { - process.nextTick(flush); - } - - if (parentDomain) { - domain.active = process.domain = parentDomain; - } -} diff --git a/node_modules/debuglog/LICENSE b/node_modules/debuglog/LICENSE deleted file mode 100644 index a3187cc10022f..0000000000000 --- a/node_modules/debuglog/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright Joyent, Inc. and other Node contributors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/node_modules/debuglog/debuglog.js b/node_modules/debuglog/debuglog.js deleted file mode 100644 index 748fd72a1a68f..0000000000000 --- a/node_modules/debuglog/debuglog.js +++ /dev/null @@ -1,22 +0,0 @@ -var util = require('util'); - -module.exports = (util && util.debuglog) || debuglog; - -var debugs = {}; -var debugEnviron = process.env.NODE_DEBUG || ''; - -function debuglog(set) { - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = util.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; diff --git a/node_modules/debuglog/package.json b/node_modules/debuglog/package.json deleted file mode 100644 index e51ecc95f11b5..0000000000000 --- a/node_modules/debuglog/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "debuglog", - "version": "1.0.1", - "description": "backport of util.debuglog from node v0.11", - "license": "MIT", - "main": "debuglog.js", - "repository": { - "type": "git", - "url": "https://github.com/sam-github/node-debuglog.git" - }, - "author": { - "name": "Sam Roberts", - "email": "sam@strongloop.com" - }, - "engines": { - "node": "*" - }, - "browser": { - "util": false - } -} diff --git a/node_modules/dezalgo/LICENSE b/node_modules/dezalgo/LICENSE deleted file mode 100644 index 19129e315fe59..0000000000000 --- a/node_modules/dezalgo/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/dezalgo/dezalgo.js b/node_modules/dezalgo/dezalgo.js deleted file mode 100644 index 04fd3ba78146d..0000000000000 --- a/node_modules/dezalgo/dezalgo.js +++ /dev/null @@ -1,22 +0,0 @@ -var wrappy = require('wrappy') -module.exports = wrappy(dezalgo) - -var asap = require('asap') - -function dezalgo (cb) { - var sync = true - asap(function () { - sync = false - }) - - return function zalgoSafe() { - var args = arguments - var me = this - if (sync) - asap(function() { - cb.apply(me, args) - }) - else - cb.apply(me, args) - } -} diff --git a/node_modules/dezalgo/package.json b/node_modules/dezalgo/package.json deleted file mode 100644 index f8ba8ec2b6b7a..0000000000000 --- a/node_modules/dezalgo/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "dezalgo", - "version": "1.0.4", - "description": "Contain async insanity so that the dark pony lord doesn't eat souls", - "main": "dezalgo.js", - "files": [ - "dezalgo.js" - ], - "directories": { - "test": "test" - }, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - }, - "devDependencies": { - "tap": "^12.4.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/dezalgo" - }, - "keywords": [ - "async", - "zalgo", - "the dark pony", - "he comes", - "asynchrony of all holy and good", - "To invoke the hive mind representing chaos", - "Invoking the feeling of chaos. /Without order", - "The Nezperdian Hive Mind of Chaos, (zalgo………………)", - "He who waits beyond the wall", - "ZALGO", - "HE COMES", - "there used to be some funky unicode keywords here, but it broke the npm website on chrome, so they were removed, sorry" - ], - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/dezalgo/issues" - }, - "homepage": "https://github.com/npm/dezalgo" -} diff --git a/node_modules/readdir-scoped-modules/LICENSE b/node_modules/readdir-scoped-modules/LICENSE deleted file mode 100644 index 19129e315fe59..0000000000000 --- a/node_modules/readdir-scoped-modules/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/readdir-scoped-modules/package.json b/node_modules/readdir-scoped-modules/package.json deleted file mode 100644 index d41b99c2643a2..0000000000000 --- a/node_modules/readdir-scoped-modules/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "readdir-scoped-modules", - "version": "1.1.0", - "description": "Like `fs.readdir` but handling `@org/module` dirs as if they were a single entry.", - "main": "readdir.js", - "directories": { - "test": "test" - }, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - }, - "devDependencies": { - "tap": "^1.2.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/readdir-scoped-modules" - }, - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/readdir-scoped-modules/issues" - }, - "homepage": "https://github.com/npm/readdir-scoped-modules", - "files": [ - "readdir.js" - ] -} diff --git a/node_modules/readdir-scoped-modules/readdir.js b/node_modules/readdir-scoped-modules/readdir.js deleted file mode 100644 index 806d787051852..0000000000000 --- a/node_modules/readdir-scoped-modules/readdir.js +++ /dev/null @@ -1,121 +0,0 @@ -var fs = require ('graceful-fs') -var dz = require ('dezalgo') -var once = require ('once') -var path = require ('path') -var debug = require ('debuglog') ('rds') - -module . exports = readdir -readdir.sync = readdirSync - -function readdir (dir, cb) { - fs . readdir (dir, function (er, kids) { - if (er) - return cb (er) - - debug ('dir=%j, kids=%j', dir, kids) - readScopes (dir, kids, function (er, data) { - if (er) - return cb (er) - - // Sort for bonus consistency points - data = data . sort (function (a, b) { - return a > b ? 1 : -1 - }) - - return cb (null, data) - }) - }) -} - -function readdirSync (dir) { - var kids = fs . readdirSync (dir) - debug ('dir=%j, kids=%j', dir, kids) - var data = readScopesSync (dir, kids) - // Sort for bonus consistency points - data = data . sort (function (a, b) { - return a > b ? 1 : -1 - }) - - return data -} - -// Turn [ 'a', '@scope' ] into -// ['a', '@scope/foo', '@scope/bar'] -function readScopes (root, kids, cb) { - var scopes = kids . filter (function (kid) { - return kid . charAt (0) === '@' - }) - - kids = kids . filter (function (kid) { - return kid . charAt (0) !== '@' - }) - - debug ('scopes=%j', scopes) - - if (scopes . length === 0) - dz (cb) (null, kids) // prevent maybe-sync zalgo release - - cb = once (cb) - var l = scopes . length - scopes . forEach (function (scope) { - var scopedir = path . resolve (root, scope) - debug ('root=%j scope=%j scopedir=%j', root, scope, scopedir) - fs . readdir (scopedir, then . bind (null, scope)) - }) - - function then (scope, er, scopekids) { - if (er) - return cb (er) - - // XXX: Not sure how old this node bug is. Maybe superstition? - scopekids = scopekids . filter (function (scopekid) { - return !(scopekid === '.' || scopekid === '..' || !scopekid) - }) - - kids . push . apply (kids, scopekids . map (function (scopekid) { - return scope + '/' + scopekid - })) - - debug ('scope=%j scopekids=%j kids=%j', scope, scopekids, kids) - - if (--l === 0) - cb (null, kids) - } -} - -function readScopesSync (root, kids) { - var scopes = kids . filter (function (kid) { - return kid . charAt (0) === '@' - }) - - kids = kids . filter (function (kid) { - return kid . charAt (0) !== '@' - }) - - debug ('scopes=%j', scopes) - - if (scopes . length === 0) - return kids - - var l = scopes . length - scopes . forEach (function (scope) { - var scopedir = path . resolve (root, scope) - debug ('root=%j scope=%j scopedir=%j', root, scope, scopedir) - then (scope, fs . readdirSync (scopedir)) - }) - - function then (scope, scopekids) { - // XXX: Not sure how old this node bug is. Maybe superstition? - scopekids = scopekids . filter (function (scopekid) { - return !(scopekid === '.' || scopekid === '..' || !scopekid) - }) - - kids . push . apply (kids, scopekids . map (function (scopekid) { - return scope + '/' + scopekid - })) - - debug ('scope=%j scopekids=%j kids=%j', scope, scopekids, kids) - } - - return kids -} diff --git a/package-lock.json b/package-lock.json index ebe6671caa2ea..9ad0f788aa454 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,6 @@ "read", "read-package-json", "read-package-json-fast", - "readdir-scoped-modules", "rimraf", "semver", "ssri", @@ -143,7 +142,6 @@ "read": "~1.0.7", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.1", - "readdir-scoped-modules": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.8", "ssri": "^10.0.0", @@ -162,7 +160,7 @@ "devDependencies": { "@npmcli/docs": "^1.0.0", "@npmcli/eslint-config": "^4.0.0", - "@npmcli/fs": "^3.0.0", + "@npmcli/fs": "^3.1.0", "@npmcli/git": "^4.0.1", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", @@ -2106,9 +2104,10 @@ } }, "node_modules/@npmcli/fs": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", "inBundle": true, - "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -2872,7 +2871,7 @@ }, "node_modules/asap": { "version": "2.0.6", - "inBundle": true, + "dev": true, "license": "MIT" }, "node_modules/async-hook-domain": { @@ -3897,7 +3896,7 @@ }, "node_modules/debuglog": { "version": "1.0.1", - "inBundle": true, + "dev": true, "license": "MIT", "engines": { "node": "*" @@ -4083,7 +4082,7 @@ }, "node_modules/dezalgo": { "version": "1.0.4", - "inBundle": true, + "dev": true, "license": "ISC", "dependencies": { "asap": "^2.0.0", @@ -10823,7 +10822,7 @@ }, "node_modules/readdir-scoped-modules": { "version": "1.1.0", - "inBundle": true, + "dev": true, "license": "ISC", "dependencies": { "debuglog": "^1.0.1", @@ -15025,10 +15024,10 @@ "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", "@npmcli/installed-package-contents": "^2.0.0", "@npmcli/map-workspaces": "^3.0.0", "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/move-file": "^3.0.0", "@npmcli/name-from-folder": "^1.0.1", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^3.0.0", @@ -15053,7 +15052,6 @@ "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^3.0.1", - "readdir-scoped-modules": "^1.1.0", "semver": "^7.3.7", "ssri": "^10.0.0", "treeverse": "^3.0.0", diff --git a/package.json b/package.json index 3b0eb95f7c4a4..ca303c5a48580 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,6 @@ "read": "~1.0.7", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.1", - "readdir-scoped-modules": "^1.1.0", "rimraf": "^3.0.2", "semver": "^7.3.8", "ssri": "^10.0.0", @@ -184,7 +183,6 @@ "read", "read-package-json", "read-package-json-fast", - "readdir-scoped-modules", "rimraf", "semver", "ssri", @@ -199,7 +197,7 @@ "devDependencies": { "@npmcli/docs": "^1.0.0", "@npmcli/eslint-config": "^4.0.0", - "@npmcli/fs": "^3.0.0", + "@npmcli/fs": "^3.1.0", "@npmcli/git": "^4.0.1", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", diff --git a/workspaces/arborist/lib/arborist/build-ideal-tree.js b/workspaces/arborist/lib/arborist/build-ideal-tree.js index afcb67903da6d..d64bdd7e496ae 100644 --- a/workspaces/arborist/lib/arborist/build-ideal-tree.js +++ b/workspaces/arborist/lib/arborist/build-ideal-tree.js @@ -7,9 +7,8 @@ const cacache = require('cacache') const promiseCallLimit = require('promise-call-limit') const realpath = require('../../lib/realpath.js') const { resolve, dirname } = require('path') -const { promisify } = require('util') const treeCheck = require('../tree-check.js') -const readdir = promisify(require('readdir-scoped-modules')) +const { readdirScoped } = require('@npmcli/fs') const { lstat, readlink } = require('fs/promises') const { depth } = require('treeverse') const log = require('proc-log') @@ -447,7 +446,8 @@ module.exports = cls => class IdealTreeBuilder extends cls { const globalExplicitUpdateNames = [] if (this[_global] && (this[_updateAll] || this[_updateNames].length)) { const nm = resolve(this.path, 'node_modules') - for (const name of await readdir(nm).catch(() => [])) { + const paths = await readdirScoped(nm).catch(() => []) + for (const name of paths.map((p) => p.replace(/\\/g, '/'))) { tree.package.dependencies = tree.package.dependencies || {} const updateName = this[_updateNames].includes(name) if (this[_updateAll] || updateName) { diff --git a/workspaces/arborist/lib/arborist/load-actual.js b/workspaces/arborist/lib/arborist/load-actual.js index bb813806e5556..6c3f917c6ac9d 100644 --- a/workspaces/arborist/lib/arborist/load-actual.js +++ b/workspaces/arborist/lib/arborist/load-actual.js @@ -3,8 +3,7 @@ const { relative, dirname, resolve, join, normalize } = require('path') const rpj = require('read-package-json-fast') -const { promisify } = require('util') -const readdir = promisify(require('readdir-scoped-modules')) +const { readdirScoped } = require('@npmcli/fs') const walkUp = require('walk-up-path') const ancestorPath = require('common-ancestor-path') const treeCheck = require('../tree-check.js') @@ -362,7 +361,7 @@ module.exports = cls => class ActualLoader extends cls { async [_loadFSChildren] (node) { const nm = resolve(node.realpath, 'node_modules') try { - const kids = await readdir(nm) + const kids = await readdirScoped(nm).then(paths => paths.map(p => p.replace(/\\/g, '/'))) return Promise.all( // ignore . dirs and retired scoped package folders kids.filter(kid => !/^(@[^/]+\/)?\./.test(kid)) @@ -411,8 +410,8 @@ module.exports = cls => class ActualLoader extends cls { break } - const entries = nmContents.get(p) || - await readdir(p + '/node_modules').catch(() => []) + const entries = nmContents.get(p) || await readdirScoped(p + '/node_modules') + .catch(() => []).then(paths => paths.map(p => p.replace(/\\/g, '/'))) nmContents.set(p, entries) if (!entries.includes(name)) { continue diff --git a/workspaces/arborist/lib/arborist/reify.js b/workspaces/arborist/lib/arborist/reify.js index c3cbf02b31080..36aabd6f0fcdd 100644 --- a/workspaces/arborist/lib/arborist/reify.js +++ b/workspaces/arborist/lib/arborist/reify.js @@ -19,7 +19,7 @@ const { rm, symlink, } = require('fs/promises') -const moveFile = require('@npmcli/move-file') +const { moveFile } = require('@npmcli/fs') const PackageJson = require('@npmcli/package-json') const packageContents = require('@npmcli/installed-package-contents') const runScript = require('@npmcli/run-script') diff --git a/workspaces/arborist/package.json b/workspaces/arborist/package.json index d739aa26ab7b8..68d0d1e505c66 100644 --- a/workspaces/arborist/package.json +++ b/workspaces/arborist/package.json @@ -4,10 +4,10 @@ "description": "Manage node_modules trees", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", "@npmcli/installed-package-contents": "^2.0.0", "@npmcli/map-workspaces": "^3.0.0", "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/move-file": "^3.0.0", "@npmcli/name-from-folder": "^1.0.1", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^3.0.0", @@ -32,7 +32,6 @@ "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^1.0.1", "read-package-json-fast": "^3.0.1", - "readdir-scoped-modules": "^1.1.0", "semver": "^7.3.7", "ssri": "^10.0.0", "treeverse": "^3.0.0", diff --git a/workspaces/arborist/test/arborist/reify.js b/workspaces/arborist/test/arborist/reify.js index 257fcb4cbcf7b..7c250a34d236b 100644 --- a/workspaces/arborist/test/arborist/reify.js +++ b/workspaces/arborist/test/arborist/reify.js @@ -3,8 +3,9 @@ const t = require('tap') const runScript = require('@npmcli/run-script') const localeCompare = require('@isaacs/string-locale-compare')('en') const tnock = require('../fixtures/tnock') - const fs = require('fs') +const fsp = require('fs/promises') +const npmFs = require('@npmcli/fs') let failRm = false let failRename = null @@ -41,26 +42,41 @@ const fsMock = { realRm(...args) }, } -const mocks = { - fs: fsMock, - 'fs/promises': { - ...fs.promises, - mkdir: async (...args) => { - if (failMkdir) { - throw failMkdir - } +const fspMock = { + ...fsp, + mkdir: async (...args) => { + if (failMkdir) { + throw failMkdir + } - return fs.promises.mkdir(...args) - }, - rm: async (...args) => { - if (failRm) { - throw new Error('rm fail') - } + return fsp.mkdir(...args) + }, + rename: async (...args) => { + if (failRename) { + throw failRename + } else if (failRenameOnce) { + const er = failRenameOnce + failRenameOnce = null + throw er + } else { + return fsp.rename(...args) + } + }, + rm: async (...args) => { + if (failRm) { + throw new Error('rm fail') + } - return fs.promises.rm(...args) - }, + return fsp.rm(...args) }, } +// need this to be injected so that it doesn't pull from main cache +const { moveFile } = t.mock('@npmcli/fs', { 'fs/promises': fspMock }) +const mocks = { + fs: fsMock, + 'fs/promises': fspMock, + '@npmcli/fs': { ...npmFs, moveFile }, +} const oldLockfileWarning = [ 'warn', @@ -73,10 +89,6 @@ This is a one-time fix-up, please be patient... `, ] -// need this to be injected so that it doesn't pull from main cache -const moveFile = t.mock('@npmcli/move-file', { fs: fsMock }) -mocks['@npmcli/move-file'] = moveFile - // track the warnings that are emitted. returns a function that removes // the listener and provides the list of what it saw. const warningTracker = () => { From 335c7e4348f5505fad33b8a78348a02a82b91426 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Thu, 3 Nov 2022 20:54:20 -0700 Subject: [PATCH 05/15] deps: cacache@17.0.2 --- DEPENDENCIES.md | 3 +- node_modules/.gitignore | 1 - node_modules/@npmcli/move-file/LICENSE.md | 22 --- node_modules/@npmcli/move-file/lib/index.js | 185 -------------------- node_modules/@npmcli/move-file/package.json | 48 ----- node_modules/cacache/lib/entry-index.js | 2 +- node_modules/cacache/lib/util/move-file.js | 2 +- node_modules/cacache/package.json | 9 +- package-lock.json | 24 +-- package.json | 2 +- workspaces/arborist/package.json | 2 +- 11 files changed, 15 insertions(+), 285 deletions(-) delete mode 100644 node_modules/@npmcli/move-file/LICENSE.md delete mode 100644 node_modules/@npmcli/move-file/lib/index.js delete mode 100644 node_modules/@npmcli/move-file/package.json diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index d4a82a0af1b43..c5b5cf39c9537 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -9,7 +9,6 @@ graph LR; bin-links-->write-file-atomic; cacache-->fs-minipass; cacache-->npmcli-fs["@npmcli/fs"]; - cacache-->npmcli-move-file["@npmcli/move-file"]; cacache-->ssri; cacache-->unique-filename; init-package-json-->npm-package-arg; @@ -759,4 +758,4 @@ packages higher up the chain. - @npmcli/git, make-fetch-happen, @npmcli/config, init-package-json - @npmcli/installed-package-contents, @npmcli/map-workspaces, cacache, npm-pick-manifest, @npmcli/run-script, read-package-json, promzard - @npmcli/docs, @npmcli/fs, npm-bundled, read-package-json-fast, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, read - - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, @npmcli/move-file, fs-minipass, ssri, unique-slug, @npmcli/promise-spawn, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, minify-registry-metadata, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate + - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, fs-minipass, ssri, unique-slug, @npmcli/promise-spawn, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, minify-registry-metadata, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate diff --git a/node_modules/.gitignore b/node_modules/.gitignore index 292e3d4dd1bf8..b94e4bd99842c 100644 --- a/node_modules/.gitignore +++ b/node_modules/.gitignore @@ -23,7 +23,6 @@ !/@npmcli/installed-package-contents !/@npmcli/map-workspaces !/@npmcli/metavuln-calculator -!/@npmcli/move-file !/@npmcli/name-from-folder !/@npmcli/node-gyp !/@npmcli/package-json diff --git a/node_modules/@npmcli/move-file/LICENSE.md b/node_modules/@npmcli/move-file/LICENSE.md deleted file mode 100644 index 072bf20840acd..0000000000000 --- a/node_modules/@npmcli/move-file/LICENSE.md +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) -Copyright (c) npm, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/node_modules/@npmcli/move-file/lib/index.js b/node_modules/@npmcli/move-file/lib/index.js deleted file mode 100644 index 5789bb127e096..0000000000000 --- a/node_modules/@npmcli/move-file/lib/index.js +++ /dev/null @@ -1,185 +0,0 @@ -const { dirname, join, resolve, relative, isAbsolute } = require('path') -const rimraf_ = require('rimraf') -const { promisify } = require('util') -const { - access: access_, - accessSync, - copyFile: copyFile_, - copyFileSync, - readdir: readdir_, - readdirSync, - rename: rename_, - renameSync, - stat: stat_, - statSync, - lstat: lstat_, - lstatSync, - symlink: symlink_, - symlinkSync, - readlink: readlink_, - readlinkSync, -} = require('fs') - -const access = promisify(access_) -const copyFile = promisify(copyFile_) -const readdir = promisify(readdir_) -const rename = promisify(rename_) -const stat = promisify(stat_) -const lstat = promisify(lstat_) -const symlink = promisify(symlink_) -const readlink = promisify(readlink_) -const rimraf = promisify(rimraf_) -const rimrafSync = rimraf_.sync - -const mkdirp = require('mkdirp') - -const pathExists = async path => { - try { - await access(path) - return true - } catch (er) { - return er.code !== 'ENOENT' - } -} - -const pathExistsSync = path => { - try { - accessSync(path) - return true - } catch (er) { - return er.code !== 'ENOENT' - } -} - -const moveFile = async (source, destination, options = {}, root = true, symlinks = []) => { - if (!source || !destination) { - throw new TypeError('`source` and `destination` file required') - } - - options = { - overwrite: true, - ...options, - } - - if (!options.overwrite && await pathExists(destination)) { - throw new Error(`The destination file exists: ${destination}`) - } - - await mkdirp(dirname(destination)) - - try { - await rename(source, destination) - } catch (error) { - if (error.code === 'EXDEV' || error.code === 'EPERM') { - const sourceStat = await lstat(source) - if (sourceStat.isDirectory()) { - const files = await readdir(source) - await Promise.all(files.map((file) => - moveFile(join(source, file), join(destination, file), options, false, symlinks) - )) - } else if (sourceStat.isSymbolicLink()) { - symlinks.push({ source, destination }) - } else { - await copyFile(source, destination) - } - } else { - throw error - } - } - - if (root) { - await Promise.all(symlinks.map(async ({ source: symSource, destination: symDestination }) => { - let target = await readlink(symSource) - // junction symlinks in windows will be absolute paths, so we need to - // make sure they point to the symlink destination - if (isAbsolute(target)) { - target = resolve(symDestination, relative(symSource, target)) - } - // try to determine what the actual file is so we can create the correct - // type of symlink in windows - let targetStat = 'file' - try { - targetStat = await stat(resolve(dirname(symSource), target)) - if (targetStat.isDirectory()) { - targetStat = 'junction' - } - } catch { - // targetStat remains 'file' - } - await symlink( - target, - symDestination, - targetStat - ) - })) - await rimraf(source) - } -} - -const moveFileSync = (source, destination, options = {}, root = true, symlinks = []) => { - if (!source || !destination) { - throw new TypeError('`source` and `destination` file required') - } - - options = { - overwrite: true, - ...options, - } - - if (!options.overwrite && pathExistsSync(destination)) { - throw new Error(`The destination file exists: ${destination}`) - } - - mkdirp.sync(dirname(destination)) - - try { - renameSync(source, destination) - } catch (error) { - if (error.code === 'EXDEV' || error.code === 'EPERM') { - const sourceStat = lstatSync(source) - if (sourceStat.isDirectory()) { - const files = readdirSync(source) - for (const file of files) { - moveFileSync(join(source, file), join(destination, file), options, false, symlinks) - } - } else if (sourceStat.isSymbolicLink()) { - symlinks.push({ source, destination }) - } else { - copyFileSync(source, destination) - } - } else { - throw error - } - } - - if (root) { - for (const { source: symSource, destination: symDestination } of symlinks) { - let target = readlinkSync(symSource) - // junction symlinks in windows will be absolute paths, so we need to - // make sure they point to the symlink destination - if (isAbsolute(target)) { - target = resolve(symDestination, relative(symSource, target)) - } - // try to determine what the actual file is so we can create the correct - // type of symlink in windows - let targetStat = 'file' - try { - targetStat = statSync(resolve(dirname(symSource), target)) - if (targetStat.isDirectory()) { - targetStat = 'junction' - } - } catch { - // targetStat remains 'file' - } - symlinkSync( - target, - symDestination, - targetStat - ) - } - rimrafSync(source) - } -} - -module.exports = moveFile -module.exports.sync = moveFileSync diff --git a/node_modules/@npmcli/move-file/package.json b/node_modules/@npmcli/move-file/package.json deleted file mode 100644 index a687ab2510c11..0000000000000 --- a/node_modules/@npmcli/move-file/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@npmcli/move-file", - "version": "3.0.0", - "files": [ - "bin/", - "lib/" - ], - "main": "lib/index.js", - "description": "move a file (fork of move-file)", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "devDependencies": { - "@npmcli/eslint-config": "^3.0.1", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.0.1" - }, - "scripts": { - "test": "tap", - "snap": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/move-file.git" - }, - "tap": { - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "author": "GitHub Inc.", - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - } -} diff --git a/node_modules/cacache/lib/entry-index.js b/node_modules/cacache/lib/entry-index.js index e81ef525a778d..add15e3a22a32 100644 --- a/node_modules/cacache/lib/entry-index.js +++ b/node_modules/cacache/lib/entry-index.js @@ -17,7 +17,7 @@ const uniqueFilename = require('unique-filename') const contentPath = require('./content/path') const hashToSegments = require('./util/hash-to-segments') const indexV = require('../package.json')['cache-version'].index -const moveFile = require('@npmcli/move-file') +const { moveFile } = require('@npmcli/fs') module.exports.NotFoundError = class NotFoundError extends Error { constructor (cache, key) { diff --git a/node_modules/cacache/lib/util/move-file.js b/node_modules/cacache/lib/util/move-file.js index 2d4de41cf8f91..eb3ba76107cd7 100644 --- a/node_modules/cacache/lib/util/move-file.js +++ b/node_modules/cacache/lib/util/move-file.js @@ -1,7 +1,7 @@ 'use strict' const fs = require('fs/promises') -const move = require('@npmcli/move-file') +const { moveFile: move } = require('@npmcli/fs') const pinflight = require('promise-inflight') module.exports = moveFile diff --git a/node_modules/cacache/package.json b/node_modules/cacache/package.json index ab5f13a027173..db6778ed4c038 100644 --- a/node_modules/cacache/package.json +++ b/node_modules/cacache/package.json @@ -1,6 +1,6 @@ { "name": "cacache", - "version": "17.0.1", + "version": "17.0.2", "cache-version": { "content": "2", "index": "5" @@ -45,8 +45,7 @@ ], "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.0.0", - "@npmcli/move-file": "^3.0.0", + "@npmcli/fs": "^3.1.0", "fs-minipass": "^2.1.0", "glob": "^8.0.1", "lru-cache": "^7.7.1", @@ -62,7 +61,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.5.1", + "@npmcli/template-oss": "4.8.0", "tap": "^16.0.0" }, "engines": { @@ -71,7 +70,7 @@ "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", "windowsCI": false, - "version": "4.5.1" + "version": "4.8.0" }, "author": "GitHub Inc.", "tap": { diff --git a/package-lock.json b/package-lock.json index 9ad0f788aa454..dd400a887e32e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "@npmcli/run-script": "^6.0.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^17.0.1", + "cacache": "^17.0.2", "chalk": "^4.1.2", "cli-columns": "^4.0.0", "cli-table3": "^0.6.3", @@ -2176,18 +2176,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/@npmcli/name-from-folder": { "version": "1.0.1", "inBundle": true, @@ -3099,12 +3087,12 @@ } }, "node_modules/cacache": { - "version": "17.0.1", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.2.tgz", + "integrity": "sha512-rYUs2x4OjSgCQND7nTrh21AHIBFgd7s/ctAYvU3a8u+nK+R5YaX/SFPDYz4Azz7SGL6+6L9ZZWI4Kawpb7grzQ==", "inBundle": true, - "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.0.0", - "@npmcli/move-file": "^3.0.0", + "@npmcli/fs": "^3.1.0", "fs-minipass": "^2.1.0", "glob": "^8.0.1", "lru-cache": "^7.7.1", @@ -15034,7 +15022,7 @@ "@npmcli/query": "^3.0.0", "@npmcli/run-script": "^6.0.0", "bin-links": "^4.0.1", - "cacache": "^17.0.1", + "cacache": "^17.0.2", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", diff --git a/package.json b/package.json index ca303c5a48580..d6991d5106350 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@npmcli/run-script": "^6.0.0", "abbrev": "^2.0.0", "archy": "~1.0.0", - "cacache": "^17.0.1", + "cacache": "^17.0.2", "chalk": "^4.1.2", "cli-columns": "^4.0.0", "cli-table3": "^0.6.3", diff --git a/workspaces/arborist/package.json b/workspaces/arborist/package.json index 68d0d1e505c66..6af29ad02921f 100644 --- a/workspaces/arborist/package.json +++ b/workspaces/arborist/package.json @@ -14,7 +14,7 @@ "@npmcli/query": "^3.0.0", "@npmcli/run-script": "^6.0.0", "bin-links": "^4.0.1", - "cacache": "^17.0.1", + "cacache": "^17.0.2", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", From a73a4c6cb5be3c5eee36ad1ea364ff8c8b68e832 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Fri, 4 Nov 2022 15:27:26 -0700 Subject: [PATCH 06/15] chore(docs): replace cmark/marked with remark --- .github/workflows/ci-npmcli-docs.yml | 42 ++ DEPENDENCIES.md | 8 +- docs/lib/build.js | 27 +- docs/lib/index.js | 8 +- docs/lib/transform-html.js | 30 +- docs/package.json | 20 +- package-lock.json | 898 +++++++++++------------- package.json | 1 - scripts/rebuild.js | 20 - scripts/resetdeps.js | 8 +- scripts/template-oss/ci-npmcli-docs.yml | 22 + scripts/template-oss/ci.yml | 2 +- 12 files changed, 532 insertions(+), 554 deletions(-) delete mode 100644 scripts/rebuild.js create mode 100644 scripts/template-oss/ci-npmcli-docs.yml diff --git a/.github/workflows/ci-npmcli-docs.yml b/.github/workflows/ci-npmcli-docs.yml index ef536f453bd18..017d354a538fc 100644 --- a/.github/workflows/ci-npmcli-docs.yml +++ b/.github/workflows/ci-npmcli-docs.yml @@ -87,3 +87,45 @@ jobs: - name: Check Git Status if: matrix && matrix.platform.os != 'windows-latest' run: node scripts/git-dirty.js + + compare-docs: + name: Compare Docs + if: github.repository_owner == 'npm' && github.event_name == 'pull_request' + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Setup Git User + run: | + git config --global user.email "npm-cli+bot@github.com" + git config --global user.name "npm CLI robot" + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: npm + - name: Reset Deps + run: node . run resetdeps + - name: Build Docs + run: | + node . run build -w docs + mv man/ man-update/ + mv docs/output/ docs/output-update/ + mv docs/content/ docs/content-update/ + - name: Get Current Docs + run: | + git clean -fd + git checkout ${{ github.event.pull_request.base.ref }} + node . run resetdeps + node . run build -w docs + - name: Diff Man + run: diff -r --color=always man/ man-update/ || true + - name: Diff HTML + run: diff -r --color=always docs/output/ docs/output-update/ || true + - name: Diff Markdown + run: diff -r --color=always docs/content/ docs/content-update/ || true diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index c5b5cf39c9537..eae9108e38ed0 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -617,16 +617,20 @@ graph LR; npmcli-config-->tap; npmcli-config-->walk-up-path; npmcli-disparity-colors-->ansi-styles; - npmcli-docs-->cmark-gfm; npmcli-docs-->front-matter; npmcli-docs-->ignore-walk; npmcli-docs-->isaacs-string-locale-compare["@isaacs/string-locale-compare"]; npmcli-docs-->jsdom; - npmcli-docs-->marked-man; npmcli-docs-->mkdirp; npmcli-docs-->npmcli-eslint-config["@npmcli/eslint-config"]; npmcli-docs-->npmcli-template-oss["@npmcli/template-oss"]; + npmcli-docs-->rehype-stringify; + npmcli-docs-->remark-gfm; + npmcli-docs-->remark-man; + npmcli-docs-->remark-parse; + npmcli-docs-->remark-rehype; npmcli-docs-->tap; + npmcli-docs-->unified; npmcli-docs-->yaml; npmcli-fs-->semver; npmcli-git-->lru-cache; diff --git a/docs/lib/build.js b/docs/lib/build.js index a88804d28a456..563b4064277f1 100644 --- a/docs/lib/build.js +++ b/docs/lib/build.js @@ -19,12 +19,31 @@ const readHtml = (path) => fs.readFile(path, 'utf-8') const readYaml = (path) => fs.readFile(path, 'utf-8').then(yaml.parse) const makeTransforms = (...args) => (src, trs) => trs.reduce((acc, tr) => tr(acc, ...args), src) +const pAll = async (obj) => { + const entries = Object.entries(obj) + const results = await Promise.all(entries.map(e => e[1])) + return results.reduce((acc, res, index) => { + acc[entries[index][0]] = res + return acc + }, {}) +} + const run = async ({ content, template, nav, man, html, md }) => { - const [contentPaths, templateFile, navFile] = await Promise.all([ + await rmAll(man, html, md) + const [contentPaths, navFile, options] = await Promise.all([ readDocs(content), - readHtml(template), readYaml(nav), - rmAll(man, html, md), + pAll({ + template: readHtml(template), + // these deps are esm only so we have to import them once we + // are inside our main async function + unified: import('unified').then(r => r.unified), + remarkParse: import('remark-parse').then(r => r.default), + remarkGfm: import('remark-gfm').then(r => r.default), + remarkRehype: import('remark-rehype').then(r => r.default), + rehypeStringify: import('rehype-stringify').then(r => r.default), + remarkMan: import('remark-man').then(r => r.default), + }), ]) const sources = await Promise.all(contentPaths.map(async (childPath) => { @@ -61,7 +80,7 @@ const run = async ({ content, template, nav, man, html, md }) => { github_path: 'docs/content', }, frontmatter, - template: templateFile, + ...options, }) const transformedSrc = applyTransforms(body, [ diff --git a/docs/lib/index.js b/docs/lib/index.js index a3270f00a87cb..74aa03222f374 100644 --- a/docs/lib/index.js +++ b/docs/lib/index.js @@ -1,4 +1,3 @@ -const marked = require('marked-man') const localeCompare = require('@isaacs/string-locale-compare')('en') const { join, basename, resolve } = require('path') const transformHTML = require('./transform-html.js') @@ -142,8 +141,11 @@ const replaceHelpLinks = (src) => { ) } -const transformMan = (src, { data }) => - marked(`# ${data.title}(${data.section}) - ${data.description}\n\n${src}`) +const transformMan = (src, { data, unified, remarkParse, remarkMan }) => unified() + .use(remarkParse) + .use(remarkMan) + .processSync(`# ${data.title}(${data.section}) - ${data.description}\n\n${src}`) + .toString() const manPath = (name, { data }) => join(`man${data.section}`, `${name}.${data.section}`) diff --git a/docs/lib/transform-html.js b/docs/lib/transform-html.js index 8d13968a40fbd..c587d75e994f8 100644 --- a/docs/lib/transform-html.js +++ b/docs/lib/transform-html.js @@ -1,22 +1,18 @@ -const cmark = require('cmark-gfm') const jsdom = require('jsdom') -function transformHTML (src, { path, template, data }) { - // Render the markdown into an HTML snippet using a GFM renderer. - // This has to use the sync API due to a bug where the promise method - // doesn't properly apply the extensions so links dont get autolinked. - const content = cmark.renderHtmlSync(src, { - smart: false, - githubPreLang: true, - strikethroughDoubleTilde: true, - unsafe: false, - extensions: { - table: true, - strikethrough: true, - tagfilter: true, - autolink: true, - }, - }) +function transformHTML ( + src, + { path, template, data, unified, remarkParse, remarkGfm, remarkRehype, rehypeStringify } +) { + const content = unified() + .use(remarkParse) + .use(remarkGfm, { + singleTilde: false, + }) + .use(remarkRehype) + .use(rehypeStringify) + .processSync(src) + .toString() // Inject this data into the template, using a mustache-like // replacement scheme. diff --git a/docs/package.json b/docs/package.json index b82c639b8e6bc..ef3486f93f8d1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,11 +11,8 @@ "lintfix": "node .. run lint -- --fix", "snap": "tap", "test": "tap", - "pretest": "node .. run rebuild-cmark", "posttest": "node .. run lint", - "build": "node bin/build.js", - "prebuild": "node .. run rebuild-cmark", - "rebuild-cmark": "node ../scripts/rebuild.js cmark-gfm" + "build": "node bin/build.js" }, "repository": { "type": "git", @@ -26,13 +23,17 @@ "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/eslint-config": "^4.0.0", "@npmcli/template-oss": "4.8.0", - "cmark-gfm": "^0.9.0", "front-matter": "^4.0.2", "ignore-walk": "^6.0.0", "jsdom": "^20.0.1", - "marked-man": "^0.7.0", "mkdirp": "^1.0.4", + "rehype-stringify": "^9.0.3", + "remark-gfm": "^3.0.1", + "remark-man": "^8.0.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", "tap": "^16.0.1", + "unified": "^10.1.2", "yaml": "^2.1.3" }, "author": "GitHub Inc.", @@ -56,6 +57,11 @@ "ciVersions": "latest", "engines": "^14.17.0 || ^16.13.0 || >=18.0.0", "version": "4.8.0", - "content": "../scripts/template-oss/index.js" + "content": "../scripts/template-oss/index.js", + "workspaceRepo": { + "add": { + ".github/workflows/ci-{{ pkgNameFs }}.yml": "ci-npmcli-docs.yml" + } + } } } diff --git a/package-lock.json b/package-lock.json index dd400a887e32e..0f992e4dd21ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -185,13 +185,17 @@ "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/eslint-config": "^4.0.0", "@npmcli/template-oss": "4.8.0", - "cmark-gfm": "^0.9.0", "front-matter": "^4.0.2", "ignore-walk": "^6.0.0", "jsdom": "^20.0.1", - "marked-man": "^0.7.0", "mkdirp": "^1.0.4", + "rehype-stringify": "^9.0.3", + "remark-gfm": "^3.0.1", + "remark-man": "^8.0.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", "tap": "^16.0.1", + "unified": "^10.1.2", "yaml": "^2.1.3" }, "engines": { @@ -291,9 +295,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.2.tgz", - "integrity": "sha512-SD75PMIK6i9H8G/tfGvB4KKl4Nw6Ssos9nGgYwxbgyTP0iX/Z55DveoH86rmUB/YHTQQ+ZC0F7xxaY8l2OF44Q==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz", + "integrity": "sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==", "dev": true, "dependencies": { "@babel/types": "^7.20.2", @@ -561,9 +565,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz", - "integrity": "sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==", + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", + "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2476,6 +2480,15 @@ "@types/ms": "*" } }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2550,9 +2563,9 @@ "dev": true }, "node_modules/@xmldom/xmldom": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.5.tgz", - "integrity": "sha512-0dpjDLeCXYThL2YhqZcd/spuwoH+dmnFoND9ZxZkAYxp1IJUB2GP16ow2MJRsjVxy8j1Qv8BJRmN5GKnbDKCmQ==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", + "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -2974,26 +2987,6 @@ "node": ">=10" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3048,30 +3041,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3193,9 +3162,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001430", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001430.tgz", - "integrity": "sha512-IB1BXTZKPDVPM7cnV4iaKaHxckvdr/3xtctB3f7Hmenx3qYBhGtTZ//7EllK66aKXW98Lx0+7Yr0kxBtIt3tzg==", + "version": "1.0.30001431", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", + "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", "dev": true, "funding": [ { @@ -3243,6 +3212,26 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3354,21 +3343,6 @@ "node": ">=0.8" } }, - "node_modules/cmark-gfm": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cmark-gfm/-/cmark-gfm-0.9.0.tgz", - "integrity": "sha512-zt++V303Zh+kqS3PERSq1knHT21TpKjbVUF/U63QhLktEH+eeZymv+mHz+6IhcTN5Hy85LdkgdKlroa/Jc6Wvg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^3.0.0", - "prebuild-install": "^6.0.0" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/cmd-shim": { "version": "6.0.0", "license": "ISC", @@ -3514,6 +3488,16 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz", + "integrity": "sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/common-ancestor-path": { "version": "1.0.1", "license": "ISC" @@ -3943,27 +3927,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "dev": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4056,18 +4019,6 @@ "node": ">=8" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dezalgo": { "version": "1.0.4", "dev": true, @@ -4220,15 +4171,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", @@ -4451,9 +4393,9 @@ } }, "node_modules/eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz", + "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==", "dev": true, "peer": true, "dependencies": { @@ -4880,9 +4822,9 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "peer": true, "dependencies": { @@ -5005,15 +4947,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5094,12 +5027,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5276,12 +5203,6 @@ "node": ">=0.10.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", @@ -5480,10 +5401,10 @@ "node": ">=10" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", "dev": true }, "node_modules/glob": { @@ -5563,6 +5484,16 @@ "dev": true, "peer": true }, + "node_modules/groff-escape": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/groff-escape/-/groff-escape-2.0.1.tgz", + "integrity": "sha512-S0nG+mLFTu1buDKQsRlBtIxZU/dMvrdCURJg/zSLKpL333yi1Fs5bLUYk+v3pRYlc+qmHtukMAM2slB0AKFKAw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -5694,6 +5625,52 @@ "node": ">=8" } }, + "node_modules/hast-util-is-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", + "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", + "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.2", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", + "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5732,6 +5709,16 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.0", "inBundle": true, @@ -7794,29 +7781,48 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", + "node_modules/mdast-util-definitions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz", + "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", "dev": true, - "peer": true, - "bin": { - "marked": "bin/marked" + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/marked-man": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked-man/-/marked-man-0.7.0.tgz", - "integrity": "sha512-zxK5E4jbuARALc+fIUAanM2njVGnrd9YvKrqoDHUg2XwNLJijo39EzMIg59LecHBHsIHNtPqepqnJp4SmL/EVg==", + "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", "dev": true, - "bin": { - "marked-man": "bin/marked-man" + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" }, - "peerDependencies": { - "marked": "^0.7.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-find-and-replace": { @@ -7978,6 +7984,56 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-hast": { + "version": "12.2.4", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz", + "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-builder": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-markdown": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", @@ -8713,18 +8769,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -8877,12 +8921,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mkdirp-infer-owner": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", @@ -8906,6 +8944,15 @@ "node": ">=0.10.0" } }, + "node_modules/months": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/months/-/months-2.1.0.tgz", + "integrity": "sha512-2M9gdDB/uVt304/hJ3k2UIquJhOV5dRjp9BovHmZSINaRp7pdJuHXxOcuSjmJaKNomFyYyu0y3LBigdWiAUEmQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -8925,12 +8972,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8967,34 +9008,10 @@ "node": ">= 10.13" } }, - "node_modules/node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "dev": true, - "dependencies": { - "semver": "^5.4.1" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -9823,15 +9840,15 @@ } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -10274,154 +10291,6 @@ "node": ">=4" } }, - "node_modules/prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prebuild-install/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/prebuild-install/node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/prebuild-install/node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/prebuild-install/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install/node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/prebuild-install/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/prebuild-install/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/prebuild-install/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10514,22 +10383,22 @@ "node": ">= 8" } }, + "node_modules/property-information": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.1.1.tgz", + "integrity": "sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -10592,36 +10461,6 @@ "node": ">=8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read": { "version": "1.0.7", "inBundle": true, @@ -10875,6 +10714,21 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/release-please": { "name": "@npmcli/release-please", "version": "14.2.6", @@ -11024,6 +10878,57 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-man": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/remark-man/-/remark-man-8.0.1.tgz", + "integrity": "sha512-F/BbNaEF/QiZXoMiC43/qb8kAgGBKIS3yA+Br4CObgyoD+9Bioq1v+LmrLVbkwy9BErircQQ4J8yR2vFD34fBA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "github-slugger": "^1.0.0", + "groff-escape": "^2.0.0", + "mdast-util-definitions": "^5.0.0", + "mdast-util-to-string": "^3.0.0", + "months": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-man/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-man/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", @@ -11039,6 +10944,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-stringify": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", @@ -11362,37 +11283,6 @@ "inBundle": true, "license": "ISC" }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "dev": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -11472,6 +11362,16 @@ "source-map": "^0.6.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz", + "integrity": "sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/spawk": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/spawk/-/spawk-1.8.0.tgz", @@ -11673,15 +11573,15 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11702,6 +11602,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "inBundle": true, @@ -13886,40 +13800,6 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tcompare": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", @@ -14090,6 +13970,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -14212,18 +14102,6 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14369,6 +14247,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/unist-builder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", + "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", + "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", @@ -14379,6 +14280,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz", + "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", @@ -14827,9 +14741,9 @@ } }, "node_modules/ws": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", - "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index d6991d5106350..fd7997e558d33 100644 --- a/package.json +++ b/package.json @@ -214,7 +214,6 @@ "dependencies": "node scripts/bundle-and-gitignore-deps.js && node scripts/dependency-graph.js", "dumpconf": "env | grep npm | sort | uniq", "licenses": "licensee --production --errors-only", - "pretest": "node scripts/rebuild.js cmark-gfm", "test": "tap", "test-all": "node . run test -ws -iwr --if-present", "snap": "tap", diff --git a/scripts/rebuild.js b/scripts/rebuild.js deleted file mode 100644 index f3f75090c11e4..0000000000000 --- a/scripts/rebuild.js +++ /dev/null @@ -1,20 +0,0 @@ -const { join } = require('path') -const { promisify } = require('util') -const glob = promisify(require('glob')) -const log = require('proc-log') -const { npm, run } = require('./util') - -const main = async (pkgNames) => { - for (const name of pkgNames) { - const { path } = await npm.query(`#${name}`).then(r => r[0]) - const binding = await glob(join(path, '**', 'binding.node')) - log.info(name, binding) - if (!binding.length) { - await npm('rebuild', name) - } else { - log.info(`skipping ${name}, already built`) - } - } -} - -run(({ argv }) => main(argv.remain)) diff --git a/scripts/resetdeps.js b/scripts/resetdeps.js index f0aad975386f0..95899ff2a2c45 100644 --- a/scripts/resetdeps.js +++ b/scripts/resetdeps.js @@ -1,6 +1,6 @@ const { join } = require('path') -const { CWD, run, pkg, fs, spawn, git, npm } = require('./util.js') +const { CWD, run, pkg, fs, git, npm } = require('./util.js') const checkout = () => git('checkout', 'node_modules/') @@ -14,12 +14,6 @@ const main = async ({ packageLock }) => { await npm('i', '--ignore-scripts', '--no-audit', '--no-fund', packageLock && '--package-lock') await npm('rebuild', '--ignore-scripts') await npm('run', 'dependencies', '--ignore-scripts') - if (process.env.CI) { - // this script can take awhile to rebuild the cmark-gfm bindings - // so we only run it in CI. locally this is handled by pretest and - // prebuild scripts, which don't run in CI due to --ignore-scripts - await spawn('node', join('scripts', 'rebuild.js'), 'cmark-gfm') - } } run(main).catch(checkout) diff --git a/scripts/template-oss/ci-npmcli-docs.yml b/scripts/template-oss/ci-npmcli-docs.yml new file mode 100644 index 0000000000000..1e3cd054262d3 --- /dev/null +++ b/scripts/template-oss/ci-npmcli-docs.yml @@ -0,0 +1,22 @@ +{{> ci }} + + compare-docs: + {{> job jobName="Compare Docs" jobCheckout=(obj fetch-depth=0) jobIf="github.event_name == 'pull_request'" }} + - name: Build Docs + run: | + node . run build -w docs + mv man/ man-update/ + mv docs/output/ docs/output-update/ + mv docs/content/ docs/content-update/ + - name: Get Current Docs + run: | + git clean -fd + git checkout $\{{ github.event.pull_request.base.ref }} + node . run resetdeps + node . run build -w docs + - name: Diff Man + run: diff -r --color=always man/ man-update/ || true + - name: Diff HTML + run: diff -r --color=always docs/output/ docs/output-update/ || true + - name: Diff Markdown + run: diff -r --color=always docs/content/ docs/content-update/ || true diff --git a/scripts/template-oss/ci.yml b/scripts/template-oss/ci.yml index f1dcc1a4b427a..ec8e9540d648d 100644 --- a/scripts/template-oss/ci.yml +++ b/scripts/template-oss/ci.yml @@ -10,4 +10,4 @@ - name: Run Smoke Tests run: {{rootNpmPath}} test -w smoke-tests --ignore-scripts - name: Check Git Status - run: node scripts/git-dirty.js \ No newline at end of file + run: node scripts/git-dirty.js From 6a15d8a3a5846b7b23559118e234eb074f84f480 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Tue, 8 Nov 2022 10:02:12 -0700 Subject: [PATCH 07/15] chore(smoke-tests): refactor smoke tests --- ...ke-tests.yml => ci-npmcli-smoke-tests.yml} | 8 +- DEPENDENCIES.md | 24 +-- package-lock.json | 27 +-- smoke-tests/package.json | 7 +- smoke-tests/test/fixtures/server.js | 49 ------ smoke-tests/test/fixtures/setup.js | 157 ++++++++++++++++++ smoke-tests/test/index.js | 131 +-------------- 7 files changed, 193 insertions(+), 210 deletions(-) rename .github/workflows/{ci-smoke-tests.yml => ci-npmcli-smoke-tests.yml} (90%) delete mode 100644 smoke-tests/test/fixtures/server.js create mode 100644 smoke-tests/test/fixtures/setup.js diff --git a/.github/workflows/ci-smoke-tests.yml b/.github/workflows/ci-npmcli-smoke-tests.yml similarity index 90% rename from .github/workflows/ci-smoke-tests.yml rename to .github/workflows/ci-npmcli-smoke-tests.yml index ccd59448c18c2..d6103908fcff7 100644 --- a/.github/workflows/ci-smoke-tests.yml +++ b/.github/workflows/ci-npmcli-smoke-tests.yml @@ -1,6 +1,6 @@ # This file is automatically added by @npmcli/template-oss. Do not edit. -name: CI - smoke-tests +name: CI - @npmcli/smoke-tests on: workflow_dispatch: @@ -40,9 +40,9 @@ jobs: - name: Reset Deps run: node . run resetdeps - name: Lint - run: node . run lint --ignore-scripts -w smoke-tests + run: node . run lint --ignore-scripts -w @npmcli/smoke-tests - name: Post Lint - run: node . run postlint --ignore-scripts -w smoke-tests + run: node . run postlint --ignore-scripts -w @npmcli/smoke-tests test: name: Test - ${{ matrix.platform.name }} - ${{ matrix.node-version }} @@ -88,7 +88,7 @@ jobs: - name: Add Problem Matcher run: echo "::add-matcher::.github/matchers/tap.json" - name: Test - run: node . test --ignore-scripts -w smoke-tests + run: node . test --ignore-scripts -w @npmcli/smoke-tests - name: Check Git Status if: matrix && matrix.platform.os != 'windows-latest' run: node scripts/git-dirty.js diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index eae9108e38ed0..c0d75350b586a 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -123,6 +123,7 @@ graph LR; npm-->npmcli-package-json["@npmcli/package-json"]; npm-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npm-->npmcli-run-script["@npmcli/run-script"]; + npm-->npmcli-smoke-tests["@npmcli/smoke-tests"]; npm-->npmcli-template-oss["@npmcli/template-oss"]; npm-->npmlog; npm-->pacote; @@ -210,6 +211,10 @@ graph LR; npmcli-run-script-->npmcli-node-gyp["@npmcli/node-gyp"]; npmcli-run-script-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-run-script-->read-package-json-fast; + npmcli-smoke-tests-->minify-registry-metadata; + npmcli-smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; + npmcli-smoke-tests-->npmcli-template-oss["@npmcli/template-oss"]; npmlog-->are-we-there-yet; npmlog-->gauge; pacote-->cacache; @@ -518,6 +523,7 @@ graph LR; npm-->npmcli-package-json["@npmcli/package-json"]; npm-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npm-->npmcli-run-script["@npmcli/run-script"]; + npm-->npmcli-smoke-tests["@npmcli/smoke-tests"]; npm-->npmcli-template-oss["@npmcli/template-oss"]; npm-->npmlog; npm-->p-map; @@ -533,7 +539,6 @@ graph LR; npm-->remark; npm-->rimraf; npm-->semver; - npm-->smoke-tests; npm-->spawk; npm-->ssri; npm-->tap; @@ -662,6 +667,12 @@ graph LR; npmcli-run-script-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-run-script-->read-package-json-fast; npmcli-run-script-->which; + npmcli-smoke-tests-->minify-registry-metadata; + npmcli-smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; + npmcli-smoke-tests-->npmcli-template-oss["@npmcli/template-oss"]; + npmcli-smoke-tests-->tap; + npmcli-smoke-tests-->which; npmlog-->are-we-there-yet; npmlog-->console-control-strings; npmlog-->gauge; @@ -705,13 +716,6 @@ graph LR; readable-stream-->util-deprecate; rimraf-->glob; semver-->lru-cache; - smoke-tests-->minify-registry-metadata; - smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; - smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; - smoke-tests-->npmcli-template-oss["@npmcli/template-oss"]; - smoke-tests-->rimraf; - smoke-tests-->tap; - smoke-tests-->which; socks-->ip; socks-->smart-buffer; socks-proxy-agent-->agent-base; @@ -761,5 +765,5 @@ packages higher up the chain. - npm-registry-fetch, libnpmversion - @npmcli/git, make-fetch-happen, @npmcli/config, init-package-json - @npmcli/installed-package-contents, @npmcli/map-workspaces, cacache, npm-pick-manifest, @npmcli/run-script, read-package-json, promzard - - @npmcli/docs, @npmcli/fs, npm-bundled, read-package-json-fast, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, read - - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, fs-minipass, ssri, unique-slug, @npmcli/promise-spawn, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, minify-registry-metadata, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate + - @npmcli/docs, @npmcli/smoke-tests, @npmcli/fs, npm-bundled, read-package-json-fast, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, read + - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, @npmcli/promise-spawn, minify-registry-metadata, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, fs-minipass, ssri, unique-slug, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate diff --git a/package-lock.json b/package-lock.json index 0f992e4dd21ea..4a3add1289f75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2240,6 +2240,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/smoke-tests": { + "resolved": "smoke-tests", + "link": true + }, "node_modules/@npmcli/template-oss": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/@npmcli/template-oss/-/template-oss-4.8.0.tgz", @@ -11301,10 +11305,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/smoke-tests": { - "resolved": "smoke-tests", - "link": true - }, "node_modules/socks": { "version": "2.7.0", "inBundle": true, @@ -14890,6 +14890,7 @@ } }, "smoke-tests": { + "name": "@npmcli/smoke-tests", "version": "1.0.0", "license": "ISC", "devDependencies": { @@ -14897,29 +14898,13 @@ "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", "minify-registry-metadata": "^2.2.0", - "rimraf": "^3.0.2", "tap": "^16.0.1", - "which": "^2.0.2" + "which": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "smoke-tests/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "workspaces/arborist": { "name": "@npmcli/arborist", "version": "6.1.1", diff --git a/smoke-tests/package.json b/smoke-tests/package.json index 04577ae822adc..1ee4b2ca33472 100644 --- a/smoke-tests/package.json +++ b/smoke-tests/package.json @@ -1,5 +1,5 @@ { - "name": "smoke-tests", + "name": "@npmcli/smoke-tests", "description": "The npm cli smoke tests", "version": "1.0.0", "private": true, @@ -22,9 +22,8 @@ "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", "minify-registry-metadata": "^2.2.0", - "rimraf": "^3.0.2", "tap": "^16.0.1", - "which": "^2.0.2" + "which": "^3.0.0" }, "author": "GitHub Inc.", "license": "ISC", @@ -36,7 +35,7 @@ "tap": { "no-coverage": true, "timeout": 300, - "files": "test/index.js", + "files": "test/*.js", "nyc-arg": [ "--exclude", "tap-snapshots/**" diff --git a/smoke-tests/test/fixtures/server.js b/smoke-tests/test/fixtures/server.js deleted file mode 100644 index b1056a2219066..0000000000000 --- a/smoke-tests/test/fixtures/server.js +++ /dev/null @@ -1,49 +0,0 @@ -const { join, basename } = require('path') -const { existsSync, readFileSync } = require('fs') -const http = require('http') -const PORT = 12345 + (+process.env.TAP_CHILD_ID || 0) - -let server = null -const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' - -const start = () => new Promise((resolve) => { - server = http.createServer((req, res) => { - res.setHeader('connection', 'close') - - const f = join(__dirname, join('/', req.url.replace(/@/, '').replace(/%2f/i, '/'))) - - // a magic package that causes us to return an error that will be logged - if (basename(f) === 'fail_reflect_user_agent') { - res.statusCode = 404 - res.setHeader('npm-notice', req.headers['user-agent']) - return res.end() - } - - const isCorgi = req.headers.accept.includes('application/vnd.npm.install-v1+json') - const file = f + ( - isCorgi && existsSync(`${f}.min.json`) ? '.min.json' - : existsSync(`${f}.json`) ? '.json' - : existsSync(`${f}/index.json`) ? 'index.json' - : '' - ) - - try { - const body = readFileSync(file) - res.setHeader('content-length', body.length) - res.setHeader('content-type', /\.min\.json$/.test(file) ? corgiDoc - : /\.json$/.test(file) ? 'application/json' - : 'application/octet-stream') - res.end(body) - } catch { - res.statusCode = 500 - res.setHeader('content-type', 'text/plain') - res.end('bad') - } - }).listen(PORT, resolve) -}) - -module.exports = { - start, - stop: () => server.close(), - registry: `http://localhost:${PORT}/`, -} diff --git a/smoke-tests/test/fixtures/setup.js b/smoke-tests/test/fixtures/setup.js new file mode 100644 index 0000000000000..bd2e1bf2d3a25 --- /dev/null +++ b/smoke-tests/test/fixtures/setup.js @@ -0,0 +1,157 @@ +const fs = require('fs') +const { join, resolve, sep, basename } = require('path') +const which = require('which').sync +const http = require('http') +const spawn = require('@npmcli/promise-spawn') + +const { SMOKE_PUBLISH_NPM, CI, PATH, TAP_CHILD_ID = '0' } = process.env +const PORT = 12345 + Number(TAP_CHILD_ID) +const log = CI ? console.error : () => {} +const registry = `http://localhost:${PORT}/` +const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' + +const normalizePath = path => path.replace(/[A-Z]:/, '').replace(/\\/g, '/') + +const cwd = resolve(__dirname, '..', '..', '..') +const npmCli = join('bin', 'npm-cli.js') +const execArgv = SMOKE_PUBLISH_NPM ? ['npm'] : [process.execPath, join(cwd, npmCli)] +const npmDir = SMOKE_PUBLISH_NPM ? fs.realpathSync(which('npm')).replace(sep + npmCli, '') : cwd + +module.exports = (t) => { + // setup fixtures + const path = t.testdir({ + '.npmrc': '', + cache: {}, + project: {}, + bin: {}, + }) + const localPrefix = resolve(path, 'project') + const userconfigLocation = resolve(path, '.npmrc') + const cacheLocation = resolve(path, 'cache') + const binLocation = resolve(path, 'bin') + + // setup server + let server = null + t.before(() => new Promise((resolvePromise) => { + server = http.createServer((req, res) => { + res.setHeader('connection', 'close') + + const f = join(__dirname, join('/', req.url.replace(/@/, '').replace(/%2f/i, '/'))) + + // a magic package that causes us to return an error that will be logged + if (basename(f) === 'fail_reflect_user_agent') { + res.statusCode = 404 + res.setHeader('npm-notice', req.headers['user-agent']) + return res.end() + } + + const isCorgi = req.headers.accept.includes('application/vnd.npm.install-v1+json') + const file = f + ( + isCorgi && fs.existsSync(`${f}.min.json`) ? '.min.json' + : fs.existsSync(`${f}.json`) ? '.json' + : fs.existsSync(`${f}/index.json`) ? 'index.json' + : '' + ) + + try { + const body = fs.readFileSync(file) + res.setHeader('content-length', body.length) + res.setHeader('content-type', /\.min\.json$/.test(file) ? corgiDoc + : /\.json$/.test(file) ? 'application/json' + : 'application/octet-stream') + res.end(body) + } catch { + res.statusCode = 500 + res.setHeader('content-type', 'text/plain') + res.end('bad') + } + }).listen(PORT, resolvePromise) + })) + t.teardown(() => server.close()) + + // update notifier should never be written + t.afterEach((t) => { + const updateExists = fs.existsSync(join(cacheLocation, '_update-notifier-last-checked')) + t.equal(updateExists, false) + }) + + t.cleanSnapshot = s => + s + // sometimes we print normalized paths in snapshots regardless of + // platform so replace those first + .split(normalizePath(npmDir)) + .join('{CWD}') + .split(normalizePath(cwd)) + .join('{CWD}') + .split(registry) + .join('https://registry.npmjs.org/') + .split(normalizePath(process.execPath)) + .join('node') + // then replace platform style paths + .split(npmDir) + .join('{CWD}') + .split(cwd) + .join('{CWD}') + .replace(/\\+/g, '/') + .replace(/\r\n/g, '\n') + .replace(/ \(in a browser\)/g, '') + .replace(/^npm@.* /gm, 'npm ') + .replace(/^.*debug-[0-9]+.log$/gm, '') + + const exec = async (...args) => { + const cmd = [] + const opts = [ + `--registry=${registry}`, + `--cache=${cacheLocation}`, + `--userconfig=${userconfigLocation}`, + '--no-audit', + '--no-update-notifier', + '--loglevel=silly', + ] + for (const arg of args) { + if (arg.startsWith('--')) { + opts.push(arg) + } else { + cmd.push(arg) + } + } + + const hasWorkspaceOpt = opts.some(o => /^--workspaces?($|=)/.test(o)) + // XXX: not sure why outdated fails with no-workspaces but works without it + if (!hasWorkspaceOpt && cmd[0] !== 'outdated') { + // This is required so we dont detect any workspace roots above the testdir + opts.push('--no-workspaces') + } + + const spawnArgs = [execArgv[0], [...execArgv.slice(1), ...cmd, ...opts]] + log([spawnArgs[0], ...spawnArgs[1]].join('\n')) + + const res = await spawn(...spawnArgs, { + cwd: localPrefix, + env: { + HOME: path, + PATH: `${PATH}:${binLocation}`, + COMSPEC: process.env.COMSPEC, + }, + }) + + log(res.stderr) + return res.stdout + } + + const readFile = (f) => fs.readFileSync(resolve(localPrefix, f), 'utf-8') + const writeFile = (f, d) => fs.writeFileSync(resolve(localPrefix, f), d, 'utf-8') + const rmDir = () => { + for (const f of fs.readdirSync(localPrefix)) { + fs.rmSync(join(localPrefix, f), { recursive: true, force: true }) + } + } + + return { + exec, + readFile, + writeFile, + rmDir, + isSmokePublish: !!SMOKE_PUBLISH_NPM, + } +} diff --git a/smoke-tests/test/index.js b/smoke-tests/test/index.js index 65a0363f2d441..e83e43de4334b 100644 --- a/smoke-tests/test/index.js +++ b/smoke-tests/test/index.js @@ -1,130 +1,17 @@ -const { readFileSync, realpathSync, mkdirSync, existsSync, writeFileSync } = require('fs') -const spawn = require('@npmcli/promise-spawn') -const { join, resolve, sep } = require('path') +const { join } = require('path') const t = require('tap') -const rimraf = require('rimraf') -const which = require('which').sync -const { start, stop, registry } = require('./fixtures/server.js') - -const { SMOKE_PUBLISH_NPM, CI, PATH } = process.env -const log = CI ? console.error : () => {} - -const cwd = resolve(__dirname, '..', '..') -const npmCli = join('bin', 'npm-cli.js') -const execArgv = SMOKE_PUBLISH_NPM ? ['npm'] : [process.execPath, join(cwd, npmCli)] -const npmDir = SMOKE_PUBLISH_NPM ? realpathSync(which('npm')).replace(sep + npmCli, '') : cwd - -// setup server -t.before(start) -t.teardown(stop) -// update notifier should never be written -t.afterEach((t) => { - const updateExists = existsSync(join(cacheLocation, '_update-notifier-last-checked')) - t.equal(updateExists, false) -}) - -const readFile = filename => readFileSync(resolve(localPrefix, filename), 'utf-8') -const normalizePath = path => path.replace(/[A-Z]:/, '').replace(/\\/g, '/') - -t.cleanSnapshot = s => - s - // sometimes we print normalized paths in snapshots regardless of - // platform so replace those first - .split(normalizePath(npmDir)) - .join('{CWD}') - .split(normalizePath(cwd)) - .join('{CWD}') - .split(registry) - .join('https://registry.npmjs.org/') - .split(normalizePath(process.execPath)) - .join('node') - // then replace platform style paths - .split(npmDir) - .join('{CWD}') - .split(cwd) - .join('{CWD}') - .replace(/\\+/g, '/') - .replace(/\r\n/g, '\n') - .replace(/ \(in a browser\)/g, '') - .replace(/^npm@.* /gm, 'npm ') - .replace(/^.*debug-[0-9]+.log$/gm, '') - -// setup fixtures -const path = t.testdir({ - '.npmrc': '', - cache: {}, - project: {}, - bin: {}, -}) -const localPrefix = resolve(path, 'project') -const userconfigLocation = resolve(path, '.npmrc') -const cacheLocation = resolve(path, 'cache') -const binLocation = resolve(path, 'bin') - -const exec = async (...args) => { - const cmd = [] - const opts = [ - `--registry=${registry}`, - `--cache=${cacheLocation}`, - `--userconfig=${userconfigLocation}`, - '--no-audit', - '--no-update-notifier', - '--loglevel=silly', - ] - for (const arg of args) { - if (arg.startsWith('--')) { - opts.push(arg) - } else { - cmd.push(arg) - } - } - - // XXX: not sure why outdated fails with no-workspaces but works without it - if (!opts.includes('--workspaces') && cmd[0] !== 'outdated') { - // This is required so we dont detect any workspace roots above the testdir - opts.push('--no-workspaces') - } - - const spawnArgs = [execArgv[0], [...execArgv.slice(1), ...cmd, ...opts]] - log([spawnArgs[0], ...spawnArgs[1]].join(' ')) +const setup = require('./fixtures/setup.js') - const res = await spawn(...spawnArgs, { - cwd: localPrefix, - env: { - HOME: path, - PATH: `${PATH}:${binLocation}`, - COMSPEC: process.env.COMSPEC, - }, - encoding: 'utf-8', - }) - - log(res.stderr) - return res.stdout -} +const { exec, isSmokePublish, readFile, writeFile, rmDir } = setup(t) // this test must come first, its package.json will be destroyed and the one // created in the next test (npm init) will create a new one that must be // present for later tests t.test('npm install sends correct user-agent', async t => { - const pkgPath = join(localPrefix, 'package.json') - const pkgContent = JSON.stringify({ - name: 'smoke-test-workspaces', - workspaces: ['packages/*'], - }) - writeFileSync(pkgPath, pkgContent, { encoding: 'utf8' }) - - const wsRoot = join(localPrefix, 'packages') - mkdirSync(wsRoot) - - const wsPath = join(wsRoot, 'foo') - mkdirSync(wsPath) - - const wsPkgPath = join(wsPath, 'package.json') - const wsContent = JSON.stringify({ - name: 'foo', - }) - writeFileSync(wsPkgPath, wsContent, { encoding: 'utf8' }) - t.teardown(() => rimraf.sync(`${localPrefix}/*`)) + writeFile('package.json', JSON.stringify({ name: 'smoke-test-workspaces' })) + t.teardown(() => rmDir()) + + await exec('init', '-y', `--workspace=${join('packages', 'foo')}`) await t.rejects( exec('install', 'fail_reflect_user_agent'), @@ -147,7 +34,7 @@ t.test('npm init', async t => { const cmdRes = await exec('init', '-y') t.matchSnapshot(cmdRes, 'should have successful npm init result') - const pkg = JSON.parse(readFileSync(resolve(localPrefix, 'package.json'))) + const pkg = JSON.parse(readFile('package.json')) t.equal(pkg.name, 'project', 'should have expected generated name') t.equal(pkg.version, '1.0.0', 'should have expected generated version') }) @@ -155,7 +42,7 @@ t.test('npm init', async t => { t.test('npm --version', async t => { const v = await exec('--version') - if (SMOKE_PUBLISH_NPM) { + if (isSmokePublish) { t.match(v.trim(), /-[0-9a-f]{40}\.\d$/, 'must have a git version') } else { t.skip('not checking version') From f36df466aab2481069fe6213671c60d2f8e8474e Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Tue, 8 Nov 2022 17:34:01 -0700 Subject: [PATCH 08/15] chore: move mock-registry to workspace --- .eslintrc.js | 1 + .github/workflows/ci-npmcli-mock-registry.yml | 94 +++ .github/workflows/ci.yml | 2 + .gitignore | 1 + DEPENDENCIES.md | 27 +- mock-registry/.eslintrc.js | 17 + mock-registry/.gitignore | 21 + .../lib/index.js | 41 +- mock-registry/package.json | 55 ++ mock-registry/test/index.js | 8 + package-lock.json | 101 ++- package.json | 5 +- smoke-tests/package.json | 8 +- .../tap-snapshots/test/index.js.test.cjs | 702 ++++++------------ smoke-tests/test/fixtures/abbrev.json | 449 ----------- smoke-tests/test/fixtures/abbrev.min.json | 89 --- .../test/fixtures/abbrev/-/abbrev-1.0.4.tgz | Bin 2295 -> 0 bytes .../test/fixtures/abbrev/-/abbrev-1.1.1.tgz | Bin 2301 -> 0 bytes .../fixtures/promise-all-reject-late.json | 138 ---- .../fixtures/promise-all-reject-late.min.json | 44 -- .../-/promise-all-reject-late-1.0.1.tgz | Bin 30838 -> 0 bytes smoke-tests/test/fixtures/setup.js | 263 ++++--- smoke-tests/test/index.js | 573 ++++++++------ smoke-tests/test/workspace-ua.js | 36 + 24 files changed, 1105 insertions(+), 1570 deletions(-) create mode 100644 .github/workflows/ci-npmcli-mock-registry.yml create mode 100644 mock-registry/.eslintrc.js create mode 100644 mock-registry/.gitignore rename test/fixtures/mock-registry.js => mock-registry/lib/index.js (93%) create mode 100644 mock-registry/package.json create mode 100644 mock-registry/test/index.js delete mode 100644 smoke-tests/test/fixtures/abbrev.json delete mode 100644 smoke-tests/test/fixtures/abbrev.min.json delete mode 100644 smoke-tests/test/fixtures/abbrev/-/abbrev-1.0.4.tgz delete mode 100644 smoke-tests/test/fixtures/abbrev/-/abbrev-1.1.1.tgz delete mode 100644 smoke-tests/test/fixtures/promise-all-reject-late.json delete mode 100644 smoke-tests/test/fixtures/promise-all-reject-late.min.json delete mode 100644 smoke-tests/test/fixtures/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz create mode 100644 smoke-tests/test/workspace-ua.js diff --git a/.eslintrc.js b/.eslintrc.js index ff8d43d7ffe5c..4d943ad316745 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,6 +13,7 @@ module.exports = { ignorePatterns: [ 'docs/**', 'smoke-tests/**', + 'mock-registry/**', 'workspaces/**', ], extends: [ diff --git a/.github/workflows/ci-npmcli-mock-registry.yml b/.github/workflows/ci-npmcli-mock-registry.yml new file mode 100644 index 0000000000000..db394f789c9f8 --- /dev/null +++ b/.github/workflows/ci-npmcli-mock-registry.yml @@ -0,0 +1,94 @@ +# This file is automatically added by @npmcli/template-oss. Do not edit. + +name: CI - @npmcli/mock-registry + +on: + workflow_dispatch: + pull_request: + paths: + - mock-registry/** + push: + branches: + - main + - latest + paths: + - mock-registry/** + schedule: + # "At 09:00 UTC (02:00 PT) on Monday" https://crontab.guru/#0_9_*_*_1 + - cron: "0 9 * * 1" + +jobs: + lint: + name: Lint + if: github.repository_owner == 'npm' + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup Git User + run: | + git config --global user.email "npm-cli+bot@github.com" + git config --global user.name "npm CLI robot" + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: npm + - name: Reset Deps + run: node . run resetdeps + - name: Lint + run: node . run lint --ignore-scripts -w @npmcli/mock-registry + - name: Post Lint + run: node . run postlint --ignore-scripts -w @npmcli/mock-registry + + test: + name: Test - ${{ matrix.platform.name }} - ${{ matrix.node-version }} + if: github.repository_owner == 'npm' + strategy: + fail-fast: false + matrix: + platform: + - name: Linux + os: ubuntu-latest + shell: bash + - name: macOS + os: macos-latest + shell: bash + - name: Windows + os: windows-latest + shell: cmd + node-version: + - 14.17.0 + - 14.x + - 16.13.0 + - 16.x + - 18.0.0 + - 18.x + runs-on: ${{ matrix.platform.os }} + defaults: + run: + shell: ${{ matrix.platform.shell }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Setup Git User + run: | + git config --global user.email "npm-cli+bot@github.com" + git config --global user.name "npm CLI robot" + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: npm + - name: Reset Deps + run: node . run resetdeps + - name: Add Problem Matcher + run: echo "::add-matcher::.github/matchers/tap.json" + - name: Test + run: node . test --ignore-scripts -w @npmcli/mock-registry + - name: Check Git Status + if: matrix && matrix.platform.os != 'windows-latest' + run: node scripts/git-dirty.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3268396f0f99..639bf4a0ce49a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ on: paths-ignore: - docs/** - smoke-tests/** + - mock-registry/** - workspaces/** push: branches: @@ -16,6 +17,7 @@ on: paths-ignore: - docs/** - smoke-tests/** + - mock-registry/** - workspaces/** schedule: # "At 09:00 UTC (02:00 PT) on Monday" https://crontab.guru/#0_9_*_*_1 diff --git a/.gitignore b/.gitignore index 2ab23adf79548..dd81bed4846dc 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ !/test/ !/docs/ !/smoke-tests/ +!/mock-registry/ !/workspaces/ /workspaces/* !/workspaces/arborist/ diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index c0d75350b586a..e0ec307f0f403 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -120,6 +120,7 @@ graph LR; npm-->npmcli-fs["@npmcli/fs"]; npm-->npmcli-git["@npmcli/git"]; npm-->npmcli-map-workspaces["@npmcli/map-workspaces"]; + npm-->npmcli-mock-registry["@npmcli/mock-registry"]; npm-->npmcli-package-json["@npmcli/package-json"]; npm-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npm-->npmcli-run-script["@npmcli/run-script"]; @@ -207,12 +208,18 @@ graph LR; npmcli-metavuln-calculator-->json-parse-even-better-errors; npmcli-metavuln-calculator-->pacote; npmcli-metavuln-calculator-->semver; + npmcli-mock-registry-->npm-package-arg; + npmcli-mock-registry-->npmcli-arborist["@npmcli/arborist"]; + npmcli-mock-registry-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-mock-registry-->npmcli-template-oss["@npmcli/template-oss"]; + npmcli-mock-registry-->pacote; npmcli-package-json-->json-parse-even-better-errors; npmcli-run-script-->npmcli-node-gyp["@npmcli/node-gyp"]; npmcli-run-script-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-run-script-->read-package-json-fast; npmcli-smoke-tests-->minify-registry-metadata; npmcli-smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-smoke-tests-->npmcli-mock-registry["@npmcli/mock-registry"]; npmcli-smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-smoke-tests-->npmcli-template-oss["@npmcli/template-oss"]; npmlog-->are-we-there-yet; @@ -520,6 +527,7 @@ graph LR; npm-->npmcli-fs["@npmcli/fs"]; npm-->npmcli-git["@npmcli/git"]; npm-->npmcli-map-workspaces["@npmcli/map-workspaces"]; + npm-->npmcli-mock-registry["@npmcli/mock-registry"]; npm-->npmcli-package-json["@npmcli/package-json"]; npm-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npm-->npmcli-run-script["@npmcli/run-script"]; @@ -657,6 +665,13 @@ graph LR; npmcli-metavuln-calculator-->json-parse-even-better-errors; npmcli-metavuln-calculator-->pacote; npmcli-metavuln-calculator-->semver; + npmcli-mock-registry-->nock; + npmcli-mock-registry-->npm-package-arg; + npmcli-mock-registry-->npmcli-arborist["@npmcli/arborist"]; + npmcli-mock-registry-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-mock-registry-->npmcli-template-oss["@npmcli/template-oss"]; + npmcli-mock-registry-->pacote; + npmcli-mock-registry-->tap; npmcli-move-file-->mkdirp; npmcli-move-file-->rimraf; npmcli-package-json-->json-parse-even-better-errors; @@ -667,8 +682,12 @@ graph LR; npmcli-run-script-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-run-script-->read-package-json-fast; npmcli-run-script-->which; + npmcli-smoke-tests-->http-proxy; + npmcli-smoke-tests-->just-extend; + npmcli-smoke-tests-->just-safe-set; npmcli-smoke-tests-->minify-registry-metadata; npmcli-smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; + npmcli-smoke-tests-->npmcli-mock-registry["@npmcli/mock-registry"]; npmcli-smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-smoke-tests-->npmcli-template-oss["@npmcli/template-oss"]; npmcli-smoke-tests-->tap; @@ -757,13 +776,13 @@ Each group depends on packages lower down the chain, nothing depends on packages higher up the chain. - npm - - libnpmpublish - - libnpmdiff, libnpmexec, libnpmfund, libnpmpack + - @npmcli/smoke-tests, libnpmpublish + - @npmcli/mock-registry, libnpmdiff, libnpmexec, libnpmfund, libnpmpack - @npmcli/arborist - @npmcli/metavuln-calculator - pacote, libnpmaccess, libnpmhook, libnpmorg, libnpmsearch, libnpmteam, npm-profile - npm-registry-fetch, libnpmversion - @npmcli/git, make-fetch-happen, @npmcli/config, init-package-json - @npmcli/installed-package-contents, @npmcli/map-workspaces, cacache, npm-pick-manifest, @npmcli/run-script, read-package-json, promzard - - @npmcli/docs, @npmcli/smoke-tests, @npmcli/fs, npm-bundled, read-package-json-fast, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, read - - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, @npmcli/promise-spawn, minify-registry-metadata, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, fs-minipass, ssri, unique-slug, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate + - @npmcli/docs, @npmcli/fs, npm-bundled, read-package-json-fast, unique-filename, npm-install-checks, npm-package-arg, npm-packlist, normalize-package-data, @npmcli/package-json, bin-links, nopt, npmlog, parse-conflict-json, read + - @npmcli/eslint-config, @npmcli/template-oss, ignore-walk, semver, npm-normalize-package-bin, @npmcli/name-from-folder, json-parse-even-better-errors, fs-minipass, ssri, unique-slug, @npmcli/promise-spawn, hosted-git-info, proc-log, validate-npm-package-name, @npmcli/node-gyp, minipass-fetch, @npmcli/query, cmd-shim, read-cmd-shim, write-file-atomic, abbrev, are-we-there-yet, gauge, treeverse, minify-registry-metadata, ini, @npmcli/disparity-colors, @npmcli/ci-detect, mute-stream, npm-audit-report, npm-user-validate diff --git a/mock-registry/.eslintrc.js b/mock-registry/.eslintrc.js new file mode 100644 index 0000000000000..5db9f815536f1 --- /dev/null +++ b/mock-registry/.eslintrc.js @@ -0,0 +1,17 @@ +/* This file is automatically added by @npmcli/template-oss. Do not edit. */ + +'use strict' + +const { readdirSync: readdir } = require('fs') + +const localConfigs = readdir(__dirname) + .filter((file) => file.startsWith('.eslintrc.local.')) + .map((file) => `./${file}`) + +module.exports = { + root: true, + extends: [ + '@npmcli', + ...localConfigs, + ], +} diff --git a/mock-registry/.gitignore b/mock-registry/.gitignore new file mode 100644 index 0000000000000..79af2bfcaa4d8 --- /dev/null +++ b/mock-registry/.gitignore @@ -0,0 +1,21 @@ +# This file is automatically added by @npmcli/template-oss. Do not edit. + +# ignore everything in the root +/* + +# keep these +!**/.gitignore +!/.eslintrc.js +!/.eslintrc.local.* +!/.gitignore +!/bin/ +!/CHANGELOG* +!/docs/ +!/lib/ +!/LICENSE* +!/map.js +!/package.json +!/README* +!/scripts/ +!/tap-snapshots/ +!/test/ diff --git a/test/fixtures/mock-registry.js b/mock-registry/lib/index.js similarity index 93% rename from test/fixtures/mock-registry.js rename to mock-registry/lib/index.js index a39532958b338..1652e3344f0a8 100644 --- a/test/fixtures/mock-registry.js +++ b/mock-registry/lib/index.js @@ -1,18 +1,15 @@ -/* - * Mock registry class - * - * This should end up as the centralized place where we generate test fixtures - * for tests against any registry data. - */ const pacote = require('pacote') const Arborist = require('@npmcli/arborist') const npa = require('npm-package-arg') +const Nock = require('nock') + class MockRegistry { #tap #nock #registry #authorization #basic + #debug constructor (opts) { if (!opts.registry) { @@ -21,16 +18,33 @@ class MockRegistry { this.#registry = (new URL(opts.registry)).origin this.#authorization = opts.authorization this.#basic = opts.basic + this.#debug = opts.debug // Required for this.package this.#tap = opts.tap } + static tnock (t, host, opts, { debug = false } = {}) { + if (debug) { + Nock.emitter.on('no match', req => console.error('NO MATCH', req.options)) + } + Nock.disableNetConnect() + const server = Nock(host, opts) + t.teardown(() => { + Nock.enableNetConnect() + server.done() + }) + return server + } + + get origin () { + return this.#registry + } + get nock () { if (!this.#nock) { if (!this.#tap) { throw new Error('cannot mock packages without a tap fixture') } - const tnock = require('./tnock.js') const reqheaders = {} if (this.#authorization) { reqheaders.authorization = `Bearer ${this.#authorization}` @@ -38,7 +52,12 @@ class MockRegistry { if (this.#basic) { reqheaders.authorization = `Basic ${this.#basic}` } - this.#nock = tnock(this.#tap, this.#registry, { reqheaders }) + this.#nock = MockRegistry.tnock( + this.#tap, + this.#registry, + { reqheaders }, + { debug: this.#debug } + ) } return this.#nock } @@ -260,7 +279,7 @@ class MockRegistry { // or an array of versions // the last packument in the packuments or versions array will be tagged latest manifest ({ name = 'test-package', users, packuments, versions } = {}) { - packuments = this.packuments(packuments, name) + packuments = this.packuments(versions || packuments, name) const latest = packuments.slice(-1)[0] const manifest = { _id: `${name}@${latest.version}`, @@ -276,10 +295,6 @@ class MockRegistry { if (users) { manifest.users = users } - if (versions) { - packuments = versions.map(version => ({ version })) - } - for (const packument of packuments) { manifest.versions[packument.version] = { _id: `${name}@${packument.version}`, diff --git a/mock-registry/package.json b/mock-registry/package.json new file mode 100644 index 0000000000000..253d06dd2ac3d --- /dev/null +++ b/mock-registry/package.json @@ -0,0 +1,55 @@ +{ + "name": "@npmcli/mock-registry", + "version": "1.0.0", + "description": "", + "main": "lib/index.js", + "private": true, + "scripts": { + "test": "tap", + "lint": "eslint \"**/*.js\"", + "postlint": "template-oss-check", + "template-oss-apply": "template-oss-apply --force", + "lintfix": "node .. run lint -- --fix", + "snap": "tap", + "posttest": "node .. run lint" + }, + "repository": { + "type": "git", + "url": "https://github.com/npm/cli.git", + "directory": "mock-registry" + }, + "keywords": [], + "author": "GitHub Inc.", + "license": "ISC", + "bugs": { + "url": "https://github.com/npm/cli/issues" + }, + "homepage": "https://github.com/npm/cli#readme", + "files": [ + "bin/", + "lib/" + ], + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "version": "4.8.0" + }, + "tap": { + "no-coverage": true, + "nyc-arg": [ + "--exclude", + "tap-snapshots/**" + ] + }, + "devDependencies": { + "@npmcli/arborist": "^6.1.1", + "@npmcli/eslint-config": "^4.0.1", + "@npmcli/template-oss": "4.8.0", + "nock": "^13.2.9", + "npm-package-arg": "^10.0.0", + "pacote": "^15.0.6", + "tap": "^16.3.0" + } +} diff --git a/mock-registry/test/index.js b/mock-registry/test/index.js new file mode 100644 index 0000000000000..45f9bc16d0dc3 --- /dev/null +++ b/mock-registry/test/index.js @@ -0,0 +1,8 @@ +const t = require('tap') +const MockRegistry = require('..') + +t.test('it works', async t => { + t.ok(new MockRegistry({ + registry: 'http://registry.npmjs.org/', + })) +}) diff --git a/package-lock.json b/package-lock.json index 4a3add1289f75..f8736f5f35927 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,6 +81,7 @@ "workspaces": [ "docs", "smoke-tests", + "mock-registry", "workspaces/*" ], "dependencies": { @@ -202,6 +203,23 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "mock-registry": { + "name": "@npmcli/mock-registry", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@npmcli/arborist": "^6.1.1", + "@npmcli/eslint-config": "^4.0.1", + "@npmcli/template-oss": "4.8.0", + "nock": "^13.2.9", + "npm-package-arg": "^10.0.0", + "pacote": "^15.0.6", + "tap": "^16.3.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@actions/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", @@ -2180,6 +2198,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@npmcli/mock-registry": { + "resolved": "mock-registry", + "link": true + }, "node_modules/@npmcli/name-from-folder": { "version": "1.0.1", "inBundle": true, @@ -5103,6 +5125,26 @@ "dev": true, "peer": true }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -5728,6 +5770,20 @@ "inBundle": true, "license": "BSD-2-Clause" }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/http-proxy-agent": { "version": "5.0.0", "inBundle": true, @@ -6735,6 +6791,18 @@ "inBundle": true, "license": "MIT" }, + "node_modules/just-extend": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.1.1.tgz", + "integrity": "sha512-1UWaMWIB90HnIZAmXOTLobwWc9lc1ZMUBRKf8PaozCAiNUif6wv1fyeXpqccWZCu7L9zxIgXG55vARuZluyvqw==", + "dev": true + }, + "node_modules/just-safe-set": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-safe-set/-/just-safe-set-4.1.1.tgz", + "integrity": "sha512-3tQtDVCvZfWc64yEbh2D8R80Zlz+x9LJVpkQ4K3ppdiO7iI1Jzf6wYgsAs1o/EMSwucRbaNb6JHex/24TbSaKw==", + "dev": true + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9449,8 +9517,9 @@ }, "node_modules/npm-package-arg": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.0.0.tgz", + "integrity": "sha512-7dkh8mRp7s0KwVHKIVJnFCJQ2B34gOGnzgBjDGyprycmARq/82SX/lhilQ95ZuacP/G/1gsS345iAkKmxWBQ2Q==", "inBundle": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", @@ -10033,8 +10102,9 @@ }, "node_modules/pacote": { "version": "15.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.0.6.tgz", + "integrity": "sha512-dQwcz/sME7QIL+cdrw/jftQfMMXxSo17i2kJ/gnhBhUvvBAsxoBu1lw9B5IzCH/Ce8CvEkG/QYZ6txzKfn0bTw==", "inBundle": true, - "license": "ISC", "dependencies": { "@npmcli/git": "^4.0.0", "@npmcli/installed-package-contents": "^2.0.1", @@ -14895,8 +14965,12 @@ "license": "ISC", "devDependencies": { "@npmcli/eslint-config": "^4.0.0", + "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", + "http-proxy": "^1.18.1", + "just-extend": "^6.1.1", + "just-safe-set": "^4.1.1", "minify-registry-metadata": "^2.2.0", "tap": "^16.0.1", "which": "^3.0.0" @@ -15196,6 +15270,29 @@ "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } + }, + "workspaces/ws-a": { + "version": "1.0.0", + "extraneous": true, + "license": "ISC", + "dependencies": { + "abbrev": "1.0.5", + "ws-b": "1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "workspaces/ws-b": { + "version": "1.0.0", + "extraneous": true, + "license": "ISC", + "dependencies": { + "abbrev": "1.0.6" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } } } } diff --git a/package.json b/package.json index fd7997e558d33..4fa888e76bf87 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "workspaces": [ "docs", "smoke-tests", + "mock-registry", "workspaces/*" ], "files": [ @@ -244,11 +245,13 @@ "--exclude", "smoke-tests/**", "--exclude", + "mock-registry/**", + "--exclude", "workspaces/**", "--exclude", "tap-snapshots/**" ], - "test-ignore": "^(docs|smoke-tests|workspaces)/" + "test-ignore": "^(docs|smoke-tests|mock-registry|workspaces)/" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", diff --git a/smoke-tests/package.json b/smoke-tests/package.json index 1ee4b2ca33472..8bcc03467b5fa 100644 --- a/smoke-tests/package.json +++ b/smoke-tests/package.json @@ -19,8 +19,12 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", + "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", + "http-proxy": "^1.18.1", + "just-extend": "^6.1.1", + "just-safe-set": "^4.1.1", "minify-registry-metadata": "^2.2.0", "tap": "^16.0.1", "which": "^3.0.0" @@ -34,8 +38,8 @@ }, "tap": { "no-coverage": true, - "timeout": 300, - "files": "test/*.js", + "timeout": 600, + "test-ignore": "fixtures/*", "nyc-arg": [ "--exclude", "tap-snapshots/**" diff --git a/smoke-tests/tap-snapshots/test/index.js.test.cjs b/smoke-tests/tap-snapshots/test/index.js.test.cjs index 9f539bf8aeeff..904b09b05742f 100644 --- a/smoke-tests/tap-snapshots/test/index.js.test.cjs +++ b/smoke-tests/tap-snapshots/test/index.js.test.cjs @@ -5,7 +5,7 @@ * Make sure to inspect the output below. Do not ignore changes! */ 'use strict' -exports[`test/index.js TAP npm (no args) > should have expected no args output 1`] = ` +exports[`test/index.js TAP basic npm (no args) > should have expected no args output 1`] = ` npm Usage: @@ -32,7 +32,7 @@ All commands: unstar, update, version, view, whoami Specify configs in the ini-formatted file: - {CWD}/smoke-tests/test/tap-testdir-index/.npmrc + {CWD}/{TESTDIR}/project/.npmrc or on the command line via: npm --key=value More configuration info: npm help config @@ -41,7 +41,7 @@ Configuration fields: npm help 7 config npm {CWD} ` -exports[`test/index.js TAP npm ci > should throw mismatch deps in lock file error 1`] = ` +exports[`test/index.js TAP basic npm ci > should throw mismatch deps in lock file error 1`] = ` npm ERR! code EUSAGE npm ERR! npm ERR! \`npm ci\` can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync. Please update your lock file with \`npm install\` before continuing. @@ -71,274 +71,43 @@ npm ERR! A complete log of this run can be found in: ` -exports[`test/index.js TAP npm diff > should have expected diff output 1`] = ` +exports[`test/index.js TAP basic npm diff > should have expected diff output 1`] = ` +diff --git a/index.js b/index.js +index v1.0.4..v1.1.1 100644 +--- a/index.js ++++ b/index.js +@@ -1,1 +1,1 @@ +-module.exports = "1.0.4" +/ No newline at end of file ++module.exports = "1.1.1" +/ No newline at end of file diff --git a/package.json b/package.json index v1.0.4..v1.1.1 100644 --- a/package.json +++ b/package.json -@@ -1,15 +1,21 @@ +@@ -1,4 +1,4 @@ { "name": "abbrev", -- "version": "1.0.4", -+ "version": "1.1.1", - "description": "Like ruby's abbrev module, but in js", - "author": "Isaac Z. Schlueter ", -- "main": "./lib/abbrev.js", -+ "main": "abbrev.js", - "scripts": { -- "test": "node lib/abbrev.js" -+ "test": "tap test.js --100", -+ "preversion": "npm test", -+ "postversion": "npm publish", -+ "postpublish": "git push origin --all; git push origin --tags" - }, - "repository": "http://github.com/isaacs/abbrev-js", -- "license": { -- "type": "MIT", -- "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE" -- } -+ "license": "ISC", -+ "devDependencies": { -+ "tap": "^10.1" -+ }, -+ "files": [ -+ "abbrev.js" -+ ] +- "version": "1.0.4" ++ "version": "1.1.1" } -diff --git a/LICENSE b/LICENSE -index v1.0.4..v1.1.1 100644 ---- a/LICENSE -+++ b/LICENSE -@@ -1,4 +1,27 @@ --Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -+This software is dual-licensed under the ISC and MIT licenses. -+You may use this software under EITHER of the following licenses. -+ -+---------- -+ -+The ISC License -+ -+Copyright (c) Isaac Z. Schlueter and Contributors -+ -+Permission to use, copy, modify, and/or distribute this software for any -+purpose with or without fee is hereby granted, provided that the above -+copyright notice and this permission notice appear in all copies. -+ -+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ -+---------- -+ -+Copyright Isaac Z. Schlueter and Contributors - All rights reserved. - - Permission is hereby granted, free of charge, to any person -diff --git a/lib/abbrev.js b/lib/abbrev.js -deleted file mode 100644 -index v1.0.4..v1.1.1 ---- a/lib/abbrev.js -+++ b/lib/abbrev.js -@@ -1,111 +0,0 @@ -- --module.exports = exports = abbrev.abbrev = abbrev -- --abbrev.monkeyPatch = monkeyPatch -- --function monkeyPatch () { -- Object.defineProperty(Array.prototype, 'abbrev', { -- value: function () { return abbrev(this) }, -- enumerable: false, configurable: true, writable: true -- }) -- -- Object.defineProperty(Object.prototype, 'abbrev', { -- value: function () { return abbrev(Object.keys(this)) }, -- enumerable: false, configurable: true, writable: true -- }) --} -- --function abbrev (list) { -- if (arguments.length !== 1 || !Array.isArray(list)) { -- list = Array.prototype.slice.call(arguments, 0) -- } -- for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { -- args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) -- } -- -- // sort them lexicographically, so that they're next to their nearest kin -- args = args.sort(lexSort) -- -- // walk through each, seeing how much it has in common with the next and previous -- var abbrevs = {} -- , prev = "" -- for (var i = 0, l = args.length ; i < l ; i ++) { -- var current = args[i] -- , next = args[i + 1] || "" -- , nextMatches = true -- , prevMatches = true -- if (current === next) continue -- for (var j = 0, cl = current.length ; j < cl ; j ++) { -- var curChar = current.charAt(j) -- nextMatches = nextMatches && curChar === next.charAt(j) -- prevMatches = prevMatches && curChar === prev.charAt(j) -- if (!nextMatches && !prevMatches) { -- j ++ -- break -- } -- } -- prev = current -- if (j === cl) { -- abbrevs[current] = current -- continue -- } -- for (var a = current.substr(0, j) ; j <= cl ; j ++) { -- abbrevs[a] = current -- a += current.charAt(j) -- } -- } -- return abbrevs --} -- --function lexSort (a, b) { -- return a === b ? 0 : a > b ? 1 : -1 --} -- -- --// tests --if (module === require.main) { -- --var assert = require("assert") --var util = require("util") -- --console.log("running tests") --function test (list, expect) { -- var actual = abbrev(list) -- assert.deepEqual(actual, expect, -- "abbrev("+util.inspect(list)+") === " + util.inspect(expect) + "/n"+ -- "actual: "+util.inspect(actual)) -- actual = abbrev.apply(exports, list) -- assert.deepEqual(abbrev.apply(exports, list), expect, -- "abbrev("+list.map(JSON.stringify).join(",")+") === " + util.inspect(expect) + "/n"+ -- "actual: "+util.inspect(actual)) --} -- --test([ "ruby", "ruby", "rules", "rules", "rules" ], --{ rub: 'ruby' --, ruby: 'ruby' --, rul: 'rules' --, rule: 'rules' --, rules: 'rules' --}) --test(["fool", "foom", "pool", "pope"], --{ fool: 'fool' --, foom: 'foom' --, poo: 'pool' --, pool: 'pool' --, pop: 'pope' --, pope: 'pope' --}) --test(["a", "ab", "abc", "abcd", "abcde", "acde"], --{ a: 'a' --, ab: 'ab' --, abc: 'abc' --, abcd: 'abcd' --, abcde: 'abcde' --, ac: 'acde' --, acd: 'acde' --, acde: 'acde' --}) -- --console.log("pass") -- --} / No newline at end of file -diff --git a/abbrev.js b/abbrev.js -new file mode 100644 -index v1.0.4..v1.1.1 ---- a/abbrev.js -+++ b/abbrev.js -@@ -0,0 +1,61 @@ -+module.exports = exports = abbrev.abbrev = abbrev -+ -+abbrev.monkeyPatch = monkeyPatch -+ -+function monkeyPatch () { -+ Object.defineProperty(Array.prototype, 'abbrev', { -+ value: function () { return abbrev(this) }, -+ enumerable: false, configurable: true, writable: true -+ }) -+ -+ Object.defineProperty(Object.prototype, 'abbrev', { -+ value: function () { return abbrev(Object.keys(this)) }, -+ enumerable: false, configurable: true, writable: true -+ }) -+} -+ -+function abbrev (list) { -+ if (arguments.length !== 1 || !Array.isArray(list)) { -+ list = Array.prototype.slice.call(arguments, 0) -+ } -+ for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { -+ args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) -+ } -+ -+ // sort them lexicographically, so that they're next to their nearest kin -+ args = args.sort(lexSort) -+ -+ // walk through each, seeing how much it has in common with the next and previous -+ var abbrevs = {} -+ , prev = "" -+ for (var i = 0, l = args.length ; i < l ; i ++) { -+ var current = args[i] -+ , next = args[i + 1] || "" -+ , nextMatches = true -+ , prevMatches = true -+ if (current === next) continue -+ for (var j = 0, cl = current.length ; j < cl ; j ++) { -+ var curChar = current.charAt(j) -+ nextMatches = nextMatches && curChar === next.charAt(j) -+ prevMatches = prevMatches && curChar === prev.charAt(j) -+ if (!nextMatches && !prevMatches) { -+ j ++ -+ break -+ } -+ } -+ prev = current -+ if (j === cl) { -+ abbrevs[current] = current -+ continue -+ } -+ for (var a = current.substr(0, j) ; j <= cl ; j ++) { -+ abbrevs[a] = current -+ a += current.charAt(j) -+ } -+ } -+ return abbrevs -+} -+ -+function lexSort (a, b) { -+ return a === b ? 0 : a > b ? 1 : -1 -+} ` -exports[`test/index.js TAP npm explain > should have expected explain output 1`] = ` +exports[`test/index.js TAP basic npm explain > should have expected explain output 1`] = ` abbrev@1.0.4 node_modules/abbrev abbrev@"^1.0.4" from the root project ` -exports[`test/index.js TAP npm fund > should have expected fund output 1`] = ` +exports[`test/index.js TAP basic npm fund > should have expected fund output 1`] = ` project@1.0.0 -\`-- https://github.com/sponsors/isaacs - \`-- promise-all-reject-late@1.0.1 +\`-- https://github.com/sponsors + \`-- promise-all-reject-late@5.0.0 ` -exports[`test/index.js TAP npm init > should have successful npm init result 1`] = ` -Wrote to {CWD}/smoke-tests/test/tap-testdir-index/project/package.json: +exports[`test/index.js TAP basic npm init > should have successful npm init result 1`] = ` +Wrote to {CWD}/{TESTDIR}/project/package.json: { "name": "project", @@ -354,194 +123,185 @@ Wrote to {CWD}/smoke-tests/test/tap-testdir-index/project/package.json: } ` -exports[`test/index.js TAP npm install dev dep > should have expected dev dep added lockfile result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm install dev dep > should have expected dev dep added lockfile result 1`] = ` +Object { "lockfileVersion": 3, - "requires": true, - "packages": { - "": { + "name": "project", + "packages": Object { + "": Object { + "dependencies": Object { + "abbrev": "^1.0.4", + }, + "devDependencies": Object { + "promise-all-reject-late": "^5.0.0", + }, + "license": "ISC", "name": "project", "version": "1.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - }, - "devDependencies": { - "promise-all-reject-late": "^1.0.1" - } }, - "node_modules/abbrev": { + "node_modules/abbrev": Object { + "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.0.4.tgz", "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz", - "integrity": "sha1-vVWuXkE7oXIu5Mq6H26hBBSlns0=" }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "node_modules/promise-all-reject-late": Object { "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - } - } + "funding": Object { + "url": "https://github.com/sponsors", + }, + "resolved": "http://smoke-test-registry.club/promise-all-reject-late/-/promise-all-reject-late-5.0.0.tgz", + "version": "5.0.0", + }, + }, + "requires": true, + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm install dev dep > should have expected dev dep added package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm install dev dep > should have expected dev dep added package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", - "main": "index.js", - "scripts": { - "test": "echo /"Error: no test specified/" && exit 1" + "devDependencies": Object { + "promise-all-reject-late": "^5.0.0", }, - "keywords": [], - "author": "", + "keywords": Array [], "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" + "main": "index.js", + "name": "project", + "scripts": Object { + "test": "echo /"Error: no test specified/" && exit 1", }, - "devDependencies": { - "promise-all-reject-late": "^1.0.1" - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm install dev dep > should have expected dev dep added reify output 1`] = ` -added 1 package +exports[`test/index.js TAP basic npm install dev dep > should have expected dev dep added reify output 1`] = ` +added 1 package in {TIME} 1 package is looking for funding run \`npm fund\` for details ` -exports[`test/index.js TAP npm install prodDep@version > should have expected install reify output 1`] = ` -added 1 package +exports[`test/index.js TAP basic npm install prodDep@version > should have expected install reify output 1`] = ` +added 1 package in {TIME} ` -exports[`test/index.js TAP npm install prodDep@version > should have expected lockfile result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm install prodDep@version > should have expected lockfile result 1`] = ` +Object { "lockfileVersion": 3, - "requires": true, - "packages": { - "": { + "name": "project", + "packages": Object { + "": Object { + "dependencies": Object { + "abbrev": "^1.0.4", + }, + "license": "ISC", "name": "project", "version": "1.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - } }, - "node_modules/abbrev": { + "node_modules/abbrev": Object { + "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.0.4.tgz", "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz", - "integrity": "sha1-vVWuXkE7oXIu5Mq6H26hBBSlns0=" - } - } + }, + }, + "requires": true, + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm install prodDep@version > should have expected package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm install prodDep@version > should have expected package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", + "keywords": Array [], + "license": "ISC", "main": "index.js", - "scripts": { - "test": "echo /"Error: no test specified/" && exit 1" + "name": "project", + "scripts": Object { + "test": "echo /"Error: no test specified/" && exit 1", }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm ls > should have expected ls output 1`] = ` -project@1.0.0 {CWD}/smoke-tests/test/tap-testdir-index/project +exports[`test/index.js TAP basic npm ls > should have expected ls output 1`] = ` +project@1.0.0 {CWD}/{TESTDIR}/project +-- abbrev@1.0.4 -\`-- promise-all-reject-late@1.0.1 +\`-- promise-all-reject-late@5.0.0 ` -exports[`test/index.js TAP npm outdated > should have expected outdated output 1`] = ` +exports[`test/index.js TAP basic npm outdated > should have expected outdated output 1`] = ` Package Current Wanted Latest Location Depended by abbrev 1.0.4 1.1.1 1.1.1 node_modules/abbrev project ` -exports[`test/index.js TAP npm pkg > should have expected npm pkg delete modified package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm pkg > should have expected npm pkg delete modified package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", + "keywords": Array [], + "license": "ISC", "main": "index.js", - "scripts": { + "name": "project", + "scripts": Object { + "hello": "echo Hello", "test": "echo /"Error: no test specified/" && exit 1", - "hello": "echo Hello" }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm pkg > should have expected npm pkg set modified package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm pkg > should have expected npm pkg set modified package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", + "keywords": Array [], + "license": "ISC", "main": "index.js", - "scripts": { + "name": "project", + "scripts": Object { + "hello": "echo Hello", "test": "echo /"Error: no test specified/" && exit 1", - "hello": "echo Hello" }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" + "tap": Object { + "test-env": Array [ + "LC_ALL=sk", + ], }, - "tap": { - "test-env": [ - "LC_ALL=sk" - ] - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm pkg > should have expected pkg delete output 1`] = ` +exports[`test/index.js TAP basic npm pkg > should have expected pkg delete output 1`] = ` ` -exports[`test/index.js TAP npm pkg > should have expected pkg get output 1`] = ` +exports[`test/index.js TAP basic npm pkg > should have expected pkg get output 1`] = ` "ISC" ` -exports[`test/index.js TAP npm pkg > should have expected pkg set output 1`] = ` +exports[`test/index.js TAP basic npm pkg > should have expected pkg set output 1`] = ` ` -exports[`test/index.js TAP npm pkg > should print package.json contents 1`] = ` +exports[`test/index.js TAP basic npm pkg > should print package.json contents 1`] = ` { "name": "project", "version": "1.0.0", "description": "", - "ma", + "main": "index.js", "scripts": { "test": "echo /"Error: no test specified/" && exit 1", "hello": "echo Hello" @@ -560,178 +320,162 @@ exports[`test/index.js TAP npm pkg > should print package.json contents 1`] = ` } ` -exports[`test/index.js TAP npm pkg set scripts > should have expected script added package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm pkg set scripts > should have expected script added package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", - "main": "index.js", - "scripts": { - "test": "echo /"Error: no test specified/" && exit 1", - "hello": "echo Hello" + "devDependencies": Object { + "promise-all-reject-late": "^5.0.0", }, - "keywords": [], - "author": "", + "keywords": Array [], "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" + "main": "index.js", + "name": "project", + "scripts": Object { + "hello": "echo Hello", + "test": "echo /"Error: no test specified/" && exit 1", }, - "devDependencies": { - "promise-all-reject-late": "^1.0.1" - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm pkg set scripts > should have expected set-script output 1`] = ` +exports[`test/index.js TAP basic npm pkg set scripts > should have expected set-script output 1`] = ` ` -exports[`test/index.js TAP npm prefix > should have expected prefix output 1`] = ` -{CWD}/smoke-tests/test/tap-testdir-index/project +exports[`test/index.js TAP basic npm prefix > should have expected prefix output 1`] = ` +{CWD}/{TESTDIR}/project ` -exports[`test/index.js TAP npm run-script > should have expected run-script output 1`] = ` +exports[`test/index.js TAP basic npm run-script > should have expected run-script output 1`] = ` > project@1.0.0 hello > echo Hello Hello ` -exports[`test/index.js TAP npm uninstall > should have expected uninstall lockfile result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm uninstall > should have expected uninstall lockfile result 1`] = ` +Object { "lockfileVersion": 3, - "requires": true, - "packages": { - "": { + "name": "project", + "packages": Object { + "": Object { + "dependencies": Object { + "abbrev": "^1.0.4", + }, + "license": "ISC", "name": "project", "version": "1.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - } }, - "node_modules/abbrev": { + "node_modules/abbrev": Object { + "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.1.1.tgz", "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - } - } + }, + }, + "requires": true, + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm uninstall > should have expected uninstall package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm uninstall > should have expected uninstall package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", + "keywords": Array [], + "license": "ISC", "main": "index.js", - "scripts": { + "name": "project", + "scripts": Object { + "hello": "echo Hello", "test": "echo /"Error: no test specified/" && exit 1", - "hello": "echo Hello" }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm uninstall > should have expected uninstall reify output 1`] = ` -removed 1 package +exports[`test/index.js TAP basic npm uninstall > should have expected uninstall reify output 1`] = ` +removed 1 package in {TIME} ` -exports[`test/index.js TAP npm update dep > should have expected update lockfile result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm update dep > should have expected update lockfile result 1`] = ` +Object { "lockfileVersion": 3, - "requires": true, - "packages": { - "": { + "name": "project", + "packages": Object { + "": Object { + "dependencies": Object { + "abbrev": "^1.0.4", + }, + "devDependencies": Object { + "promise-all-reject-late": "^5.0.0", + }, + "license": "ISC", "name": "project", "version": "1.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" - }, - "devDependencies": { - "promise-all-reject-late": "^1.0.1" - } }, - "node_modules/abbrev": { + "node_modules/abbrev": Object { + "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.1.1.tgz", "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "node_modules/promise-all-reject-late": Object { "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - } - } + "funding": Object { + "url": "https://github.com/sponsors", + }, + "resolved": "http://smoke-test-registry.club/promise-all-reject-late/-/promise-all-reject-late-5.0.0.tgz", + "version": "5.0.0", + }, + }, + "requires": true, + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm update dep > should have expected update package.json result 1`] = ` -{ - "name": "project", - "version": "1.0.0", +exports[`test/index.js TAP basic npm update dep > should have expected update package.json result 1`] = ` +Object { + "author": "", + "dependencies": Object { + "abbrev": "^1.0.4", + }, "description": "", - "main": "index.js", - "scripts": { - "test": "echo /"Error: no test specified/" && exit 1", - "hello": "echo Hello" + "devDependencies": Object { + "promise-all-reject-late": "^5.0.0", }, - "keywords": [], - "author": "", + "keywords": Array [], "license": "ISC", - "dependencies": { - "abbrev": "^1.0.4" + "main": "index.js", + "name": "project", + "scripts": Object { + "hello": "echo Hello", + "test": "echo /"Error: no test specified/" && exit 1", }, - "devDependencies": { - "promise-all-reject-late": "^1.0.1" - } + "version": "1.0.0", } - ` -exports[`test/index.js TAP npm update dep > should have expected update reify output 1`] = ` -changed 1 package +exports[`test/index.js TAP basic npm update dep > should have expected update reify output 1`] = ` +changed 1 package in {TIME} 1 package is looking for funding run \`npm fund\` for details ` -exports[`test/index.js TAP npm view > should have expected view output 1`] = ` -abbrev@1.0.4 | MIT | deps: none | versions: 8 -Like ruby's abbrev module, but in js -https://github.com/isaacs/abbrev-js#readme +exports[`test/index.js TAP basic npm view > should have expected view output 1`] = ` +abbrev@1.0.4 | Proprietary | deps: none | versions: 2 +mocked test package dist -.tarball: https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz -.shasum: bd55ae5e413ba1722ee4caba1f6ea10414a59ecd - -maintainers: -- nlf -- ruyadorno -- darcyclarke -- adam_baldwin -- isaacs +.tarball: http://smoke-test-registry.club/abbrev/-/abbrev-1.0.4.tgz +.shasum: undefined dist-tags: latest: 1.1.1 -published over a year ago by isaacs +published just now ` diff --git a/smoke-tests/test/fixtures/abbrev.json b/smoke-tests/test/fixtures/abbrev.json deleted file mode 100644 index ffcf5474a9de8..0000000000000 --- a/smoke-tests/test/fixtures/abbrev.json +++ /dev/null @@ -1,449 +0,0 @@ -{ - "_id": "abbrev", - "_rev": "72-d1d46bef3d311d6da6737e109e771869", - "name": "abbrev", - "dist-tags": { - "latest": "1.1.1" - }, - "versions": { - "1.0.3": { - "name": "abbrev", - "version": "1.0.3", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "./lib/abbrev.js", - "scripts": { - "test": "node lib/abbrev.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/abbrev-js.git" - }, - "_id": "abbrev@1.0.3", - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.0.0rc7", - "_nodeVersion": "v0.5.0-pre", - "_defaultsLoaded": true, - "dist": { - "shasum": "aa049c967f999222aa42e14434f0c562ef468241", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.3.tgz" - }, - "directories": {} - }, - "1.0.4": { - "name": "abbrev", - "version": "1.0.4", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "./lib/abbrev.js", - "scripts": { - "test": "node lib/abbrev.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/isaacs/abbrev-js" - }, - "license": { - "type": "MIT", - "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE" - }, - "_id": "abbrev@1.0.4", - "dist": { - "shasum": "bd55ae5e413ba1722ee4caba1f6ea10414a59ecd", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" - }, - "_npmVersion": "1.1.70", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {} - }, - "1.0.5": { - "name": "abbrev", - "version": "1.0.5", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "node test.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/isaacs/abbrev-js" - }, - "license": { - "type": "MIT", - "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE" - }, - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js", - "_id": "abbrev@1.0.5", - "_shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", - "_from": ".", - "_npmVersion": "1.4.7", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "dist": { - "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" - }, - "directories": {} - }, - "1.0.6": { - "name": "abbrev", - "version": "1.0.6", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "node test.js" - }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "license": "ISC", - "gitHead": "648a6735d9c5a7a04885e3ada49eed4db36181c2", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "_id": "abbrev@1.0.6", - "_shasum": "b6d632b859b3fa2d6f7e4b195472461b9e32dc30", - "_from": ".", - "_npmVersion": "2.10.0", - "_nodeVersion": "2.0.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "b6d632b859b3fa2d6f7e4b195472461b9e32dc30", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.6.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {} - }, - "1.0.7": { - "name": "abbrev", - "version": "1.0.7", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "tap test.js --cov" - }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "license": "ISC", - "devDependencies": { - "tap": "^1.2.0" - }, - "gitHead": "821d09ce7da33627f91bbd8ed631497ed6f760c2", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "_id": "abbrev@1.0.7", - "_shasum": "5b6035b2ee9d4fb5cf859f08a9be81b208491843", - "_from": ".", - "_npmVersion": "2.10.1", - "_nodeVersion": "2.0.1", - "_npmUser": { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - "dist": { - "shasum": "5b6035b2ee9d4fb5cf859f08a9be81b208491843", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "directories": {} - }, - "1.0.9": { - "name": "abbrev", - "version": "1.0.9", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "tap test.js --cov" - }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "license": "ISC", - "devDependencies": { - "tap": "^5.7.2" - }, - "files": [ - "abbrev.js" - ], - "gitHead": "c386cd9dbb1d8d7581718c54d4ba944cc9298d6f", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "_id": "abbrev@1.0.9", - "_shasum": "91b4792588a7738c25f35dd6f63752a2f8776135", - "_from": ".", - "_npmVersion": "3.9.1", - "_nodeVersion": "4.4.4", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "91b4792588a7738c25f35dd6f63752a2f8776135", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/abbrev-1.0.9.tgz_1466016055839_0.7825860097073019" - }, - "directories": {} - }, - "1.1.0": { - "name": "abbrev", - "version": "1.1.0", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "tap test.js --100", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --all; git push origin --tags" - }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "license": "ISC", - "devDependencies": { - "tap": "^10.1" - }, - "files": [ - "abbrev.js" - ], - "gitHead": "7136d4d95449dc44115d4f78b80ec907724f64e0", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "_id": "abbrev@1.1.0", - "_shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f", - "_from": ".", - "_npmVersion": "4.3.0", - "_nodeVersion": "8.0.0-pre", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/abbrev-1.1.0.tgz_1487054000015_0.9229173036292195" - }, - "directories": {} - }, - "1.1.1": { - "name": "abbrev", - "version": "1.1.1", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "tap test.js --100", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --all; git push origin --tags" - }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "license": "ISC", - "devDependencies": { - "tap": "^10.1" - }, - "files": [ - "abbrev.js" - ], - "gitHead": "a9ee72ebc8fe3975f1b0c7aeb3a8f2a806a432eb", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "_id": "abbrev@1.1.1", - "_npmVersion": "5.4.2", - "_nodeVersion": "8.5.0", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "shasum": "f8f2c887ad10bf67f634f005b6987fed3179aac8", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - }, - "maintainers": [ - { - "name": "gabra", - "email": "jerry+1@npmjs.com" - }, - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "s3://npm-registry-packages", - "tmp": "tmp/abbrev-1.1.1.tgz_1506566833068_0.05750026390887797" - }, - "directories": {} - } - }, - "maintainers": [ - { - "email": "quitlahok@gmail.com", - "name": "nlf" - }, - { - "email": "ruyadorno@hotmail.com", - "name": "ruyadorno" - }, - { - "email": "darcy@darcyclarke.me", - "name": "darcyclarke" - }, - { - "email": "evilpacket@gmail.com", - "name": "adam_baldwin" - }, - { - "email": "i@izs.me", - "name": "isaacs" - } - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "description": "Like ruby's abbrev module, but in js", - "time": { - "modified": "2020-10-13T05:04:03.636Z", - "created": "2011-03-21T22:21:11.183Z", - "1.0.1": "2011-03-21T22:21:11.183Z", - "1.0.2": "2011-03-21T22:21:11.183Z", - "1.0.3": "2011-03-21T22:21:11.183Z", - "1.0.3-1": "2011-03-24T23:01:19.581Z", - "1.0.4": "2013-01-09T00:01:24.135Z", - "1.0.5": "2014-04-17T20:09:12.523Z", - "1.0.6": "2015-05-21T00:58:16.778Z", - "1.0.7": "2015-05-30T22:57:54.685Z", - "1.0.9": "2016-06-15T18:41:01.215Z", - "1.1.0": "2017-02-14T06:33:20.235Z", - "1.1.1": "2017-09-28T02:47:13.220Z" - }, - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "users": { - "leesei": true, - "ceejbot": true, - "isaacs": true, - "npm-www": true, - "tunnckocore": true, - "ruanyu1": true, - "leodutra": true, - "jessaustin": true, - "jian263994241": true, - "floriannagel": true, - "tdmalone": true, - "ryanve": true, - "detj": true, - "monjer": true, - "d-band": true - }, - "readme": "# abbrev-js\n\nJust like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).\n\nUsage:\n\n var abbrev = require(\"abbrev\");\n abbrev(\"foo\", \"fool\", \"folding\", \"flop\");\n \n // returns:\n { fl: 'flop'\n , flo: 'flop'\n , flop: 'flop'\n , fol: 'folding'\n , fold: 'folding'\n , foldi: 'folding'\n , foldin: 'folding'\n , folding: 'folding'\n , foo: 'foo'\n , fool: 'fool'\n }\n\nThis is handy for command-line scripts, or other cases where you want to be able to accept shorthands.\n", - "readmeFilename": "README.md", - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "license": "ISC" -} diff --git a/smoke-tests/test/fixtures/abbrev.min.json b/smoke-tests/test/fixtures/abbrev.min.json deleted file mode 100644 index c03d91c9c8c19..0000000000000 --- a/smoke-tests/test/fixtures/abbrev.min.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "abbrev", - "dist-tags": { - "latest": "1.1.1" - }, - "versions": { - "1.0.3": { - "name": "abbrev", - "version": "1.0.3", - "dist": { - "shasum": "aa049c967f999222aa42e14434f0c562ef468241", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.3.tgz" - }, - "engines": { - "node": "*" - } - }, - "1.0.4": { - "name": "abbrev", - "version": "1.0.4", - "dist": { - "shasum": "bd55ae5e413ba1722ee4caba1f6ea10414a59ecd", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.4.tgz" - } - }, - "1.0.5": { - "name": "abbrev", - "version": "1.0.5", - "dist": { - "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" - } - }, - "1.0.6": { - "name": "abbrev", - "version": "1.0.6", - "dist": { - "shasum": "b6d632b859b3fa2d6f7e4b195472461b9e32dc30", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.6.tgz" - } - }, - "1.0.7": { - "name": "abbrev", - "version": "1.0.7", - "devDependencies": { - "tap": "^1.2.0" - }, - "dist": { - "shasum": "5b6035b2ee9d4fb5cf859f08a9be81b208491843", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" - } - }, - "1.0.9": { - "name": "abbrev", - "version": "1.0.9", - "devDependencies": { - "tap": "^5.7.2" - }, - "dist": { - "shasum": "91b4792588a7738c25f35dd6f63752a2f8776135", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" - } - }, - "1.1.0": { - "name": "abbrev", - "version": "1.1.0", - "devDependencies": { - "tap": "^10.1" - }, - "dist": { - "shasum": "d0554c2256636e2f56e7c2e5ad183f859428d81f", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz" - } - }, - "1.1.1": { - "name": "abbrev", - "version": "1.1.1", - "devDependencies": { - "tap": "^10.1" - }, - "dist": { - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "shasum": "f8f2c887ad10bf67f634f005b6987fed3179aac8", - "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - } - } - }, - "modified": "2020-10-13T05:04:03.636Z" -} diff --git a/smoke-tests/test/fixtures/abbrev/-/abbrev-1.0.4.tgz b/smoke-tests/test/fixtures/abbrev/-/abbrev-1.0.4.tgz deleted file mode 100644 index dfd1b55919e2f24febd758561d7640b0c1a7059a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2295 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 {\n return lateReject(files.map(file => writeFile(file, 'some data')))\n .catch(er => {\n // try to clean up, then fail with the initial error\n // we know that all write attempts are finished at this point\n return lateReject(files.map(file => rimraf(file)))\n .catch(er => {\n console.error('failed to clean up, youre on your own i guess', er)\n })\n .then(() => {\n // fail with the original error\n throw er\n })\n })\n}\n```\n\n## API\n\n* `lateReject([array, of, promises])` - Resolve all the promises,\n returning a promise that rejects with the first error, or resolves with\n the array of results, but only after all promises are settled.\n", - "readmeFilename": "README.md", - "_cached": false, - "_contentLength": 0 -} \ No newline at end of file diff --git a/smoke-tests/test/fixtures/promise-all-reject-late.min.json b/smoke-tests/test/fixtures/promise-all-reject-late.min.json deleted file mode 100644 index 699be7aaf2e82..0000000000000 --- a/smoke-tests/test/fixtures/promise-all-reject-late.min.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "promise-all-reject-late", - "dist-tags": { - "latest": "1.0.1" - }, - "versions": { - "1.0.0": { - "name": "promise-all-reject-late", - "version": "1.0.0", - "devDependencies": { - "tap": "^14.10.5" - }, - "dist": { - "integrity": "sha512-f5XvVl++12pEo7Sv7f7FGfzVuVpeY2msNKjn7nNcXyOSKh5uVu7IAzDO6RE9hDVoHJhxvg+gqEacwkZ891Se5g==", - "shasum": "4fa37515e2d78c3b0462414402a8debce62b8b9f", - "tarball": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.0.tgz", - "fileCount": 7, - "unpackedSize": 123039, - "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeBmldCRA9TVsSAnZWagAAaigP/2CarvNCbglNS0dgjOoH\n7ZuFo1cG+N8BkZct00TyEJjuB+5UUmv9TSnZogfEOGutvMqUTSRhvm3fOWsJ\n7TXs8zJ6SotDR9+xlxqi/skpYXfRdNjdaMvo9kYO5jaV84pstdbl17sPeYXd\nCudbAKp1sYodlaJyqpyfUd2PWUNe/VGLODmjLogHB4/bevT3tdjsdauKrUS4\n3VFw8sS1Fwp7P2YneNIK3C1TY/Yb66KysZO23VsQemCQFKXpQJMa9B6yj8zs\n5BQp+W5tM70IfW6OXD0+Vt2jWr9jmKmoWVEiL5usJT3zD7vRbeH3xQvSEgDD\nskI8vH8iJ+3EbEOWTGlIu7mX88Dp2KnHOoRUkOR03WJWuGnsTC8Uyqi0F1Xd\nFeFlaeNzynR/R2LcdRNiFOM+1xtzfAtVGF7TIp9UjgJwSNNkEMlkNzQqSiC7\n/AeqsAYoBBNmYWY2fvXdS9HQ4HfIGjI++jCYWX4I7sUvOjqfcwlEz8MwromA\nqeBAFPdvnB0F/q/AOOLkcdsO81jES7ts0nB7bDt0rDbztWWq34BSMDnNoSDo\nDE9q8u7g68tQcr3WmOQr4ro10sSbJVJZmz8DSJKCbVJ+FN0+GM+49oyyhIFl\nOjokXn5U8ASEdiZnmFnt51dr9A4fyjhehotJA6qSs7t2fBe86VnufijC971U\nv3Jc\r\n=lLwf\r\n-----END PGP SIGNATURE-----\r\n" - } - }, - "1.0.1": { - "name": "promise-all-reject-late", - "version": "1.0.1", - "devDependencies": { - "tap": "^14.10.5" - }, - "dist": { - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "shasum": "f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2", - "tarball": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "fileCount": 8, - "unpackedSize": 123171, - "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeL65kCRA9TVsSAnZWagAAas4P/2WFFJvncp0LWb3DbE0t\ndx9BhZEwY3W8V6ug8uKvph24LoQp1PakkncscKS7PsCVHyIslD+fi6V99AmI\nOmL2ECAMUd5N69Cs8eTi4tKTNtUoIslfCu0+SMlCAF11D7oBXSabdOxGQofA\nuksoHdCqGM6M1y2BGjK7FR8dSwvgbQCPaUzazZ5w7w4XqVxDlzbvNj2E5mSF\n5HjlT5q239uNQppwPIFpisyi9DKa0ran2N7F2ioZ1PHvhFCqo6rmL8tAQsxQ\n+3OA4eFD0FJCJuqd3MOaY66mkncfNpmPvQYMyigKBUdJJyrgNsB67yfaFduy\ndK198Bnva5kotttQ4EHxM6gkqRm2d9o1/sYmAUtDELgrVDxzeNl+yG+nCkho\n1ta4cY+wy1dTjqAYaprQJ855nIeGGnr3tvz4dEGX/5eyh5K+oYVOYRFvWFX6\nVlEhBmSRqamfW5N1ndMyY18FM+Vc12yu66yZ3z1FqbgEGqdf3EP3lwWqClpP\nbPdXANzHM1FIz1PGHC7IZFWXH5KV1z+JXXahg/d8CLzz0PY6jaBt4c2xDvo7\nLaEAm7kNMbdewKvuTuG7x2Kqyf1KwjpOhXMrq6h0rlFm0pRt0xAArQ9Sglw8\n2Vq9Ic9EEsSIpzA5iQ86O1xkTREGHTB3uTRXUJixXIGkhLkhBB+Uj9y+GoOh\nX+Dm\r\n=yF+m\r\n-----END PGP SIGNATURE-----\r\n" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - } - }, - "modified": "2020-01-28T03:45:42.154Z", - "_cached": false, - "_contentLength": 2803 -} \ No newline at end of file diff --git a/smoke-tests/test/fixtures/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz b/smoke-tests/test/fixtures/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz deleted file mode 100644 index 7da40442387663b9f251a44867e18246aaa6c25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30838 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 z 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 z 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 R`1~V({y&|#T>b$50RR?OQ^^1T diff --git a/smoke-tests/test/fixtures/setup.js b/smoke-tests/test/fixtures/setup.js index bd2e1bf2d3a25..38fc27f3eea8f 100644 --- a/smoke-tests/test/fixtures/setup.js +++ b/smoke-tests/test/fixtures/setup.js @@ -1,157 +1,204 @@ -const fs = require('fs') -const { join, resolve, sep, basename } = require('path') -const which = require('which').sync -const http = require('http') +const fs = require('fs/promises') +const { join, resolve, sep, extname, relative, delimiter } = require('path') +const which = require('which') const spawn = require('@npmcli/promise-spawn') +const justExtend = require('just-extend') +const justSet = require('just-safe-set') +const MockRegistry = require('@npmcli/mock-registry') +const { Blob } = require('buffer') +const http = require('http') +const httpProxy = require('http-proxy') -const { SMOKE_PUBLISH_NPM, CI, PATH, TAP_CHILD_ID = '0' } = process.env -const PORT = 12345 + Number(TAP_CHILD_ID) -const log = CI ? console.error : () => {} -const registry = `http://localhost:${PORT}/` -const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' +const { SMOKE_PUBLISH_NPM, CI, PATH, Path, TAP_CHILD_ID = '0' } = process.env +const PORT = 12345 + (+TAP_CHILD_ID) +const set = (obj, ...args) => justSet(obj, ...args) && obj +const merge = (...args) => justExtend(true, ...args) const normalizePath = path => path.replace(/[A-Z]:/, '').replace(/\\/g, '/') +const exists = (f) => fs.access(f, fs.constants.F_OK).catch(() => false) + +const testdirHelper = (obj) => { + for (const [key, value] of Object.entries(obj)) { + if (extname(key) === '.json') { + obj[key] = JSON.stringify(value, null, 2) + } else if (typeof value === 'object') { + obj[key] = testdirHelper(value) + } else { + obj[key] = value + } + } + return obj +} -const cwd = resolve(__dirname, '..', '..', '..') -const npmCli = join('bin', 'npm-cli.js') -const execArgv = SMOKE_PUBLISH_NPM ? ['npm'] : [process.execPath, join(cwd, npmCli)] -const npmDir = SMOKE_PUBLISH_NPM ? fs.realpathSync(which('npm')).replace(sep + npmCli, '') : cwd +const getNpm = async () => { + const cliRoot = resolve(__dirname, '..', '..', '..') + const cliBin = join('bin', 'npm-cli.js') + + if (SMOKE_PUBLISH_NPM) { + return { + command: ['npm'], + cleanPaths: [ + cliRoot, + await which('npm').then(p => fs.realpath(p).replace(sep + cliBin)), + ], + } + } + + return { + command: [process.execPath, join(cliRoot, cliBin)], + cleanPaths: [process.execPath, cliRoot], + } +} + +module.exports = async (t, { testdir = {}, debug } = {}) => { + const { command, cleanPaths } = await getNpm(t) -module.exports = (t) => { // setup fixtures - const path = t.testdir({ - '.npmrc': '', + const root = t.testdir({ cache: {}, - project: {}, + project: { '.npmrc': '' }, bin: {}, + global: { '.npmrc': '' }, + ...testdirHelper(testdir), }) - const localPrefix = resolve(path, 'project') - const userconfigLocation = resolve(path, '.npmrc') - const cacheLocation = resolve(path, 'cache') - const binLocation = resolve(path, 'bin') - - // setup server - let server = null - t.before(() => new Promise((resolvePromise) => { - server = http.createServer((req, res) => { - res.setHeader('connection', 'close') - - const f = join(__dirname, join('/', req.url.replace(/@/, '').replace(/%2f/i, '/'))) - - // a magic package that causes us to return an error that will be logged - if (basename(f) === 'fail_reflect_user_agent') { - res.statusCode = 404 - res.setHeader('npm-notice', req.headers['user-agent']) - return res.end() - } + const paths = { + root, + project: join(root, 'project'), + global: join(root, 'global'), + userConfig: join(root, 'project', '.npmrc'), + globalConfig: join(root, 'global', '.npmrc'), + cache: join(root, 'cache'), + bin: join(root, 'bin'), + } - const isCorgi = req.headers.accept.includes('application/vnd.npm.install-v1+json') - const file = f + ( - isCorgi && fs.existsSync(`${f}.min.json`) ? '.min.json' - : fs.existsSync(`${f}.json`) ? '.json' - : fs.existsSync(`${f}/index.json`) ? 'index.json' - : '' - ) - - try { - const body = fs.readFileSync(file) - res.setHeader('content-length', body.length) - res.setHeader('content-type', /\.min\.json$/.test(file) ? corgiDoc - : /\.json$/.test(file) ? 'application/json' - : 'application/octet-stream') - res.end(body) - } catch { - res.statusCode = 500 - res.setHeader('content-type', 'text/plain') - res.end('bad') - } - }).listen(PORT, resolvePromise) - })) + const registry = new MockRegistry({ + tap: t, + registry: 'http://smoke-test-registry.club/', + debug, + }) + const httpProxyRegistry = `http://localhost:${PORT}/` + const proxy = httpProxy.createProxyServer({}) + const server = http.createServer((req, res) => proxy.web(req, res, { target: registry.origin })) + await new Promise(res => server.listen(PORT, res)) t.teardown(() => server.close()) // update notifier should never be written - t.afterEach((t) => { - const updateExists = fs.existsSync(join(cacheLocation, '_update-notifier-last-checked')) + t.afterEach(async (t) => { + const updateExists = await exists(join(paths.cache, '_update-notifier-last-checked')) t.equal(updateExists, false) + // this requires that mocks not be shared between sub tests but it helps + // find mistakes quicker instead of waiting for the entire test to end + t.strictSame(registry.nock.pendingMocks(), [], 'no pending mocks after each') + t.strictSame(registry.nock.activeMocks(), [], 'no active mocks after each') }) - t.cleanSnapshot = s => - s + const cleanOutput = s => { // sometimes we print normalized paths in snapshots regardless of - // platform so replace those first - .split(normalizePath(npmDir)) - .join('{CWD}') - .split(normalizePath(cwd)) - .join('{CWD}') - .split(registry) - .join('https://registry.npmjs.org/') - .split(normalizePath(process.execPath)) - .join('node') - // then replace platform style paths - .split(npmDir) - .join('{CWD}') - .split(cwd) - .join('{CWD}') + // platform so replace those first then replace platform style paths + for (const cleanPath of cleanPaths) { + s = s + .split(normalizePath(cleanPath)).join('{CWD}') + .split(cleanPath).join('{CWD}') + .split(relative(cleanPath, t.testdirName)).join('{TESTDIR}') + } + + return s.split(httpProxyRegistry).join('{REGISTRY}') .replace(/\\+/g, '/') .replace(/\r\n/g, '\n') .replace(/ \(in a browser\)/g, '') .replace(/^npm@.* /gm, 'npm ') .replace(/^.*debug-[0-9]+.log$/gm, '') + .replace(/in \d+ms$/gm, 'in {TIME}') + } + t.cleanSnapshot = cleanOutput + const log = !debug && !CI ? () => {} : (...args) => { + console.error(...args.map(a => cleanOutput(a.toString()))) + } - const exec = async (...args) => { - const cmd = [] - const opts = [ - `--registry=${registry}`, - `--cache=${cacheLocation}`, - `--userconfig=${userconfigLocation}`, + const npm = async (...args) => { + const defaultCmd = [] + const defaultOpts = [ + `--registry=${httpProxyRegistry}`, + `--cache=${paths.cache}`, + `--prefix=${paths.project}`, + `--userconfig=${paths.userConfig}`, + `--globalconfig=${paths.globalConfig}`, '--no-audit', '--no-update-notifier', '--loglevel=silly', + '--fetch-timeout=5000', + '--fetch-retries=0', ] - for (const arg of args) { + + const [cmd, opts] = args.reduce((acc, arg) => { if (arg.startsWith('--')) { - opts.push(arg) + acc[1].push(arg) } else { - cmd.push(arg) + acc[0].push(arg) } - } + return acc + }, [defaultCmd, defaultOpts]) - const hasWorkspaceOpt = opts.some(o => /^--workspaces?($|=)/.test(o)) - // XXX: not sure why outdated fails with no-workspaces but works without it - if (!hasWorkspaceOpt && cmd[0] !== 'outdated') { - // This is required so we dont detect any workspace roots above the testdir - opts.push('--no-workspaces') - } + const spawnCmd = command[0] + const spawnArgs = [...command.slice(1), ...cmd, ...opts] - const spawnArgs = [execArgv[0], [...execArgv.slice(1), ...cmd, ...opts]] - log([spawnArgs[0], ...spawnArgs[1]].join('\n')) + log('='.repeat(40)) + log(`\n${spawnCmd} ${spawnArgs.join(' ')}`) - const res = await spawn(...spawnArgs, { - cwd: localPrefix, + const { stderr, stdout } = await spawn(spawnCmd, spawnArgs, { + cwd: paths.project, env: { - HOME: path, - PATH: `${PATH}:${binLocation}`, + HTTP_PROXY: httpProxyRegistry, + HOME: paths.root, + [Path ? 'Path' : 'PATH']: `${Path || PATH}${delimiter}${paths.bin}`, COMSPEC: process.env.COMSPEC, }, }) - log(res.stderr) - return res.stdout + log('\n' + stderr) + log('\n' + stdout) + log('='.repeat(40)) + + return cleanOutput(stdout) + } + + // helpers for reading/writing files and their source + const readFile = async (f) => { + const file = await fs.readFile(join(paths.project, f), 'utf-8') + return extname(f) === '.json' ? JSON.parse(file) : file } - const readFile = (f) => fs.readFileSync(resolve(localPrefix, f), 'utf-8') - const writeFile = (f, d) => fs.writeFileSync(resolve(localPrefix, f), d, 'utf-8') - const rmDir = () => { - for (const f of fs.readdirSync(localPrefix)) { - fs.rmSync(join(localPrefix, f), { recursive: true, force: true }) + // Returns a recurisve list of relative file paths in the testdir root + // will also follow symlinks and print their relative paths + const tree = async (rootDir = paths.project, dir = rootDir) => { + const results = {} + for (const item of await fs.readdir(dir)) { + const itemPath = join(dir, item) + const relPath = relative(rootDir, itemPath) + const stat = await fs.lstat(itemPath) + + if (stat.isSymbolicLink()) { + const realpath = await fs.realpath(itemPath) + merge(results, await tree(rootDir, realpath)) + } else if (stat.isDirectory()) { + merge(results, await tree(rootDir, itemPath)) + } else { + const raw = await readFile(relPath) + const content = typeof raw === 'string' ? `${new Blob([raw]).size} bytes` : raw + merge(results, set({}, relPath.split(sep), content)) + } } + return results } return { - exec, + npm, readFile, - writeFile, - rmDir, + tree, + paths, + registry, isSmokePublish: !!SMOKE_PUBLISH_NPM, } } + +module.exports.testdir = testdirHelper diff --git a/smoke-tests/test/index.js b/smoke-tests/test/index.js index e83e43de4334b..4aafcb2cbd2e1 100644 --- a/smoke-tests/test/index.js +++ b/smoke-tests/test/index.js @@ -2,246 +2,337 @@ const { join } = require('path') const t = require('tap') const setup = require('./fixtures/setup.js') -const { exec, isSmokePublish, readFile, writeFile, rmDir } = setup(t) - -// this test must come first, its package.json will be destroyed and the one -// created in the next test (npm init) will create a new one that must be -// present for later tests -t.test('npm install sends correct user-agent', async t => { - writeFile('package.json', JSON.stringify({ name: 'smoke-test-workspaces' })) - t.teardown(() => rmDir()) - - await exec('init', '-y', `--workspace=${join('packages', 'foo')}`) - - await t.rejects( - exec('install', 'fail_reflect_user_agent'), - { - stderr: /workspaces\/false/, - }, - 'workspaces/false is present in output' - ) - - await t.rejects( - exec('install', 'fail_reflect_user_agent', '--workspaces'), - { - stderr: /workspaces\/true/, +t.test('basic', async t => { + const { registry, npm, isSmokePublish, readFile, paths } = await setup(t, { + testdir: { + packages: { + 'abbrev-1.0.4': { + 'package.json': { name: 'abbrev', version: '1.0.4' }, + 'index.js': 'module.exports = "1.0.4"', + }, + 'abbrev-1.1.1': { + 'package.json': { name: 'abbrev', version: '1.1.1' }, + 'index.js': 'module.exports = "1.1.1"', + }, + 'promise-all-reject-late': { + 'package.json': { name: 'promise-all-reject-late', version: '5.0.0' }, + 'index.js': 'module.exports = null', + }, + }, }, - 'workspaces/true is present in output' - ) -}) - -t.test('npm init', async t => { - const cmdRes = await exec('init', '-y') - - t.matchSnapshot(cmdRes, 'should have successful npm init result') - const pkg = JSON.parse(readFile('package.json')) - t.equal(pkg.name, 'project', 'should have expected generated name') - t.equal(pkg.version, '1.0.0', 'should have expected generated version') -}) - -t.test('npm --version', async t => { - const v = await exec('--version') - - if (isSmokePublish) { - t.match(v.trim(), /-[0-9a-f]{40}\.\d$/, 'must have a git version') - } else { - t.skip('not checking version') - } -}) - -t.test('npm (no args)', async t => { - const err = await exec('--loglevel=notice').catch(e => e) - - t.equal(err.code, 1, 'should exit with error code') - t.equal(err.stderr, '', 'should have no stderr output') - t.matchSnapshot(err.stdout, 'should have expected no args output') -}) - -t.test('npm install prodDep@version', async t => { - const cmdRes = await exec('install', 'abbrev@1.0.4') - - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected install reify output') - t.matchSnapshot(readFile('package.json'), 'should have expected package.json result') - t.matchSnapshot(readFile('package-lock.json'), 'should have expected lockfile result') -}) - -t.test('npm install dev dep', async t => { - const cmdRes = await exec('install', 'promise-all-reject-late', '-D') - - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected dev dep added reify output') - t.matchSnapshot( - readFile('package.json'), - 'should have expected dev dep added package.json result' - ) - t.matchSnapshot( - readFile('package-lock.json'), - 'should have expected dev dep added lockfile result' - ) -}) - -t.test('npm ls', async t => { - const cmdRes = await exec('ls') - - t.matchSnapshot(cmdRes, 'should have expected ls output') -}) - -t.test('npm fund', async t => { - const cmdRes = await exec('fund') - - t.matchSnapshot(cmdRes, 'should have expected fund output') -}) - -t.test('npm explain', async t => { - const cmdRes = await exec('explain', 'abbrev') - - t.matchSnapshot(cmdRes, 'should have expected explain output') -}) - -t.test('npm diff', async t => { - const cmdRes = await exec('diff', '--diff=abbrev@1.0.4', '--diff=abbrev@1.1.1') - - t.matchSnapshot(cmdRes, 'should have expected diff output') -}) - -t.test('npm outdated', async t => { - const err = await exec('outdated').catch(e => e) - - t.equal(err.code, 1, 'should exit with error code') - t.not(err.stderr, '', 'should have stderr output') - t.matchSnapshot(err.stdout, 'should have expected outdated output') -}) - -t.test('npm pkg set scripts', async t => { - const cmdRes = await exec('pkg', 'set', 'scripts.hello=echo Hello') - - t.matchSnapshot(cmdRes, 'should have expected set-script output') - t.matchSnapshot( - readFile('package.json'), - 'should have expected script added package.json result' - ) -}) - -t.test('npm run-script', async t => { - const cmdRes = await exec('run', 'hello') - - t.matchSnapshot(cmdRes, 'should have expected run-script output') -}) - -t.test('npm prefix', async t => { - const cmdRes = await exec('prefix') - - t.matchSnapshot(cmdRes, 'should have expected prefix output') -}) - -t.test('npm view', async t => { - const cmdRes = await exec('view', 'abbrev@1.0.4') - - t.matchSnapshot(cmdRes, 'should have expected view output') -}) - -t.test('npm update dep', async t => { - const cmdRes = await exec('update', 'abbrev') - - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected update reify output') - t.matchSnapshot(readFile('package.json'), 'should have expected update package.json result') - t.matchSnapshot(readFile('package-lock.json'), 'should have expected update lockfile result') -}) - -t.test('npm uninstall', async t => { - const cmdRes = await exec('uninstall', 'promise-all-reject-late') - - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected uninstall reify output') - t.matchSnapshot(readFile('package.json'), 'should have expected uninstall package.json result') - t.matchSnapshot(readFile('package-lock.json'), 'should have expected uninstall lockfile result') -}) - -t.test('npm pkg', async t => { - let cmdRes = await exec('pkg', 'get', 'license') - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected pkg get output') - - cmdRes = await exec('pkg', 'set', 'tap[test-env][0]=LC_ALL=sk') - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected pkg set output') - - t.matchSnapshot( - readFile('package.json'), - 'should have expected npm pkg set modified package.json result' - ) - - cmdRes = await exec('pkg', 'get') - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should print package.json contents') - - cmdRes = await exec('pkg', 'delete', 'tap') - t.matchSnapshot(cmdRes.replace(/in.*s/, ''), 'should have expected pkg delete output') - - t.matchSnapshot( - readFile('package.json'), - 'should have expected npm pkg delete modified package.json result' - ) -}) - -t.test('npm update --no-save --no-package-lock', async t => { - // setup, manually reset dep value - await exec('pkg', 'set', 'dependencies.abbrev==1.0.4') - await exec(`install`) - await exec('pkg', 'set', 'dependencies.abbrev=^1.0.4') - - await exec('update', '--no-save', '--no-package-lock') - - t.equal( - JSON.parse(readFile('package.json')).dependencies.abbrev, - '^1.0.4', - 'should have expected update --no-save --no-package-lock package.json result' - ) - t.equal( - JSON.parse(readFile('package-lock.json')).packages['node_modules/abbrev'].version, - '1.0.4', - 'should have expected update --no-save --no-package-lock lockfile result' - ) -}) - -t.test('npm update --no-save', async t => { - await exec('update', '--no-save') - - t.equal( - JSON.parse(readFile('package.json')).dependencies.abbrev, - '^1.0.4', - 'should have expected update --no-save package.json result' - ) - t.equal( - JSON.parse(readFile('package-lock.json')).packages['node_modules/abbrev'].version, - '1.1.1', - 'should have expected update --no-save lockfile result' - ) -}) - -t.test('npm update --save', async t => { - await exec('update', '--save') - - t.equal( - JSON.parse(readFile('package.json')).dependencies.abbrev, - '^1.1.1', - 'should have expected update --save package.json result' - ) - t.equal( - JSON.parse(readFile('package-lock.json')).packages['node_modules/abbrev'].version, - '1.1.1', - 'should have expected update --save lockfile result' - ) -}) - -t.test('npm ci', async t => { - await exec('uninstall', 'abbrev') - await exec('install', 'abbrev@1.0.4', '--save-exact') - - t.equal( - JSON.parse(readFile('package-lock.json')).packages['node_modules/abbrev'].version, - '1.0.4', - 'should have stored exact installed version' - ) - - await exec('pkg', 'set', 'dependencies.abbrev=^1.1.1') - - const err = await exec('ci', '--loglevel=error').catch(e => e) - t.equal(err.code, 1) - t.matchSnapshot(err.stderr, 'should throw mismatch deps in lock file error') + }) + + const abbrevManifest = () => registry.manifest({ name: 'abbrev', versions: ['1.0.4', '1.1.1'] }) + + await t.test('npm init', async t => { + const cmdRes = await npm('init', '-y') + + t.matchSnapshot(cmdRes, 'should have successful npm init result') + const pkg = await readFile('package.json') + t.equal(pkg.name, 'project', 'should have expected generated name') + t.equal(pkg.version, '1.0.0', 'should have expected generated version') + }) + + await t.test('npm --version', async t => { + const v = await npm('--version') + + if (isSmokePublish) { + t.match(v.trim(), /-[0-9a-f]{40}\.\d$/, 'must have a git version') + } else { + t.match(v.trim(), /^\d+\.\d+\.\d+/, 'has a version') + } + }) + + await t.test('npm (no args)', async t => { + const err = await npm('--loglevel=notice').catch(e => e) + + t.equal(err.code, 1, 'should exit with error code') + t.equal(err.stderr, '', 'should have no stderr output') + t.matchSnapshot(err.stdout, 'should have expected no args output') + }) + + await t.test('npm install prodDep@version', async t => { + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + tarballs: { '1.0.4': join(paths.root, 'packages', 'abbrev-1.0.4') }, + }) + + const cmdRes = await npm('install', 'abbrev@1.0.4') + + t.matchSnapshot(cmdRes, 'should have expected install reify output') + t.resolveMatchSnapshot(readFile('package.json'), 'should have expected package.json result') + t.resolveMatchSnapshot(readFile('package-lock.json'), 'should have expected lockfile result') + }) + + await t.test('npm install dev dep', async t => { + const manifest = registry.manifest({ + name: 'promise-all-reject-late', + packuments: [{ version: '5.0.0', funding: 'https://github.com/sponsors' }], + }) + await registry.package({ + manifest: manifest, + tarballs: { '5.0.0': join(paths.root, 'packages', 'promise-all-reject-late') }, + }) + + const cmdRes = await npm('install', 'promise-all-reject-late', '-D') + + t.matchSnapshot(cmdRes, 'should have expected dev dep added reify output') + t.resolveMatchSnapshot( + readFile('package.json'), + 'should have expected dev dep added package.json result' + ) + t.resolveMatchSnapshot( + readFile('package-lock.json'), + 'should have expected dev dep added lockfile result' + ) + }) + + await t.test('npm ls', async t => { + const cmdRes = await npm('ls') + + t.matchSnapshot(cmdRes, 'should have expected ls output') + }) + + await t.test('npm fund', async t => { + const cmdRes = await npm('fund') + + t.matchSnapshot(cmdRes, 'should have expected fund output') + }) + + await t.test('npm explain', async t => { + const cmdRes = await npm('explain', 'abbrev') + + t.matchSnapshot(cmdRes, 'should have expected explain output') + }) + + await t.test('npm diff', async t => { + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + tarballs: { '1.0.4': join(paths.root, 'packages', 'abbrev-1.0.4') }, + }) + await registry.package({ + manifest: manifest, + tarballs: { '1.1.1': join(paths.root, 'packages', 'abbrev-1.1.1') }, + }) + + const cmdRes = await npm('diff', '--diff=abbrev@1.0.4', '--diff=abbrev@1.1.1') + + t.matchSnapshot(cmdRes, 'should have expected diff output') + }) + + await t.test('npm outdated', async t => { + await registry.package({ + manifest: registry.manifest({ + name: 'promise-all-reject-late', + versions: ['5.0.0'], + }), + }) + await registry.package({ + manifest: abbrevManifest(), + }) + + const outdated = await npm('outdated').catch(e => e) + + t.equal(outdated.code, 1, 'should exit with error code') + t.not(outdated.stderr, '', 'should have stderr output') + t.matchSnapshot(outdated.stdout, 'should have expected outdated output') + }) + + await t.test('npm pkg set scripts', async t => { + const cmdRes = await npm('pkg', 'set', 'scripts.hello=echo Hello') + + t.matchSnapshot(cmdRes, 'should have expected set-script output') + t.resolveMatchSnapshot( + readFile('package.json'), + 'should have expected script added package.json result' + ) + }) + + await t.test('npm run-script', async t => { + const cmdRes = await npm('run', 'hello') + + t.matchSnapshot(cmdRes, 'should have expected run-script output') + }) + + await t.test('npm prefix', async t => { + const cmdRes = await npm('prefix') + + t.matchSnapshot(cmdRes, 'should have expected prefix output') + }) + + await t.test('npm view', async t => { + await registry.package({ + manifest: abbrevManifest(), + }) + const cmdRes = await npm('view', 'abbrev@1.0.4') + + t.matchSnapshot(cmdRes, 'should have expected view output') + }) + + await t.test('npm update dep', async t => { + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + tarballs: { + '1.1.1': join(paths.root, 'packages', 'abbrev-1.1.1'), + }, + }) + + const cmdRes = await npm('update', 'abbrev') + + t.matchSnapshot(cmdRes, 'should have expected update reify output') + t.resolveMatchSnapshot(readFile('package.json'), + 'should have expected update package.json result') + t.resolveMatchSnapshot(readFile('package-lock.json'), + 'should have expected update lockfile result') + }) + + await t.test('npm uninstall', async t => { + const cmdRes = await npm('uninstall', 'promise-all-reject-late') + + t.matchSnapshot(cmdRes, 'should have expected uninstall reify output') + t.resolveMatchSnapshot(readFile('package.json'), + 'should have expected uninstall package.json result') + t.resolveMatchSnapshot(readFile('package-lock.json'), + 'should have expected uninstall lockfile result') + }) + + await t.test('npm pkg', async t => { + let cmdRes = await npm('pkg', 'get', 'license') + t.matchSnapshot(cmdRes, 'should have expected pkg get output') + + cmdRes = await npm('pkg', 'set', 'tap[test-env][0]=LC_ALL=sk') + t.matchSnapshot(cmdRes, 'should have expected pkg set output') + + t.resolveMatchSnapshot( + readFile('package.json'), + 'should have expected npm pkg set modified package.json result' + ) + + cmdRes = await npm('pkg', 'get') + t.matchSnapshot(cmdRes, 'should print package.json contents') + + cmdRes = await npm('pkg', 'delete', 'tap') + t.matchSnapshot(cmdRes, 'should have expected pkg delete output') + + t.resolveMatchSnapshot( + readFile('package.json'), + 'should have expected npm pkg delete modified package.json result' + ) + }) + + await t.test('npm update --no-save --no-package-lock', async t => { + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + tarballs: { + '1.0.4': join(paths.root, 'packages', 'abbrev-1.0.4'), + }, + }) + + // setup, manually reset dep value + await npm('pkg', 'set', 'dependencies.abbrev==1.0.4') + await npm('install') + + await registry.package({ + manifest: manifest, + tarballs: { + '1.1.1': join(paths.root, 'packages', 'abbrev-1.1.1'), + }, + }) + + await npm('pkg', 'set', 'dependencies.abbrev=^1.0.4') + await npm('update', '--no-save', '--no-package-lock') + + t.equal( + (await readFile('package.json')).dependencies.abbrev, + '^1.0.4', + 'should have expected update --no-save --no-package-lock package.json result' + ) + t.equal( + (await readFile('package-lock.json')).packages['node_modules/abbrev'].version, + '1.0.4', + 'should have expected update --no-save --no-package-lock lockfile result' + ) + t.equal( + (await readFile('node_modules/abbrev/package.json')).version, + '1.1.1', + 'actual installed version is 1.1.1' + ) + }) + + await t.test('npm update --no-save', async t => { + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + tarballs: { + '1.1.1': join(paths.root, 'packages', 'abbrev-1.1.1'), + }, + }) + + await npm('update', '--no-save') + + t.equal( + (await readFile('package.json')).dependencies.abbrev, + '^1.0.4', + 'should have expected update --no-save package.json result' + ) + t.equal( + (await readFile('package-lock.json')).packages['node_modules/abbrev'].version, + '1.1.1', + 'should have expected update --no-save lockfile result' + ) + }) + + await t.test('npm update --save', async t => { + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + }) + + await npm('update', '--save') + + t.equal( + (await readFile('package.json')).dependencies.abbrev, + '^1.1.1', + 'should have expected update --save package.json result' + ) + t.equal( + (await readFile('package-lock.json')).packages['node_modules/abbrev'].version, + '1.1.1', + 'should have expected update --save lockfile result' + ) + }) + + await t.test('npm ci', async t => { + await npm('uninstall', 'abbrev') + + const manifest = abbrevManifest() + await registry.package({ + manifest: manifest, + tarballs: { + '1.0.4': join(paths.root, 'packages', 'abbrev-1.0.4'), + }, + }) + + await npm('install', 'abbrev@1.0.4', '--save-exact') + + t.equal( + (await readFile('package-lock.json')).packages['node_modules/abbrev'].version, + '1.0.4', + 'should have stored exact installed version' + ) + + await npm('pkg', 'set', 'dependencies.abbrev=^1.1.1') + + await registry.package({ + manifest, + }) + + const err = await npm('ci', '--loglevel=error').catch(e => e) + t.equal(err.code, 1) + t.matchSnapshot(err.stderr, 'should throw mismatch deps in lock file error') + }) }) diff --git a/smoke-tests/test/workspace-ua.js b/smoke-tests/test/workspace-ua.js new file mode 100644 index 0000000000000..8cfc4041715dd --- /dev/null +++ b/smoke-tests/test/workspace-ua.js @@ -0,0 +1,36 @@ + +const t = require('tap') +const setup = require('./fixtures/setup.js') + +t.test('basic', async t => { + const { registry, npm } = await setup(t) + + const mock = () => registry.nock + .get(`/fail_reflect_user_agent`) + // XXX: why does this get fetched twice for each uninstall? + .times(2) + .reply(404, {}, { 'npm-notice': (req) => req.headers['user-agent'] }) + + await t.test('npm install sends correct user-agent', async t => { + await npm('init', '-y') + await npm('init', '-y', `--workspace=foo`) + + mock() + await t.rejects( + npm('install', 'fail_reflect_user_agent'), + { + stderr: /workspaces\/false/, + }, + 'workspaces/false is present in output' + ) + + mock() + await t.rejects( + npm('install', 'fail_reflect_user_agent', '--workspaces'), + { + stderr: /workspaces\/true/, + }, + 'workspaces/true is present in output' + ) + }) +}) From 6fffad7e4846ebd7d4fde9c8c1d6b81e27f0fd34 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Tue, 8 Nov 2022 18:24:09 -0700 Subject: [PATCH 09/15] chore: use mock-registry in cli tests --- package-lock.json | 1 + package.json | 1 + .../tap-snapshots/test/index.js.test.cjs | 14 ++-- smoke-tests/test/fixtures/setup.js | 69 +++++++++---------- test/lib/commands/access.js | 2 +- test/lib/commands/adduser.js | 2 +- test/lib/commands/audit.js | 2 +- test/lib/commands/cache.js | 2 +- test/lib/commands/ci.js | 2 +- test/lib/commands/dedupe.js | 2 +- test/lib/commands/deprecate.js | 2 +- test/lib/commands/exec.js | 2 +- test/lib/commands/find-dupes.js | 2 +- test/lib/commands/login.js | 2 +- test/lib/commands/owner.js | 2 +- test/lib/commands/ping.js | 2 +- test/lib/commands/publish.js | 2 +- test/lib/commands/search.js | 2 +- test/lib/commands/star.js | 2 +- test/lib/commands/unpublish.js | 2 +- test/lib/commands/unstar.js | 2 +- test/lib/commands/whoami.js | 2 +- 22 files changed, 59 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8736f5f35927..e26231ceb1b36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -163,6 +163,7 @@ "@npmcli/eslint-config": "^4.0.0", "@npmcli/fs": "^3.1.0", "@npmcli/git": "^4.0.1", + "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", "licensee": "^9.0.0", diff --git a/package.json b/package.json index 4fa888e76bf87..fd63a010e32de 100644 --- a/package.json +++ b/package.json @@ -200,6 +200,7 @@ "@npmcli/eslint-config": "^4.0.0", "@npmcli/fs": "^3.1.0", "@npmcli/git": "^4.0.1", + "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", "@npmcli/template-oss": "4.8.0", "licensee": "^9.0.0", diff --git a/smoke-tests/tap-snapshots/test/index.js.test.cjs b/smoke-tests/tap-snapshots/test/index.js.test.cjs index 904b09b05742f..4c02dc0443ee8 100644 --- a/smoke-tests/tap-snapshots/test/index.js.test.cjs +++ b/smoke-tests/tap-snapshots/test/index.js.test.cjs @@ -140,7 +140,7 @@ Object { "version": "1.0.0", }, "node_modules/abbrev": Object { - "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.0.4.tgz", + "resolved": "{REGISTRY}/abbrev/-/abbrev-1.0.4.tgz", "version": "1.0.4", }, "node_modules/promise-all-reject-late": Object { @@ -148,7 +148,7 @@ Object { "funding": Object { "url": "https://github.com/sponsors", }, - "resolved": "http://smoke-test-registry.club/promise-all-reject-late/-/promise-all-reject-late-5.0.0.tgz", + "resolved": "{REGISTRY}/promise-all-reject-late/-/promise-all-reject-late-5.0.0.tgz", "version": "5.0.0", }, }, @@ -203,7 +203,7 @@ Object { "version": "1.0.0", }, "node_modules/abbrev": Object { - "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.0.4.tgz", + "resolved": "{REGISTRY}/abbrev/-/abbrev-1.0.4.tgz", "version": "1.0.4", }, }, @@ -371,7 +371,7 @@ Object { "version": "1.0.0", }, "node_modules/abbrev": Object { - "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.1.1.tgz", + "resolved": "{REGISTRY}/abbrev/-/abbrev-1.1.1.tgz", "version": "1.1.1", }, }, @@ -420,7 +420,7 @@ Object { "version": "1.0.0", }, "node_modules/abbrev": Object { - "resolved": "http://smoke-test-registry.club/abbrev/-/abbrev-1.1.1.tgz", + "resolved": "{REGISTRY}/abbrev/-/abbrev-1.1.1.tgz", "version": "1.1.1", }, "node_modules/promise-all-reject-late": Object { @@ -428,7 +428,7 @@ Object { "funding": Object { "url": "https://github.com/sponsors", }, - "resolved": "http://smoke-test-registry.club/promise-all-reject-late/-/promise-all-reject-late-5.0.0.tgz", + "resolved": "{REGISTRY}/promise-all-reject-late/-/promise-all-reject-late-5.0.0.tgz", "version": "5.0.0", }, }, @@ -471,7 +471,7 @@ abbrev@1.0.4 | Proprietary | deps: none | versions: 2 mocked test package dist -.tarball: http://smoke-test-registry.club/abbrev/-/abbrev-1.0.4.tgz +.tarball: {REGISTRY}/abbrev/-/abbrev-1.0.4.tgz .shasum: undefined dist-tags: diff --git a/smoke-tests/test/fixtures/setup.js b/smoke-tests/test/fixtures/setup.js index 38fc27f3eea8f..596ec4872b5e0 100644 --- a/smoke-tests/test/fixtures/setup.js +++ b/smoke-tests/test/fixtures/setup.js @@ -1,4 +1,5 @@ const fs = require('fs/promises') +const { existsSync } = require('fs') const { join, resolve, sep, extname, relative, delimiter } = require('path') const which = require('which') const spawn = require('@npmcli/promise-spawn') @@ -11,11 +12,11 @@ const httpProxy = require('http-proxy') const { SMOKE_PUBLISH_NPM, CI, PATH, Path, TAP_CHILD_ID = '0' } = process.env const PORT = 12345 + (+TAP_CHILD_ID) +const CLI_ROOT = resolve(process.cwd(), '..') const set = (obj, ...args) => justSet(obj, ...args) && obj const merge = (...args) => justExtend(true, ...args) const normalizePath = path => path.replace(/[A-Z]:/, '').replace(/\\/g, '/') -const exists = (f) => fs.access(f, fs.constants.F_OK).catch(() => false) const testdirHelper = (obj) => { for (const [key, value] of Object.entries(obj)) { @@ -30,29 +31,24 @@ const testdirHelper = (obj) => { return obj } -const getNpm = async () => { - const cliRoot = resolve(__dirname, '..', '..', '..') +const getSpawnArgs = async () => { const cliBin = join('bin', 'npm-cli.js') if (SMOKE_PUBLISH_NPM) { return { command: ['npm'], - cleanPaths: [ - cliRoot, - await which('npm').then(p => fs.realpath(p).replace(sep + cliBin)), - ], + NPM: await which('npm').then(p => fs.realpath(p).replace(sep + cliBin)), } } return { - command: [process.execPath, join(cliRoot, cliBin)], - cleanPaths: [process.execPath, cliRoot], + command: [process.execPath, join(CLI_ROOT, cliBin)], + NODE: process.execPath, + NPM: join(CLI_ROOT, cliBin), } } module.exports = async (t, { testdir = {}, debug } = {}) => { - const { command, cleanPaths } = await getNpm(t) - // setup fixtures const root = t.testdir({ cache: {}, @@ -76,7 +72,7 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { registry: 'http://smoke-test-registry.club/', debug, }) - const httpProxyRegistry = `http://localhost:${PORT}/` + const httpProxyRegistry = `http://localhost:${PORT}` const proxy = httpProxy.createProxyServer({}) const server = http.createServer((req, res) => proxy.web(req, res, { target: registry.origin })) await new Promise(res => server.listen(PORT, res)) @@ -84,25 +80,29 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { // update notifier should never be written t.afterEach(async (t) => { - const updateExists = await exists(join(paths.cache, '_update-notifier-last-checked')) - t.equal(updateExists, false) + t.equal(existsSync(join(paths.cache, '_update-notifier-last-checked')), false) // this requires that mocks not be shared between sub tests but it helps // find mistakes quicker instead of waiting for the entire test to end t.strictSame(registry.nock.pendingMocks(), [], 'no pending mocks after each') t.strictSame(registry.nock.activeMocks(), [], 'no active mocks after each') }) + const { command, ...spawnPaths } = await getSpawnArgs() + const cleanPaths = Object.entries({ ...spawnPaths, CWD: CLI_ROOT }) + const cleanOutput = s => { // sometimes we print normalized paths in snapshots regardless of // platform so replace those first then replace platform style paths - for (const cleanPath of cleanPaths) { - s = s - .split(normalizePath(cleanPath)).join('{CWD}') - .split(cleanPath).join('{CWD}') - .split(relative(cleanPath, t.testdirName)).join('{TESTDIR}') + for (const [key, value] of cleanPaths) { + s = s.split(normalizePath(value)).join(`{${key}}`) } - - return s.split(httpProxyRegistry).join('{REGISTRY}') + for (const [key, value] of cleanPaths) { + s = s.split(value).join(`{${key}}`) + } + return s + .split(relative(CLI_ROOT, t.testdirName)).join('{TESTDIR}') + .split(httpProxyRegistry).join('{REGISTRY}') + .split(registry.origin).join('{REGISTRY}') .replace(/\\+/g, '/') .replace(/\r\n/g, '\n') .replace(/ \(in a browser\)/g, '') @@ -110,14 +110,11 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { .replace(/^.*debug-[0-9]+.log$/gm, '') .replace(/in \d+ms$/gm, 'in {TIME}') } + const log = debug || CI ? (...a) => console.error(cleanOutput(a.join(' '))) : () => {} t.cleanSnapshot = cleanOutput - const log = !debug && !CI ? () => {} : (...args) => { - console.error(...args.map(a => cleanOutput(a.toString()))) - } const npm = async (...args) => { - const defaultCmd = [] - const defaultOpts = [ + const defaultFlags = [ `--registry=${httpProxyRegistry}`, `--cache=${paths.cache}`, `--prefix=${paths.project}`, @@ -126,24 +123,21 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { '--no-audit', '--no-update-notifier', '--loglevel=silly', - '--fetch-timeout=5000', - '--fetch-retries=0', ] - - const [cmd, opts] = args.reduce((acc, arg) => { - if (arg.startsWith('--')) { + const [positionals, flags] = args.reduce((acc, arg) => { + if (arg.startsWith('-')) { acc[1].push(arg) } else { acc[0].push(arg) } return acc - }, [defaultCmd, defaultOpts]) + }, [[], defaultFlags]) const spawnCmd = command[0] - const spawnArgs = [...command.slice(1), ...cmd, ...opts] + const spawnArgs = [...command.slice(1), ...positionals, ...flags] - log('='.repeat(40)) - log(`\n${spawnCmd} ${spawnArgs.join(' ')}`) + log(`${spawnCmd} ${spawnArgs.filter(a => !defaultFlags.includes(a)).join(' ')}`) + log('-'.repeat(40)) const { stderr, stdout } = await spawn(spawnCmd, spawnArgs, { cwd: paths.project, @@ -155,8 +149,9 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { }, }) - log('\n' + stderr) - log('\n' + stdout) + log(stderr) + log('-'.repeat(40)) + log(stdout) log('='.repeat(40)) return cleanOutput(stdout) diff --git a/test/lib/commands/access.js b/test/lib/commands/access.js index ae26f4c9332dc..b0057545ba026 100644 --- a/test/lib/commands/access.js +++ b/test/lib/commands/access.js @@ -1,7 +1,7 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const token = 'test-auth-token' const auth = { '//registry.npmjs.org/:_authToken': 'test-auth-token' } diff --git a/test/lib/commands/adduser.js b/test/lib/commands/adduser.js index 73e446309ef3b..90ed10df70274 100644 --- a/test/lib/commands/adduser.js +++ b/test/lib/commands/adduser.js @@ -5,7 +5,7 @@ const ini = require('ini') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') const mockGlobals = require('../../fixtures/mock-globals.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const stream = require('stream') t.test('usage', async t => { diff --git a/test/lib/commands/audit.js b/test/lib/commands/audit.js index bfa68955c5c7b..02b00f7f9ad88 100644 --- a/test/lib/commands/audit.js +++ b/test/lib/commands/audit.js @@ -4,7 +4,7 @@ const path = require('path') const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const gunzip = zlib.gunzipSync const gzip = zlib.gzipSync diff --git a/test/lib/commands/cache.js b/test/lib/commands/cache.js index 625caf7ffc0b6..fe2854f9aa626 100644 --- a/test/lib/commands/cache.js +++ b/test/lib/commands/cache.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const mockGlobals = require('../../fixtures/mock-globals') const cacache = require('cacache') diff --git a/test/lib/commands/ci.js b/test/lib/commands/ci.js index 7019cb177e01e..bd3fd9be9a6a0 100644 --- a/test/lib/commands/ci.js +++ b/test/lib/commands/ci.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: _loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const path = require('path') const fs = require('fs') diff --git a/test/lib/commands/dedupe.js b/test/lib/commands/dedupe.js index 0ca51245cc818..604ed21a257fc 100644 --- a/test/lib/commands/dedupe.js +++ b/test/lib/commands/dedupe.js @@ -3,7 +3,7 @@ const path = require('path') const fs = require('fs') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') t.test('should throw in global mode', async (t) => { const { npm } = await loadMockNpm(t, { diff --git a/test/lib/commands/deprecate.js b/test/lib/commands/deprecate.js index 57ed9c93ba0f4..22ddfe182de6e 100644 --- a/test/lib/commands/deprecate.js +++ b/test/lib/commands/deprecate.js @@ -1,7 +1,7 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const user = 'test-user' const token = 'test-auth-token' diff --git a/test/lib/commands/exec.js b/test/lib/commands/exec.js index aef4c856df1f5..1a03b1a2e6a5b 100644 --- a/test/lib/commands/exec.js +++ b/test/lib/commands/exec.js @@ -2,7 +2,7 @@ const t = require('tap') const fs = require('fs/promises') const path = require('path') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') t.test('call with args', async t => { const { npm } = await loadMockNpm(t, { diff --git a/test/lib/commands/find-dupes.js b/test/lib/commands/find-dupes.js index 228ac662b4454..40022fa065121 100644 --- a/test/lib/commands/find-dupes.js +++ b/test/lib/commands/find-dupes.js @@ -3,7 +3,7 @@ const path = require('path') const fs = require('fs') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const treeWithDupes = { 'package.json': JSON.stringify({ diff --git a/test/lib/commands/login.js b/test/lib/commands/login.js index 6c1d40c0d6edb..ae7e3ffab0f02 100644 --- a/test/lib/commands/login.js +++ b/test/lib/commands/login.js @@ -5,7 +5,7 @@ const ini = require('ini') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') const mockGlobals = require('../../fixtures/mock-globals.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const stream = require('stream') t.test('usage', async t => { diff --git a/test/lib/commands/owner.js b/test/lib/commands/owner.js index f8ab7feef5be7..5b6bb443712f0 100644 --- a/test/lib/commands/owner.js +++ b/test/lib/commands/owner.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const path = require('path') const npa = require('npm-package-arg') diff --git a/test/lib/commands/ping.js b/test/lib/commands/ping.js index dd2f83de08fc9..77201955ff2a8 100644 --- a/test/lib/commands/ping.js +++ b/test/lib/commands/ping.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') t.test('no details', async t => { const { npm, logs, joinedOutput } = await loadMockNpm(t) diff --git a/test/lib/commands/publish.js b/test/lib/commands/publish.js index b5cb72dbc98bd..496c02394eb17 100644 --- a/test/lib/commands/publish.js +++ b/test/lib/commands/publish.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const pacote = require('pacote') const Arborist = require('@npmcli/arborist') const path = require('path') diff --git a/test/lib/commands/search.js b/test/lib/commands/search.js index f18fcc475a99c..596c849909229 100644 --- a/test/lib/commands/search.js +++ b/test/lib/commands/search.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const libnpmsearchResultFixture = require('../../fixtures/libnpmsearch-stream-result.js') diff --git a/test/lib/commands/star.js b/test/lib/commands/star.js index ce9d258be1855..c5f233f01cc4a 100644 --- a/test/lib/commands/star.js +++ b/test/lib/commands/star.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const pkgName = '@npmcli/test-package' const authToken = 'test-auth-token' diff --git a/test/lib/commands/unpublish.js b/test/lib/commands/unpublish.js index 9efd2a147d42f..cba7298475133 100644 --- a/test/lib/commands/unpublish.js +++ b/test/lib/commands/unpublish.js @@ -1,7 +1,7 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const user = 'test-user' const pkg = 'test-package' const auth = { '//registry.npmjs.org/:_authToken': 'test-auth-token' } diff --git a/test/lib/commands/unstar.js b/test/lib/commands/unstar.js index 85c33d2793563..ee31428546d06 100644 --- a/test/lib/commands/unstar.js +++ b/test/lib/commands/unstar.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm.js') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const pkgName = '@npmcli/test-package' const authToken = 'test-auth-token' diff --git a/test/lib/commands/whoami.js b/test/lib/commands/whoami.js index d63b49015f0d0..a4532390bc66b 100644 --- a/test/lib/commands/whoami.js +++ b/test/lib/commands/whoami.js @@ -1,6 +1,6 @@ const t = require('tap') const { load: loadMockNpm } = require('../../fixtures/mock-npm') -const MockRegistry = require('../../fixtures/mock-registry.js') +const MockRegistry = require('@npmcli/mock-registry') const username = 'foo' const auth = { '//registry.npmjs.org/:_authToken': 'test-auth-token' } From 1b2930663957e8254f9a157070ed89d2b8977202 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Tue, 8 Nov 2022 20:11:14 -0700 Subject: [PATCH 10/15] chore: remove minify-registry-metadata --- DEPENDENCIES.md | 2 -- package-lock.json | 1 - smoke-tests/package.json | 1 - 3 files changed, 4 deletions(-) diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index e0ec307f0f403..1448db1b9fde5 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -217,7 +217,6 @@ graph LR; npmcli-run-script-->npmcli-node-gyp["@npmcli/node-gyp"]; npmcli-run-script-->npmcli-promise-spawn["@npmcli/promise-spawn"]; npmcli-run-script-->read-package-json-fast; - npmcli-smoke-tests-->minify-registry-metadata; npmcli-smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; npmcli-smoke-tests-->npmcli-mock-registry["@npmcli/mock-registry"]; npmcli-smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; @@ -685,7 +684,6 @@ graph LR; npmcli-smoke-tests-->http-proxy; npmcli-smoke-tests-->just-extend; npmcli-smoke-tests-->just-safe-set; - npmcli-smoke-tests-->minify-registry-metadata; npmcli-smoke-tests-->npmcli-eslint-config["@npmcli/eslint-config"]; npmcli-smoke-tests-->npmcli-mock-registry["@npmcli/mock-registry"]; npmcli-smoke-tests-->npmcli-promise-spawn["@npmcli/promise-spawn"]; diff --git a/package-lock.json b/package-lock.json index e26231ceb1b36..887cd75bdf65a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14972,7 +14972,6 @@ "http-proxy": "^1.18.1", "just-extend": "^6.1.1", "just-safe-set": "^4.1.1", - "minify-registry-metadata": "^2.2.0", "tap": "^16.0.1", "which": "^3.0.0" }, diff --git a/smoke-tests/package.json b/smoke-tests/package.json index 8bcc03467b5fa..5281e2e645af6 100644 --- a/smoke-tests/package.json +++ b/smoke-tests/package.json @@ -25,7 +25,6 @@ "http-proxy": "^1.18.1", "just-extend": "^6.1.1", "just-safe-set": "^4.1.1", - "minify-registry-metadata": "^2.2.0", "tap": "^16.0.1", "which": "^3.0.0" }, From a767aae7148dbbc943095ba994bbfab58bf2a8be Mon Sep 17 00:00:00 2001 From: Gar Date: Wed, 9 Nov 2022 10:22:41 -0800 Subject: [PATCH 11/15] fix(npx): look for bins in local package.json --- workspaces/libnpmexec/lib/index.js | 42 ++++++++++++++++-------- workspaces/libnpmexec/lib/run-script.js | 2 +- workspaces/libnpmexec/test/index.js | 22 ++++--------- workspaces/libnpmexec/test/run-script.js | 3 +- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/workspaces/libnpmexec/lib/index.js b/workspaces/libnpmexec/lib/index.js index 7a224ab7f0a62..575f8e6ea4a5e 100644 --- a/workspaces/libnpmexec/lib/index.js +++ b/workspaces/libnpmexec/lib/index.js @@ -79,7 +79,6 @@ const exec = async (opts) => { const { args = [], call = '', - color = false, localBin = resolve('./node_modules/.bin'), locationMsg = undefined, globalBin = '', @@ -97,7 +96,6 @@ const exec = async (opts) => { const run = () => runScript({ args, call, - color, flatOptions, locationMsg, output, @@ -114,20 +112,36 @@ const exec = async (opts) => { const needPackageCommandSwap = (args.length > 0) && (packages.length === 0) // If they asked for a command w/o specifying a package, see if there is a - // bin that directly matches that name either globally or in the local tree. + // bin that directly matches that name: + // - in the local package itself + // - in the local tree + // - globally if (needPackageCommandSwap) { - const dir = dirname(dirname(localBin)) - const localBinPath = await localFileExists(dir, args[0], '/') - if (localBinPath) { - binPaths.push(localBinPath) - return await run() - } else if (globalPath && await fileExists(`${globalBin}/${args[0]}`)) { - binPaths.push(globalBin) - return await run() + let localManifest + try { + localManifest = await pacote.manifest(path, flatOptions) + } catch { + // no local package.json? no problem, move one. + } + if (localManifest?.bin?.[args[0]]) { + // we have to install the local package into the npx cache so that its + // bin links get set up + packages.push(path) + yes = true + flatOptions.installLinks = false + } else { + const dir = dirname(dirname(localBin)) + const localBinPath = await localFileExists(dir, args[0], '/') + if (localBinPath) { + binPaths.push(localBinPath) + return await run() + } else if (globalPath && await fileExists(`${globalBin}/${args[0]}`)) { + binPaths.push(globalBin) + return await run() + } + // We swap out args[0] with the bin from the manifest later + packages.push(args[0]) } - - // We swap out args[0] with the bin from the manifest later - packages.push(args[0]) } // Resolve any directory specs so that the npx directory is unique to the diff --git a/workspaces/libnpmexec/lib/run-script.js b/workspaces/libnpmexec/lib/run-script.js index b34895c824e6d..2f7b258345faa 100644 --- a/workspaces/libnpmexec/lib/run-script.js +++ b/workspaces/libnpmexec/lib/run-script.js @@ -15,7 +15,6 @@ const nocolor = { const run = async ({ args, call, - color, flatOptions, locationMsg, output = () => {}, @@ -26,6 +25,7 @@ const run = async ({ }) => { // turn list of args into command string const script = call || args.shift() || scriptShell + const color = !!flatOptions.color const colorize = color ? chalk : nocolor // do the fakey runScript dance diff --git a/workspaces/libnpmexec/test/index.js b/workspaces/libnpmexec/test/index.js index 8d34118296200..739a686aba8c3 100644 --- a/workspaces/libnpmexec/test/index.js +++ b/workspaces/libnpmexec/test/index.js @@ -24,39 +24,31 @@ const baseOpts = { yes: true, } -t.test('local pkg', async t => { +t.test('bin in local pkg', async t => { const pkg = { - name: 'pkg', + name: '@npmcli/local-pkg-bin-test', bin: { - a: 'index.js', + a: 'local-bin-test.js', }, } const path = t.testdir({ cache: {}, npxCache: {}, - node_modules: { - '.bin': {}, - a: { - 'index.js': `#!/usr/bin/env node + 'local-bin-test.js': `#!/usr/bin/env node require('fs').writeFileSync(process.argv.slice(2)[0], 'LOCAL PKG')`, - }, - }, 'package.json': JSON.stringify(pkg), }) const localBin = resolve(path, 'node_modules/.bin') const runPath = path + const npxCache = resolve(path, 'npxCache') - const executable = resolve(path, 'node_modules/a') + const executable = resolve(path, 'local-bin-test.js') fs.chmodSync(executable, 0o775) - await binLinks({ - path: resolve(path, 'node_modules/a'), - pkg, - }) - await libexec({ ...baseOpts, args: ['a', 'resfile'], + npxCache, localBin, path, runPath, diff --git a/workspaces/libnpmexec/test/run-script.js b/workspaces/libnpmexec/test/run-script.js index 40b31ebdf2b19..4b1cafa0dec73 100644 --- a/workspaces/libnpmexec/test/run-script.js +++ b/workspaces/libnpmexec/test/run-script.js @@ -4,6 +4,7 @@ const baseOpts = { args: [], call: '', color: false, + flatOptions: {}, path: '', runPath: '', shell: process.platform === 'win32' @@ -73,7 +74,7 @@ t.test('colorized interactive mode msg', async t => { OUTPUT.push(msg) }, runPath: '/foo/', - color: true, + flatOptions: { color: true }, }) t.matchSnapshot(OUTPUT.join('\n'), 'should print colorized output') }) From 46b2728adbd1ca5a21bff1b874a8df2d9fbfe638 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Wed, 9 Nov 2022 11:36:52 -0700 Subject: [PATCH 12/15] chore: @npmcli/template-oss@4.9.0 --- SECURITY.md | 13 ++++++++- docs/package.json | 4 +-- mock-registry/package.json | 4 +-- package-lock.json | 40 +++++++++++++-------------- package.json | 4 +-- smoke-tests/package.json | 4 +-- workspaces/arborist/package.json | 4 +-- workspaces/config/package.json | 4 +-- workspaces/libnpmaccess/package.json | 4 +-- workspaces/libnpmdiff/package.json | 4 +-- workspaces/libnpmexec/package.json | 4 +-- workspaces/libnpmfund/package.json | 4 +-- workspaces/libnpmhook/package.json | 4 +-- workspaces/libnpmorg/package.json | 4 +-- workspaces/libnpmpack/package.json | 4 +-- workspaces/libnpmpublish/package.json | 4 +-- workspaces/libnpmsearch/package.json | 4 +-- workspaces/libnpmteam/package.json | 4 +-- workspaces/libnpmversion/package.json | 4 +-- 19 files changed, 66 insertions(+), 55 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index a93106d0cb896..4e7c26c66ebd9 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,3 +1,14 @@ -Please send vulnerability reports through [hackerone](https://hackerone.com/github). +GitHub takes the security of our software products and services seriously, including the open source code repositories managed through our GitHub organizations, such as [GitHub](https://github.com/GitHub). + +If you believe you have found a security vulnerability in this GitHub-owned open source repository, you can report it to us in one of two ways. + +If the vulnerability you have found is *not* [in scope for the GitHub Bug Bounty Program](https://bounty.github.com/#scope) or if you do not wish to be considered for a bounty reward, please report the issue to us directly using [private vulnerability reporting](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability). + +If the vulnerability you have found is [in scope for the GitHub Bug Bounty Program](https://bounty.github.com/#scope) and you would like for your finding to be considered for a bounty reward, please submit the vulnerability to us through [HackerOne](https://hackerone.com/github) in order to be eligible to receive a bounty award. + +**Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** + +Thanks for helping make GitHub safe for everyone. + diff --git a/docs/package.json b/docs/package.json index ef3486f93f8d1..6130418caee9e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -22,7 +22,7 @@ "devDependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "front-matter": "^4.0.2", "ignore-walk": "^6.0.0", "jsdom": "^20.0.1", @@ -56,7 +56,7 @@ "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", "ciVersions": "latest", "engines": "^14.17.0 || ^16.13.0 || >=18.0.0", - "version": "4.8.0", + "version": "4.9.0", "content": "../scripts/template-oss/index.js", "workspaceRepo": { "add": { diff --git a/mock-registry/package.json b/mock-registry/package.json index 253d06dd2ac3d..3729a17f1e004 100644 --- a/mock-registry/package.json +++ b/mock-registry/package.json @@ -34,7 +34,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0" + "version": "4.9.0" }, "tap": { "no-coverage": true, @@ -46,7 +46,7 @@ "devDependencies": { "@npmcli/arborist": "^6.1.1", "@npmcli/eslint-config": "^4.0.1", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.9", "npm-package-arg": "^10.0.0", "pacote": "^15.0.6", diff --git a/package-lock.json b/package-lock.json index 887cd75bdf65a..972bc58d38abc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -165,7 +165,7 @@ "@npmcli/git": "^4.0.1", "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "licensee": "^9.0.0", "nock": "^13.2.4", "npm-packlist": "^7.0.1", @@ -186,7 +186,7 @@ "devDependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "front-matter": "^4.0.2", "ignore-walk": "^6.0.0", "jsdom": "^20.0.1", @@ -211,7 +211,7 @@ "devDependencies": { "@npmcli/arborist": "^6.1.1", "@npmcli/eslint-config": "^4.0.1", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.9", "npm-package-arg": "^10.0.0", "pacote": "^15.0.6", @@ -2268,9 +2268,9 @@ "link": true }, "node_modules/@npmcli/template-oss": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@npmcli/template-oss/-/template-oss-4.8.0.tgz", - "integrity": "sha512-rNTVjPGiqv4UCMt8eb98AQAlik5tGIoBziJnZXGxyQ+0QWs4rOdv71DsSHFAkS6cG6/I/Mfp4JFs8bkG+8d9cQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@npmcli/template-oss/-/template-oss-4.9.0.tgz", + "integrity": "sha512-zfo9e5bGLXf3GAF2TWDIKBlTjP3zR578nKkCaYTFnw00TwEMjjHzNFskbJNNdBXqW9Lc7BH246LCrhYikmYlCQ==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -14968,7 +14968,7 @@ "@npmcli/eslint-config": "^4.0.0", "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "http-proxy": "^1.18.1", "just-extend": "^6.1.1", "just-safe-set": "^4.1.1", @@ -15023,7 +15023,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "benchmark": "^2.1.4", "chalk": "^4.1.0", "minify-registry-metadata": "^2.1.0", @@ -15050,7 +15050,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "tap": "^16.0.1" }, "engines": { @@ -15066,7 +15066,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -15090,7 +15090,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "tap": "^16.0.1" }, "engines": { @@ -15116,7 +15116,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "bin-links": "^4.0.1", "minify-registry-metadata": "^2.2.0", "mkdirp": "^1.0.4", @@ -15134,7 +15134,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "tap": "^16.0.1" }, "engines": { @@ -15150,7 +15150,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -15167,7 +15167,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "minipass": "^3.1.1", "nock": "^13.2.4", "tap": "^16.0.1" @@ -15187,7 +15187,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.0.7", "spawk": "^1.7.1", "tap": "^16.0.1" @@ -15208,7 +15208,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "libnpmpack": "^5.0.2", "lodash.clonedeep": "^4.5.0", "nock": "^13.2.4", @@ -15226,7 +15226,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -15243,7 +15243,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -15263,7 +15263,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "require-inject": "^1.4.4", "tap": "^16.0.1" }, diff --git a/package.json b/package.json index fd63a010e32de..595c3d75cf1d2 100644 --- a/package.json +++ b/package.json @@ -202,7 +202,7 @@ "@npmcli/git": "^4.0.1", "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "licensee": "^9.0.0", "nock": "^13.2.4", "npm-packlist": "^7.0.1", @@ -256,7 +256,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "./scripts/template-oss/root.js" }, "license": "Artistic-2.0", diff --git a/smoke-tests/package.json b/smoke-tests/package.json index 5281e2e645af6..e2ca299c69884 100644 --- a/smoke-tests/package.json +++ b/smoke-tests/package.json @@ -21,7 +21,7 @@ "@npmcli/eslint-config": "^4.0.0", "@npmcli/mock-registry": "^1.0.0", "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "http-proxy": "^1.18.1", "just-extend": "^6.1.1", "just-safe-set": "^4.1.1", @@ -32,7 +32,7 @@ "license": "ISC", "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/arborist/package.json b/workspaces/arborist/package.json index 6af29ad02921f..bdeb461b1d5a9 100644 --- a/workspaces/arborist/package.json +++ b/workspaces/arborist/package.json @@ -39,7 +39,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "benchmark": "^2.1.4", "chalk": "^4.1.0", "minify-registry-metadata": "^2.1.0", @@ -101,7 +101,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" } } diff --git a/workspaces/config/package.json b/workspaces/config/package.json index 5d659cc322e0a..faeefbd08de49 100644 --- a/workspaces/config/package.json +++ b/workspaces/config/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "tap": "^16.0.1" }, "dependencies": { @@ -50,6 +50,6 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0" + "version": "4.9.0" } } diff --git a/workspaces/libnpmaccess/package.json b/workspaces/libnpmaccess/package.json index 0f345fb052adb..121c16418d3bf 100644 --- a/workspaces/libnpmaccess/package.json +++ b/workspaces/libnpmaccess/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -40,7 +40,7 @@ ], "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmdiff/package.json b/workspaces/libnpmdiff/package.json index 83502b066a9f7..2e8e504f217b8 100644 --- a/workspaces/libnpmdiff/package.json +++ b/workspaces/libnpmdiff/package.json @@ -43,7 +43,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "tap": "^16.0.1" }, "dependencies": { @@ -59,7 +59,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmexec/package.json b/workspaces/libnpmexec/package.json index bdd10efcd394a..449dd42f14541 100644 --- a/workspaces/libnpmexec/package.json +++ b/workspaces/libnpmexec/package.json @@ -51,7 +51,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "bin-links": "^4.0.1", "minify-registry-metadata": "^2.2.0", "mkdirp": "^1.0.4", @@ -73,7 +73,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" } } diff --git a/workspaces/libnpmfund/package.json b/workspaces/libnpmfund/package.json index 99833181dece9..b984bc15ce694 100644 --- a/workspaces/libnpmfund/package.json +++ b/workspaces/libnpmfund/package.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "tap": "^16.0.1" }, "dependencies": { @@ -53,7 +53,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmhook/package.json b/workspaces/libnpmhook/package.json index bdd9756c0d96c..7b2c911663700 100644 --- a/workspaces/libnpmhook/package.json +++ b/workspaces/libnpmhook/package.json @@ -37,7 +37,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -46,7 +46,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmorg/package.json b/workspaces/libnpmorg/package.json index a234750d5f33f..e1d309162bc0a 100644 --- a/workspaces/libnpmorg/package.json +++ b/workspaces/libnpmorg/package.json @@ -28,7 +28,7 @@ ], "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "minipass": "^3.1.1", "nock": "^13.2.4", "tap": "^16.0.1" @@ -49,7 +49,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmpack/package.json b/workspaces/libnpmpack/package.json index 23dcd361c198c..7308feaced740 100644 --- a/workspaces/libnpmpack/package.json +++ b/workspaces/libnpmpack/package.json @@ -23,7 +23,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.0.7", "spawk": "^1.7.1", "tap": "^16.0.1" @@ -46,7 +46,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmpublish/package.json b/workspaces/libnpmpublish/package.json index 29ca5e58c8d28..1aa505fc6da85 100644 --- a/workspaces/libnpmpublish/package.json +++ b/workspaces/libnpmpublish/package.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "libnpmpack": "^5.0.2", "lodash.clonedeep": "^4.5.0", "nock": "^13.2.4", @@ -50,7 +50,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmsearch/package.json b/workspaces/libnpmsearch/package.json index d727ee5579db8..25b8c2664f0e5 100644 --- a/workspaces/libnpmsearch/package.json +++ b/workspaces/libnpmsearch/package.json @@ -26,7 +26,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -45,7 +45,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmteam/package.json b/workspaces/libnpmteam/package.json index 5fc2f29e799c0..f85f67de8d3ae 100644 --- a/workspaces/libnpmteam/package.json +++ b/workspaces/libnpmteam/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "nock": "^13.2.4", "tap": "^16.0.1" }, @@ -39,7 +39,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" }, "tap": { diff --git a/workspaces/libnpmversion/package.json b/workspaces/libnpmversion/package.json index 3237b62d19382..410bcfe0b727e 100644 --- a/workspaces/libnpmversion/package.json +++ b/workspaces/libnpmversion/package.json @@ -32,7 +32,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", + "@npmcli/template-oss": "4.9.0", "require-inject": "^1.4.4", "tap": "^16.0.1" }, @@ -48,7 +48,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0", + "version": "4.9.0", "content": "../../scripts/template-oss/index.js" } } From fd856d3d2ee91d147ca48e2769b0aa8ab52a61c1 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Wed, 9 Nov 2022 12:00:55 -0700 Subject: [PATCH 13/15] chore: dont run git commands when not in git repo --- scripts/bundle-and-gitignore-deps.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scripts/bundle-and-gitignore-deps.js b/scripts/bundle-and-gitignore-deps.js index 6dd1b93f08d66..6057e8bc15e16 100644 --- a/scripts/bundle-and-gitignore-deps.js +++ b/scripts/bundle-and-gitignore-deps.js @@ -4,6 +4,7 @@ const { join, relative } = require('path') const localeCompare = require('@isaacs/string-locale-compare')('en') const PackageJson = require('@npmcli/package-json') const { run, CWD, git, fs } = require('./util') +const npmGit = require('@npmcli/git') const ALWAYS_IGNORE = ` .bin/ @@ -227,6 +228,12 @@ const main = async () => { const NODE_MODULES = join(CWD, 'node_modules') const res = await fs.writeFile(join(NODE_MODULES, '.gitignore'), ignoreFile.join('\n')) + if (!await npmGit.is({ cwd: CWD })) { + // if we are not running in a git repo then write the files but we do not + // need to run any git commands to check if we have unmatched files in source + return res + } + // After we write the file we have to check if any of the paths already checked in // inside node_modules are now going to be ignored. If we find any then fail with // a list of the paths remaining. We already attempted to `git rm` them so just From 139bce18ab1e6f0417bbfdf35a1ab2326838c604 Mon Sep 17 00:00:00 2001 From: Luke Karrys Date: Wed, 9 Nov 2022 13:50:30 -0700 Subject: [PATCH 14/15] chore: fix async realpath in smoke publish (#5836) --- .../tap-snapshots/test/index.js.test.cjs | 10 ++--- smoke-tests/test/fixtures/setup.js | 38 ++++++++++++++----- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/smoke-tests/tap-snapshots/test/index.js.test.cjs b/smoke-tests/tap-snapshots/test/index.js.test.cjs index 4c02dc0443ee8..de87748529e5f 100644 --- a/smoke-tests/tap-snapshots/test/index.js.test.cjs +++ b/smoke-tests/tap-snapshots/test/index.js.test.cjs @@ -32,13 +32,13 @@ All commands: unstar, update, version, view, whoami Specify configs in the ini-formatted file: - {CWD}/{TESTDIR}/project/.npmrc + {NPM}/{TESTDIR}/project/.npmrc or on the command line via: npm --key=value More configuration info: npm help config Configuration fields: npm help 7 config -npm {CWD} +npm {NPM} ` exports[`test/index.js TAP basic npm ci > should throw mismatch deps in lock file error 1`] = ` @@ -107,7 +107,7 @@ project@1.0.0 ` exports[`test/index.js TAP basic npm init > should have successful npm init result 1`] = ` -Wrote to {CWD}/{TESTDIR}/project/package.json: +Wrote to {NPM}/{TESTDIR}/project/package.json: { "name": "project", @@ -231,7 +231,7 @@ Object { ` exports[`test/index.js TAP basic npm ls > should have expected ls output 1`] = ` -project@1.0.0 {CWD}/{TESTDIR}/project +project@1.0.0 {NPM}/{TESTDIR}/project +-- abbrev@1.0.4 \`-- promise-all-reject-late@5.0.0 ` @@ -347,7 +347,7 @@ exports[`test/index.js TAP basic npm pkg set scripts > should have expected set- ` exports[`test/index.js TAP basic npm prefix > should have expected prefix output 1`] = ` -{CWD}/{TESTDIR}/project +{NPM}/{TESTDIR}/project ` exports[`test/index.js TAP basic npm run-script > should have expected run-script output 1`] = ` diff --git a/smoke-tests/test/fixtures/setup.js b/smoke-tests/test/fixtures/setup.js index 596ec4872b5e0..4291006b435e0 100644 --- a/smoke-tests/test/fixtures/setup.js +++ b/smoke-tests/test/fixtures/setup.js @@ -32,19 +32,32 @@ const testdirHelper = (obj) => { } const getSpawnArgs = async () => { - const cliBin = join('bin', 'npm-cli.js') + const cliBin = join('bin', 'npm') + const cliJsBin = join('bin', 'npm-cli.js') + const npmLinks = await which('npm', { all: true }) + const npmPaths = await Promise.all(npmLinks.map(npm => fs.realpath(npm))) + + const cleanNpmPaths = [...new Set([ + CLI_ROOT, + join(CLI_ROOT, cliBin), + join(CLI_ROOT, cliJsBin), + ...npmLinks, + ...npmPaths, + ...npmPaths.map(n => n.replace(sep + cliBin, '')), + ...npmPaths.map(n => n.replace(sep + cliJsBin, '')), + ])] if (SMOKE_PUBLISH_NPM) { return { command: ['npm'], - NPM: await which('npm').then(p => fs.realpath(p).replace(sep + cliBin)), + NPM: cleanNpmPaths, } } return { - command: [process.execPath, join(CLI_ROOT, cliBin)], + command: [process.execPath, join(CLI_ROOT, cliJsBin)], NODE: process.execPath, - NPM: join(CLI_ROOT, cliBin), + NPM: cleanNpmPaths, } } @@ -87,17 +100,24 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { t.strictSame(registry.nock.activeMocks(), [], 'no active mocks after each') }) - const { command, ...spawnPaths } = await getSpawnArgs() - const cleanPaths = Object.entries({ ...spawnPaths, CWD: CLI_ROOT }) + const debugLog = debug || CI ? (...a) => console.error(...a) : () => {} + const { command, ...spawnPaths } = await getSpawnArgs({ log: debugLog }) + const cleanPaths = Object.entries(spawnPaths) const cleanOutput = s => { // sometimes we print normalized paths in snapshots regardless of // platform so replace those first then replace platform style paths for (const [key, value] of cleanPaths) { - s = s.split(normalizePath(value)).join(`{${key}}`) + const values = [].concat(value) + for (const v of values) { + s = s.split(normalizePath(v)).join(`{${key}}`) + } } for (const [key, value] of cleanPaths) { - s = s.split(value).join(`{${key}}`) + const values = [].concat(value) + for (const v of values) { + s = s.split(v).join(`{${key}}`) + } } return s .split(relative(CLI_ROOT, t.testdirName)).join('{TESTDIR}') @@ -110,7 +130,7 @@ module.exports = async (t, { testdir = {}, debug } = {}) => { .replace(/^.*debug-[0-9]+.log$/gm, '') .replace(/in \d+ms$/gm, 'in {TIME}') } - const log = debug || CI ? (...a) => console.error(cleanOutput(a.join(' '))) : () => {} + const log = (...a) => debugLog(cleanOutput(a.join(' '))) t.cleanSnapshot = cleanOutput const npm = async (...args) => { From 3794f036a5489331bfc38c2290690def65b74377 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:18:11 +0000 Subject: [PATCH 15/15] chore: release 9.1.1 --- .release-please-manifest.json | 14 +++++----- CHANGELOG.md | 17 ++++++++++++ package-lock.json | 38 +++++++++++++-------------- package.json | 14 +++++----- workspaces/arborist/CHANGELOG.md | 7 +++++ workspaces/arborist/package.json | 2 +- workspaces/libnpmdiff/CHANGELOG.md | 6 +++++ workspaces/libnpmdiff/package.json | 4 +-- workspaces/libnpmexec/CHANGELOG.md | 10 +++++++ workspaces/libnpmexec/package.json | 4 +-- workspaces/libnpmfund/CHANGELOG.md | 6 +++++ workspaces/libnpmfund/package.json | 4 +-- workspaces/libnpmpack/CHANGELOG.md | 6 +++++ workspaces/libnpmpack/package.json | 4 +-- workspaces/libnpmpublish/CHANGELOG.md | 6 +++++ workspaces/libnpmpublish/package.json | 4 +-- 16 files changed, 102 insertions(+), 44 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 2faa1bd296d24..7b70cdd152096 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,14 +1,14 @@ { - ".": "9.1.0", - "workspaces/arborist": "6.1.1", + ".": "9.1.1", + "workspaces/arborist": "6.1.2", "workspaces/libnpmaccess": "7.0.0", - "workspaces/libnpmdiff": "5.0.2", - "workspaces/libnpmexec": "5.0.2", - "workspaces/libnpmfund": "4.0.2", + "workspaces/libnpmdiff": "5.0.3", + "workspaces/libnpmexec": "5.0.3", + "workspaces/libnpmfund": "4.0.3", "workspaces/libnpmhook": "9.0.0", "workspaces/libnpmorg": "5.0.0", - "workspaces/libnpmpack": "5.0.2", - "workspaces/libnpmpublish": "7.0.2", + "workspaces/libnpmpack": "5.0.3", + "workspaces/libnpmpublish": "7.0.3", "workspaces/libnpmsearch": "6.0.0", "workspaces/libnpmteam": "5.0.0", "workspaces/libnpmversion": "4.0.1", diff --git a/CHANGELOG.md b/CHANGELOG.md index b7f5ae0f5ac4f..bfc3c26cc637a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [9.1.1](https://github.com/npm/cli/compare/v9.1.0...v9.1.1) (2022-11-09) + +### Documentation + +* [`1bff064`](https://github.com/npm/cli/commit/1bff0640ccb8414e2d416a5cf9d64e9ff03c6403) [#5819](https://github.com/npm/cli/pull/5819) config: document `npm config fix` (#5819) (@wraithgar) + +### Dependencies + +* [`335c7e4`](https://github.com/npm/cli/commit/335c7e4348f5505fad33b8a78348a02a82b91426) [#5813](https://github.com/npm/cli/pull/5813) `cacache@17.0.2` +* [`878ddfb`](https://github.com/npm/cli/commit/878ddfb5b68c03bdcd7d7da8dae92c4947942801) `@npmcli/fs@3.1.0` +* [Workspace](https://github.com/npm/cli/compare/arborist-v6.1.1...arborist-v6.1.2): `@npmcli/arborist@6.1.2` +* [Workspace](https://github.com/npm/cli/compare/libnpmdiff-v5.0.2...libnpmdiff-v5.0.3): `libnpmdiff@5.0.3` +* [Workspace](https://github.com/npm/cli/compare/libnpmexec-v5.0.2...libnpmexec-v5.0.3): `libnpmexec@5.0.3` +* [Workspace](https://github.com/npm/cli/compare/libnpmfund-v4.0.2...libnpmfund-v4.0.3): `libnpmfund@4.0.3` +* [Workspace](https://github.com/npm/cli/compare/libnpmpack-v5.0.2...libnpmpack-v5.0.3): `libnpmpack@5.0.3` +* [Workspace](https://github.com/npm/cli/compare/libnpmpublish-v7.0.2...libnpmpublish-v7.0.3): `libnpmpublish@7.0.3` + ## [9.1.0](https://github.com/npm/cli/compare/v9.0.1...v9.1.0) (2022-11-02) ### Features diff --git a/package-lock.json b/package-lock.json index 972bc58d38abc..0c995200daf81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "npm", - "version": "9.1.0", + "version": "9.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "npm", - "version": "9.1.0", + "version": "9.1.1", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -86,7 +86,7 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/ci-detect": "^3.0.1", "@npmcli/config": "^6.1.0", "@npmcli/map-workspaces": "^3.0.0", @@ -109,13 +109,13 @@ "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^3.0.0", "libnpmaccess": "^7.0.0", - "libnpmdiff": "^5.0.2", - "libnpmexec": "^5.0.2", - "libnpmfund": "^4.0.2", + "libnpmdiff": "^5.0.3", + "libnpmexec": "^5.0.3", + "libnpmfund": "^4.0.3", "libnpmhook": "^9.0.0", "libnpmorg": "^5.0.0", - "libnpmpack": "^5.0.2", - "libnpmpublish": "^7.0.2", + "libnpmpack": "^5.0.3", + "libnpmpublish": "^7.0.3", "libnpmsearch": "^6.0.0", "libnpmteam": "^5.0.0", "libnpmversion": "^4.0.1", @@ -14981,7 +14981,7 @@ }, "workspaces/arborist": { "name": "@npmcli/arborist", - "version": "6.1.1", + "version": "6.1.2", "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", @@ -15075,10 +15075,10 @@ } }, "workspaces/libnpmdiff": { - "version": "5.0.2", + "version": "5.0.3", "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/disparity-colors": "^3.0.0", "@npmcli/installed-package-contents": "^2.0.0", "binary-extensions": "^2.2.0", @@ -15098,10 +15098,10 @@ } }, "workspaces/libnpmexec": { - "version": "5.0.2", + "version": "5.0.3", "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/ci-detect": "^3.0.1", "@npmcli/run-script": "^6.0.0", "chalk": "^4.1.0", @@ -15127,10 +15127,10 @@ } }, "workspaces/libnpmfund": { - "version": "4.0.2", + "version": "4.0.3", "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.1.1" + "@npmcli/arborist": "^6.1.2" }, "devDependencies": { "@npmcli/eslint-config": "^4.0.0", @@ -15177,10 +15177,10 @@ } }, "workspaces/libnpmpack": { - "version": "5.0.2", + "version": "5.0.3", "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/run-script": "^6.0.0", "npm-package-arg": "^10.0.0", "pacote": "^15.0.2" @@ -15197,7 +15197,7 @@ } }, "workspaces/libnpmpublish": { - "version": "7.0.2", + "version": "7.0.3", "license": "ISC", "dependencies": { "normalize-package-data": "^5.0.0", @@ -15209,7 +15209,7 @@ "devDependencies": { "@npmcli/eslint-config": "^4.0.0", "@npmcli/template-oss": "4.9.0", - "libnpmpack": "^5.0.2", + "libnpmpack": "^5.0.3", "lodash.clonedeep": "^4.5.0", "nock": "^13.2.4", "tap": "^16.0.1" diff --git a/package.json b/package.json index 595c3d75cf1d2..ba34d7a2793ec 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "9.1.0", + "version": "9.1.1", "name": "npm", "description": "a package manager for JavaScript", "workspaces": [ @@ -57,7 +57,7 @@ }, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/ci-detect": "^3.0.1", "@npmcli/config": "^6.1.0", "@npmcli/map-workspaces": "^3.0.0", @@ -80,13 +80,13 @@ "is-cidr": "^4.0.2", "json-parse-even-better-errors": "^3.0.0", "libnpmaccess": "^7.0.0", - "libnpmdiff": "^5.0.2", - "libnpmexec": "^5.0.2", - "libnpmfund": "^4.0.2", + "libnpmdiff": "^5.0.3", + "libnpmexec": "^5.0.3", + "libnpmfund": "^4.0.3", "libnpmhook": "^9.0.0", "libnpmorg": "^5.0.0", - "libnpmpack": "^5.0.2", - "libnpmpublish": "^7.0.2", + "libnpmpack": "^5.0.3", + "libnpmpublish": "^7.0.3", "libnpmsearch": "^6.0.0", "libnpmteam": "^5.0.0", "libnpmversion": "^4.0.1", diff --git a/workspaces/arborist/CHANGELOG.md b/workspaces/arborist/CHANGELOG.md index ec5423b353b6f..1e74c11923202 100644 --- a/workspaces/arborist/CHANGELOG.md +++ b/workspaces/arborist/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [6.1.2](https://github.com/npm/cli/compare/arborist-v6.1.1...arborist-v6.1.2) (2022-11-09) + +### Dependencies + +* [`335c7e4`](https://github.com/npm/cli/commit/335c7e4348f5505fad33b8a78348a02a82b91426) [#5813](https://github.com/npm/cli/pull/5813) `cacache@17.0.2` +* [`878ddfb`](https://github.com/npm/cli/commit/878ddfb5b68c03bdcd7d7da8dae92c4947942801) `@npmcli/fs@3.1.0` + ## [6.1.1](https://github.com/npm/cli/compare/arborist-v6.1.0...arborist-v6.1.1) (2022-11-02) ### Bug Fixes diff --git a/workspaces/arborist/package.json b/workspaces/arborist/package.json index bdeb461b1d5a9..8ff8546f42ed0 100644 --- a/workspaces/arborist/package.json +++ b/workspaces/arborist/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/arborist", - "version": "6.1.1", + "version": "6.1.2", "description": "Manage node_modules trees", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", diff --git a/workspaces/libnpmdiff/CHANGELOG.md b/workspaces/libnpmdiff/CHANGELOG.md index 6195aa8781f0a..40f783c57efde 100644 --- a/workspaces/libnpmdiff/CHANGELOG.md +++ b/workspaces/libnpmdiff/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [5.0.3](https://github.com/npm/cli/compare/libnpmdiff-v5.0.2...libnpmdiff-v5.0.3) (2022-11-09) + +### Dependencies + +* [Workspace](https://github.com/npm/cli/compare/arborist-v6.1.1...arborist-v6.1.2): `@npmcli/arborist@6.1.2` + ## [5.0.2](https://github.com/npm/cli/compare/libnpmdiff-v5.0.1...libnpmdiff-v5.0.2) (2022-11-02) ### Dependencies diff --git a/workspaces/libnpmdiff/package.json b/workspaces/libnpmdiff/package.json index 2e8e504f217b8..07acc9852e362 100644 --- a/workspaces/libnpmdiff/package.json +++ b/workspaces/libnpmdiff/package.json @@ -1,6 +1,6 @@ { "name": "libnpmdiff", - "version": "5.0.2", + "version": "5.0.3", "description": "The registry diff", "repository": { "type": "git", @@ -47,7 +47,7 @@ "tap": "^16.0.1" }, "dependencies": { - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/disparity-colors": "^3.0.0", "@npmcli/installed-package-contents": "^2.0.0", "binary-extensions": "^2.2.0", diff --git a/workspaces/libnpmexec/CHANGELOG.md b/workspaces/libnpmexec/CHANGELOG.md index 6312b392287e0..7cbe7d1dbbfd5 100644 --- a/workspaces/libnpmexec/CHANGELOG.md +++ b/workspaces/libnpmexec/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## [5.0.3](https://github.com/npm/cli/compare/libnpmexec-v5.0.2...libnpmexec-v5.0.3) (2022-11-09) + +### Bug Fixes + +* [`a767aae`](https://github.com/npm/cli/commit/a767aae7148dbbc943095ba994bbfab58bf2a8be) npx: look for bins in local package.json (@wraithgar) + +### Dependencies + +* [Workspace](https://github.com/npm/cli/compare/arborist-v6.1.1...arborist-v6.1.2): `@npmcli/arborist@6.1.2` + ## [5.0.2](https://github.com/npm/cli/compare/libnpmexec-v5.0.1...libnpmexec-v5.0.2) (2022-11-02) ### Bug Fixes diff --git a/workspaces/libnpmexec/package.json b/workspaces/libnpmexec/package.json index 449dd42f14541..31f3531cbc538 100644 --- a/workspaces/libnpmexec/package.json +++ b/workspaces/libnpmexec/package.json @@ -1,6 +1,6 @@ { "name": "libnpmexec", - "version": "5.0.2", + "version": "5.0.3", "files": [ "bin/", "lib/" @@ -58,7 +58,7 @@ "tap": "^16.0.1" }, "dependencies": { - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/ci-detect": "^3.0.1", "@npmcli/run-script": "^6.0.0", "chalk": "^4.1.0", diff --git a/workspaces/libnpmfund/CHANGELOG.md b/workspaces/libnpmfund/CHANGELOG.md index a84dd61e43c58..4889150836b7e 100644 --- a/workspaces/libnpmfund/CHANGELOG.md +++ b/workspaces/libnpmfund/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [4.0.3](https://github.com/npm/cli/compare/libnpmfund-v4.0.2...libnpmfund-v4.0.3) (2022-11-09) + +### Dependencies + +* [Workspace](https://github.com/npm/cli/compare/arborist-v6.1.1...arborist-v6.1.2): `@npmcli/arborist@6.1.2` + ## [4.0.2](https://github.com/npm/cli/compare/libnpmfund-v4.0.1...libnpmfund-v4.0.2) (2022-11-02) ### Dependencies diff --git a/workspaces/libnpmfund/package.json b/workspaces/libnpmfund/package.json index b984bc15ce694..352babd7a7c84 100644 --- a/workspaces/libnpmfund/package.json +++ b/workspaces/libnpmfund/package.json @@ -1,6 +1,6 @@ { "name": "libnpmfund", - "version": "4.0.2", + "version": "4.0.3", "main": "lib/index.js", "files": [ "bin/", @@ -46,7 +46,7 @@ "tap": "^16.0.1" }, "dependencies": { - "@npmcli/arborist": "^6.1.1" + "@npmcli/arborist": "^6.1.2" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" diff --git a/workspaces/libnpmpack/CHANGELOG.md b/workspaces/libnpmpack/CHANGELOG.md index 235af82111896..1da3688596da1 100644 --- a/workspaces/libnpmpack/CHANGELOG.md +++ b/workspaces/libnpmpack/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [5.0.3](https://github.com/npm/cli/compare/libnpmpack-v5.0.2...libnpmpack-v5.0.3) (2022-11-09) + +### Dependencies + +* [Workspace](https://github.com/npm/cli/compare/arborist-v6.1.1...arborist-v6.1.2): `@npmcli/arborist@6.1.2` + ## [5.0.2](https://github.com/npm/cli/compare/libnpmpack-v5.0.1...libnpmpack-v5.0.2) (2022-11-02) ### Bug Fixes diff --git a/workspaces/libnpmpack/package.json b/workspaces/libnpmpack/package.json index 7308feaced740..469864a4fb184 100644 --- a/workspaces/libnpmpack/package.json +++ b/workspaces/libnpmpack/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpack", - "version": "5.0.2", + "version": "5.0.3", "description": "Programmatic API for the bits behind npm pack", "author": "GitHub Inc.", "main": "lib/index.js", @@ -36,7 +36,7 @@ "bugs": "https://github.com/npm/libnpmpack/issues", "homepage": "https://npmjs.com/package/libnpmpack", "dependencies": { - "@npmcli/arborist": "^6.1.1", + "@npmcli/arborist": "^6.1.2", "@npmcli/run-script": "^6.0.0", "npm-package-arg": "^10.0.0", "pacote": "^15.0.2" diff --git a/workspaces/libnpmpublish/CHANGELOG.md b/workspaces/libnpmpublish/CHANGELOG.md index ef912f60e6d9c..7b27afdf3b925 100644 --- a/workspaces/libnpmpublish/CHANGELOG.md +++ b/workspaces/libnpmpublish/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [7.0.3](https://github.com/npm/cli/compare/libnpmpublish-v7.0.2...libnpmpublish-v7.0.3) (2022-11-09) + +### Dependencies + +* [Workspace](https://github.com/npm/cli/compare/libnpmpack-v5.0.2...libnpmpack-v5.0.3): `libnpmpack@5.0.3` + ## [7.0.2](https://github.com/npm/cli/compare/libnpmpublish-v7.0.1...libnpmpublish-v7.0.2) (2022-11-02) ### Dependencies diff --git a/workspaces/libnpmpublish/package.json b/workspaces/libnpmpublish/package.json index 1aa505fc6da85..0498dcce2919d 100644 --- a/workspaces/libnpmpublish/package.json +++ b/workspaces/libnpmpublish/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpublish", - "version": "7.0.2", + "version": "7.0.3", "description": "Programmatic API for the bits behind npm publish and unpublish", "author": "GitHub Inc.", "main": "lib/index.js", @@ -26,7 +26,7 @@ "devDependencies": { "@npmcli/eslint-config": "^4.0.0", "@npmcli/template-oss": "4.9.0", - "libnpmpack": "^5.0.2", + "libnpmpack": "^5.0.3", "lodash.clonedeep": "^4.5.0", "nock": "^13.2.4", "tap": "^16.0.1"