{"_id":"next-safe-navigation","_rev":"12-5d425afe6a9853a2c4e282f7fb5d576f","name":"next-safe-navigation","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"next-safe-navigation","version":"0.1.0","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.1.0","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"7c893d89a9061dd60514c23b2748fbf8432daf04","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.1.0.tgz","fileCount":9,"integrity":"sha512-B4bTF++TTE0Z/ljDi8rdRdIrFluuOeR3onH7S0C4J6xbepAsdPA0u3aYKOz8Y34OehviqPNdTZQBWFLztHM+KA==","signatures":[{"sig":"MEQCIAWWNbV/mK8+AroQglqNQmhUkgq3uVLgly4U+f8IdmluAiBaQlx4jcd42nPmZ/xhIrVs/qr0QL1xjsDU5CenWMbWNQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":62752},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"ee40b001bba192ff753fe14b42fe7344f9c63aeb","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.2.4","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.11.0","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.0","tsup":"^8.0.1","jsdom":"^24.0.0","vitest":"^1.2.2","prettier":"^3.2.4","@types/bun":"latest","@vitest/ui":"^1.2.2","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.2.2","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.0","eslint-config-lukemorales":"^0.3.0","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.1.0_1706903150539_0.5276970347571164","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"next-safe-navigation","version":"0.1.1","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.1.1","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"dfe7973ab8ac795aeafb1fdf420e08ebb9a7f7a3","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.1.1.tgz","fileCount":9,"integrity":"sha512-S2f9HjzI4afDPVj7qGVT1oOb+kfpRyey+xqDbWFeGZdccaBGzzy0TOnmsrzeZNNi1d25RZHOIOgEjfrA/3aZpA==","signatures":[{"sig":"MEUCIHxJjfm69Ppf5WpJ4f3iKE6G1+JtKeO9rGD4+3nSvQ6MAiEAygWk8ShC31teW/XBdHw1TiVxLkBJHArnmyPftyNeOrI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":62732},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"c358d6968e172f72578ae674fde1bf1579e77e48","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.2.4","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.11.0","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.0","tsup":"^8.0.1","jsdom":"^24.0.0","vitest":"^1.2.2","prettier":"^3.2.4","@types/bun":"latest","@vitest/ui":"^1.2.2","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.2.2","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.0","eslint-config-lukemorales":"^0.3.0","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.1.1_1707017962580_0.9272294253646121","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"next-safe-navigation","version":"0.2.0","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.2.0","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"9699ebef0f589c3b564f39b55a4d17bf5111b0bd","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.2.0.tgz","fileCount":9,"integrity":"sha512-IR6U6k/7JYfK6WBvW1k5OTNhBBe+jbhH6Z4ACGX05EjrbIaDDl2UnD/pJnaqx8aF+ctpw6DlUk+ntXZOrZHMkA==","signatures":[{"sig":"MEUCIQC6XB7BAKN9FWJXiEoTFh82yQHfGgSzytM85B0gDGQCPAIgNlH8arhbZyruQxBREDngVpI7bk9fgXtmBzZGpxazHdk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":65739},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"5e7e23eccc3ccbecd5fbe61f242cb08b68b8313e","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.2.4","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.11.1","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.0","tsup":"^8.0.1","jsdom":"^24.0.0","vitest":"^1.2.2","prettier":"^3.2.4","@types/bun":"latest","@vitest/ui":"^1.2.2","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.2.2","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.0","eslint-config-lukemorales":"^0.3.0","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.2.0_1711500559883_0.3955196148563265","host":"s3://npm-registry-packages"}},"0.3.0":{"name":"next-safe-navigation","version":"0.3.0","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.3.0","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"fc253ac306c43f53d1d0d6422623c9bdc7778823","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.3.0.tgz","fileCount":9,"integrity":"sha512-3kLkyFScusL4nzLG9Tpigf8jL5UTO8WB1/y/ECO4GZaRo4pDmIjXDANfa+RexEaTk6kCNEtNW2+aPiD7IHWIhA==","signatures":[{"sig":"MEYCIQCL2I+tSRXjT+xYQv9Dr1kwYMb/vwrrR16podkmCi3UdQIhALkG6PnOl/v07ZCsTvGQaOuUhqaegNoaishWbmiAf34N","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70781},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"0634241cd7525989bd39332510cd07e209986fbf","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.5.0","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.12.0","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.4","tsup":"^8.0.2","jsdom":"^24.0.0","vitest":"^1.4.0","prettier":"^3.2.5","@types/bun":"latest","@vitest/ui":"^1.4.0","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.4.0","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.2","eslint-config-lukemorales":"^0.4.1","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.3.0_1711729880814_0.5321056297224287","host":"s3://npm-registry-packages"}},"0.3.1":{"name":"next-safe-navigation","version":"0.3.1","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.3.1","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"57b076cfb7b077b8dcf5c71b29adb13f1362b3f7","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.3.1.tgz","fileCount":9,"integrity":"sha512-X32TqDC3oN8BD2ZLSztaRUZhsQOy4Ge5j48nBs6MMDuwfucnfx8jd3kIQFl0WT5du77MNp6OjHhUekupu9mR6Q==","signatures":[{"sig":"MEYCIQCBrZOIV7I8FzbI7AEhK/elvPr7A4YsM+rATueLW7YUZgIhAN0+KxbJKzUOQIf5yKSXXc3S2ASA4m97jwNsOPMRETZS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70409},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"9829e4f67460e57c0b8c620a59a2a488c63c125e","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.5.0","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.12.0","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.4","tsup":"^8.0.2","jsdom":"^24.0.0","vitest":"^1.4.0","prettier":"^3.2.5","@types/bun":"latest","@vitest/ui":"^1.4.0","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.4.0","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.2","eslint-config-lukemorales":"^0.4.1","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.3.1_1711813887633_0.8134688231062204","host":"s3://npm-registry-packages"}},"0.3.2":{"name":"next-safe-navigation","version":"0.3.2","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.3.2","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"22d890918d389594a6fec2edc165f0925bc8d9a0","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.3.2.tgz","fileCount":9,"integrity":"sha512-Y0HiEsRXe7qgM9TEbGbVkq/X68rKDg+/RkHnacNyRGCm6ZY50ieLpqJaMpzm9xBPytVoOwNHnxE5Mh7RxzQvUg==","signatures":[{"sig":"MEUCIQDsr7Vynb5A0hpuZjDjYn6HYuU5a67mK+grIt+V4CeZrwIgbKCt7DXS5ZUDbLxhPVCSjRMm+Gnt1VIzxfa1UvqjfpU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70521},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"6d5d020b47bd390e5a69bd95d84f4c0797068183","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.5.0","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.12.2","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.4","tsup":"^8.0.2","jsdom":"^24.0.0","vitest":"^1.4.0","prettier":"^3.2.5","@types/bun":"latest","@vitest/ui":"^1.4.0","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.4.0","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.2","eslint-config-lukemorales":"^0.4.1","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.3.2_1713823128439_0.1832836830249973","host":"s3://npm-registry-packages"}},"0.3.3":{"name":"next-safe-navigation","version":"0.3.3","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","zod","runtime validation","validation"],"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","_id":"next-safe-navigation@0.3.3","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"homepage":"https://github.com/lukemorales/safe-next-navigation#readme","bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"dist":{"shasum":"f800469bd3c1abac6f1a9798ee9cc401e872497b","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.3.3.tgz","fileCount":9,"integrity":"sha512-R9Boed5xHw3S9YkhR+j8kaWqj4WVMBDzD4G035Zo7rRYTZuHe7WAasar8LcSAwB/1jsnhNDI4L/pWzyrUKycTA==","signatures":[{"sig":"MEYCIQD3KJWDx2ymT2Jr3v+PbotElhEo2JsBfApE66Vw6Fbs5gIhAJYeaqWjYeLALljAWfevgCdg8JeAsdqa2BgfEgivM9Ah","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70449},"main":"dist/index.js","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","module":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"ddc27ea7ed1d047e84b95734c7ae8603dc523401","scripts":{"dev":"bun run test:coverage --ui","lint":"run-p lint:*","test":"vitest --passWithNoTests","build":"run-p build:*","clean":"rimraf dist","release":"changeset publish","test:ci":"bun run test:coverage --run","lint:tsc":"tsc --project tsconfig.json --noEmit","changeset":"changeset","build:tsup":"tsup --dts --minify","prerelease":"run-p build test:ci","lint:eslint":"eslint src --ext .ts","lint:format":"prettier --check \"src/**/*.ts\"","test:coverage":"bun run test --coverage","lint:eslint:fix":"bun run lint:eslint --fix","lint:format:fix":"bun run lint:format --write"},"typings":"dist/index.d.ts","_npmUser":{"name":"lukemorales","email":"lukemorales@live.com"},"prettier":"@lukemorales/prettier-config","repository":{"url":"git+https://github.com/lukemorales/safe-next-navigation.git","type":"git"},"_npmVersion":"10.8.1","description":"Type-safe navigation for NextJS App router","directories":{},"_nodeVersion":"20.16.0","eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.22.4","next":"^14.1.4","tsup":"^8.0.2","jsdom":"^24.0.0","vitest":"^1.4.0","prettier":"^3.2.5","@types/bun":"latest","@vitest/ui":"^1.4.0","typescript":"^4.8.2","npm-run-all":"^4.1.5","@changesets/cli":"^2.27.1","@vitest/coverage-v8":"^1.4.0","@vitejs/plugin-react":"^4.2.1","@testing-library/react":"^14.2.2","eslint-config-lukemorales":"^0.4.1","@changesets/changelog-github":"^0.5.0","@lukemorales/prettier-config":"^1.1.0"},"peerDependencies":{"zod":">=3.20.0","next":">=13.0.0","typescript":">=4.8.2"},"trustedDependencies":["npm-run-all"],"_npmOperationalInternal":{"tmp":"tmp/next-safe-navigation_0.3.3_1723926748569_0.8273206385028111","host":"s3://npm-registry-packages"}},"0.4.0":{"name":"next-safe-navigation","version":"0.4.0","author":{"name":"Luke Morales","email":"lukemorales@live.com"},"description":"Type-safe navigation for NextJS App router with Standard Schema support (Zod, Valibot, ArkType, etc.)","license":"MIT","repository":{"type":"git","url":"git+https://github.com/lukemorales/safe-next-navigation.git"},"bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"main":"dist/index.js","module":"dist/index.mjs","typings":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","module":"./dist/index.mjs","import":"./dist/index.mjs","require":"./dist/index.js","default":"./dist/index.mjs"},"./package.json":"./package.json"},"scripts":{"build":"run-p build:*","build:tsup":"tsup --dts --minify","changeset":"changeset","clean":"rimraf dist","dev":"bun run test:coverage --ui","lint":"run-p lint:*","lint:eslint":"eslint src --ext .ts","lint:eslint:fix":"bun run lint:eslint --fix","lint:format":"prettier --check \"src/**/*.ts\"","lint:format:fix":"bun run lint:format --write","lint:tsc":"tsc --project tsconfig.json --noEmit","test":"vitest --passWithNoTests","test:ci":"bun run test:coverage --run","test:coverage":"bun run test --coverage","prerelease":"run-p build test:ci","release":"changeset publish"},"trustedDependencies":["npm-run-all"],"eslintConfig":{"extends":["lukemorales/oss","lukemorales/jest"]},"prettier":"@lukemorales/prettier-config","devDependencies":{"@changesets/changelog-github":"^0.5.0","@changesets/cli":"^2.27.1","@lukemorales/prettier-config":"^1.1.0","@testing-library/react":"^14.2.2","@types/bun":"latest","@vitejs/plugin-react":"^4.2.1","@vitest/coverage-v8":"^1.4.0","@vitest/ui":"^1.4.0","eslint-config-lukemorales":"^0.4.1","jsdom":"^24.0.0","next":"^14.1.4","npm-run-all":"^4.1.5","prettier":"^3.2.5","tsup":"^8.0.2","typescript":"^4.8.2","vitest":"^1.4.0","zod":"^3.25.67"},"peerDependencies":{"next":">=13.0.0","typescript":">=4.8.2"},"peerDependenciesMeta":{"zod":{"optional":true}},"keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","standard-schema","zod","valibot","arktype","runtime validation","validation"],"dependencies":{"@standard-schema/spec":"^1.0.0"},"_id":"next-safe-navigation@0.4.0","gitHead":"8adf803fcd51a697f26eff3eeccb0a00a82891fd","homepage":"https://github.com/lukemorales/safe-next-navigation#readme","_nodeVersion":"20.19.3","_npmVersion":"10.8.2","dist":{"integrity":"sha512-ksQKW5u3Bp06qcWnZI+HMiluvRMJk7M8rdDThOffOBfKm7Cj/NsW3XQtJEU/wBCwdnNviKKovtiRx5fXhnH2+Q==","shasum":"26cbd171260ec9c94a3d8eb56452181aecf580d7","tarball":"https://registry.npmjs.org/next-safe-navigation/-/next-safe-navigation-0.4.0.tgz","fileCount":9,"unpackedSize":82587,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCe9y6S+74KesqOWSAE4e+uze92/XxFgAJB1mYmP9kJ+AIgT2YxgHZ1sClOC89kRSCXLdS4oNBDsS50PZFseu7X1mA="}]},"_npmUser":{"name":"lukemorales","email":"lukemorales@live.com","actor":{"name":"lukemorales","email":"lukemorales@live.com","type":"user"}},"directories":{},"maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/next-safe-navigation_0.4.0_1750781310869_0.5693460853170573"},"_hasShrinkwrap":false}},"time":{"created":"2024-02-01T20:56:45.146Z","modified":"2025-06-24T16:08:31.217Z","0.0.1":"2024-02-01T20:56:45.532Z","0.0.2":"2024-02-02T04:00:08.003Z","0.1.0":"2024-02-02T19:45:50.722Z","0.1.1":"2024-02-04T03:39:22.718Z","0.2.0":"2024-03-27T00:49:20.126Z","0.3.0":"2024-03-29T16:31:21.042Z","0.3.1":"2024-03-30T15:51:27.812Z","0.3.2":"2024-04-22T21:58:48.622Z","0.3.3":"2024-08-17T20:32:28.749Z","0.4.0":"2025-06-24T16:08:31.050Z"},"bugs":{"url":"https://github.com/lukemorales/safe-next-navigation/issues"},"author":{"name":"Luke Morales","email":"lukemorales@live.com"},"license":"MIT","homepage":"https://github.com/lukemorales/safe-next-navigation#readme","keywords":["next","nextjs","next.js","next-js","app router","app-router","vercel","typescript","type-safety","router","navigation","standard-schema","zod","valibot","arktype","runtime validation","validation"],"repository":{"type":"git","url":"git+https://github.com/lukemorales/safe-next-navigation.git"},"description":"Type-safe navigation for NextJS App router with Standard Schema support (Zod, Valibot, ArkType, etc.)","maintainers":[{"name":"lukemorales","email":"lukemorales@live.com"}],"readme":"<p align=\"center\">\n  <a href=\"https://github.com/lukemorales/next-safe-navigation\" target=\"\\_parent\"><img src=\"https://em-content.zobj.net/source/apple/354/goggles_1f97d.png\" alt=\"Goggles emoji\" height=\"130\"></a>\n</p>\n\n<h1 align=\"center\">Safe NextJS Navigation</h1>\n\n<p align=\"center\">\n  <a href=\"https://github.com/lukemorales/next-safe-navigation/actions/workflows/tests.yml\" target=\"\\_parent\"><img src=\"https://github.com/lukemorales/next-safe-navigation/actions/workflows/tests.yml/badge.svg?branch=main\" alt=\"Latest build\"></a>\n  <a href=\"https://codecov.io/gh/lukemorales/next-safe-navigation\"><img src=\"https://codecov.io/gh/lukemorales/next-safe-navigation/graph/badge.svg?token=35GW5EJMFK\"/></a>\n  <a href=\"https://www.npmjs.com/package/next-safe-navigation\" target=\"\\_parent\"><img src=\"https://badgen.net/npm/v/next-safe-navigation\" alt=\"Latest published version\"></a>\n  <a href=\"https://bundlephobia.com/package/next-safe-navigation@latest\" target=\"\\_parent\"><img src=\"https://badgen.net/bundlephobia/minzip/next-safe-navigation\" alt=\"Bundlephobia\"></a>\n  <a href=\"https://bundlephobia.com/package/next-safe-navigation@latest\" target=\"\\_parent\"><img src=\"https://badgen.net/bundlephobia/tree-shaking/next-safe-navigation\" alt=\"Tree shaking available\"></a>\n  <a href=\"https://github.com/lukemorales/next-safe-navigation\" target=\"\\_parent\"><img src=\"https://badgen.net/npm/types/next-safe-navigation\" alt=\"Types included\"></a>\n  <a href=\"https://www.npmjs.com/package/next-safe-navigation\" target=\"\\_parent\"><img src=\"https://badgen.net/npm/license/next-safe-navigation\" alt=\"License\"></a>\n  <a href=\"https://www.npmjs.com/package/next-safe-navigation\" target=\"\\_parent\"><img src=\"https://badgen.net/npm/dt/next-safe-navigation\" alt=\"Number of downloads\"></a>\n  <a href=\"https://github.com/lukemorales/next-safe-navigation\" target=\"\\_parent\"><img src=\"https://img.shields.io/github/stars/lukemorales/next-safe-navigation.svg?style=social&amp;label=Star\" alt=\"GitHub Stars\"></a>\n</p>\n\n<p align=\"center\">\n  <strong>Static type and runtime validation for navigating routes in <a href=\"https://nextjs.org\" target=\"\\_parent\">NextJS App Router</a> with Standard Schema support (Zod, Valibot, ArkType, etc.).</strong>\n</p>\n\n<p align=\"center\">\n  Static and runtime validation of routes, route params and query string parameters on client and server components.\n</p>\n\n## 📦 Install\n\nSafe NextJS Navigation is available as a package on NPM, install with your favorite package manager:\n\n```dircolors\nnpm install next-safe-navigation\n```\n\nYou'll also need to install a Standard Schema compatible validation library:\n\n```dircolors\n# Choose one:\nnpm install zod           # Zod (most popular)\nnpm install valibot       # Valibot (lightweight)\nnpm install arktype       # ArkType (fast)\n```\n\n## ⚡ Quick start\n\n> [!TIP]\n> Enable `experimental.typedRoutes` in `next.config.js` for a better and safer experience with autocomplete when defining your routes\n\n### Declare your application routes and parameters in a single place\n\n```ts\n// src/shared/navigation.ts\nimport { createNavigationConfig } from 'next-safe-navigation';\nimport { z } from 'zod';\n\nexport const { routes, useSafeParams, useSafeSearchParams } =\n  createNavigationConfig((defineRoute) => ({\n    home: defineRoute('/'),\n    customers: defineRoute('/customers', {\n      search: z\n        .object({\n          query: z.string().default(''),\n          page: z.coerce.number().default(1),\n        })\n        .default({ query: '', page: 1 }),\n    }),\n    invoice: defineRoute('/invoices/[invoiceId]', {\n      params: z.object({\n        invoiceId: z.string(),\n      }),\n    }),\n    shop: defineRoute('/support/[...tickets]', {\n      params: z.object({\n        tickets: z.array(z.string()),\n      }),\n    }),\n    shop: defineRoute('/shop/[[...slug]]', {\n      params: z.object({\n        // ⚠️ Remember to always set your optional catch-all segments\n        // as optional values, or add a default value to them\n        slug: z.array(z.string()).optional(),\n      }),\n    }),\n  }));\n```\n\n### Runtime validation for React Server Components (RSC)\n\n> [!IMPORTANT]\n> The output of a schema might not be the same as its input, since schemas can transform the values during parsing (e.g.: string to number coercion), especially when dealing with `URLSearchParams` where all values are strings and you might want to convert params to different types. For this reason, this package does not expose types to infer `params` or `searchParams` from your declared routes to be used in page props:\n>\n> ```ts\n> interface CustomersPageProps {\n>   // ❌ Do not declare your params | searchParam types\n>   searchParams?: ReturnType<typeof routes.customers.$parseSearchParams>;\n> }\n> ```\n>\n> Instead, it is strongly advised that you parse the params in your server components to have runtime validated and accurate type information for the values in your app.\n\n```ts\n// src/app/customers/page.tsx\nimport { routes } from \"@/shared/navigation\";\n\ninterface CustomersPageProps {\n  // ✅ Never assume the types of your params before validation\n  searchParams?: unknown\n}\n\nexport default async function CustomersPage({ searchParams }: CustomersPageProps) {\n  const { query, page } = routes.customers.$parseSearchParams(searchParams);\n\n  const customers = await fetchCustomers({ query, page });\n\n  return (\n    <main>\n      <input name=\"query\" type=\"search\" defaultValue={query} />\n\n      <Customers data={customers} />\n    </main>\n  )\n};\n\n/* --------------------------------- */\n\n// src/app/invoices/[invoiceId]/page.tsx\nimport { routes } from \"@/shared/navigation\";\n\ninterface InvoicePageProps {\n  // ✅ Never assume the types of your params before validation\n  params?: unknown\n}\n\nexport default async function InvoicePage({ params }: InvoicePageProps) {\n  const { invoiceId } = routes.invoice.$parseParams(params);\n\n  const invoice = await fetchInvoice(invoiceId);\n\n  return (\n    <main>\n      <Invoice data={customers} />\n    </main>\n  )\n};\n```\n\n### Runtime validation for Client Components\n\n```ts\n// src/app/customers/page.tsx\n'use client';\n\nimport { useSafeSearchParams } from \"@/shared/navigation\";\n\nexport default function CustomersPage() {\n  const { query, page } = useSafeSearchParams('customers');\n\n  const customers = useSuspenseQuery({\n    queryKey: ['customers', { query, page }],\n    queryFn: () => fetchCustomers({ query, page}),\n  });\n\n  return (\n    <main>\n      <input name=\"query\" type=\"search\" defaultValue={query} />\n\n      <Customers data={customers.data} />\n    </main>\n  )\n};\n\n/* --------------------------------- */\n\n// src/app/invoices/[invoiceId]/page.tsx\n'use client';\n\nimport { useSafeParams } from \"@/shared/navigation\";\n\nexport default function InvoicePage() {\n  const { invoiceId } = useSafeParams('invoice');\n\n  const invoice = useSuspenseQuery({\n    queryKey: ['invoices', { invoiceId }],\n    queryFn: () => fetchInvoice(invoiceId),\n  });\n\n  return (\n    <main>\n      <Invoice data={invoice.data} />\n    </main>\n  )\n};\n```\n\nUse throughout your codebase as the single source for navigating between routes:\n\n```ts\nimport { routes } from \"@/shared/navigation\";\n\nexport function Header() {\n  return (\n    <nav>\n      <Link href={routes.home()}>Home</Link>\n      <Link href={routes.customers()}>Customers</Link>\n    </nav>\n  )\n};\n\nexport function CustomerInvoices({ invoices }) {\n  return (\n    <ul>\n      {invoices.map(invoice => (\n        <li key={invoice.id}>\n          <Link href={routes.invoice({ invoiceId: invoice.id })}>\n            View invoice\n          </Link>\n        </li>\n      ))}\n    </ul>\n  )\n};\n```\n\n## 🔄 Standard Schema Support\n\nThis library now supports [Standard Schema](https://github.com/standard-schema/standard-schema), which means you can use any compatible validation library:\n\n### Using Zod\n\n```ts\n// src/shared/navigation.ts\nimport { createNavigationConfig } from 'next-safe-navigation';\nimport { z } from 'zod';\n\nexport const { routes, useSafeParams, useSafeSearchParams } =\n  createNavigationConfig((defineRoute) => ({\n    customers: defineRoute('/customers', {\n      search: z\n        .object({\n          query: z.string().default(''),\n          page: z.coerce.number().default(1),\n        })\n        .default({ query: '', page: 1 }),\n    }),\n    invoice: defineRoute('/invoices/[invoiceId]', {\n      params: z.object({\n        invoiceId: z.string(),\n      }),\n    }),\n  }));\n```\n\n### Using Valibot\n\n```ts\n// src/shared/navigation.ts\nimport { createNavigationConfig } from 'next-safe-navigation';\nimport * as v from 'valibot';\n\nexport const { routes, useSafeParams, useSafeSearchParams } =\n  createNavigationConfig((defineRoute) => ({\n    customers: defineRoute('/customers', {\n      search: v.objectWithRest(\n        {\n          query: v.optional(v.string(), ''),\n          page: v.optional(v.pipe(v.string(), v.transform(Number)), 1),\n        },\n        v.never(),\n      ),\n    }),\n    invoice: defineRoute('/invoices/[invoiceId]', {\n      params: v.object({\n        invoiceId: v.string(),\n      }),\n    }),\n  }));\n```\n\n### Using ArkType\n\n```ts\n// src/shared/navigation.ts\nimport { createNavigationConfig } from 'next-safe-navigation';\nimport { type } from 'arktype';\n\nexport const { routes, useSafeParams, useSafeSearchParams } =\n  createNavigationConfig((defineRoute) => ({\n    customers: defineRoute('/customers', {\n      search: type({\n        'query?': \"string = ''\",\n        'page?': 'string.numeric.parse = 1',\n      }),\n    }),\n    invoice: defineRoute('/invoices/[invoiceId]', {\n      params: type({\n        invoiceId: 'string',\n      }),\n    }),\n  }));\n```\n","readmeFilename":"README.md"}