diff --git a/.evergreen.yml b/.evergreen.yml index c47515d6998..2eed1c04204 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -172,6 +172,17 @@ functions: DEBUG=${debug} MONGODB_VERSION=${mongodb_version|4.0.3} npm run test-ci --unsafe-perm -- --stream 'package': + - command: shell.exec + params: + working_dir: src + shell: bash + script: | + set -e + # Load environment variables generated by `prepare` + source ~/compass_env.sh + + echo "Generating package-lock file for Compass application" + npm run gen-package-lock mongodb-compass - command: shell.exec params: working_dir: src/packages/compass @@ -185,6 +196,8 @@ functions: npm run evergreen-expansions ${compass_distribution} - command: expansions.update params: + # The only variables used from hadron-build generated expansions seems + # to be all the `*_filename` vars and nothing else file: src/packages/compass/expansions.yml - command: shell.exec params: diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 7a4dedc3e69..d8624027c74 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -126,6 +126,11 @@ jobs: # Setting debug before this line breaks plugins build process export DEBUG=hadron*,mongo*,electron* + # Generate package lock for the Compass workspace so that external + # dependencies are exactly matching monorepo root package-lock + npm run gen-package-lock mongodb-compass + + # Finally start the packaging process npm run release-evergreen # Clean-up background verdaccio process diff --git a/package-lock.json b/package-lock.json index 6533553d16b..33af38ca5f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "packages/*" ], "devDependencies": { + "@npmcli/arborist": "^2.7.1", "chalk": "^4.1.1", "find-up": "^5.0.0", "fs-extra": "^9.1.0", @@ -17,6 +18,7 @@ "make-fetch-happen": "^8.0.14", "npm-cli-adduser": "^1.1.4", "ora": "^5.4.0", + "pacote": "^11.3.5", "pkg-up": "^3.1.0", "ps-list": "^7.2.0", "semver": "^7.3.5", @@ -4773,6 +4775,96 @@ "node": ">= 8" } }, + "node_modules/@npmcli/arborist": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.7.1.tgz", + "integrity": "sha512-EGDHJs6dna/52BrStr/6aaRcMLrYxGbSjT4V3JzvoTBY9/w5i2+1KNepmsG80CAsGADdo6nuNnFwb7sDRm8ZAw==", + "dev": true, + "dependencies": { + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^11.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", + "proc-log": "^1.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "ssri": "^8.0.1", + "tar": "^6.1.0", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/arborist/node_modules/make-fetch-happen": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.0.4.tgz", + "integrity": "sha512-sQWNKMYqSmbAGXqJg2jZ+PmHh5JAybvwu0xM8mZR/bsTjGiTASj3ldXJV7KFHy1k/IJIBkjxQFoWIVsv9+PQMg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/arborist/node_modules/npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/ci-detect": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", @@ -4811,6 +4903,32 @@ "node": ">= 10" } }, + "node_modules/@npmcli/map-workspaces": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.3.tgz", + "integrity": "sha512-SdlRlOoQw4WKD4vtb/n5gUkobEABYBEOo8fRE4L8CtBkyWDSvIrReTfKvQ/Jc/LQqDaaZ5iv1iMSQzKCUr1n1A==", + "dev": true, + "dependencies": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", + "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" + } + }, "node_modules/@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", @@ -4823,12 +4941,27 @@ "node": ">=10" } }, + "node_modules/@npmcli/name-from-folder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", + "dev": true + }, "node_modules/@npmcli/node-gyp": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", "dev": true }, + "node_modules/@npmcli/package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", + "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.1" + } + }, "node_modules/@npmcli/promise-spawn": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", @@ -9456,6 +9589,23 @@ "node": "*" } }, + "node_modules/bin-links": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.2.1.tgz", + "integrity": "sha512-wFzVTqavpgCCYAh8SVBdnZdiQMxTkGR+T3b14CNpBXIBe2neJWaMGAZ55XWWHELJJ89dscuq0VCBqcVaIOgCMg==", + "dev": true, + "dependencies": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -11278,6 +11428,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -25044,6 +25200,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -25234,6 +25399,18 @@ "node": ">=8" } }, + "node_modules/just-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", + "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", + "dev": true + }, + "node_modules/just-diff-apply": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.0.0.tgz", + "integrity": "sha512-K2MLc+ZC2DVxX4V61bIKPeMUUfj1YYZ3h0myhchDXOW1cKoPZMnjIoNCqv9bF2n5Oob1PFxuR2gVJxkxz4e58w==", + "dev": true + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -36083,12 +36260,12 @@ } }, "node_modules/pacote": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.4.tgz", - "integrity": "sha512-RfahPCunM9GI7ryJV/zY0bWQiokZyLqaSNHXtbNSoLb7bwTvBbJBEyCJ01KWs4j1Gj7GmX8crYXQ1sNX6P2VKA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", + "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", "dev": true, "dependencies": { - "@npmcli/git": "^2.0.1", + "@npmcli/git": "^2.1.0", "@npmcli/installed-package-contents": "^1.0.6", "@npmcli/promise-spawn": "^1.2.0", "@npmcli/run-script": "^1.8.2", @@ -36264,6 +36441,17 @@ "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", "optional": true }, + "node_modules/parse-conflict-json": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", + "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, "node_modules/parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", @@ -37598,6 +37786,12 @@ "node": ">= 0.6" } }, + "node_modules/proc-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", + "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", + "dev": true + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -37684,6 +37878,24 @@ "asap": "~1.0.0" } }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", + "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -43197,6 +43409,12 @@ "node": "*" } }, + "node_modules/treeverse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", + "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", + "dev": true + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -44190,6 +44408,12 @@ "node": ">=8.9.0" } }, + "node_modules/walk-up-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true + }, "node_modules/walkdir": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", @@ -135190,6 +135414,86 @@ "fastq": "^1.6.0" } }, + "@npmcli/arborist": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.7.1.tgz", + "integrity": "sha512-EGDHJs6dna/52BrStr/6aaRcMLrYxGbSjT4V3JzvoTBY9/w5i2+1KNepmsG80CAsGADdo6nuNnFwb7sDRm8ZAw==", + "dev": true, + "requires": { + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/package-json": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^11.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", + "proc-log": "^1.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "ssri": "^8.0.1", + "tar": "^6.1.0", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.0.4.tgz", + "integrity": "sha512-sQWNKMYqSmbAGXqJg2jZ+PmHh5JAybvwu0xM8mZR/bsTjGiTASj3ldXJV7KFHy1k/IJIBkjxQFoWIVsv9+PQMg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dev": true, + "requires": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + } + } + }, "@npmcli/ci-detect": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", @@ -135222,6 +135526,29 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "@npmcli/map-workspaces": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.3.tgz", + "integrity": "sha512-SdlRlOoQw4WKD4vtb/n5gUkobEABYBEOo8fRE4L8CtBkyWDSvIrReTfKvQ/Jc/LQqDaaZ5iv1iMSQzKCUr1n1A==", + "dev": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + } + }, + "@npmcli/metavuln-calculator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", + "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" + } + }, "@npmcli/move-file": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", @@ -135231,12 +135558,27 @@ "rimraf": "^3.0.2" } }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", + "dev": true + }, "@npmcli/node-gyp": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.2.tgz", "integrity": "sha512-yrJUe6reVMpktcvagumoqD9r08fH1iRo01gn1u0zoCApa9lnZGEigVKUd2hzsCId4gdtkZZIVscLhNxMECKgRg==", "dev": true }, + "@npmcli/package-json": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", + "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, "@npmcli/promise-spawn": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", @@ -139350,6 +139692,20 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "bin-links": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.2.1.tgz", + "integrity": "sha512-wFzVTqavpgCCYAh8SVBdnZdiQMxTkGR+T3b14CNpBXIBe2neJWaMGAZ55XWWHELJJ89dscuq0VCBqcVaIOgCMg==", + "dev": true, + "requires": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + } + }, "binary": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", @@ -141626,6 +141982,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -157734,6 +158096,12 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -157892,6 +158260,18 @@ "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" }, + "just-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", + "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", + "dev": true + }, + "just-diff-apply": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.0.0.tgz", + "integrity": "sha512-K2MLc+ZC2DVxX4V61bIKPeMUUfj1YYZ3h0myhchDXOW1cKoPZMnjIoNCqv9bF2n5Oob1PFxuR2gVJxkxz4e58w==", + "dev": true + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -170682,12 +171062,12 @@ } }, "pacote": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.4.tgz", - "integrity": "sha512-RfahPCunM9GI7ryJV/zY0bWQiokZyLqaSNHXtbNSoLb7bwTvBbJBEyCJ01KWs4j1Gj7GmX8crYXQ1sNX6P2VKA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", + "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", "dev": true, "requires": { - "@npmcli/git": "^2.0.1", + "@npmcli/git": "^2.1.0", "@npmcli/installed-package-contents": "^1.0.6", "@npmcli/promise-spawn": "^1.2.0", "@npmcli/run-script": "^1.8.2", @@ -170851,6 +171231,17 @@ } } }, + "parse-conflict-json": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", + "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, "parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", @@ -171921,6 +172312,12 @@ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, + "proc-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", + "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -172007,6 +172404,18 @@ } } }, + "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==", + "dev": true + }, + "promise-call-limit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", + "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", + "dev": true + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -176615,6 +177024,12 @@ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", "optional": true }, + "treeverse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", + "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -177414,6 +177829,12 @@ "rxjs": "^6.6.3" } }, + "walk-up-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true + }, "walkdir": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", diff --git a/package.json b/package.json index 28fa521f6ad..02bdf41cbc5 100644 --- a/package.json +++ b/package.json @@ -39,13 +39,15 @@ "update-authors": "node scripts/generate-authors.js", "update-third-party-notices": "node scripts/gather-licenses.js packages/compass/ > THIRD-PARTY-NOTICES.md", "version": "node ./scripts/bump-private-dependencies.js --no-commit", - "where": "node ./scripts/monorepo/where.js" + "where": "node ./scripts/monorepo/where.js", + "gen-package-lock": "node ./scripts/generate-package-lock.js" }, "repository": { "type": "git", "url": "git://github.com/mongodb-js/compass.git" }, "devDependencies": { + "@npmcli/arborist": "^2.7.1", "chalk": "^4.1.1", "find-up": "^5.0.0", "fs-extra": "^9.1.0", @@ -53,6 +55,7 @@ "make-fetch-happen": "^8.0.14", "npm-cli-adduser": "^1.1.4", "ora": "^5.4.0", + "pacote": "^11.3.5", "pkg-up": "^3.1.0", "ps-list": "^7.2.0", "semver": "^7.3.5", diff --git a/packages/hadron-build/commands/release.js b/packages/hadron-build/commands/release.js index 9081e3801d5..f994ebbd001 100644 --- a/packages/hadron-build/commands/release.js +++ b/packages/hadron-build/commands/release.js @@ -11,7 +11,6 @@ * and include in assets. * @see [Atom's dump-symbols-task.coffee](https://git.io/va3fG) */ -const execa = require('execa'); const Target = require('../lib/target'); const verifyDistro = require('../lib/distro'); const cli = require('mongodb-js-cli')('hadron-build:release'); @@ -369,11 +368,6 @@ const transformPackageJson = (CONFIG, done) => { const installDependencies = (CONFIG, done) => { const appPackagePath = path.join(CONFIG.resources, 'app'); - var args = [ - 'install', - '--production' - ]; - cli.debug('Installing dependencies'); var opts = { @@ -381,43 +375,36 @@ const installDependencies = (CONFIG, done) => { cwd: appPackagePath }; - run('npm', args, opts, function(err) { + run('npm', ['ci'], opts, function(err) { if (err) { return done(err); } - // NOTE: temporary fix for https://jira.mongodb.org/browse/COMPASS-4939: - // reinstall the mongodb driver if coming from a "github:" fork so it gets - // post-install hooks and compiled sources - const packageJson = fs.readJsonSync(path.join(appPackagePath, 'package.json')); - const mongodbDepVersion = packageJson.dependencies.mongodb; + cli.debug('Dependencies installed'); - if ((mongodbDepVersion || '').startsWith('github')) { - cli.debug(`Installing mongodb@${mongodbDepVersion}`); + run('npm', ['prune', '--production'], opts, (err) => { + if (err) { + return done(err); + } - execa.sync('npm', ['install', `mongodb@${mongodbDepVersion}`], { - env: process.env, - cwd: appPackagePath + cli.debug('Dev-only dependencies removed'); + + rebuild({ + ...CONFIG.rebuild, + electronVersion: CONFIG.packagerOptions.electronVersion, + buildPath: appPackagePath, + // `projectRootPath` is undocumented, but changes modules resolution quite + // a bit and required for the electron-rebuild to be able to pick up + // dependencies inside project root, but outside of their dependants (e.g. + // a transitive dependency that was hoisted by npm installation process) + projectRootPath: appPackagePath, + force: true + }).then(() => { + cli.debug('Native modules rebuilt against Electron.'); + return done(); + }).catch((e) => { + return done(e); }); - } - - cli.debug('Dependencies installed'); - - rebuild({ - ...CONFIG.rebuild, - electronVersion: CONFIG.packagerOptions.electronVersion, - buildPath: appPackagePath, - // `projectRootPath` is undocumented, but changes modules resolution quite - // a bit and required for the electron-rebuild to be able to pick up - // dependencies inside project root, but outside of their dependants (e.g. - // a transitive dependency that was hoisted by npm installation process) - projectRootPath: appPackagePath, - force: true - }).then(() => { - cli.debug('Native modules rebuilt against Electron.'); - return done(); - }).catch((e) => { - return done(e); }); }); }; diff --git a/packages/hadron-build/lib/run.js b/packages/hadron-build/lib/run.js index 4af271735cb..1963fbed175 100644 --- a/packages/hadron-build/lib/run.js +++ b/packages/hadron-build/lib/run.js @@ -65,9 +65,7 @@ function run(cmd, args, opts, fn) { return fn(err); } - debug('running', { - cmd: cmd - }); + debug('running', { cmd, args }); var output = []; var proc = spawn(bin, args, opts); diff --git a/scripts/generate-package-lock.js b/scripts/generate-package-lock.js new file mode 100644 index 00000000000..2b1d0d5de37 --- /dev/null +++ b/scripts/generate-package-lock.js @@ -0,0 +1,190 @@ +const path = require('path'); +const { promises: fs } = require('fs'); +const { Arborist, Shrinkwrap } = require('@npmcli/arborist'); +const pacote = require('pacote'); +const { withProgress } = require('./monorepo/with-progress'); + +/** + * This script produces a fully "detached" package-lock file for a specific + * workspace from a root dependencies tree in an npm workspace. This might be + * helpful when you want a workspace to be aware of its exact dependencies + * versions outside of your monorepo setup. + * + * For the description of Node, Link and Edge data structures refer to the + * arborist docs[0]. + * + * [0] - https://github.com/npm/arborist#data-structures + */ +async function main() { + const rootPath = path.resolve(__dirname, '..'); + const workspaceName = process.argv.slice(2)[0]; + + let arb, tree, workspaceNode, workspacePath; + + await withProgress('Loading dependencies tree', async () => { + arb = new Arborist({ path: rootPath }); + // Using virtual here so that optional and system specific pacakges are also + // included (they will be missing in `actual` if they are not on disk). + tree = await arb.loadVirtual(); + }); + + await withProgress(`Looking for ${workspaceName} workspace`, async () => { + if (!tree.workspaces.has(workspaceName)) { + const availableWorkspaces = Array.from(tree.workspaces.keys()); + + throw new Error( + `Workspace "${workspaceName}" doesn't exist. Available workspaces:\n\n${availableWorkspaces + .map((name) => ` - ${name}`) + .join('\n')}` + ); + } + + workspacePath = tree.workspaces.get(workspaceName); + workspaceNode = tree.children.get(workspaceName); + }); + + const packagesMeta = new Map(); + + await withProgress( + `Building dependency tree for ${workspaceName} workspace`, + async () => { + const packages = getAllChildrenForNode(workspaceNode); + + for (const packageNode of packages) { + const metaPath = packageNode.path + .replace(workspacePath, '') + .replace(rootPath, '') + .replace(/^(\/|\\)/, ''); + + // In theory should never happen + if (packagesMeta.has(metaPath)) { + // TODO: print nice diff maybe + // const pkgA = JSON.stringify(packagesMeta.get(metaPath), null, 2); + const pkgB = JSON.stringify(packageNode, null, 2); + throw new Error( + `Conflicting package dependency: package ${packageNode.name} already exists on path ${metaPath}\n\n${pkgB}` + ); + } + + let meta; + + if (packageNode.isLink) { + meta = await resolvePackageMetaForLink(packageNode); + } else { + meta = Shrinkwrap.metaFromNode(packageNode); + } + + packagesMeta.set(metaPath, meta); + } + } + ); + + await withProgress( + `Writing package lock file to ${path.relative( + process.cwd(), + path.join(workspacePath, 'package-lock.json') + )}`, + async () => { + // https://docs.npmjs.com/cli/v7/configuring-npm/package-lock-json#file-format + const packageLock = { + name: workspaceName, + version: workspaceNode.version, + lockfileVersion: 3, + packages: Object.fromEntries(packagesMeta) + }; + + await fs.writeFile( + path.join(workspacePath, 'package-lock.json'), + JSON.stringify(packageLock, null, 2) + ); + } + ); +} + +const maybeMissingType = ['optional', 'peer', 'peerOptional']; + +function getAllChildrenForNode(nodeOrLink, packages = new Set()) { + const node = nodeOrLink.isLink ? nodeOrLink.target : nodeOrLink; + for (const edge of node.edgesOut.values()) { + const pkg = findPackageNodeRec(edge.name, nodeOrLink); + if (!maybeMissingType.includes(edge.type) && !pkg) { + throw new Error( + `Failed to resolve edge ${edge.name} from package ${ + node.packageName + } at ${node.realpath}:\n\n${JSON.stringify(edge, null, 2)}` + ); + } else if (pkg && !packages.has(pkg)) { + packages.add(pkg); + getAllChildrenForNode(pkg, packages); + } + } + return packages; +} + +function findPackageNodeRec(packageName, startNode) { + const parent = startNode.parent || startNode.top || startNode.root || null; + const node = startNode.isLink ? startNode.target : startNode; + return startNode.children.has(packageName) + ? node.children.get(packageName) + : parent && parent !== startNode + ? findPackageNodeRec(packageName, parent) + : null; +} + +const manifestKeys = [ + 'version', + 'bin', + 'license', + 'engines', + 'dependencies', + 'optionalDependencies', + '_resolved', + '_integrity' +]; + +const nodePackageKeys = ['inBundle', 'hasShrinkwrap', 'hasInstallScript']; + +/** + * Create a shrinkwrap package meta from registry metadata following the + * description in npm docs[0] and internal arborist implementation[1] (we can't + * use `Shrinkwrap.metaFromNode` directly for LINKs as their metadata will + * produce an incorrect shrinkwrap meta) + * + * [0] - https://docs.npmjs.com/cli/v7/configuring-npm/package-lock-json#packages + * [1] - https://github.com/npm/arborist/blob/75c785f64bc27f326b645854be0b2607e219f09b/lib/shrinkwrap.js#L107-L146 + */ +async function resolvePackageMetaForLink(link) { + const manifest = await pacote.manifest(`${link.name}@${link.version}`, { + // if env is undefined, defaults to https://registry.npmjs.org + registry: process.env.npm_config_registry + }); + + const meta = { + // XXX: We are not providing `dev`, `optional`, `devOptional` (see npm docs + // for description): those are not set on the LINKs and their children + // returned by arborist and there is no easy way to get that info without a + // deeper tree inspection. Good news are this info is not really required + // for our purposes, so we can skip it. + }; + + manifestKeys.forEach((key) => { + if (manifest[key]) { + meta[key.replace('_', '')] = manifest[key]; + } + }); + + nodePackageKeys.forEach((key) => { + if (link.package[key]) { + meta[key] = link.package[key]; + } + }); + + return meta; +} + +process.on('unhandledRejection', (err) => { + console.error(); + console.error(err.stack || err.message || err); +}); + +main();