diff --git a/.gitignore b/.gitignore index a569048..cbf7c30 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -/node_modules +node_modules /.tshy /lib /dist diff --git a/bench/bench.js b/bench/bench.js new file mode 100644 index 0000000..fed1279 --- /dev/null +++ b/bench/bench.js @@ -0,0 +1,38 @@ +import {packageUp, packageUpSync} from 'package-up'; +import {up as empathic} from 'empathic/package'; +import {findPackagePath, findPackagePathSync} from 'fd-package-json'; +import {Bench} from 'tinybench'; +import {join} from 'node:path'; +import {styleText} from 'node:util'; + +const dirs = 'abcdefghij'; +const depths = [1, 3, 5, 10]; + +for (const dep of depths) { + const name = `${dep} depth${dep === 1 ? '' : 's'}`; + const cwd = join(import.meta.dirname, 'fixture', ...dirs.substring(0, dep)); + const bench = new Bench({name, warmup: true}); + + bench + .add('package-up', async () => await packageUp({cwd})) + .add('package-up (sync)', () => packageUpSync({cwd})) + .add('empathic (sync)', () => empathic({cwd})) + .add('fd-package-json', async () => await findPackagePath(cwd)) + .add('fd-package-json (sync)', () => findPackagePathSync(cwd)); + + await bench.run(); + + console.log(`# ${name}`); + + const table = bench.table(); + for (const row of table) { + for (const prop in row) { + const isName = prop === 'Task name'; + console.log( + `${isName ? '-' : ' '} ${isName ? '' : `${prop}: `}${styleText(isName ? ['bold', 'underline'] : 'none', String(row[prop]))}` + ); + } + } + + console.log(''); +} diff --git a/bench/fixture/a/b/c/d/e/f/g/h/i/j/.gitkeep b/bench/fixture/a/b/c/d/e/f/g/h/i/j/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/bench/fixture/package.json b/bench/fixture/package.json new file mode 100644 index 0000000..5b666b7 --- /dev/null +++ b/bench/fixture/package.json @@ -0,0 +1,15 @@ +{ + "name": "simple-package", + "private": true, + "version": "1.0.0", + "description": "A simple package that does nothing.", + "keywords": [ + "some", + "keywords" + ], + "author": "That Guy", + "license": "MIT", + "type": "module", + "dependencies": { + } +} diff --git a/bench/package-lock.json b/bench/package-lock.json new file mode 100644 index 0000000..3472ddd --- /dev/null +++ b/bench/package-lock.json @@ -0,0 +1,88 @@ +{ + "name": "bench", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bench", + "devDependencies": { + "empathic": "^2.0.0", + "fd-package-json": "file:../", + "package-up": "^5.0.0", + "tinybench": "^5.1.0" + } + }, + "..": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-up-path": "^4.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.27.0", + "@types/node": "^20.11.24", + "c8": "^10.1.3", + "eslint": "^9.27.0", + "eslint-config-google": "^0.14.0", + "premove": "^4.0.0", + "prettier": "^3.5.3", + "typescript": "^5.8.3", + "typescript-eslint": "^8.32.1" + } + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/fd-package-json": { + "resolved": "..", + "link": true + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/package-up/-/package-up-5.0.0.tgz", + "integrity": "sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tinybench": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-5.1.0.tgz", + "integrity": "sha512-LXKNtFualiKOm6gADe1UXPtf8+Nfn1CtPMEHAT33Fd2YjQatrujkDcK0+4wRC1X6t7fxUDXUs6BsvuIgfkDgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + } + } +} diff --git a/bench/package.json b/bench/package.json new file mode 100644 index 0000000..8f4cff1 --- /dev/null +++ b/bench/package.json @@ -0,0 +1,11 @@ +{ + "name": "bench", + "private": true, + "type": "module", + "devDependencies": { + "empathic": "^2.0.0", + "fd-package-json": "file:../", + "package-up": "^5.0.0", + "tinybench": "^5.1.0" + } +}