diff --git a/@packages/utils/package.json b/@packages/utils/package.json index 197bde6eda..27d763b368 100644 --- a/@packages/utils/package.json +++ b/@packages/utils/package.json @@ -37,13 +37,13 @@ }, "license": "MIT", "dependencies": { - "@commitlint/test": "^11.0.0", "execa": "^5.0.0", - "is-builtin-module": "3.0.0", - "meow": "8.1.0", + "fs-extra": "^9.0.0", "read-pkg": "5.2.0", "require-from-string": "2.0.2", - "tar-fs": "2.1.1" + "tar-fs": "2.1.1", + "tmp": "0.2.1", + "yargs": "^16.0.0" }, "gitHead": "71f0194f33943954a8dac1c458be47e5049717cd" } diff --git a/@packages/utils/pkg-check.js b/@packages/utils/pkg-check.js index 60abbdc2bc..a9d5ccdeb6 100755 --- a/@packages/utils/pkg-check.js +++ b/@packages/utils/pkg-check.js @@ -1,53 +1,51 @@ #!/usr/bin/env node const path = require('path'); -const fs = require('fs'); +const fs = require('fs-extra'); const zlib = require('zlib'); const execa = require('execa'); -const meow = require('meow'); +const yargs = require('yargs'); const readPkg = require('read-pkg'); const requireFromString = require('require-from-string'); const tar = require('tar-fs'); -const {fix} = require('@commitlint/test'); +const tmp = require('tmp'); -const builtin = require.resolve('is-builtin-module'); +tmp.setGracefulCleanup(); const PRELUDE = ` -var _require = require; +var Module = require('module'); +var originalLoader = Module._load -require = function(id) { +Module._load = function(path, parent) { + if (path.startsWith('.') || Module.builtinModules.includes(path)) { + return originalLoader.apply(this, arguments); + } var dummy = new Proxy({}, { get() { return dummy; } }); - - var _isBuiltIn = _require('${builtin}'); - if (id[0] === '.' || _isBuiltIn(id)) { - return _require(id); - } else { - return dummy; - } + return dummy; }; `; -function main(cli) { +function main(flags) { if (!Proxy) { console .warn('Skipping pkg-check, detected missing Proxy support') .process.exit(0); } - const cwd = cli.flags.cwd || process.cwd(); + const cwd = flags.cwd || process.cwd(); const skipImport = - typeof cli.flags.skipImport === 'boolean' ? cli.flags.skipImport : false; + typeof flags.skipImport === 'boolean' ? flags.skipImport : false; return readPkg({cwd}).then((pkg) => { return getTarballFiles(cwd, {write: !skipImport}).then((tarball) => { return getPackageFiles(cwd).then((pkgFiles) => { let problems = []; - if (!cli.flags.skipBin) { + if (!flags.skipBin) { problems = problems.concat( pkgFiles.bin .filter((binFile) => tarball.files.indexOf(binFile) === -1) @@ -59,10 +57,7 @@ function main(cli) { ); } - if ( - !cli.flags.skipMain && - tarball.files.indexOf(pkgFiles.main) === -1 - ) { + if (!flags.skipMain && tarball.files.indexOf(pkgFiles.main) === -1) { problems.push({ type: 'main', file: pkgFiles.main, @@ -70,7 +65,7 @@ function main(cli) { }); } - if (!cli.flags.skipImport && !cli.flags.skipMain) { + if (!flags.skipImport && !flags.skipMain) { const importable = fileImportable( path.join(tarball.dirname, pkgFiles.main) ); @@ -95,19 +90,35 @@ function main(cli) { } main( - meow(` - pkg-check - - Check if a package creates valid tarballs - - Options - --skip-main Skip main checks - --skip-bin Skip bin checks - --skip-import Skip import smoke test - - Examples - $ pkg-check -`) + yargs + .options({ + cwd: { + description: 'directory to execute in', + type: 'string', + }, + skipMain: { + default: false, + type: 'boolean', + description: 'Skip main checks', + }, + skipBin: { + default: false, + type: 'boolean', + description: 'Skip bin checks', + }, + skipImport: { + default: false, + type: 'boolean', + description: 'Skip import smoke test', + }, + }) + .scriptName('pkg-check') + .usage('pkg-check\n') + .usage('Check if a package creates valid tarballs') + .example('$0', '') + .help() + .version() + .strict().argv ) .then((report) => { if (report.problems.length > 0) { @@ -125,16 +136,19 @@ main( .catch((err) => { setTimeout(() => { throw err; - }); + }, 0); + }); + +async function getTarballFiles(source, options) { + const tmpDir = tmp.dirSync({ + keep: false, + unsafeCleanup: true, }); + const cwd = tmpDir.name; + const tarball = path.join(cwd, 'test-archive.tgz'); + await execa('yarn', ['pack', '--filename', tarball], {cwd: source}); -function getTarballFiles(source, options) { - return fix - .bootstrap(source) - .then((cwd) => - execa('npm', ['pack'], {cwd}).then((cp) => path.join(cwd, cp.stdout)) - ) - .then((tarball) => getArchiveFiles(tarball, options)); + return getArchiveFiles(tarball, options); } function getArchiveFiles(filePath, options) { @@ -173,7 +187,7 @@ function getPackageFiles(source) { function normalizeMainPath(mainPath) { const norm = path.normalize(mainPath); - if (norm[norm.length - 1] === '/') { + if (norm[norm.length - 1] === path.sep) { return `${norm}index.js`; } return norm; diff --git a/yarn.lock b/yarn.lock index 732c48764b..a403db7668 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2368,11 +2368,6 @@ resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= - "@types/node@*", "@types/node@>= 8": version "12.12.26" resolved "https://registry.npmjs.org/@types/node/-/node-12.12.26.tgz#213e153babac0ed169d44a6d919501e68f59dea9" @@ -3163,11 +3158,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builtin-modules@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" - integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== - builtins@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3283,15 +3273,6 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - camelcase@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -4086,7 +4067,7 @@ debuglog@^1.0.1: resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: +decamelize-keys@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -5549,11 +5530,6 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -5641,13 +5617,6 @@ hosted-git-info@^2.7.1: resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== -hosted-git-info@^3.0.6: - version "3.0.7" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" - integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== - dependencies: - lru-cache "^6.0.0" - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -5985,13 +5954,6 @@ is-buffer@^1.1.5: resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.0.0.tgz#137d3d2425023a19a660fb9dd6ddfabe52c03466" - integrity sha512-/93sDihsAD652hrMEbJGbMAVBf1qc96kyThHQ0CAOONHaE3aROLpTjDe4WQ5aoC5ITHFxEq1z8XqSU7km+8amw== - dependencies: - builtin-modules "^3.0.0" - is-callable@^1.1.4, is-callable@^1.2.0: version "1.2.2" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" @@ -6924,7 +6886,7 @@ kind-of@^5.0.0: resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7325,11 +7287,6 @@ map-obj@^2.0.0: resolved "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= -map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -7347,23 +7304,6 @@ medium-zoom@^1.0.6: resolved "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.6.tgz#9247f21ca9313d8bbe9420aca153a410df08d027" integrity sha512-UdiUWfvz9fZMg1pzf4dcuqA0W079o0mpqbTnOz5ip4VGYX96QjmbM+OgOU/0uOzAytxC0Ny4z+VcYQnhdifimg== -meow@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/meow/-/meow-8.1.0.tgz#0fcaa267e35e4d58584b8205923df6021ddcc7ba" - integrity sha512-fNWkgM1UVMey2kf24yLiccxLihc5W+6zVus3/N0b+VfnJgxV99E9u04X6NAiKdg6ED7DAQBX5sy36NM0QJZkWA== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - meow@^3.3.0: version "3.7.0" resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -7501,15 +7441,6 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" @@ -7799,16 +7730,6 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" - integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== - dependencies: - hosted-git-info "^3.0.6" - resolve "^1.17.0" - semver "^7.3.2" - validate-npm-package-license "^3.0.1" - normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -8674,11 +8595,6 @@ quick-lru@^1.0.0: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -8873,14 +8789,6 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -10185,11 +10093,6 @@ trim-newlines@^2.0.0: resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= -trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== - trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" @@ -10280,11 +10183,6 @@ type-fest@^0.11.0: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== -type-fest@^0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.0.tgz#2edfa6382d48653707344f7fccdb0443d460e8d6" - integrity sha512-fbDukFPnJBdn2eZ3RR+5mK2slHLFd6gYHY7jna1KWWy4Yr4XysHuCdXRzy+RiG/HwG4WJat00vdC2UHky5eKiQ== - type-fest@^0.3.0: version "0.3.1" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -10866,11 +10764,6 @@ yargs-parser@^19.0.4: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-19.0.4.tgz#99183a3a59268b205c6b04177f2a5bfb46e79ba7" integrity sha512-eXeQm7yXRjPFFyf1voPkZgXQZJjYfjgQUmGPbD2TLtZeIYzvacgWX7sQ5a1HsRgVP+pfKAkRZDNtTGev4h9vhw== -yargs-parser@^20.2.3: - version "20.2.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz#92419ba867b858c868acf8bae9bf74af0dd0ce26" - integrity sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww== - yargs@^14.2.0: version "14.2.3" resolved "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414"