{"_id":"@bernierllc/route-discoverer","_rev":"12-5c170b115189b7a97a6dc488d5fa2882","name":"@bernierllc/route-discoverer","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.1":{"name":"@bernierllc/route-discoverer","version":"0.1.1","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"fc3f19dcafc74315fe890cdc4224e059c7c1f75b","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.1.1.tgz","fileCount":38,"integrity":"sha512-wVsWIPr8dTibamWX3ynXiMvr82HTt0oMq0HHdKlzKArI9pCKnT+Cbgori3Lf+O4D5Z2XGFxEape28AQwkY0RTA==","signatures":[{"sig":"MEYCIQC9ArE2b1JkCtlZOIVxzP+GguMVlKUvzI1m0o4PEItO/QIhAKTs37Yc5vaVcovE+HWhSsaZrrzlT/IIAhSldjNZ34K7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107427},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"a86c5ab9dd7394bcd5862c93deb74c4b304a847b","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"24.4.1","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"workspace:^"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.1.1_1759970825270_0.21397640647876792","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bernierllc/route-discoverer","version":"0.1.3","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.1.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"513f2bbebcd0da8e6fe8f9ffbbe0c78d2dc75be6","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.1.3.tgz","fileCount":38,"integrity":"sha512-iyrbB/91/sF6UrEZCEdw+uGbYgKrLvP3OSsd8Ja8yUbh93PgzVJG3zh81JK5lq30fWNQYhVHzXUXFog9lnjlsg==","signatures":[{"sig":"MEQCIFY0Z2qzqDiW13uF8iV1WuxkTFaIrm590wON2OPZq44bAiACjUC3ac2S2+1gSm5asPquIlfuHzQBKl4x78KpDWYvZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107467},"main":"dist/index.js","type":"module","_from":"file:bernierllc-route-discoverer-0.1.3.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/tmp/3f21585761039e86e2147822ffeab6d9/bernierllc-route-discoverer-0.1.3.tgz","_integrity":"sha512-iyrbB/91/sF6UrEZCEdw+uGbYgKrLvP3OSsd8Ja8yUbh93PgzVJG3zh81JK5lq30fWNQYhVHzXUXFog9lnjlsg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.7.0","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"20.19.6","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.2.3"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.1.3_1766283498004_0.48017293995070354","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/route-discoverer","version":"0.3.0","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"1259978879850b8d86ccb53bd874750fbe2c8fbd","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.3.0.tgz","fileCount":38,"integrity":"sha512-XYTYNMX5FRwD9bkh+vEH9XA8veM3CgtkmsxsLc21JYk6Pz2HezikQ+d/MmY10OSB7oHu5By6stsYIa3NWepdXA==","signatures":[{"sig":"MEUCIBXQGcZ7JAGEBeM9u/zP9JCSlnIVPrZFIcML2zeHFTq4AiEA/Wk7YvkkRJ1bQfh33QvdVxOMLBFF48HdXesIf6KwxRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107525},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"683786f5b043d9a96c9f49ed1f04f9dccd79eed3","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:759915f2-9909-4228-b0bf-356b1f8a1145"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"20.19.6","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.4.0"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.3.0_1767644261255_0.3033695818634128","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/route-discoverer","version":"0.3.1","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"89d5166e15c26783ea001c3864dfdb714cbc7a94","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.3.1.tgz","fileCount":38,"integrity":"sha512-MxgRnIg8UqBUenZG/3uFS4ngnM9p08Ci/0qLhs0QfJZTpmHwCQy0jNKRUD4k94XmxvBt1vTXu9Fc81unZq3aKw==","signatures":[{"sig":"MEUCIQDnDBQTBHcodBhcYYAreG852Sg2uoy3wXXhhyYhONQbYwIgWGhlLhbMrR2vP65mKDsNNjMS5BVYfEOnpgvk4NvqHOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107463},"main":"dist/index.js","type":"module","_from":"file:bernierllc-route-discoverer-0.3.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:759915f2-9909-4228-b0bf-356b1f8a1145"}},"_resolved":"/tmp/18c69d1297bc39b1147059f996792d1e/bernierllc-route-discoverer-0.3.1.tgz","_integrity":"sha512-MxgRnIg8UqBUenZG/3uFS4ngnM9p08Ci/0qLhs0QfJZTpmHwCQy0jNKRUD4k94XmxvBt1vTXu9Fc81unZq3aKw==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"20.20.0","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.4.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.3.1_1773078186304_0.4531258546313752","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/route-discoverer","version":"0.3.2","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"60343d65038c8fbf876d235a43fa352f9413ba50","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.3.2.tgz","fileCount":38,"integrity":"sha512-/u8h13kCjQkBKMnBWrhNx16HSQQgxa/Oo+hBzAAjX7LO8BljsMRfX1U9JjMWeDhDQW4bUQ0xcMpiGgSEnITeFQ==","signatures":[{"sig":"MEQCIEzB0D6K4bXKSIa8NysPSFwXPA/j3E2zjaeByVWZ3qN2AiB1fhwkjPiHCMW3k7hHwK2lunWw3TPYg2OoNgcdcp8Lhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107463},"main":"dist/index.js","type":"module","_from":"file:bernierllc-route-discoverer-0.3.2.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:759915f2-9909-4228-b0bf-356b1f8a1145"}},"_resolved":"/home/runner/work/tools/tools/packages/core/route-discoverer/bernierllc-route-discoverer-0.3.2.tgz","_integrity":"sha512-/u8h13kCjQkBKMnBWrhNx16HSQQgxa/Oo+hBzAAjX7LO8BljsMRfX1U9JjMWeDhDQW4bUQ0xcMpiGgSEnITeFQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"20.20.0","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.4.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.3.2_1773163265749_0.31139278023443007","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/route-discoverer","version":"0.5.0","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"fd236dd35c5eeee0c9ba48a778b95cbc7e186684","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.5.0.tgz","fileCount":41,"integrity":"sha512-WPgI5cQR8yVVRA3VTDBtkj0mlLy+TC59OQl7oZpuVi4QljVi1hMfxhiV53LLGGrOlMX9Cf4yHpwMIorJ4jbOLQ==","signatures":[{"sig":"MEYCIQDGdcswBL76/oJtkEPnXQY8pJ5mkerfrBvberdL12cghgIhALZ3njA5HqK1xGgdifZegKWl0uQerSQR5MR/NJYnlLfD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109512},"main":"dist/index.js","type":"module","_from":"file:bernierllc-route-discoverer-0.5.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:759915f2-9909-4228-b0bf-356b1f8a1145"}},"_resolved":"/home/runner/work/tools/tools/packages/core/route-discoverer/bernierllc-route-discoverer-0.5.0.tgz","_integrity":"sha512-WPgI5cQR8yVVRA3VTDBtkj0mlLy+TC59OQl7oZpuVi4QljVi1hMfxhiV53LLGGrOlMX9Cf4yHpwMIorJ4jbOLQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"20.20.2","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.5.0_1779241385052_0.6407484537413042","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bernierllc/route-discoverer","version":"0.6.0","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/route-discoverer@0.6.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"ceb11c039e4f89e44da5bbd5b47aa18e419682cd","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.6.0.tgz","fileCount":41,"integrity":"sha512-YsKk9hrALY+1B5xDelNJ4aSEoMUKAvJ0rzGx7PX+HX6xe3EEIM8PQ6P1q8Eomdz7WUKPJZ2taaV7APYIt0jCMQ==","signatures":[{"sig":"MEUCIGcEhfpqj5yf57AcfcAIhf1FcLj4sGKtr8CSopqClM/kAiEArB00SVOG7w/my48e06fWBSrf3zi4D9fcs3l8smPKafo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109512},"main":"dist/index.js","type":"module","_from":"file:bernierllc-route-discoverer-0.6.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist coverage","prebuild":"npm run clean","test:run":"jest --runInBand","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:759915f2-9909-4228-b0bf-356b1f8a1145"}},"_resolved":"/home/runner/work/tools/tools/packages/core/route-discoverer/bernierllc-route-discoverer-0.6.0.tgz","_integrity":"sha512-YsKk9hrALY+1B5xDelNJ4aSEoMUKAvJ0rzGx7PX+HX6xe3EEIM8PQ6P1q8Eomdz7WUKPJZ2taaV7APYIt0jCMQ==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","directories":{},"_nodeVersion":"20.20.2","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.7.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.6.4","eslint":"^8.49.0","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2","@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/parser":"^6.7.0","@typescript-eslint/eslint-plugin":"^6.7.0"},"_npmOperationalInternal":{"tmp":"tmp/route-discoverer_0.6.0_1779250131808_0.19603877716517193","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@bernierllc/route-discoverer","version":"0.7.0","description":"Framework-agnostic route discovery and analysis utilities for API route introspection","type":"module","main":"dist/index.js","types":"dist/index.d.ts","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","dependencies":{"glob":"^10.4.5","minimatch":"^9.0.5","@bernierllc/file-handler":"0.8.0"},"devDependencies":{"@types/jest":"^29.5.5","@types/node":"^20.6.0","@typescript-eslint/eslint-plugin":"^6.7.0","@typescript-eslint/parser":"^6.7.0","eslint":"^8.49.0","jest":"^29.6.4","rimraf":"^5.0.1","ts-jest":"^29.1.1","typescript":"^5.2.2"},"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:run":"jest --runInBand","clean":"rimraf dist coverage","prebuild":"npm run clean","lint":"eslint src --ext .ts","typecheck":"tsc --noEmit"},"_id":"@bernierllc/route-discoverer@0.7.0","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","_integrity":"sha512-8/4gDSHXnERlrkcIYtitMJxIC04IG2yRdMjcZwmn6sDtPgF9nYHREXe4penelVVdw29U2aadhlvsOJNYG2Hg2A==","_resolved":"/home/runner/work/tools/tools/packages/core/route-discoverer/bernierllc-route-discoverer-0.7.0.tgz","_from":"file:bernierllc-route-discoverer-0.7.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.15.0","dist":{"integrity":"sha512-8/4gDSHXnERlrkcIYtitMJxIC04IG2yRdMjcZwmn6sDtPgF9nYHREXe4penelVVdw29U2aadhlvsOJNYG2Hg2A==","shasum":"916c03cf95f6266517ef4d25325439af21ac583c","tarball":"https://registry.npmjs.org/@bernierllc/route-discoverer/-/route-discoverer-0.7.0.tgz","fileCount":41,"unpackedSize":109512,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAwNRxXl//kOkoRieDwerGzy4V5mmf1eN0tecr/+bW/mAiEA0bIixLwnGkjaUgJ0+Pp/kc7dcA9lGXQzXIixnUsB2Is="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:759915f2-9909-4228-b0bf-356b1f8a1145"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/route-discoverer_0.7.0_1779840693177_0.7684867317673809"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-09T00:47:05.183Z","modified":"2026-05-27T00:11:33.778Z","0.1.1":"2025-10-09T00:47:05.482Z","0.1.3":"2025-12-21T02:18:18.150Z","0.3.0":"2026-01-05T20:17:41.403Z","0.3.1":"2026-03-09T17:43:06.468Z","0.3.2":"2026-03-10T17:21:05.906Z","0.5.0":"2026-05-20T01:43:05.205Z","0.6.0":"2026-05-20T04:08:51.959Z","0.7.0":"2026-05-27T00:11:33.308Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"Bernier LLC","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["routes","discovery","route-analysis","nextjs","express","fastify","framework-agnostic","api-routes","route-detection","bernierllc","core"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"description":"Framework-agnostic route discovery and analysis utilities for API route introspection","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/route-discoverer\n\nFramework-agnostic route discovery and analysis utilities for API route introspection across Next.js, Express, Fastify, and other web frameworks.\n\n## Installation\n\n```bash\nnpm install @bernierllc/route-discoverer\n```\n\n## Features\n\n- 🔍 **Framework-Agnostic** - Works with any file-based routing system\n- 🎯 **Multi-Framework Support** - Built-in adapters for Next.js (App Router & Pages Router), Express, and Fastify\n- 📊 **Route Analysis** - Extract parameters, detect conflicts, calculate coverage\n- 🏗️ **Route Tree Generation** - Build hierarchical route structures\n- ⚡ **Performance Optimized** - Concurrent file processing with configurable limits\n- 🔒 **Type-Safe** - Full TypeScript support with detailed interfaces\n- 📝 **Metadata Extraction** - Parse JSDoc comments and inline metadata\n\n## Usage\n\n### Basic Route Discovery\n\n```typescript\nimport { RouteDiscoverer } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/*.{js,ts,jsx,tsx}'],\n  ignore: ['**/*.test.{js,ts}', '**/node_modules/**'],\n  recursive: true,\n  maxDepth: 10\n});\n\n// Discover all routes in a directory\nconst routes = await discoverer.discoverRoutes('./src/api');\n\nconsole.log(`Found ${routes.length} routes`);\nroutes.forEach(route => {\n  console.log(`${route.methods.join(', ')} ${route.routePath} (${route.framework})`);\n});\n```\n\n### Framework-Specific Discovery\n\n#### Next.js Routes\n\n```typescript\nimport { RouteDiscoverer } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/route.{js,ts}', '**/*.{js,ts,jsx,tsx}']\n});\n\n// Discover Next.js App Router and Pages Router routes\nconst routes = await discoverer.discoverNextJSRoutes(\n  './app',      // App Router directory\n  './pages/api' // Pages Router API directory (optional)\n);\n\nroutes.forEach(route => {\n  console.log(`${route.routePath}:`, route.methods);\n  if (route.metadata.requiresAuth) {\n    console.log('  ⚠️  Requires authentication');\n  }\n});\n```\n\n#### Express Routes\n\n```typescript\nimport { RouteDiscoverer } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/routes/**/*.{js,ts}']\n});\n\nconst routes = await discoverer.discoverExpressRoutes('./src/routes');\n\nroutes.forEach(route => {\n  console.log(`Express route: ${route.routePath}`);\n});\n```\n\n#### Fastify Routes\n\n```typescript\nimport { RouteDiscoverer } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/routes/**/*.{js,ts}']\n});\n\nconst routes = await discoverer.discoverFastifyRoutes('./src/routes');\n\nroutes.forEach(route => {\n  console.log(`Fastify route: ${route.routePath}`);\n});\n```\n\n### Route Analysis\n\n```typescript\nimport { routeAnalyzer } from '@bernierllc/route-discoverer';\n\n// Analyze route pattern\nconst patternInfo = routeAnalyzer.analyzeRoutePattern('/api/users/[id]/posts/[postId]');\n\nconsole.log('Pattern depth:', patternInfo.depth);\nconsole.log('Static segments:', patternInfo.staticSegments);\nconsole.log('Dynamic segments:', patternInfo.dynamicSegments);\nconsole.log('Specificity score:', patternInfo.specificity);\n\n// Extract parameters\nconst parameters = routeAnalyzer.extractParameters('/api/users/[id]/posts/[postId]');\n\nparameters.forEach(param => {\n  console.log(`Parameter: ${param.name} (${param.type}, required: ${param.required})`);\n});\n\n// Detect conflicts between routes\nconst conflicts = routeAnalyzer.detectConflicts(routes);\n\nconflicts.forEach(conflict => {\n  console.log(`⚠️  Conflict detected (${conflict.type}):`);\n  console.log(`   ${conflict.route1.routePath} vs ${conflict.route2.routePath}`);\n  console.log(`   ${conflict.description}`);\n  if (conflict.resolution) {\n    console.log(`   💡 ${conflict.resolution}`);\n  }\n});\n```\n\n### Generate Route Tree\n\n```typescript\nimport { routeAnalyzer } from '@bernierllc/route-discoverer';\n\nconst tree = routeAnalyzer.generateRouteTree(routes);\n\nconsole.log(`Total routes: ${tree.totalRoutes}`);\nconsole.log(`Max depth: ${tree.maxDepth}`);\n\n// Traverse tree\nfunction printTree(node, indent = '') {\n  if (node.routes.length > 0) {\n    console.log(`${indent}${node.path} (${node.routes.length} routes)`);\n  }\n\n  node.children.forEach(child => {\n    printTree(child, indent + '  ');\n  });\n}\n\nprintTree(tree.root);\n```\n\n### Calculate Coverage\n\n```typescript\nimport { routeAnalyzer } from '@bernierllc/route-discoverer';\n\nconst patterns = [\n  '/api/users',\n  '/api/users/[id]',\n  '/api/posts',\n  '/api/posts/[id]',\n  '/api/comments'\n];\n\nconst coverage = routeAnalyzer.calculateCoverage(routes, patterns);\n\nconsole.log(`Coverage: ${coverage.coveragePercentage.toFixed(2)}%`);\nconsole.log(`Covered: ${coverage.coveredPatterns}/${coverage.totalPatterns}`);\n\nif (coverage.uncoveredPatterns.length > 0) {\n  console.log('Uncovered patterns:');\n  coverage.uncoveredPatterns.forEach(pattern => {\n    console.log(`  - ${pattern}`);\n  });\n}\n```\n\n### Single Route Analysis\n\n```typescript\nimport { RouteDiscoverer } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/*.{js,ts}']\n});\n\nconst analysis = await discoverer.analyzeRouteFile('./app/api/users/[id]/route.ts');\n\nif (analysis) {\n  console.log('Route:', analysis.route.routePath);\n  console.log('Methods:', analysis.route.methods);\n  console.log('Is dynamic:', analysis.isDynamic);\n  console.log('Is catch-all:', analysis.isCatchAll);\n  console.log('Parameters:', analysis.parameters);\n}\n```\n\n### Route Validation\n\n```typescript\nimport { RouteDiscoverer } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/*.{js,ts}']\n});\n\nconst routes = await discoverer.discoverRoutes('./src/api');\n\nroutes.forEach(route => {\n  const validation = discoverer.validateRoute(route);\n\n  if (!validation.isValid) {\n    console.log(`❌ ${route.routePath}:`);\n    validation.errors.forEach(error => {\n      console.log(`   Error: ${error}`);\n    });\n  }\n\n  if (validation.warnings.length > 0) {\n    console.log(`⚠️  ${route.routePath}:`);\n    validation.warnings.forEach(warning => {\n      console.log(`   Warning: ${warning}`);\n    });\n  }\n});\n```\n\n### Route Filtering\n\n```typescript\nimport { RouteDiscoverer, FrameworkType, HttpMethod } from '@bernierllc/route-discoverer';\n\nconst discoverer = new RouteDiscoverer({\n  patterns: ['**/*.{js,ts}']\n});\n\nconst routes = await discoverer.discoverRoutes('./src/api');\n\n// Filter by framework\nconst nextjsRoutes = discoverer.filterRoutes(\n  routes,\n  [route => route.framework === FrameworkType.NEXTJS]\n);\n\n// Filter by HTTP method\nconst postRoutes = discoverer.filterRoutes(\n  routes,\n  [route => route.methods.includes(HttpMethod.POST)]\n);\n\n// Filter by authentication requirement\nconst authRoutes = discoverer.filterRoutes(\n  routes,\n  [route => route.metadata.requiresAuth === true]\n);\n\n// Combine multiple filters\nconst securePostRoutes = discoverer.filterRoutes(routes, [\n  route => route.methods.includes(HttpMethod.POST),\n  route => route.metadata.requiresAuth === true,\n  route => route.framework === FrameworkType.NEXTJS\n]);\n```\n\n### Using Framework Adapters Directly\n\n```typescript\nimport { NextJSAdapter, ExpressAdapter } from '@bernierllc/route-discoverer';\n\n// Next.js adapter\nconst nextjs = new NextJSAdapter();\n\nconst isNextJS = await nextjs.detectFramework('./app/api/users/route.ts');\nconst routePath = nextjs.parseRoutePath('./app/api/users/[id]/route.ts', './app');\nconst segments = nextjs.extractRouteSegments('/api/users/[id]');\n\n// Express adapter\nconst express = new ExpressAdapter();\n\nconst content = await fs.readFile('./routes/users.ts', 'utf-8');\nconst methods = express.extractMethods(content);\nconst metadata = express.extractMetadata(content);\nconst definitions = express.extractRouteDefinitions(content);\n```\n\n## API Reference\n\n### RouteDiscoverer\n\nMain class for discovering routes.\n\n#### Constructor\n\n```typescript\nconstructor(options: RouteDiscovererOptions)\n```\n\nOptions:\n- `patterns: string[]` - File patterns to match (glob patterns)\n- `ignore?: string[]` - Patterns to ignore (merged with defaults)\n- `recursive?: boolean` - Enable recursive directory traversal (default: true)\n- `followSymlinks?: boolean` - Follow symbolic links (default: false)\n- `maxDepth?: number` - Maximum directory depth (default: 20)\n\n#### Methods\n\n- `discoverRoutes(basePath: string): Promise<DiscoveredRoute[]>` - Discover all routes in directory\n- `discoverSingleRoute(filePath: string, basePath?: string): Promise<DiscoveredRoute | null>` - Discover single route\n- `analyzeRouteFile(filePath: string, basePath?: string): Promise<RouteAnalysis | null>` - Analyze route file\n- `discoverNextJSRoutes(appDir?: string, pagesDir?: string): Promise<DiscoveredRoute[]>` - Discover Next.js routes\n- `discoverExpressRoutes(routesDir: string): Promise<DiscoveredRoute[]>` - Discover Express routes\n- `discoverFastifyRoutes(routesDir: string): Promise<DiscoveredRoute[]>` - Discover Fastify routes\n- `validateRoute(route: DiscoveredRoute): ValidationResult` - Validate route\n- `filterRoutes(routes: DiscoveredRoute[], filters: RouteFilter[]): DiscoveredRoute[]` - Filter routes\n\n### RouteAnalyzer\n\nUtility class for route analysis.\n\n#### Methods\n\n- `analyzeRoutePattern(pattern: string): RoutePatternInfo` - Analyze route pattern\n- `extractParameters(routePath: string): ParameterInfo[]` - Extract route parameters\n- `detectConflicts(routes: DiscoveredRoute[]): RouteConflict[]` - Detect route conflicts\n- `generateRouteTree(routes: DiscoveredRoute[]): RouteTree` - Generate route tree\n- `calculateCoverage(routes: DiscoveredRoute[], patterns: string[]): CoverageReport` - Calculate coverage\n- `analyzeRoute(route: DiscoveredRoute): RouteAnalysis` - Analyze single route\n\n### Framework Adapters\n\n#### NextJSAdapter\n\n- `detectFramework(filePath: string, content?: string): Promise<boolean>`\n- `parseRoutePath(filePath: string, basePath: string): string`\n- `extractMethods(content: string): HttpMethod[]`\n- `extractMetadata(content: string): RouteMetadata`\n- `extractRouteSegments(path: string): RouteSegment[]`\n\n#### ExpressAdapter\n\n- `detectFramework(filePath: string, content?: string): Promise<boolean>`\n- `parseRoutePath(filePath: string, basePath: string): string`\n- `extractMethods(content: string): HttpMethod[]`\n- `extractMetadata(content: string): RouteMetadata`\n- `extractRouteDefinitions(content: string): RouteDefinition[]`\n- `parseMiddleware(content: string): MiddlewareInfo[]`\n\n#### FastifyAdapter\n\n- `detectFramework(filePath: string, content?: string): Promise<boolean>`\n- `parseRoutePath(filePath: string, basePath: string): string`\n- `extractMethods(content: string): HttpMethod[]`\n- `extractMetadata(content: string): RouteMetadata`\n- `extractRouteDefinitions(content: string): RouteDefinition[]`\n- `extractPlugins(content: string): string[]`\n\n### Helper Functions\n\n```typescript\n// Route creation\ncreateRouteDiscoverer(patterns?: string[], options?: Partial<RouteDiscovererOptions>): RouteDiscoverer\n\n// Simple discovery wrapper\ndiscoverRoutes(basePath: string, patterns?: string[]): Promise<PackageResult<DiscoveredRoute[]>>\n\n// Path utilities\nnormalizePath(filePath: string): string\nfilePathToRoutePath(filePath: string, basePath: string): string\ngetPathDepth(filePath: string): number\ngetPathSegments(filePath: string): string[]\ncalculatePathSpecificity(routePath: string): number\n\n// Pattern matching\nmatchesPattern(filePath: string, patterns: string[]): boolean\nextractNextJSSegments(routePath: string): RouteSegment[]\nnextJSToStandardRoute(routePath: string): string\nroutesConflict(route1: string, route2: string): boolean\nisDynamicRoute(routePath: string): boolean\nisCatchAllRoute(routePath: string): boolean\n```\n\n## Types\n\n### DiscoveredRoute\n\n```typescript\ninterface DiscoveredRoute {\n  filePath: string;           // Absolute path to route file\n  relativePath: string;       // Relative path from base\n  routePath: string;          // HTTP route path\n  methods: HttpMethod[];      // Supported HTTP methods\n  framework: FrameworkType;   // Detected framework\n  metadata: RouteMetadata;    // Route metadata\n  lastModified: Date;         // File modification time\n}\n```\n\n### RouteMetadata\n\n```typescript\ninterface RouteMetadata {\n  description?: string;       // Route description\n  tags?: string[];           // Route tags/categories\n  requiresAuth?: boolean;    // Authentication required\n  rateLimit?: {              // Rate limiting config\n    requests: number;\n    window: number;\n  };\n  [key: string]: unknown;    // Custom metadata\n}\n```\n\n### RouteAnalysis\n\n```typescript\ninterface RouteAnalysis {\n  route: DiscoveredRoute;         // The analyzed route\n  parameters: ParameterInfo[];    // Extracted parameters\n  patternInfo: RoutePatternInfo;  // Pattern information\n  isDynamic: boolean;             // Has dynamic segments\n  isCatchAll: boolean;            // Is catch-all route\n}\n```\n\n## Integration Status\n\n- **Logger integration**: not-applicable - Core utility package with minimal logging needs (no @bernierllc/logger dependency required)\n- **Docs-Suite**: ready - Comprehensive JSDoc comments and TypeDoc-compatible API documentation\n- **NeverHub integration**: not-applicable - Standalone utility package with no service dependencies (no @bernierllc/neverhub-adapter required)\n\n## Performance\n\nThe package is optimized for large codebases:\n\n- **Concurrent Processing**: Files are processed in batches (default: 50 concurrent reads)\n- **File Size Limits**: Files over 10MB are automatically skipped\n- **Route Limits**: Supports up to 10,000 routes per discovery\n- **Depth Limits**: Configurable maximum directory depth (default: 20 levels)\n\nTypical performance:\n- **1,000 routes**: < 5 seconds\n- **5,000 routes**: < 20 seconds\n- **10,000 routes**: < 40 seconds\n\n## See Also\n\n- [@bernierllc/file-handler](../file-handler) - File system operations used internally\n- [@bernierllc/jsdoc-openapi-parser](../jsdoc-openapi-parser) - OpenAPI generation from JSDoc comments\n- [@bernierllc/nextjs-openapi](../../service/nextjs-openapi) - Next.js OpenAPI integration\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n","readmeFilename":"README.md"}