diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6c60a0..f6d9a69 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: build: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 15.x] + node-version: [10.0.x, 10.x, 12.0.x, 12.x, 14.0.x, 14.x, 15.x] os: [ubuntu-latest, macOS-latest, windows-latest] fail-fast: false diff --git a/index.js b/index.js index fa81551..30427fe 100644 --- a/index.js +++ b/index.js @@ -22,6 +22,7 @@ const fs = require('fs') const readFile = promisify(fs.readFile) const readdir = promisify(fs.readdir) const stat = promisify(fs.stat) +const lstat = promisify(fs.lstat) const {relative, resolve, basename, dirname} = require('path') const normalizePackageBin = require('npm-normalize-package-bin') @@ -131,6 +132,18 @@ const pkgContents = async ({ const recursePromises = [] + // if we didn't get withFileTypes support, tack that on + if (typeof dirEntries[0] === 'string') { + // use a map so we can return a promise, but we mutate dirEntries in place + // this is much slower than getting the entries from the readdir call, + // but polyfills support for node versions before 10.10 + await Promise.all(dirEntries.map(async (name, index) => { + const p = resolve(path, name) + const st = await lstat(p) + dirEntries[index] = Object.assign(st, {name}) + })) + } + for (const entry of dirEntries) { const p = resolve(path, entry.name) if (entry.isDirectory() === false) { diff --git a/package-lock.json b/package-lock.json index af066e6..430d6ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "installed-package-contents": "index.js" }, "devDependencies": { + "require-inject": "^1.4.4", "tap": "^14.11.0" }, "engines": { @@ -380,6 +381,12 @@ "signal-exit": "^3.0.2" } }, + "node_modules/caller": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caller/-/caller-1.0.1.tgz", + "integrity": "sha1-uFGGD3Dhlds9J3OVqhp+I+ow7PU=", + "dev": true + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -2141,6 +2148,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-inject": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/require-inject/-/require-inject-1.4.4.tgz", + "integrity": "sha512-5Y5ctRN84+I4iOZO61gm+48tgP/6Hcd3VZydkaEM3MCuOvnHRsTJYQBOc01faI/Z9at5nsCAJVHhlfPA6Pc0Og==", + "dev": true, + "dependencies": { + "caller": "^1.0.1" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -2436,7 +2452,102 @@ "signal-exit", "tap-parser", "tap-yaml", - "yaml" + "yaml", + "@babel/code-frame", + "@babel/core", + "@babel/generator", + "@babel/helper-annotate-as-pure", + "@babel/helper-builder-react-jsx", + "@babel/helper-builder-react-jsx-experimental", + "@babel/helper-function-name", + "@babel/helper-get-function-arity", + "@babel/helper-member-expression-to-functions", + "@babel/helper-module-imports", + "@babel/helper-module-transforms", + "@babel/helper-optimise-call-expression", + "@babel/helper-plugin-utils", + "@babel/helper-replace-supers", + "@babel/helper-simple-access", + "@babel/helper-split-export-declaration", + "@babel/helper-validator-identifier", + "@babel/helpers", + "@babel/highlight", + "@babel/parser", + "@babel/plugin-proposal-object-rest-spread", + "@babel/plugin-syntax-jsx", + "@babel/plugin-syntax-object-rest-spread", + "@babel/plugin-transform-destructuring", + "@babel/plugin-transform-parameters", + "@babel/plugin-transform-react-jsx", + "@babel/template", + "@babel/traverse", + "@babel/types", + "@types/color-name", + "@types/prop-types", + "@types/yoga-layout", + "ansi-escapes", + "ansi-regex", + "ansi-styles", + "ansicolors", + "arrify", + "astral-regex", + "auto-bind", + "caller-callsite", + "caller-path", + "callsites", + "cardinal", + "chalk", + "ci-info", + "cli-cursor", + "cli-truncate", + "color-convert", + "color-name", + "convert-source-map", + "csstype", + "debug", + "emoji-regex", + "escape-string-regexp", + "esprima", + "events-to-array", + "gensync", + "globals", + "has-flag", + "is-ci", + "is-fullwidth-code-point", + "js-tokens", + "jsesc", + "json5", + "lodash", + "lodash.throttle", + "log-update", + "loose-envify", + "mimic-fn", + "minimist", + "ms", + "object-assign", + "onetime", + "path-parse", + "prop-types", + "punycode", + "react-is", + "react-reconciler", + "redeyed", + "resolve", + "resolve-from", + "restore-cursor", + "scheduler", + "semver", + "slice-ansi", + "string-length", + "string-width", + "strip-ansi", + "supports-color", + "to-fast-properties", + "type-fest", + "unicode-length", + "widest-line", + "wrap-ansi", + "yoga-layout-prebuilt" ], "dev": true, "dependencies": { @@ -5185,6 +5296,12 @@ } } }, + "caller": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caller/-/caller-1.0.1.tgz", + "integrity": "sha1-uFGGD3Dhlds9J3OVqhp+I+ow7PU=", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -6623,6 +6740,15 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-inject": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/require-inject/-/require-inject-1.4.4.tgz", + "integrity": "sha512-5Y5ctRN84+I4iOZO61gm+48tgP/6Hcd3VZydkaEM3MCuOvnHRsTJYQBOc01faI/Z9at5nsCAJVHhlfPA6Pc0Og==", + "dev": true, + "requires": { + "caller": "^1.0.1" + } + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", diff --git a/package.json b/package.json index e101dbc..d8cbe78 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,11 @@ "postpublish": "git push origin --follow-tags" }, "tap": { - "check-coverage": true + "check-coverage": true, + "color": true }, "devDependencies": { + "require-inject": "^1.4.4", "tap": "^14.11.0" }, "dependencies": { diff --git a/tap-snapshots/test-basic.js-TAP.test.js b/tap-snapshots/test-basic.js-TAP.test.js index b10c5b4..cba17ec 100644 --- a/tap-snapshots/test-basic.js-TAP.test.js +++ b/tap-snapshots/test-basic.js-TAP.test.js @@ -33,7 +33,7 @@ array [ ] ` -exports[`test/basic.js TAP default depth bundle-all > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth bundle-all > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/all", "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", @@ -47,14 +47,14 @@ array [ ] ` -exports[`test/basic.js TAP default depth bundle-none > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth bundle-none > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/bundle-none", "{dir}/fixtures/node_modules/bundle-none/package.json", ] ` -exports[`test/basic.js TAP default depth bundle-some > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth bundle-some > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/some", "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", @@ -64,15 +64,15 @@ array [ ] ` -exports[`test/basic.js TAP default depth empty > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth empty > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP default depth missing > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth missing > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP default depth no-deps > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth no-deps > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/no-deps/empty", "{dir}/fixtures/node_modules/no-deps/index.js", @@ -80,7 +80,7 @@ array [ ] ` -exports[`test/basic.js TAP default depth optional-only > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false default depth optional-only > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", @@ -92,52 +92,52 @@ array [ ] ` -exports[`test/basic.js TAP depth:0 bundle-all > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 bundle-all > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/all", "{dir}/fixtures/node_modules/bundle-all", ] ` -exports[`test/basic.js TAP depth:0 bundle-none > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 bundle-none > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/bundle-none", "{dir}/fixtures/node_modules/bundle-none", ] ` -exports[`test/basic.js TAP depth:0 bundle-some > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 bundle-some > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/some", "{dir}/fixtures/node_modules/bundle-some", ] ` -exports[`test/basic.js TAP depth:0 empty > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 empty > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/empty", ] ` -exports[`test/basic.js TAP depth:0 missing > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 missing > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/missing", ] ` -exports[`test/basic.js TAP depth:0 no-deps > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 no-deps > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/no-deps", ] ` -exports[`test/basic.js TAP depth:0 optional-only > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:0 optional-only > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/optional-only", ] ` -exports[`test/basic.js TAP depth:1 bundle-all > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 bundle-all > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/all", "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", @@ -151,14 +151,14 @@ array [ ] ` -exports[`test/basic.js TAP depth:1 bundle-none > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 bundle-none > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/bundle-none", "{dir}/fixtures/node_modules/bundle-none/package.json", ] ` -exports[`test/basic.js TAP depth:1 bundle-some > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 bundle-some > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/some", "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", @@ -168,15 +168,15 @@ array [ ] ` -exports[`test/basic.js TAP depth:1 empty > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 empty > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP depth:1 missing > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 missing > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP depth:1 no-deps > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 no-deps > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/no-deps/empty", "{dir}/fixtures/node_modules/no-deps/index.js", @@ -184,7 +184,7 @@ array [ ] ` -exports[`test/basic.js TAP depth:1 optional-only > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:1 optional-only > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", @@ -196,7 +196,7 @@ array [ ] ` -exports[`test/basic.js TAP depth:2 bundle-all > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 bundle-all > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/all", "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", @@ -211,14 +211,14 @@ array [ ] ` -exports[`test/basic.js TAP depth:2 bundle-none > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 bundle-none > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/bundle-none", "{dir}/fixtures/node_modules/bundle-none/package.json", ] ` -exports[`test/basic.js TAP depth:2 bundle-some > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 bundle-some > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/some", "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", @@ -229,15 +229,15 @@ array [ ] ` -exports[`test/basic.js TAP depth:2 empty > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 empty > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP depth:2 missing > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 missing > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP depth:2 no-deps > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 no-deps > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/no-deps/empty", "{dir}/fixtures/node_modules/no-deps/index.js", @@ -245,7 +245,7 @@ array [ ] ` -exports[`test/basic.js TAP depth:2 optional-only > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:2 optional-only > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", @@ -258,7 +258,7 @@ array [ ] ` -exports[`test/basic.js TAP depth:Infinity bundle-all > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity bundle-all > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/all", "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", @@ -273,14 +273,14 @@ array [ ] ` -exports[`test/basic.js TAP depth:Infinity bundle-none > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity bundle-none > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/bundle-none", "{dir}/fixtures/node_modules/bundle-none/package.json", ] ` -exports[`test/basic.js TAP depth:Infinity bundle-some > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity bundle-some > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/.bin/some", "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", @@ -291,15 +291,15 @@ array [ ] ` -exports[`test/basic.js TAP depth:Infinity empty > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity empty > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP depth:Infinity missing > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity missing > expect resolving Promise 1`] = ` array [] ` -exports[`test/basic.js TAP depth:Infinity no-deps > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity no-deps > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/no-deps/empty", "{dir}/fixtures/node_modules/no-deps/index.js", @@ -307,7 +307,294 @@ array [ ] ` -exports[`test/basic.js TAP depth:Infinity optional-only > expect resolving Promise 1`] = ` +exports[`test/basic.js TAP fileTypesSupport=false depth:Infinity optional-only > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/baz/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/quux/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/bar/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/foo/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/foo/xyz/abc", + "{dir}/fixtures/node_modules/optional-only/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth bundle-all > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/all", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/quux", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/baz", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/quux", + "{dir}/fixtures/node_modules/bundle-all/node_modules/bar", + "{dir}/fixtures/node_modules/bundle-all/node_modules/foo", + "{dir}/fixtures/node_modules/bundle-all/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth bundle-none > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/bundle-none", + "{dir}/fixtures/node_modules/bundle-none/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth bundle-some > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/some", + "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-some/node_modules/@scope/baz", + "{dir}/fixtures/node_modules/bundle-some/node_modules/foo", + "{dir}/fixtures/node_modules/bundle-some/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth empty > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth missing > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth no-deps > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/no-deps/empty", + "{dir}/fixtures/node_modules/no-deps/index.js", + "{dir}/fixtures/node_modules/no-deps/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true default depth optional-only > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/baz", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/quux", + "{dir}/fixtures/node_modules/optional-only/node_modules/bar", + "{dir}/fixtures/node_modules/optional-only/node_modules/foo", + "{dir}/fixtures/node_modules/optional-only/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 bundle-all > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/all", + "{dir}/fixtures/node_modules/bundle-all", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 bundle-none > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/bundle-none", + "{dir}/fixtures/node_modules/bundle-none", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 bundle-some > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/some", + "{dir}/fixtures/node_modules/bundle-some", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 empty > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/empty", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 missing > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/missing", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 no-deps > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/no-deps", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:0 optional-only > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/optional-only", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 bundle-all > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/all", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/quux", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/baz", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/quux", + "{dir}/fixtures/node_modules/bundle-all/node_modules/bar", + "{dir}/fixtures/node_modules/bundle-all/node_modules/foo", + "{dir}/fixtures/node_modules/bundle-all/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 bundle-none > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/bundle-none", + "{dir}/fixtures/node_modules/bundle-none/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 bundle-some > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/some", + "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-some/node_modules/@scope/baz", + "{dir}/fixtures/node_modules/bundle-some/node_modules/foo", + "{dir}/fixtures/node_modules/bundle-some/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 empty > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 missing > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 no-deps > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/no-deps/empty", + "{dir}/fixtures/node_modules/no-deps/index.js", + "{dir}/fixtures/node_modules/no-deps/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:1 optional-only > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/baz", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/quux", + "{dir}/fixtures/node_modules/optional-only/node_modules/bar", + "{dir}/fixtures/node_modules/optional-only/node_modules/foo", + "{dir}/fixtures/node_modules/optional-only/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 bundle-all > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/all", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/quux", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/baz/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/quux/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/bar/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/foo/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/foo/xyz", + "{dir}/fixtures/node_modules/bundle-all/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 bundle-none > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/bundle-none", + "{dir}/fixtures/node_modules/bundle-none/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 bundle-some > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/some", + "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-some/node_modules/@scope/baz/package.json", + "{dir}/fixtures/node_modules/bundle-some/node_modules/foo/package.json", + "{dir}/fixtures/node_modules/bundle-some/node_modules/foo/xyz", + "{dir}/fixtures/node_modules/bundle-some/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 empty > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 missing > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 no-deps > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/no-deps/empty", + "{dir}/fixtures/node_modules/no-deps/index.js", + "{dir}/fixtures/node_modules/no-deps/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:2 optional-only > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/baz/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/@scope/quux/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/bar/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/foo/package.json", + "{dir}/fixtures/node_modules/optional-only/node_modules/foo/xyz", + "{dir}/fixtures/node_modules/optional-only/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity bundle-all > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/all", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/bar", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-all/node_modules/.bin/quux", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/baz/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/@scope/quux/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/bar/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/foo/package.json", + "{dir}/fixtures/node_modules/bundle-all/node_modules/foo/xyz/abc", + "{dir}/fixtures/node_modules/bundle-all/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity bundle-none > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/bundle-none", + "{dir}/fixtures/node_modules/bundle-none/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity bundle-some > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/.bin/some", + "{dir}/fixtures/node_modules/bundle-some/node_modules/.bin/foo", + "{dir}/fixtures/node_modules/bundle-some/node_modules/@scope/baz/package.json", + "{dir}/fixtures/node_modules/bundle-some/node_modules/foo/package.json", + "{dir}/fixtures/node_modules/bundle-some/node_modules/foo/xyz/abc", + "{dir}/fixtures/node_modules/bundle-some/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity empty > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity missing > expect resolving Promise 1`] = ` +array [] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity no-deps > expect resolving Promise 1`] = ` +array [ + "{dir}/fixtures/node_modules/no-deps/empty", + "{dir}/fixtures/node_modules/no-deps/index.js", + "{dir}/fixtures/node_modules/no-deps/package.json", +] +` + +exports[`test/basic.js TAP fileTypesSupport=true depth:Infinity optional-only > expect resolving Promise 1`] = ` array [ "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/bar", "{dir}/fixtures/node_modules/optional-only/node_modules/.bin/foo", diff --git a/test/basic.js b/test/basic.js index 57d4e2e..24f467d 100644 --- a/test/basic.js +++ b/test/basic.js @@ -1,4 +1,26 @@ -const getContents = require('../') +const requireInject = require('require-inject') +const {promisify} = require('util') +const fs = require('fs') + +const realReaddir = fs.readdir +let readdirFileTypes = true +const readdir = (path, ...args) => { + if (readdirFileTypes) + return realReaddir(path, ...args) + else + return realReaddir(path, args.pop()) +} + +const fsMock = { + ...fs, + promises: fs.promises ? { + ...fs.promises, + readdir: promisify(readdir), + } : null, + readdir, +} + +const getContents = requireInject('../', { fs: fsMock }) const t = require('tap') const {resolve} = require('path') @@ -9,7 +31,9 @@ t.formatSnapshot = a => Array.isArray(a) ? a.sort() : a // sometimes and lowercase others, so we normalize that as well. t.cleanSnapshot = s => s.toLowerCase().replace(/\\\\/g, '\\') .split(__dirname.toLowerCase()).join('{dir}') + .replace(/[\n\r]+/, '\0') .replace(/\\+/g, '/') + .replace('\0', '\n') const mkdirp = require('mkdirp').sync const fixtures = resolve(__dirname, 'fixtures/node_modules') @@ -29,47 +53,53 @@ const paths = [ 'optional-only', ] -t.test('default depth', t => { - t.plan(paths.length) - paths.forEach(p => t.test(p, t => - t.resolveMatchSnapshot(getContents({ path: resolve(fixtures, p) })))) -}) +for (const fileTypesSupport of [true, false]) { + t.test(`fileTypesSupport=${fileTypesSupport}`, async t => { + readdirFileTypes = fileTypesSupport -t.test('depth:0', t => { - t.plan(paths.length) - paths.forEach(p => t.test(p, t => - t.resolveMatchSnapshot(getContents({ - path: resolve(fixtures, p), - depth: 0, - })))) -}) + t.test('default depth', t => { + t.plan(paths.length) + paths.forEach(p => t.test(p, t => + t.resolveMatchSnapshot(getContents({ path: resolve(fixtures, p) })))) + }) -t.test('depth:1', t => { - t.plan(paths.length) - paths.forEach(p => t.test(p, t => - t.resolveMatchSnapshot(getContents({ - path: resolve(fixtures, p), - depth: 1, - })))) -}) + t.test('depth:0', t => { + t.plan(paths.length) + paths.forEach(p => t.test(p, t => + t.resolveMatchSnapshot(getContents({ + path: resolve(fixtures, p), + depth: 0, + })))) + }) -t.test('depth:2', t => { - t.plan(paths.length) - paths.forEach(p => t.test(p, t => - t.resolveMatchSnapshot(getContents({ - path: resolve(fixtures, p), - depth: 2, - })))) -}) + t.test('depth:1', t => { + t.plan(paths.length) + paths.forEach(p => t.test(p, t => + t.resolveMatchSnapshot(getContents({ + path: resolve(fixtures, p), + depth: 1, + })))) + }) -t.test('depth:Infinity', t => { - t.plan(paths.length) - paths.forEach(p => t.test(p, t => - t.resolveMatchSnapshot(getContents({ - path: resolve(fixtures, p), - depth: Infinity, - })))) -}) + t.test('depth:2', t => { + t.plan(paths.length) + paths.forEach(p => t.test(p, t => + t.resolveMatchSnapshot(getContents({ + path: resolve(fixtures, p), + depth: 2, + })))) + }) + + t.test('depth:Infinity', t => { + t.plan(paths.length) + paths.forEach(p => t.test(p, t => + t.resolveMatchSnapshot(getContents({ + path: resolve(fixtures, p), + depth: Infinity, + })))) + }) + }) +} t.test('cache race condition coverage tests', t => { t.plan(2) diff --git a/test/bin.js b/test/bin.js index 927708d..24be38d 100644 --- a/test/bin.js +++ b/test/bin.js @@ -31,12 +31,7 @@ const mkdirp = require('mkdirp').sync // mkdirp this because we don't want to leave a .git-keep file in it // no need to clean up, git will ignore it. mkdirp(resolve(fixtures, 'node_modules/empty')) - -// mkdirp these because we don't want to leave a .git-keep file in it, -// since the whole point is that the dirs are empty. -// no need to clean up, git will ignore it. -mkdirp(resolve(fixtures, 'empty')) -mkdirp(resolve(fixtures, 'no-deps/empty')) +mkdirp(resolve(fixtures, 'node_modules/no-deps/empty')) const paths = [ 'node_modules/bundle-all',