{"_id":"@remix-run/fetch-router","_rev":"31-df63a5d9636489258a59b1a3bbf45790","name":"@remix-run/fetch-router","dist-tags":{"latest":"0.22.1"},"versions":{"0.1.0":{"name":"@remix-run/fetch-router","version":"0.1.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.1.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"2595149c957d263c2bcd1527cb15a13a313abeae","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.1.0.tgz","fileCount":29,"integrity":"sha512-xNXyyuPcoWOVoQ6VvdV/qG7xUjNWtiaOiPgrfrny+XNUTXnbW5KKzRZ+UHA5NJsS5CnjioG/9NzNbD51HvodJg==","signatures":[{"sig":"MEUCIQCSwpnwitAa/PiR0ezNB0WjYF86DU+Kkt6jwooy/qBpwgIgKGuKLwc1+R8LM0CfRm+4XujTxPLNqDDdxDsoM19QOyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144075},"type":"module","_from":"file:remix-run-fetch-router-0.1.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:esm","clean":"rm -rf dist","build:esm":"esbuild src/index.ts --bundle --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","typecheck":"tsc --noEmit","build:types":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/tmp/f13c6c88130c08457be40568ab5c2c73/remix-run-fetch-router-0.1.0.tgz","_integrity":"sha512-xNXyyuPcoWOVoQ6VvdV/qG7xUjNWtiaOiPgrfrny+XNUTXnbW5KKzRZ+UHA5NJsS5CnjioG/9NzNbD51HvodJg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.9.0","dependencies":{"@remix-run/route-pattern":"0.13.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.10","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.1.0_1759346449141_0.691328114358517","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@remix-run/fetch-router","version":"0.2.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.2.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"f894d4f94167b4d5c8f50a067a31cb34d949139e","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.2.0.tgz","fileCount":29,"integrity":"sha512-pO0KN37zzyQpzO06shp5LWMQxKxNo+4MkJoZLGZifIxyy7e9xH3KbZhaZqoxKIVUaHjWECya6VQETPCye4yjyA==","signatures":[{"sig":"MEYCIQDzd5NCBFza+ttS1dsebp+MlBRqqCEqA/MwB5u2OQxnLgIhAJyvNwJWr6C2IInu30heA4jZFUiD9ZOVcfG7EHoVObUM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150327},"type":"module","_from":"file:remix-run-fetch-router-0.2.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:esm","clean":"rm -rf dist","build:esm":"esbuild src/index.ts --bundle --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","typecheck":"tsc --noEmit","build:types":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/tmp/b80a30e6fb89e4b480d109d0e503d55e/remix-run-fetch-router-0.2.0.tgz","_integrity":"sha512-pO0KN37zzyQpzO06shp5LWMQxKxNo+4MkJoZLGZifIxyy7e9xH3KbZhaZqoxKIVUaHjWECya6VQETPCye4yjyA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.9.0","dependencies":{"@remix-run/route-pattern":"0.13.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.10","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.2.0_1759422669615_0.03241840249351302","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@remix-run/fetch-router","version":"0.3.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.3.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"83a2b637323f49621555b1d3413d956643ca4895","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.3.0.tgz","fileCount":32,"integrity":"sha512-9pv0rsPoXb+P2R3OSOo9amKzkWVGyVj2Pq+QOAouKeJS2owHkBBCkxPmvm2nF2brSPnTmGp/QyB5QIXJeGzWgg==","signatures":[{"sig":"MEUCIQClm2M4flm/sM0Svp2gQUCDbPflgzxOabe+zKhsOYm35QIgcwbzTsbnnR8vI7UiaZ+V4y2lJnDNr0HdVMsezFVzi5A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202576},"type":"module","_from":"file:remix-run-fetch-router-0.3.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:esm","clean":"rm -rf dist","build:esm":"esbuild src/index.ts --bundle --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","typecheck":"tsc --noEmit","build:types":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/tmp/bdb4888a8683e88fee849e2669c17b3c/remix-run-fetch-router-0.3.0.tgz","_integrity":"sha512-9pv0rsPoXb+P2R3OSOo9amKzkWVGyVj2Pq+QOAouKeJS2owHkBBCkxPmvm2nF2brSPnTmGp/QyB5QIXJeGzWgg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.9.0","dependencies":{"@remix-run/route-pattern":"0.13.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.10","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.3.0_1759466064275_0.997228392209697","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@remix-run/fetch-router","version":"0.4.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.4.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"feb14d6ee6bcc174fd4974c285993df296132247","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.4.0.tgz","fileCount":35,"integrity":"sha512-QZ88CrYTt6BaH3ih7OITg1q5SYp/UJuZwnEbW+2zZhpEG0N0dKZgXKwOR4xj74lUzp3Rf4LCu5UnQnwq6OEx/w==","signatures":[{"sig":"MEQCICyoS08tct65Xb+iVIIOVAIGtNRSHf/4SmxldY16K0GfAiBMT3DcokoP08Y9KGjmvtRcruV852TiHQ0oMPfyQZ+4JQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208844},"type":"module","_from":"file:remix-run-fetch-router-0.4.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:esm","clean":"rm -rf dist","build:esm":"esbuild src/index.ts --bundle --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","typecheck":"tsc --noEmit","build:types":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/tmp/a3ff12ce15314ebe616768c08fceb97b/remix-run-fetch-router-0.4.0.tgz","_integrity":"sha512-QZ88CrYTt6BaH3ih7OITg1q5SYp/UJuZwnEbW+2zZhpEG0N0dKZgXKwOR4xj74lUzp3Rf4LCu5UnQnwq6OEx/w==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.9.0","dependencies":{"@remix-run/route-pattern":"0.14.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.10","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.4.0_1759562533548_0.9681240558382489","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@remix-run/fetch-router","version":"0.5.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.5.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"1f70895fc3d510fcef1bdc3b50ab8f96e1b18276","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.5.0.tgz","fileCount":60,"integrity":"sha512-MG6W0pbEE4xnuh1+8ZAzvy6akrhp11uP4Kwp0dOcCMfcZnyzXi5Zr8WSSZrRxxG0copXYu/KRIz7rBpfzq2sHQ==","signatures":[{"sig":"MEQCIFIuuGEVSe77VSlcokd8aUgX5gbIjN3y1o5kgLxys0t4AiA1vcRRH2FZ+f2KMrA2nrxXVIGvHYUxTifhI3uYqkppjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":430099},"type":"module","_from":"file:remix-run-fetch-router-0.5.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./logger-middleware":{"types":"./dist/logger-middleware.d.ts","default":"./dist/logger-middleware.js"},"./form-data-middleware":{"types":"./dist/form-data-middleware.d.ts","default":"./dist/form-data-middleware.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:index && pnpm run build:form-data-middleware && pnpm run build:logger-middleware","clean":"rm -rf dist","typecheck":"tsc --noEmit","build:index":"esbuild src/index.ts --bundle --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","build:types":"tsc --project tsconfig.build.json","build:logger-middleware":"esbuild src/logger-middleware.ts --bundle --outfile=dist/logger-middleware.js --format=esm --platform=neutral --sourcemap","build:form-data-middleware":"esbuild src/form-data-middleware.ts --bundle --outfile=dist/form-data-middleware.js --format=esm --platform=neutral --sourcemap"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/tmp/f4819eaf14ec2e36ea4e34d53710a438/remix-run-fetch-router-0.5.0.tgz","_integrity":"sha512-MG6W0pbEE4xnuh1+8ZAzvy6akrhp11uP4Kwp0dOcCMfcZnyzXi5Zr8WSSZrRxxG0copXYu/KRIz7rBpfzq2sHQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.9.0","dependencies":{"@remix-run/route-pattern":"0.14.0","@remix-run/form-data-parser":"0.11.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.10","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.5.0_1759645668418_0.671724419681136","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@remix-run/fetch-router","version":"0.6.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.6.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"17f74f445f9ca2987caf12683d98e8041faa7f9b","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.6.0.tgz","fileCount":52,"integrity":"sha512-N5AMK2XxTFO3d8AMRWphFoRos4NjvfZpQeZW859Ade+FgP1yYRZhEYep2T3FVPBUJWPqrG7c9lIxVLcVcZUBSQ==","signatures":[{"sig":"MEYCIQDKPDYvaB/4vLQ6MuuLCTxGhOOW89x7RT+NeT/GTC05UAIhAJxsJtRZ9yeVlBqSfgbkfCTRhEtYHUy9weqA/9pJ7LSf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438509},"type":"module","_from":"file:remix-run-fetch-router-0.6.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./logger-middleware":{"types":"./dist/logger-middleware.d.ts","default":"./dist/logger-middleware.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:index && pnpm run build:logger-middleware","clean":"rm -rf dist","typecheck":"tsc --noEmit","build:index":"esbuild src/index.ts --bundle --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","build:types":"tsc --project tsconfig.build.json","build:logger-middleware":"esbuild src/logger-middleware.ts --bundle --outfile=dist/logger-middleware.js --format=esm --platform=neutral --sourcemap"},"_npmUser":{"name":"mjackson","email":"mjijackson+npm@gmail.com"},"_resolved":"/tmp/2891f0a93b0f5252572e3b7a12c58c62/remix-run-fetch-router-0.6.0.tgz","_integrity":"sha512-N5AMK2XxTFO3d8AMRWphFoRos4NjvfZpQeZW859Ade+FgP1yYRZhEYep2T3FVPBUJWPqrG7c9lIxVLcVcZUBSQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.9.0","dependencies":{"@remix-run/route-pattern":"0.14.0","@remix-run/form-data-parser":"0.11.0"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.25.10","@types/node":"^24.6.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.6.0_1760067997015_0.12108343840177449","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@remix-run/fetch-router","version":"0.7.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.7.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"71a921e2176467c1015a03d13c9d187ab5822fe7","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.7.0.tgz","fileCount":66,"integrity":"sha512-hcsosvDrhewWmuTceWcA4850T7tADp87mhYZlyDmTZZG+PdrqOnDnGhWrxRbAOfAK5CW/hS/FYJrt9/uNdmASg==","signatures":[{"sig":"MEUCIQDtom0g5mWFrxVTTZKWqiSTfGBfAzn0Cth2AaWMEIM6ZQIgcGjGPXJUQbX6IHPtWEm2NeK9w6eX22Ds0uk8z5UbPpU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":195983},"type":"module","_from":"file:remix-run-fetch-router-0.7.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./response-helpers":{"types":"./dist/response-helpers.d.ts","default":"./dist/response-helpers.js"},"./logger-middleware":{"types":"./dist/logger-middleware.d.ts","default":"./dist/logger-middleware.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:index && pnpm run build:logger-middleware && pnpm run build:response-helpers","clean":"rm -rf dist","typecheck":"tsc --noEmit","build:index":"esbuild src/index.ts --bundle --external:@remix-run/form-data-parser --external:@remix-run/headers --external:@remix-run/route-pattern --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","build:types":"tsc --project tsconfig.build.json","build:response-helpers":"esbuild src/response-helpers.ts --bundle --outfile=dist/response-helpers.js --format=esm --platform=neutral --sourcemap","build:logger-middleware":"esbuild src/logger-middleware.ts --bundle --outfile=dist/logger-middleware.js --format=esm --platform=neutral --sourcemap"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/f00be72e7624b5f2a07269aff2a7a53b/remix-run-fetch-router-0.7.0.tgz","_integrity":"sha512-hcsosvDrhewWmuTceWcA4850T7tADp87mhYZlyDmTZZG+PdrqOnDnGhWrxRbAOfAK5CW/hS/FYJrt9/uNdmASg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.1","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","esbuild":"^0.25.10","@types/node":"^24.6.0"},"peerDependencies":{"@remix-run/headers":"0.14.0","@remix-run/html-template":"0.2.0","@remix-run/route-pattern":"0.14.0","@remix-run/form-data-parser":"0.12.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.7.0_1761890540764_0.45612687548246367","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@remix-run/fetch-router","version":"0.8.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.8.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"b497f4e793152717a72ebeee4b8279f64ebc8c23","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.8.0.tgz","fileCount":82,"integrity":"sha512-ugvauNoGxZBGw5F+3IcohAbrZ6dMM8VdWVgi12UVeHg2843IjkKtGv2dHCkHPMZvydJZQlYWDGd/NRxDSChG3w==","signatures":[{"sig":"MEQCIFR5HZBzqA2X6Tixf0PY3wGjD2vpRpBWdnQymL1kHKGpAiB/KW2OV9f6qmyuvhrxagerAu00romc8kx9G9LxnG3qpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":400134},"type":"module","_from":"file:remix-run-fetch-router-0.8.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./response-helpers":{"types":"./dist/response-helpers.d.ts","default":"./dist/response-helpers.js"},"./logger-middleware":{"types":"./dist/logger-middleware.d.ts","default":"./dist/logger-middleware.js"},"./form-data-middleware":{"types":"./dist/form-data-middleware.d.ts","default":"./dist/form-data-middleware.js"},"./method-override-middleware":{"types":"./dist/method-override-middleware.d.ts","default":"./dist/method-override-middleware.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"pnpm run clean && pnpm run build:types && pnpm run build:index && pnpm run build:form-data-middleware && pnpm run build:logger-middleware && pnpm run build:method-override-middleware && pnpm run build:response-helpers","clean":"rm -rf dist","typecheck":"tsc --noEmit","build:index":"esbuild src/index.ts --bundle --external:@remix-run/form-data-parser --external:@remix-run/headers --external:@remix-run/route-pattern --outfile=dist/index.js --format=esm --platform=neutral --sourcemap","build:types":"tsc --project tsconfig.build.json","build:response-helpers":"esbuild src/response-helpers.ts --bundle --outfile=dist/response-helpers.js --format=esm --platform=neutral --sourcemap","build:logger-middleware":"esbuild src/logger-middleware.ts --bundle --outfile=dist/logger-middleware.js --format=esm --platform=neutral --sourcemap","build:form-data-middleware":"esbuild src/form-data-middleware.ts --bundle --outfile=dist/form-data-middleware.js --format=esm --platform=neutral --sourcemap","build:method-override-middleware":"esbuild src/method-override-middleware.ts --bundle --outfile=dist/method-override-middleware.js --format=esm --platform=neutral --sourcemap"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/934bec4eaf5f8ed3e9ffcfb6d073e519/remix-run-fetch-router-0.8.0.tgz","_integrity":"sha512-ugvauNoGxZBGw5F+3IcohAbrZ6dMM8VdWVgi12UVeHg2843IjkKtGv2dHCkHPMZvydJZQlYWDGd/NRxDSChG3w==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.1","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","esbuild":"^0.25.10","@types/node":"^24.6.0"},"peerDependencies":{"@remix-run/headers":"0.14.0","@remix-run/html-template":"0.2.0","@remix-run/route-pattern":"0.14.0","@remix-run/form-data-parser":"0.12.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.8.0_1762151297635_0.6358506429598405","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@remix-run/fetch-router","version":"0.9.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.9.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"4d3a652bf5686d5cc0dc7b3d8051f163620a8463","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.9.0.tgz","fileCount":123,"integrity":"sha512-getkVhWaxzgma12yg5dY4Ad61mjDeD5Xxb580UY7pcxgwHFeINiHPiR6ACEzwuyTHSbcqqaWy7rmVq4NrfaEvg==","signatures":[{"sig":"MEUCIBQXkM2IBjBg/dB0ee4uUtI7bREjRCkg0UNk+noI8glaAiEApSCFDZQr41WGIL5tR7Zf42Ac5AzY3jel3n00DRWlR9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":186126},"type":"module","_from":"file:remix-run-fetch-router-0.9.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./response-helpers":{"types":"./dist/response-helpers.d.ts","default":"./dist/response-helpers.js"},"./logger-middleware":{"types":"./dist/logger-middleware.d.ts","default":"./dist/logger-middleware.js"},"./static-middleware":{"types":"./dist/static-middleware.d.ts","default":"./dist/static-middleware.js"},"./session-middleware":{"types":"./dist/session-middleware.d.ts","default":"./dist/session-middleware.js"},"./form-data-middleware":{"types":"./dist/form-data-middleware.d.ts","default":"./dist/form-data-middleware.js"},"./async-context-middleware":{"types":"./dist/async-context-middleware.d.ts","default":"./dist/async-context-middleware.js"},"./method-override-middleware":{"types":"./dist/method-override-middleware.d.ts","default":"./dist/method-override-middleware.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/29c103671888785e84cb43c9ed4787f3/remix-run-fetch-router-0.9.0.tgz","_integrity":"sha512-getkVhWaxzgma12yg5dY4Ad61mjDeD5Xxb580UY7pcxgwHFeINiHPiR6ACEzwuyTHSbcqqaWy7rmVq4NrfaEvg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.6.0","@remix-run/cookie":"0.4.0","@remix-run/session":"0.2.0"},"peerDependencies":{"@remix-run/cookie":"^0.4.0","@remix-run/headers":"^0.17.0","@remix-run/session":"^0.2.0","@remix-run/lazy-file":"^3.8.0","@remix-run/html-template":"^0.3.0","@remix-run/route-pattern":"^0.15.0","@remix-run/form-data-parser":"^0.14.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.9.0_1763428882677_0.2666440119924134","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@remix-run/fetch-router","version":"0.10.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.10.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"88a8718898dc56729bbd7a5d7f3c9e3d5e990346","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.10.0.tgz","fileCount":75,"integrity":"sha512-rMm9VdYf7D6MF0ClYGATGE6M5jhZzrBNGJYBzVPorNmMw7eARTPf98WCSwPLY4ZVz722xVD+7yTaGLZDFYYWTw==","signatures":[{"sig":"MEUCIQDaanfRDwOTZ+n4R7OPpOykuXwL4FzElAAkXsjffNBWWAIgCDRdcpBAq8UNz1aRrcR834CQ9DIJ3NxKQEc9ohgzwZw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":159706},"type":"module","_from":"file:remix-run-fetch-router-0.10.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./response-helpers":{"types":"./dist/response-helpers.d.ts","default":"./dist/response-helpers.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/4ba358ca6af8458e7aafa50b5a55b16d/remix-run-fetch-router-0.10.0.tgz","_integrity":"sha512-rMm9VdYf7D6MF0ClYGATGE6M5jhZzrBNGJYBzVPorNmMw7eARTPf98WCSwPLY4ZVz722xVD+7yTaGLZDFYYWTw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.6.0","@remix-run/session":"0.2.1"},"peerDependencies":{"@remix-run/headers":"^0.17.0","@remix-run/session":"^0.2.1","@remix-run/lazy-file":"^3.8.0","@remix-run/html-template":"^0.3.0","@remix-run/route-pattern":"^0.15.3"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.10.0_1763582823181_0.1524548232884202","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@remix-run/fetch-router","version":"0.11.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.11.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"acca7d7d026adffbc576e21f80e09add3d87feaf","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.11.0.tgz","fileCount":75,"integrity":"sha512-N2VX8MvAM0O/3rj74+QBwd6ASS49NNdBfUIQVAMeCXvJkvKgxDZfg//YR3iA9tTI0KYPB5oLA2xmd1e59qGhFw==","signatures":[{"sig":"MEYCIQDNL3F9GFM24h/MNpsdGb3ft8dh2XLySt7V7JAN8jWCAAIhAJ5rOTU+G2Pc8b4yVsu883b2xiT3k4C5ZQHdegq1i3of","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":160316},"type":"module","_from":"file:remix-run-fetch-router-0.11.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json","./response-helpers":{"types":"./dist/response-helpers.d.ts","default":"./dist/response-helpers.js"}},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/dd089f315f421c255d4b9b2f312750e7/remix-run-fetch-router-0.11.0.tgz","_integrity":"sha512-N2VX8MvAM0O/3rj74+QBwd6ASS49NNdBfUIQVAMeCXvJkvKgxDZfg//YR3iA9tTI0KYPB5oLA2xmd1e59qGhFw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.6.0","@remix-run/session":"0.2.1"},"peerDependencies":{"@remix-run/headers":"^0.17.1","@remix-run/session":"^0.2.1","@remix-run/lazy-file":"^4.0.0","@remix-run/html-template":"^0.3.0","@remix-run/route-pattern":"^0.15.3"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.11.0_1763768921727_0.9764229097083514","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@remix-run/fetch-router","version":"0.12.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.12.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"45df214d76e53b641caa3e219fded52cd4fce930","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.12.0.tgz","fileCount":59,"integrity":"sha512-BDG/VepZg2ZJ7wav3HDrB9ZJLpzZONHi9ItOkFMcKsrbm5g7jjrxW5Vdijbbebz12pbJQu6VKTwLVXp/LgFusA==","signatures":[{"sig":"MEQCIDdAntrwsJvKZqvxSxWlWhQQXtNrw/n5ZNBWuGo3z4ShAiAtTQd6eCWsa6cJLJCoWeMtaZEAwf+nqkkk0q3idBEYcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129921},"type":"module","_from":"file:remix-run-fetch-router-0.12.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/20fb9dbbb9df38c5c02e9c8d2d75b438/remix-run-fetch-router-0.12.0.tgz","_integrity":"sha512-BDG/VepZg2ZJ7wav3HDrB9ZJLpzZONHi9ItOkFMcKsrbm5g7jjrxW5Vdijbbebz12pbJQu6VKTwLVXp/LgFusA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.6.0","@remix-run/session":"0.4.0"},"peerDependencies":{"@remix-run/headers":"^0.17.2","@remix-run/session":"^0.4.0","@remix-run/route-pattern":"^0.15.3"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.12.0_1764045254595_0.42734302277996883","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@remix-run/fetch-router","version":"0.13.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.13.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"ad602a31ee2ee1d664f51dac1acd5ae9892b84e7","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.13.0.tgz","fileCount":63,"integrity":"sha512-qiAVGklpElB0w8GI4lTF0VthzD1FbO7jeMHamhm1f1yQNVz+t7DPdgPZFDRedT8bKUDb4v67wUBii76cCeEmrQ==","signatures":[{"sig":"MEUCIQDIXSN/mmWSUrBF8u5uatXUUTPpFI449uz3sYG/oMCNEgIgDu5kHt0XhQzGotdXmJQTCNHn9JpmV9crW0Mm+NoMCvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":145155},"type":"module","_from":"file:remix-run-fetch-router-0.13.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test './src/**/*.test.ts'","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/6bdd819f814259e8dd9140cc6e226f27/remix-run-fetch-router-0.13.0.tgz","_integrity":"sha512-qiAVGklpElB0w8GI4lTF0VthzD1FbO7jeMHamhm1f1yQNVz+t7DPdgPZFDRedT8bKUDb4v67wUBii76cCeEmrQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^24.6.0","@remix-run/session":"0.4.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"peerDependencies":{"@remix-run/headers":"^0.18.0","@remix-run/session":"^0.4.0","@remix-run/route-pattern":"^0.15.3"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.13.0_1764616000873_0.45338621459936856","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@remix-run/fetch-router","version":"0.14.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.14.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"535371ad2a3f60c21d6e0e200caec59b5fb13460","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.14.0.tgz","fileCount":59,"integrity":"sha512-NAujUz27JtkAdzPHG0vX85tS3HS5Gpw0NqxpGYgrQ7Jt9ua+BYZdFcPbMduioLcs7e/1jsmNVpr4zmMQtK9d7g==","signatures":[{"sig":"MEUCIQDku5+IBPE+/EEkoV/k5yL3l3RbLOgAt+Mn3G2efNvEhwIgLkZpF+V+0ew4Oo3ypN55X57VNpKgHHO6Ay5PZVawBtQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":145926},"type":"module","_from":"file:remix-run-fetch-router-0.14.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/b3236225a41ed6464b86789fdf73cca3/remix-run-fetch-router-0.14.0.tgz","_integrity":"sha512-NAujUz27JtkAdzPHG0vX85tS3HS5Gpw0NqxpGYgrQ7Jt9ua+BYZdFcPbMduioLcs7e/1jsmNVpr4zmMQtK9d7g==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/session":"0.4.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"peerDependencies":{"@remix-run/headers":"^0.18.0","@remix-run/session":"^0.4.1","@remix-run/route-pattern":"^0.16.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.14.0_1766081253734_0.8026476355086354","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@remix-run/fetch-router","version":"0.15.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.15.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"65929099a07c3a31f6ac1e2fa070b3f2e09667aa","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.15.0.tgz","fileCount":59,"integrity":"sha512-vkN0qqGlROCrr7YBLRMVsWCc5ePTbeCaO2C81QxFAr+MbpAwiV/j9slIM6aKBHaBxRFB8wbI3RhAtPIOHeeNMg==","signatures":[{"sig":"MEUCIQCxG0Sut2/HHcGDwsR/W5OQShLpotHb+6PYbrTq8PcX8gIgK9VQUrqswIgw29pjB6/ZWslwhVQXu0yI7jJ6q+xx79Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146070},"type":"module","_from":"file:remix-run-fetch-router-0.15.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/4c437001dc2a57df33a8f155f4b25e91/remix-run-fetch-router-0.15.0.tgz","_integrity":"sha512-vkN0qqGlROCrr7YBLRMVsWCc5ePTbeCaO2C81QxFAr+MbpAwiV/j9slIM6aKBHaBxRFB8wbI3RhAtPIOHeeNMg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/session":"0.4.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"peerDependencies":{"@remix-run/session":"^0.4.1","@remix-run/route-pattern":"^0.17.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.15.0_1768948093282_0.12348323960453778","host":"s3://npm-registry-packages-npm-production"}},"0.15.1":{"name":"@remix-run/fetch-router","version":"0.15.1","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.15.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"f3122c49320c3a682e247415ca49f6edeed7a616","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.15.1.tgz","fileCount":59,"integrity":"sha512-HYJGY7AkJuXPNmVJO4jCgSr48tYiNSjVeuTZ1pzYGaJW/z1Q4IWesXVMkWQiY52u60aeImJho3gzS6yaLGkiMQ==","signatures":[{"sig":"MEYCIQCTnkRWSsPMLGDfTwUP7LzDYue8co0sWTmOCFiObHu5TwIhANdiEIBQ1OqsTYBG+Y6/iiErtbvv0JsOsHSULSLZAOBW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.15.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146066},"type":"module","_from":"file:remix-run-fetch-router-0.15.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/fe52909659d53914d8c2baff2c0c6e4e/remix-run-fetch-router-0.15.1.tgz","_integrity":"sha512-HYJGY7AkJuXPNmVJO4jCgSr48tYiNSjVeuTZ1pzYGaJW/z1Q4IWesXVMkWQiY52u60aeImJho3gzS6yaLGkiMQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/route-pattern":"^0.17.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/session":"0.4.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.15.1_1769471886642_0.035974959525350014","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@remix-run/fetch-router","version":"0.16.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.16.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"},{"name":"ryanflorence","email":"rpflorence@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"615f6f3ab779af992c838923b76d192a0a4fbc12","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.16.0.tgz","fileCount":59,"integrity":"sha512-7X4sBkL3/64X0GJdOwP5f+sW8GrcAG1vBAX55Ysimafj/JaP4ibNgYQVZBg5ebG9cuumO3Gqzo4FCUUJp9uP3g==","signatures":[{"sig":"MEUCIQDbdfQOKXWJQJ/4prr0Sr8P2+hSVu/HckpJ2ZYbOFrmMwIgPSD02ngWvF6u0QR5uAq/HC0sIdvcrpPeYJuw90cAZx4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":145737},"type":"module","_from":"file:remix-run-fetch-router-0.16.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/d63862447971948f493231c7852e8939/remix-run-fetch-router-0.16.0.tgz","_integrity":"sha512-7X4sBkL3/64X0GJdOwP5f+sW8GrcAG1vBAX55Ysimafj/JaP4ibNgYQVZBg5ebG9cuumO3Gqzo4FCUUJp9uP3g==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.6.2","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.13.0","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/route-pattern":"^0.18.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/session":"0.4.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.16.0_1769566393139_0.37581487198164076","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@remix-run/fetch-router","version":"0.17.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.17.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"73d949a1d993c9d59d6eb849e0e08de77897dce9","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.17.0.tgz","fileCount":63,"integrity":"sha512-3FeJGrTqrKKCvZdQWijbCXTEHKcdttkLFbI2ogfpZ+iDYSNZ9036wgDXuuoZqg6d+D0E8Unhk5ZwrLKDCd/hOw==","signatures":[{"sig":"MEQCICCCNAhTb6bLFo0XjmKu73pfbho5kKwPOgVa/K1JyGKkAiBBhtOA2f4bgWhnc0mrib/0nqZ/03/mdaqU9DBPbRML1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":147516},"type":"module","_from":"file:remix-run-fetch-router-0.17.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"node --disable-warning=ExperimentalWarning --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/a75ece1183b8324bbefb4dfb2582f62b/remix-run-fetch-router-0.17.0.tgz","_integrity":"sha512-3FeJGrTqrKKCvZdQWijbCXTEHKcdttkLFbI2ogfpZ+iDYSNZ9036wgDXuuoZqg6d+D0E8Unhk5ZwrLKDCd/hOw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.10.1","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"25.7.0","dependencies":{"@remix-run/session":"^0.4.1","@remix-run/route-pattern":"^0.19.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/session":"0.4.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.17.0_1772239286040_0.4150174887063458","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@remix-run/fetch-router","version":"0.18.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.18.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"4768c50fdc71ffdaa5cc0dea16cde8aa21da8594","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.18.0.tgz","fileCount":59,"integrity":"sha512-9Z4JgLH9/jD8jiVvAY9LZR+VoZxPJOQ7pENTBJoSo91PZOkPXfCxQWhPhAwYCP8z+/0FV4ZWSg1DmPPoU2f0UQ==","signatures":[{"sig":"MEUCIGfVwOPERcLhfxBPPpUc2rgTNacSwu3nUgfZKQla5AzLAiEAkZy6wuiTT5gB3o8mIYuvyR+PSeezkyRNdO/icm5Qg+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":176687},"type":"module","_from":"file:remix-run-fetch-router-0.18.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"node --test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/574f88063ab6b96b3e5441d846bb9918/remix-run-fetch-router-0.18.0.tgz","_integrity":"sha512-9Z4JgLH9/jD8jiVvAY9LZR+VoZxPJOQ7pENTBJoSo91PZOkPXfCxQWhPhAwYCP8z+/0FV4ZWSg1DmPPoU2f0UQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.9.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"@remix-run/route-pattern":"^0.20.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/data-schema":"^0.2.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.18.0_1774479826012_0.6514724113293453","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"@remix-run/fetch-router","version":"0.18.1","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.18.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"6cdaa7aec10a5e80157931e32f6614e4590c73bc","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.18.1.tgz","fileCount":59,"integrity":"sha512-pmVNDkgmEYJ+Ugw6PuThcOzesG3ksnlY4gIm8w4fxWf+vqyWrBtjezINiMGEiJNml+tayktngrHPeLY3jYaLDw==","signatures":[{"sig":"MEQCIGDVYcYb0x74RTyVyGEocDDoDWSIbggIRHUgoC1/MargAiBGJNfXooxtStoV6n+8hmJl1n8lu5bETSJyvxofbZ4DNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.18.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":176752},"type":"module","_from":"file:remix-run-fetch-router-0.18.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/4521d8dd49bd54152433f312d31eb260/remix-run-fetch-router-0.18.1.tgz","_integrity":"sha512-pmVNDkgmEYJ+Ugw6PuThcOzesG3ksnlY4gIm8w4fxWf+vqyWrBtjezINiMGEiJNml+tayktngrHPeLY3jYaLDw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.12.1","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@remix-run/route-pattern":"^0.20.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.1.0","@remix-run/assert":"0.1.0","@remix-run/data-schema":"^0.2.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.18.1_1776904643707_0.8155435939797628","host":"s3://npm-registry-packages-npm-production"}},"0.18.2":{"name":"@remix-run/fetch-router","version":"0.18.2","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.18.2","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"51a4a9b430aa77ce2c3d3b6936aacea5e34e8223","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.18.2.tgz","fileCount":59,"integrity":"sha512-/yZkz81ZwzWcZR9od+PIOfwavsreC62TmRdSYESznThYYhVezLkvvRLvNh0v8hAaSOIzNkoLN/wc037m67mm4Q==","signatures":[{"sig":"MEQCIE88x31MYr5cZAfV763dFiy4qYZGOjZv2b7jb0T7aqKhAiAuf6pLZp0YyTVdc4paDu+4jczH25y9KqFmczROuULceA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.18.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":177447},"type":"module","_from":"file:remix-run-fetch-router-0.18.2.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/3d9651c3e5d745bfc18b4ca0d227ca09/remix-run-fetch-router-0.18.2.tgz","_integrity":"sha512-/yZkz81ZwzWcZR9od+PIOfwavsreC62TmRdSYESznThYYhVezLkvvRLvNh0v8hAaSOIzNkoLN/wc037m67mm4Q==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.11.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@remix-run/route-pattern":"^0.20.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.3.0","@remix-run/assert":"0.2.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.18.2_1777576280529_0.19628853544031455","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@remix-run/fetch-router","version":"0.19.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.19.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"b07e11ae3a22e2d48d518220dfa9cfc679b42fc1","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.19.0.tgz","fileCount":63,"integrity":"sha512-knY84TmNppFF5Jq687D80fz1cNiuD9Yu6K31t3rf/Oe/Cdh0ex+oznTXxJi3CIVU2Wy4frCbiSljSsaYAhdiMw==","signatures":[{"sig":"MEYCIQDOAiEt5UCIrDUtUYKv6zC08zALU79eYz9woRIaQ156BAIhAMH1jNUgcH0dwz2oSos6f+Y2mSboezXbJAZFLjKYKasq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":185656},"type":"module","_from":"file:remix-run-fetch-router-0.19.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/207b40ab434c39e74b4f47b355bbec11/remix-run-fetch-router-0.19.0.tgz","_integrity":"sha512-knY84TmNppFF5Jq687D80fz1cNiuD9Yu6K31t3rf/Oe/Cdh0ex+oznTXxJi3CIVU2Wy4frCbiSljSsaYAhdiMw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.12.1","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@remix-run/route-pattern":"^0.21.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.4.0","@remix-run/assert":"0.2.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.19.0_1779247287030_0.27584290527121924","host":"s3://npm-registry-packages-npm-production"}},"0.19.1":{"name":"@remix-run/fetch-router","version":"0.19.1","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.19.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"95e622e324f613638b1bd6bdd33e90ec1b34c6a2","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.19.1.tgz","fileCount":63,"integrity":"sha512-MsU7WidGOdorGJzEBgtqCFDto1AafCZou5n5jzA47Sjc9UB8y1FcAiUOZq6Kp6B9C4ghtDv4p1yEWyhka1Th3w==","signatures":[{"sig":"MEUCIC5Zag4n/cvEKCS2o/F723PsIl9ZHf39eMqrj4kPTooxAiEAuGhrDU0WQpV0HGqa2Jj0F7bBmLXEdDWylARl3UnxEtA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.19.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":185656},"type":"module","_from":"file:remix-run-fetch-router-0.19.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/76c0ce5b9228fdde18cb695b7ae0fcc5/remix-run-fetch-router-0.19.1.tgz","_integrity":"sha512-MsU7WidGOdorGJzEBgtqCFDto1AafCZou5n5jzA47Sjc9UB8y1FcAiUOZq6Kp6B9C4ghtDv4p1yEWyhka1Th3w==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.12.1","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@remix-run/route-pattern":"^0.21.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.4.1","@remix-run/assert":"0.2.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.19.1_1779308240206_0.30195484937619343","host":"s3://npm-registry-packages-npm-production"}},"0.19.2":{"name":"@remix-run/fetch-router","version":"0.19.2","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.19.2","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"3c74b96214aebfbb17b66ab17765c30c8b06dcdf","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.19.2.tgz","fileCount":63,"integrity":"sha512-jlMuXQTNYC4CTyzYBCxTBrLDo8f/tBPJn/PG+c0+EDBMGhylMTe95hDvZmnWdC7J1RN/sDL8rpKoX5TQLPEVGQ==","signatures":[{"sig":"MEUCIAfTffwk1LKP6U0F5kxoNzuqew5RO1NiqT5nNWWrIS8KAiEA0EoI+92iQRUOvNn3Eb33cfr4lMzP0m+9b4+o7G/umi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.19.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":185656},"type":"module","_from":"file:remix-run-fetch-router-0.19.2.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/24d0284cd343523f99dd6fbf225c8c9e/remix-run-fetch-router-0.19.2.tgz","_integrity":"sha512-jlMuXQTNYC4CTyzYBCxTBrLDo8f/tBPJn/PG+c0+EDBMGhylMTe95hDvZmnWdC7J1RN/sDL8rpKoX5TQLPEVGQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.13.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@remix-run/route-pattern":"^0.22.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.4.2","@remix-run/assert":"0.2.1","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.19.2_1780078599012_0.979801604366082","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@remix-run/fetch-router","version":"0.20.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.20.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"243e0ef7e3ee608eab18491346c56becdb3a6887","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.20.0.tgz","fileCount":63,"integrity":"sha512-iNjDAesu37Yf8nApAkKgKjmZBavC+AuzWK9EUmiwo+OnH7nn8ag5whyVFR4kb0LJN5CeXciFEIjX+oHG5cNeyw==","signatures":[{"sig":"MEYCIQDj9BB+6soTa/1DwjPOdTDMe/ISnK+k9o2BbLYyKlUfFwIhAPiCyowue5hgps1Eza2Y0nogAk14Fl2hz42ydcC1mOMm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":198964},"type":"module","_from":"file:remix-run-fetch-router-0.20.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/7197077892c458fb38099b6d53e21783/remix-run-fetch-router-0.20.0.tgz","_integrity":"sha512-iNjDAesu37Yf8nApAkKgKjmZBavC+AuzWK9EUmiwo+OnH7nn8ag5whyVFR4kb0LJN5CeXciFEIjX+oHG5cNeyw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.13.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.16.0","dependencies":{"@remix-run/route-pattern":"^0.22.1"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.5.0","@remix-run/assert":"0.3.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.20.0_1780683920215_0.37365259904753234","host":"s3://npm-registry-packages-npm-production"}},"0.20.1":{"name":"@remix-run/fetch-router","version":"0.20.1","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.20.1","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"9c0499440e9a358634659b3085fbd3eee16d8df9","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.20.1.tgz","fileCount":63,"integrity":"sha512-vxlIu4LHY5KyqOdlXFjJeUefUJxgc7499/cSsBl2bzhQnU5DayPHN/dklBOiG+U7GIYQMmObAinmubkwzaXyuw==","signatures":[{"sig":"MEUCIGI6aeLLxGIWvm03P8C3nTZbGy+sPwBeq+6MhyG2aSgCAiEAlaQD8o/QjQ254KLNzkmvOQtK817sC++tW/HGClzxNRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.20.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":198964},"type":"module","_from":"file:remix-run-fetch-router-0.20.1.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix-test","build":"tsgo -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix-test","typecheck":"tsgo --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/050773be2719ba8d97170960eb123a5d/remix-run-fetch-router-0.20.1.tgz","_integrity":"sha512-vxlIu4LHY5KyqOdlXFjJeUefUJxgc7499/cSsBl2bzhQnU5DayPHN/dklBOiG+U7GIYQMmObAinmubkwzaXyuw==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.13.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.17.0","dependencies":{"@remix-run/route-pattern":"^0.23.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.6.0","@remix-run/test":"0.5.0","@remix-run/assert":"0.3.0","@typescript/native-preview":"7.0.0-dev.20251125.1"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.20.1_1782932522656_0.4020327207015826","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@remix-run/fetch-router","version":"0.21.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.21.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"c7b54f0b472ca0816d652e14880c2df40726de8e","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.21.0.tgz","fileCount":63,"integrity":"sha512-dN3Lsd4dHAV0USTF3Dm04effXcdr7GMgXiqeozTFDfvVIx2DbRAl94bwF6UdAWurgTOK2Oyz4cs9uadW/ylWXA==","signatures":[{"sig":"MEYCIQDOEGwSppOXFnxiulqhN/99p3P7Sd8v67mBjcfSHhu5nAIhAMUWEEepxRCRguBYoK5WUJu50HCNEshgtFw0YqJ92s05","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":199607},"type":"module","_from":"file:remix-run-fetch-router-0.21.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/71fd1b249d4386885fd6554dd911c2fc/remix-run-fetch-router-0.21.0.tgz","_integrity":"sha512-dN3Lsd4dHAV0USTF3Dm04effXcdr7GMgXiqeozTFDfvVIx2DbRAl94bwF6UdAWurgTOK2Oyz4cs9uadW/ylWXA==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.16.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@remix-run/route-pattern":"^0.24.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.0","@remix-run/assert":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.21.0_1786666397861_0.1940719248547209","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@remix-run/fetch-router","version":"0.22.0","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","_id":"@remix-run/fetch-router@0.22.0","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"486378047f2ee57cdb9abd009bd9398c77d8a9f8","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.22.0.tgz","fileCount":63,"integrity":"sha512-ErxqVZWUYTYPd6L/NbOe12BeRd8ulik7gCZnQxChEDlnko3chcTLqTsXc//h8IAqOY2x8NSOlo+ZQdFzfhCrpg==","signatures":[{"sig":"MEUCIHw93QK30FoLiP/ZzsAis8EF78q+3ZkY0hUZnAbAYA+rAiEAx+8g9ZHwiJzR+6pbai70GbkHTUtkq0MDFSVHvZmaR7k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":205492},"type":"module","_from":"file:/tmp/remix-publish-fetch-router-1i6UQC/remix-run-fetch-router-0.22.0.tgz","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"_resolved":"/tmp/remix-publish-fetch-router-1i6UQC/remix-run-fetch-router-0.22.0.tgz","_integrity":"sha512-ErxqVZWUYTYPd6L/NbOe12BeRd8ulik7gCZnQxChEDlnko3chcTLqTsXc//h8IAqOY2x8NSOlo+ZQdFzfhCrpg==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.19.0","description":"A minimal, composable router for the web Fetch API","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@remix-run/route-pattern":"^0.24.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.0","@remix-run/assert":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/fetch-router_0.22.0_1788908542652_0.1648472208646823","host":"s3://npm-registry-packages-npm-production"}},"0.22.1":{"_id":"@remix-run/fetch-router@0.22.1","bugs":{"url":"https://github.com/remix-run/remix/issues"},"dist":{"shasum":"c89464d27b67f3c475131fb64640a980ae17fcb2","tarball":"https://registry.npmjs.org/@remix-run/fetch-router/-/fetch-router-0.22.1.tgz","fileCount":63,"integrity":"sha512-pe0FcjhOU+ChzpRWQnMde9UPCrLWDbrHv3/mubcpf3fM3jFP95aS/C0ZqzPhbgHUf2iVu6R2XnCtRAgXTxMFIQ==","signatures":[{"sig":"MEUCIQCDmpALJE3x33r50vvklvetdZ0ikMTw1+AwIsEzDdlNfQIgDfJ5mh4FMfCImg9r6E2/ASXAlKhGx/WGeNsy+G+ObCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGWgDAB9h6px0eeSUnIjiZb9eEgx/9IuP5stnr3MRJKAAiEAymZjQ5qMIVELzjah2BD2ELgr2DhcLCmJyOnB4A/gm4E="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@remix-run%2ffetch-router@0.22.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":205492},"name":"@remix-run/fetch-router","type":"module","_from":"file:/tmp/remix-publish-fetch-router-4tFQok/remix-run-fetch-router-0.22.1.tgz","author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./routes":{"types":"./dist/routes.d.ts","default":"./dist/routes.js"},"./package.json":"./package.json"},"license":"MIT","scripts":{"test":"remix test","build":"tsc -p tsconfig.build.json","clean":"git clean -fdX","test:bun":"bun x --bun remix test","typecheck":"tsc --noEmit"},"version":"0.22.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c9f88c56-3888-451f-b3ff-7215fb276bef"}},"homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"_resolved":"/tmp/remix-publish-fetch-router-4tFQok/remix-run-fetch-router-0.22.1.tgz","_integrity":"sha512-pe0FcjhOU+ChzpRWQnMde9UPCrLWDbrHv3/mubcpf3fM3jFP95aS/C0ZqzPhbgHUf2iVu6R2XnCtRAgXTxMFIQ==","repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"_npmVersion":"11.19.0","description":"A minimal, composable router for the web Fetch API","directories":{},"maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"@remix-run/route-pattern":"^0.24.1"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^7.0.2","@types/node":"^24.6.0","@remix-run/test":"0.6.1","@remix-run/assert":"0.3.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fetch-router_0.22.1_1789770851889_0.18007245453935372"}}},"time":{"created":"2025-10-01T19:20:49.046Z","modified":"2026-09-18T22:34:12.343Z","0.1.0":"2025-10-01T19:20:49.343Z","0.2.0":"2025-10-02T16:31:09.794Z","0.3.0":"2025-10-03T04:34:24.461Z","0.4.0":"2025-10-04T07:22:13.794Z","0.5.0":"2025-10-05T06:27:48.600Z","0.6.0":"2025-10-10T03:46:37.286Z","0.7.0":"2025-10-31T06:02:20.978Z","0.8.0":"2025-11-03T06:28:17.848Z","0.9.0":"2025-11-18T01:21:22.899Z","0.10.0":"2025-11-19T20:07:03.423Z","0.11.0":"2025-11-21T23:48:41.933Z","0.12.0":"2025-11-25T04:34:14.789Z","0.13.0":"2025-12-01T19:06:41.071Z","0.14.0":"2025-12-18T18:07:33.883Z","0.15.0":"2026-01-20T22:28:13.421Z","0.15.1":"2026-01-26T23:58:06.797Z","0.16.0":"2026-01-28T02:13:13.330Z","0.17.0":"2026-02-28T00:41:26.235Z","0.18.0":"2026-03-25T23:03:46.193Z","0.18.1":"2026-04-23T00:37:23.879Z","0.18.2":"2026-04-30T19:11:20.766Z","0.19.0":"2026-05-20T03:21:27.178Z","0.19.1":"2026-05-20T20:17:20.373Z","0.19.2":"2026-05-29T18:16:39.150Z","0.20.0":"2026-06-05T18:25:20.358Z","0.20.1":"2026-07-01T19:02:02.789Z","0.21.0":"2026-08-14T00:13:18.000Z","0.22.0":"2026-09-08T23:02:22.836Z","0.22.1":"2026-09-18T22:34:11.973Z"},"bugs":{"url":"https://github.com/remix-run/remix/issues"},"author":{"name":"Michael Jackson","email":"mjijackson@gmail.com"},"license":"MIT","homepage":"https://github.com/remix-run/remix/tree/main/packages/fetch-router#readme","keywords":["fetch","router","routing","middleware","koa","url","pattern","match"],"repository":{"url":"git+https://github.com/remix-run/remix.git","type":"git","directory":"packages/fetch-router"},"description":"A minimal, composable router for the web Fetch API","maintainers":[{"name":"mjackson","email":"mjijackson+npm@gmail.com"}],"readme":"# fetch-router\n\nA minimal, composable router built on the [web Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) and [`route-pattern`](https://github.com/remix-run/remix/tree/main/packages/route-pattern). Use it to define typed route maps, run middleware, and share request-scoped context across APIs, web services, and server-rendered applications.\n\n## Features\n\n- **Fetch API**: Built on standard web APIs that work everywhere - Node.js, Bun, Deno, Cloudflare Workers, and browsers\n- **Type-Safe Routing**: Leverage TypeScript for compile-time route validation and parameter inference\n- **Typed Request Context**: Carry request-scoped context through routers, controllers, and actions\n- **Declarative Route Maps**: Define your route structure upfront with type-safe route names and request methods\n- **Flexible Middleware**: Use router, controller, and action middleware for each request boundary\n- **Easy Testing**: Use standard `fetch()` to test your routes - no special test harness required\n\n## Installation\n\n```sh\nnpm i remix\n```\n\n## Usage\n\nThe main purpose of the router is to map incoming requests to request handlers and middleware. The router uses the `fetch()` API to accept a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) and return a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response).\n\nImport route definition helpers (`route`, `form`, `resource`, `resources`, etc.) from `remix/routes` and runtime APIs (`createRouter`, `Middleware`, etc.) from `remix/router`.\n\nThe example below is a small site with a home page, an \"about\" page, and a blog.\n\n```ts\nimport { route } from 'remix/routes'\nimport { createRouter } from 'remix/router'\nimport { logger } from 'remix/middleware/logger'\n\n// `route()` creates a \"route map\" that organizes routes by name. The keys\n// of the map may be any name, and may be nested to group related routes.\nlet routes = route({\n  home: '/',\n  about: '/about',\n  blog: {\n    index: '/blog',\n    show: '/blog/:slug',\n  },\n})\n\nlet router = createRouter({\n  // Middleware is used to run code before and/or after actions run.\n  // In this case, the `logger()` middleware logs the request to the console.\n  middleware: [logger()],\n})\n\n// Map a controller that supplies actions for the root routes.\n// A controller is a plain object with an `actions` property that\n// matches the direct route leaves in a route map.\nrouter.map(routes, {\n  actions: {\n    home() {\n      return new Response('Home')\n    },\n    about() {\n      return new Response('About')\n    },\n  },\n})\n\n// Map another controller that supplies actions for the blog routes.\nrouter.map(routes.blog, {\n  actions: {\n    index() {\n      return new Response('Blog')\n    },\n    show({ params }) {\n      // params is a type-safe object with the parameters from the route pattern\n      return new Response(`Post ${params.slug}`)\n    },\n  },\n})\n\nlet response = await router.fetch('https://remix.run/blog/hello-remix')\nconsole.log(await response.text()) // \"Post hello-remix\"\n```\n\nThe route map is an object of the same shape as the object pass into `route()`, including nested objects. The leaves of the map are `Route` objects, which you can see if you inspect the type of the `routes` variable in your IDE.\n\n```ts\ntype Routes = typeof routes\n// {\n//   home: Route<'ANY', '/'>\n//   about: Route<'ANY', '/about'>\n//   blog: {\n//     index: Route<'ANY', '/blog'>\n//     show: Route<'ANY', '/blog/:slug'>\n//   },\n// }\n```\n\nThe `routes.home` route is a `Route<'ANY', '/'>`, which means it serves any request method (`GET`, `POST`, `PUT`, `DELETE`, etc.) when the URL path is `/`. We'll discuss [routing based on request method](#routing-based-on-request-method) in detail later. But first, let's talk about navigation.\n\n### Links and Form Actions\n\nIn addition to describing the structure of your routes, route maps also make it easy to generate type-safe links and form actions using the `href()` function on a route. The example below is a small site with a home page and a \"Contact Us\" page.\n\nNote: We're using the [`createHtmlResponse` helper from `response`](https://github.com/remix-run/remix/tree/main/packages/response#readme) below to create `Response`s with `Content-Type: text/html`. We're also using the `html` template tag to create safe HTML strings to use in the response body.\n\n```ts\nimport { route } from 'remix/routes'\nimport { createRouter } from 'remix/router'\nimport { html } from 'remix/html-template'\nimport { createHtmlResponse } from 'remix/response/html'\n\nlet routes = route({\n  home: '/',\n  contact: '/contact',\n})\n\nlet router = createRouter()\n\n// Register an action for `GET /`\nrouter.get(routes.home, () => {\n  return createHtmlResponse(`\n    <html>\n      <body>\n        <h1>Home</h1>\n        <p>\n          <a href=\"${routes.contact.href()}\">Contact Us</a>\n        </p>\n      </body>\n    </html>\n  `)\n})\n\n// Register an action for `GET /contact`\nrouter.get(routes.contact, () => {\n  return createHtmlResponse(`\n    <html>\n      <body>\n        <h1>Contact Us</h1>\n        <form method=\"POST\" action=\"${routes.contact.href()}\">\n          <div>\n            <label for=\"message\">Message</label>\n            <input type=\"text\" name=\"message\" />\n          </div>\n          <button type=\"submit\">Send</button>\n        </form>\n        <footer>\n          <p>\n            <a href=\"${routes.home.href()}\">Home</a>\n          </p>\n        </footer>\n      </body>\n    </html>\n  `)\n})\n\n// Register an action for `POST /contact`\nrouter.post(routes.contact, ({ get }) => {\n  // POST actions can read parsed FormData from request context using FormData\n  // as the context key after the formData middleware has run.\n  let formData = get(FormData)\n  let message = formData.get('message') as string\n  let body = html`\n    <html>\n      <body>\n        <h1>Thanks!</h1>\n        <div>\n          <p>You said: ${message}</p>\n        </div>\n        <footer>\n          <p>\n            <a href=\"${routes.home.href()}\">Home</a>\n          </p>\n        </footer>\n      </body>\n    </html>\n  `\n\n  return createHtmlResponse(body)\n})\n```\n\n### Routing Based on Request Method\n\nIn the example above, both the `home` and `contact` routes are able to be registered for any incoming [`request.method`](https://developer.mozilla.org/en-US/docs/Web/API/Request/method). If you inspect their types, you'll see:\n\n```tsx\ntype HomeRoute = typeof routes.home // Route<'ANY', '/'>\ntype ContactRoute = typeof routes.contact // Route<'ANY', '/contact'>\n```\n\nWe used `router.get()` and `router.post()` to register actions on each route specifically for the `GET` and `POST` request methods.\n\nHowever, we can also encode the request method into the route definition itself using the `method` property on the route. When you include the `method` in the route definition, `router.map()` will register the action only for that specific request method. This can be more convenient than using `router.get()` and `router.post()` to register actions one at a time.\n\n```ts\nimport * as assert from 'node:assert/strict'\nimport { createRouter } from 'remix/router'\nimport { route } from 'remix/routes'\n\nlet routes = route({\n  home: { method: 'GET', pattern: '/' },\n  contact: {\n    index: { method: 'GET', pattern: '/contact' },\n    action: { method: 'POST', pattern: '/contact' },\n  },\n})\n\ntype Routes = typeof routes\n// Each route is now typed with a specific request method.\n// {\n//   home: Route<'GET', '/'>,\n//   contact: {\n//     index: Route<'GET', '/contact'>,\n//     action: Route<'POST', '/contact'>,\n//   },\n// }\n\nlet router = createRouter()\n\nrouter.map(routes, {\n  actions: {\n    home({ method }) {\n      assert.equal(method, 'GET')\n      return new Response('Home')\n    },\n  },\n})\n\nrouter.map(routes.contact, {\n  actions: {\n    index({ method }) {\n      assert.equal(method, 'GET')\n      return new Response('Contact')\n    },\n    action({ method }) {\n      assert.equal(method, 'POST')\n      return new Response('Contact Action')\n    },\n  },\n})\n```\n\n#### Method Not Allowed Responses\n\nWhen a request URL matches one or more route patterns, but none of those routes are registered for the request method, the router first falls through to any less specific route that can handle the method (including `ANY` routes). If no route can handle the request, the router responds with `405 Method Not Allowed` and an [`Allow` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Allow) listing the methods that are registered for that URL, instead of treating the request as a 404.\n\n```ts\nimport { createRouter } from 'remix/router'\n\nlet router = createRouter()\n\nrouter.get('/users/:id', ({ params }) => new Response(`User ${params.id}`))\nrouter.put('/users/:id', ({ params }) => new Response(`Updated ${params.id}`))\n\nlet response = await router.fetch('https://remix.run/users/1', { method: 'DELETE' })\n// 405 Method Not Allowed\n// Allow: GET, HEAD, PUT\n```\n\nIf you want a handler to receive every request method at a given URL instead, register an `ANY` route for it.\n\n#### HEAD Requests\n\nRoutes registered for `GET` also serve `HEAD` requests. The `GET` handler runs as usual, and the router strips the body from its response, so a `HEAD` request observes the same status and headers as the equivalent `GET` request.\n\n```ts\nlet router = createRouter()\n\nrouter.get(\n  '/report',\n  () => new Response('report data', { headers: { 'Content-Type': 'text/csv' } }),\n)\n\nlet response = await router.fetch('https://remix.run/report', { method: 'HEAD' })\n// 200 OK\n// Content-Type: text/csv\n// (empty body)\n```\n\nIf you register an explicit `HEAD` route for the same pattern, it takes precedence over the `GET` route for `HEAD` requests.\n\n### Composing Route Groups\n\nAs applications grow, it is useful to let one file own the routes for a specific area of the app while the top-level router decides where that area is mounted. Use `router.mount()` with a route installer to register a group of routes under a route pattern prefix.\n\nA route installer receives a `RouteBuilder`, not a full `Router`, so it can register routes but cannot dispatch requests. The parent router remains the only router that owns request dispatch, the matcher, and the default handler.\n\n```ts\nimport { createRouter, type RouteBuilder } from 'remix/router'\nimport { get, route } from 'remix/routes'\n\nconst adminRouteDefs = {\n  index: get('/'),\n  users: {\n    show: get('/users/:id'),\n  },\n}\n\n// Use relative route groups inside installers. These routes are registered below\n// the mount prefix when `installAdminRoutes()` runs.\nconst adminRouteGroup = route(adminRouteDefs)\n\n// Use full app routes for links and redirects.\nconst routes = {\n  admin: route('/admin', adminRouteDefs),\n}\n\nfunction installAdminRoutes<context extends AppContext>(router: RouteBuilder<context>) {\n  router.map(adminRouteGroup, {\n    actions: {\n      index() {\n        return new Response('Admin')\n      },\n    },\n  })\n\n  router.map(adminRouteGroup.users, {\n    actions: {\n      show({ params, currentUser }) {\n        return new Response(`User ${params.id} for ${currentUser.id}`)\n      },\n    },\n  })\n}\n\nlet router = createRouter<AppContext>({ middleware })\n\nrouter.mount('/admin', installAdminRoutes)\n```\n\nMount prefixes are route patterns. They compose with routes registered inside the installer using `joinPatterns()`, so params from the mount prefix are available to mounted handlers:\n\n```ts\nrouter.mount('/orgs/:orgId', (org) => {\n  org.get('/users/:userId', ({ params }) => {\n    // params is { orgId: string, userId: string }\n    return new Response(`${params.orgId}:${params.userId}`)\n  })\n})\n```\n\nWhen a mount prefix and child route use the same param name, the right-most route param wins, matching `route-pattern` behavior.\n\nMiddleware stays on routers, controllers, and actions. If an entire route group needs auth or another boundary, put that middleware on the controllers or actions owned by the installer:\n\n```ts\nfunction installAdminRoutes<context extends AppContext>(router: RouteBuilder<context>) {\n  router.map(adminRouteGroup, {\n    middleware: [requireAdmin()],\n    actions: {\n      index({ admin }) {\n        return new Response(admin.id)\n      },\n    },\n  })\n}\n```\n\nUnknown paths below a mounted prefix fall through to the parent router's default handler. If a route group needs its own catch-all response, register one explicitly inside the installer.\n\n### Declaring Routes\n\nIn addition to the `{ method, pattern }` syntax shown above, the router provides a few shorthand methods that help eliminate some of the boilerplate when building complex route maps:\n\n- [`form`](#declaring-form-routes) - creates a route map with an `index` (`GET`) and `action` (`POST`) route. This is well-suited to showing a standard HTML `<form>` and handling its submit action at the same URL.\n- [`resources` (and `resource`)](#resource-based-routes) - creates a route map with a set of resource-based routes, useful when defining RESTful API routes or [Rails-style resource-based routes](https://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default).\n\n#### Declaring Form Routes\n\nContinuing with [the example of the contact page](#routing-based-on-request-method), let's use the `form` shorthand to make the route map a little less verbose.\n\nA `form()` route map contains two routes: `index` and `action`. The `index` route is a `GET` route that shows the form, and the `action` route is a `POST` route that handles the form submission.\n\n```tsx\nimport { createRouter } from 'remix/router'\nimport { route, form } from 'remix/routes'\nimport { createHtmlResponse } from 'remix/response/html'\nimport { html } from 'remix/html-template'\n\nlet routes = route({\n  home: '/',\n  contact: form('contact'),\n})\n\ntype Routes = typeof routes\n// {\n//   home: Route<'ANY', '/'>\n//   contact: {\n//     index: Route<'GET', '/contact'> - Shows the form\n//     action: Route<'POST', '/contact'> - Handles the form submission\n//   },\n// }\n\nlet router = createRouter()\n\nrouter.map(routes, {\n  actions: {\n    home() {\n      return createHtmlResponse(`\n        <html>\n          <body>\n            <h1>Home</h1>\n            <footer>\n              <p>\n                <a href=\"${routes.contact.index.href()}\">Contact Us</a>\n              </p>\n            </footer>\n          </body>\n        </html>\n      `)\n    },\n  },\n})\n\nrouter.map(routes.contact, {\n  actions: {\n    // GET /contact - shows the form\n    index() {\n      return createHtmlResponse(`\n        <html>\n          <body>\n            <h1>Contact Us</h1>\n            <form method=\"POST\" action=\"${routes.contact.action.href()}\">\n              <label for=\"message\">Message</label>\n              <input type=\"text\" name=\"message\" />\n              <button type=\"submit\">Send</button>\n            </form>\n          </body>\n        </html>\n      `)\n    },\n    // POST /contact - handles the form submission\n    action({ get }) {\n      let formData = get(FormData)\n      let message = formData.get('message') as string\n      let body = html`\n        <html>\n          <body>\n            <h1>Thanks!</h1>\n            <p>You said: ${message}</p>\n\n            <p>\n              Got more to say? <a href=\"${routes.contact.index.href()}\">Send another message</a>\n            </p>\n          </body>\n        </html>\n      `\n\n      return createHtmlResponse(body)\n    },\n  },\n})\n```\n\n#### Resource-based Routes\n\nThe router provides a `resources()` helper that creates a route map with a set of resource-based routes, useful when defining RESTful API routes or modeling resources in a web application ([similar to Rails' `resources` helper](https://guides.rubyonrails.org/routing.html#resource-routing-the-rails-default)). You can think of \"resources\" as a way to define routes for a collection of related resources, like products, books, users, etc.\n\n```ts\nimport { createRouter } from 'remix/router'\nimport { route, resources } from 'remix/routes'\n\nlet routes = route({\n  brands: {\n    ...resources('brands', { only: ['index', 'show'] }),\n    products: resources('brands/:brandId/products', {\n      only: ['index', 'show'],\n    }),\n  },\n})\n\ntype Routes = typeof routes\n// {\n//   brands: {\n//     index: Route<'GET', '/brands'>\n//     show: Route<'GET', '/brands/:id'>\n//     products: {\n//       index: Route<'GET', '/brands/:brandId/products'>\n//       show: Route<'GET', '/brands/:brandId/products/:id'>\n//     },\n//   },\n// }\n\nlet router = createRouter()\n\nrouter.map(routes.brands, {\n  actions: {\n    // GET /brands\n    index() {\n      return new Response('Brands Index')\n    },\n    // GET /brands/:id\n    show({ params }) {\n      return new Response(`Brand ${params.id}`)\n    },\n  },\n})\n\nrouter.map(routes.brands.products, {\n  actions: {\n    // GET /brands/:brandId/products\n    index() {\n      return new Response('Products Index')\n    },\n    // GET /brands/:brandId/products/:id\n    show({ params }) {\n      return new Response(`Brand ${params.brandId}, Product ${params.id}`)\n    },\n  },\n})\n```\n\nThe `resource()` helper creates a route map for a single resource (i.e. not something that is part of a collection). This is useful when defining operations on a singleton resource, like a user profile.\n\n```tsx\nimport { createRouter } from 'remix/router'\nimport { route, resources, resource } from 'remix/routes'\n\nlet routes = route({\n  user: {\n    ...resources('users', { only: ['index', 'show'] }),\n    profile: resource('users/:userId/profile', { only: ['show', 'edit', 'update'] }),\n  },\n})\n\ntype Routes = typeof routes\n// {\n//   user: {\n//     index: Route<'GET', '/users'>\n//     show: Route<'GET', '/users/:id'>\n//     profile: {\n//       show: Route<'GET', '/users/:userId/profile'>\n//       edit: Route<'GET', '/users/:userId/profile/edit'>\n//       update: Route<'PUT', '/users/:userId/profile'>\n//     },\n//   },\n// }\n```\n\nIn both of the examples above we used the `only` option to limit the routes generated by `resources()`/`resource()` to only the routes we needed. Without the `only` option, a `resources('users')` route map contains 7 routes: `index`, `new`, `show`, `create`, `edit`, `update`, and `destroy`.\n\n```tsx\nlet routes = resources('users')\ntype Routes = typeof routes\n// {\n//   index: Route<'GET', '/users'> - Lists all users\n//   new: Route<'GET', '/users/new'> - Shows a form to create a new user\n//   show: Route<'GET', '/users/:id'> - Shows a single user\n//   create: Route<'POST', '/users'> - Creates a new user\n//   edit: Route<'GET', '/users/:id/edit'> - Shows a form to edit a user\n//   update: Route<'PUT', '/users/:id'> - Updates a user\n//   destroy: Route<'DELETE', '/users/:id'> - Deletes a user\n// }\n```\n\nSimilarly, a `resource('profile')` route map contains 6 routes: `new`, `show`, `create`, `edit`, `update`, and `destroy`. There is no `index` route because a `resource()` represents a singleton resource, not a collection, so there is no collection view.\n\n```tsx\nlet routes = resource('profile')\ntype Routes = typeof routes\n// {\n//   new: Route<'GET', '/profile/new'> - Shows a form to create the profile\n//   show: Route<'GET', '/profile'> - Shows the profile\n//   create: Route<'POST', '/profile'> - Creates the profile\n//   edit: Route<'GET', '/profile/edit'> - Shows a form to edit the profile\n//   update: Route<'PUT', '/profile'> - Updates the profile\n//   destroy: Route<'DELETE', '/profile'> - Deletes the profile\n// }\n```\n\nResource route names may be customized using the `names` option when you'd prefer not to use the default `index`/`new`/`show`/`create`/`edit`/`update`/`destroy` route names.\n\n```tsx\nimport { createRouter } from 'remix/router'\nimport { route, resources } from 'remix/routes'\n\nlet routes = route({\n  users: resources('users', {\n    only: ['index', 'show'],\n    names: { index: 'list', show: 'view' },\n  }),\n})\ntype Routes = typeof routes.users\n// {\n//   list: Route<'GET', '/users'> - Lists all users\n//   view: Route<'GET', '/users/:id'> - Shows a single user\n// }\n```\n\nIf you want to use a param name other than `id`, you can use the `param` option.\n\n```tsx\nimport { createRouter } from 'remix/router'\nimport { route, resources } from 'remix/routes'\n\nlet routes = route({\n  users: resources('users', {\n    only: ['index', 'show', 'edit', 'update'],\n    param: 'userId',\n  }),\n})\ntype Routes = typeof routes.users\n// {\n//   index: Route<'GET', '/users'> - Lists all users\n//   show: Route<'GET', '/users/:userId'> - Shows a single user\n//   edit: Route<'GET', '/users/:userId/edit'> - Shows a form to edit a user\n//   update: Route<'PUT', '/users/:userId'> - Updates a user\n// }\n```\n\nYou can use the `exclude` option to exclude routes from being generated.\n\n```tsx\nlet routes = resources('users', { exclude: ['edit', 'update', 'destroy'] })\ntype Routes = typeof routes\n// {\n//   index: Route<'GET', '/users'> - Lists all users\n//   new: Route<'GET', '/users/new'> - Shows a form to create a new user\n//   show: Route<'GET', '/users/:userId'> - Shows a single user\n//   create: Route<'POST', '/users'> - Creates a new user\n// }\n```\n\n### Controllers and Middleware\n\nMiddleware functions run code before and/or after actions. They are a powerful way to add functionality to your app.\n\nEvery middleware must either return a `Response`, return the response from `next()`, or call `await next()` before it returns. Middleware that returns without calling `next()` throws at runtime.\n\nA basic logging middleware might look like this:\n\n```ts\nimport { type Middleware } from 'remix/router'\n\n// You can use the `Middleware` type to type middleware functions.\nfunction logger(): Middleware {\n  return async (context, next) => {\n    let start = new Date()\n\n    // Call next() to invoke the next middleware or action in the chain.\n    let response = await next()\n\n    let end = new Date()\n    let duration = end.getTime() - start.getTime()\n\n    console.log(`${context.request.method} ${context.request.url} ${response.status} ${duration}ms`)\n\n    return response\n  }\n}\n\n// Use it like this:\nlet router = createRouter({\n  middleware: [logger()],\n})\n```\n\nMiddleware is typically built as a function that returns a middleware function. This allows you to pass options to the middleware function if needed. For example, the `auth()` middleware below allows you to pass a `token` option that is used to authenticate the request.\n\n```tsx\ninterface AuthOptions {\n  token: string\n}\n\nfunction auth(options?: AuthOptions): Middleware {\n  let token = options?.token ?? 'secret'\n\n  return (context, next) => {\n    if (context.headers.get('Authorization') !== `Bearer ${token}`) {\n      return new Response('Unauthorized', { status: 401 })\n    }\n    return next()\n  }\n}\n```\n\nMiddleware can store values in request context with a key. To make that value available as `context.db`, add `property: 'db'` to the middleware type and pass `{ property: 'db' }` to `context.set()`:\n\n```ts\nimport { createContextKey, type Middleware } from 'remix/router'\n\ninterface Database {\n  findMany(): Promise<unknown[]>\n}\n\nconst Database = createContextKey<Database>()\n\nfunction loadDatabase(): Middleware<{\n  key: typeof Database\n  value: Database\n  property: 'db'\n}> {\n  return async (context, next) => {\n    context.set(Database, await connectDatabase(), { property: 'db' })\n    return next()\n  }\n}\n\nrouter.get('/books', async (context) => {\n  let books = await context.db.findMany()\n  return Response.json(books)\n})\n```\n\nUse `context.db` (or `context.get(Database)`). If two values use the same property name, the router throws.\n\nMiddleware has three API-owned forms: router middleware, controller middleware, and action middleware.\n\nRouter middleware is added to the router when it is created using the `createRouter({ middleware })` option. This middleware runs before any routes are matched and is useful for doing things like logging, serving static files, profiling, and a variety of other things. Router middleware runs on every request, so it's important to keep it lightweight and fast.\n\nController middleware runs for every direct action in a controller. Action middleware runs only for one action, whether that action is created with `createAction()`, registered in a controller, or registered directly with `router.map()` or one of the method-specific helpers like `router.get()`, `router.post()`, `router.put()`, `router.delete()`, etc. The object form for actions is `{ handler, middleware? }`, so you can omit `middleware` entirely when you do not need it.\n\nA controller's `middleware` applies only to the direct route actions in that controller, and its `actions` object may not include nested route-map keys. This is the router's scoped middleware model: map nested route maps explicitly so each controller owns the direct route actions for one route map, and share middleware arrays between controllers that need the same boundary.\n\n```tsx\nlet routes = route({\n  home: '/',\n  admin: {\n    dashboard: '/admin/dashboard',\n    settings: '/admin/settings',\n  },\n})\n\nlet router = createRouter({\n  // Router middleware runs on all requests.\n  middleware: [staticFiles('./public')],\n})\n\nrouter.map(routes.home, () => new Response('Home'))\n\nrouter.map(routes.admin, {\n  // Controller middleware applies to all direct actions in this controller.\n  middleware: [auth({ token: 'secret' })],\n  actions: {\n    dashboard() {\n      return new Response('Dashboard')\n    },\n    settings: {\n      // Action middleware applies only to this action.\n      middleware: [requireAdmin()],\n      handler() {\n        return new Response('Settings')\n      },\n    },\n  },\n})\n```\n\n### Request Context\n\nEvery action and middleware receives a `context` object with useful properties:\n\n```ts\nconst UserKey = createContextKey<{ id: string }>()\n\nrouter.get('/posts/:id', (context) => {\n  // request: The original Request object\n  console.log(context.request.method) // \"GET\"\n  console.log(context.request.headers.get('Accept'))\n\n  // url: Parsed URL object\n  console.log(context.url.pathname) // \"/posts/123\"\n  console.log(context.url.searchParams.get('sort'))\n\n  // params: Route parameters (fully typed!)\n  console.log(context.params.id) // \"123\"\n\n  // set/get: type-safe request-scoped context data on the context object\n  context.set(UserKey, currentUser)\n  let user = context.get(UserKey)\n  if (user == null) throw new Error('Expected current user')\n  console.log(user.id)\n\n  return new Response(`Post ${context.params.id}`)\n})\n```\n\n### Typed Context Contracts\n\nRoute params are only half of a handler's type contract. In many apps, handlers also depend on values that middleware loads into request context, like sessions, database connections, or authenticated users.\n\n`fetch-router` lets you carry that context contract through the router and into direct route registration, stored controllers, and stored actions. A common pattern is to derive one application context type from your middleware, augment `RouterTypes.context` with it, then use `createAction()` and `createController()` to type stored handlers.\n\n```ts\nimport { Auth, requireAuth } from 'remix/middleware/auth'\nimport { createAction, createController, createRouter, type RouterContext } from 'remix/router'\nimport { route } from 'remix/routes'\nimport { loadDatabase } from './middleware/database.ts'\nimport { loadSession } from './middleware/session.ts'\n\nlet routes = route({\n  account: '/account',\n})\n\ntype AuthIdentity = { id: string }\n\nexport const router = createRouter({\n  middleware: [loadSession(), loadDatabase()],\n})\n\ntype AppContext = RouterContext<typeof router>\n\ndeclare module 'remix/router' {\n  interface RouterTypes {\n    context: AppContext\n  }\n}\n\nlet accountAction = createAction(routes.account, {\n  middleware: [requireAuth<AuthIdentity>()],\n  handler(context) {\n    let auth = context.get(Auth)\n    return Response.json({ id: auth.identity.id })\n  },\n})\n\nlet accountController = createController(routes, {\n  middleware: [requireAuth<AuthIdentity>()],\n  actions: {\n    account(context) {\n      let auth = context.get(Auth)\n      return Response.json({ id: auth.identity.id })\n    },\n  },\n})\n```\n\nIn this example, the router's inline middleware array defines the app context contract. `RouterContext<typeof router>` extracts the request context that the router provides, so `RouterTypes.context` can use that context without storing the middleware chain separately.\n\nPrefer plain inline arrays for `middleware` options on routers, controllers, actions, and route helpers. Inline arrays already give TypeScript enough information to infer middleware-provided context for downstream handlers, so `createAction()` and direct action objects see action middleware context, and `createController()` sees controller middleware context without `createMiddleware()`.\n\nUse `createMiddleware()` only when a middleware chain is stored somewhere and its exact tuple type needs to survive that boundary. The common cases are deriving `MiddlewareContext<typeof rootMiddleware>` without a router value, exporting a reusable chain, or returning a chain from a factory. A standalone array like `let middleware = [loadSession(), loadDatabase()]` widens to a normal array, so `MiddlewareContext<typeof middleware>` cannot derive the ordered middleware context.\n\nWhen manually annotating stored handlers with `Action<typeof route, Context>` or `Controller<typeof routes, Context>`, compose any action or controller middleware chain into `Context` with `MiddlewareContext<typeof actionOrControllerMiddleware, AppContext>`.\n\n#### Middleware Provider Guidance\n\n`context.get(key)` returns a defined value when the context type includes the key or the key has a default. Constructor keys like `FormData` are useful, but they do not imply presence; use context transforms for required values and handle `undefined` otherwise.\n\nIf you're authoring a middleware package that stores values in request context, treat that context contract as part of the package API. A good provider should usually export:\n\n- the context key consumers read with `context.get(...)`\n- the middleware that populates that key at runtime, with a `Middleware` context transform that describes the value it provides\n- an optional direct context property for values handlers read frequently\n\nApps can derive request context from the middleware tuple with `MiddlewareContext`. If they need to describe a context shape without a middleware tuple, they can use the core `ContextWithEntry` and `ContextWithEntries` helpers directly.\n\n```ts\nimport {\n  createContextKey,\n  createMiddleware,\n  type Middleware,\n  type MiddlewareContext,\n} from 'remix/router'\n\n// The context key that consumers will need to read from `context.get(...)`\nexport const CurrentUser = createContextKey<User | null>()\nconst currentUserContextProperty = { property: 'currentUser' } as const\n\n// The context effect carried by middleware that sets one context value\nexport function loadCurrentUser(): Middleware<{\n  key: typeof CurrentUser\n  value: User | null\n  property: 'currentUser'\n}> {\n  return async (context, next) => {\n    context.set(CurrentUser, await getCurrentUser(context.request), currentUserContextProperty)\n    return next()\n  }\n}\n\nlet middleware = createMiddleware(loadCurrentUser())\ntype AppContext = MiddlewareContext<typeof middleware>\n\n// Use context.currentUser (or context.get(CurrentUser)).\n// context.currentUser\n// context.get(CurrentUser)\n```\n\n### Additional Topics\n\n#### Scaling Your Application\n\n- how to spread controllers across multiple files\n\n#### Error Handling and Aborted Requests\n\n- wrap `router.fetch()` in a try/catch to handle errors\n- `AbortError` is thrown when a request is aborted\n\n#### Content Negotiation\n\n- use `Accept.from()` from `remix/headers` to serve different responses based on the client's `Accept` header\n  - maybe put this on `context.accepts()` for convenience?\n\n#### Sessions\n\n- use a custom `sessionStorage` implementation to store session data\n- use `session.get()` and `session.set()` to get and set session data\n- use `session.flash()` to set a flash message\n- use `session.destroy()` to destroy the session\n\n#### Form Data and File Uploads\n\n- use the `formData()` middleware to parse the `FormData` object from the request body\n- use `context.formData` or `context.get(FormData)` to access parsed form data\n- use `context.formData.get(name)`/`getAll(name)` to access uploaded files\n- use the `uploadHandler` option of the `formData()` middleware to handle file uploads\n\n#### Request Method Override\n\n- use the `methodOverride()` middleware to override the request method\n- use a hidden `<input name=\"_method\" value=\"...\">` to override the request method\n\n### Response Helpers\n\nResponse helpers for creating common HTTP responses are available in the [`response`](https://github.com/remix-run/remix/tree/main/packages/response) package:\n\n```tsx\nimport { createFileResponse } from 'remix/response/file'\nimport { createHtmlResponse } from 'remix/response/html'\nimport { createRedirectResponse } from 'remix/response/redirect'\nimport { compressResponse } from 'remix/response/compress'\n\nlet response = createHtmlResponse('<h1>Hello</h1>')\nlet response = Response.json({ message: 'Hello' })\nlet response = createRedirectResponse('/')\nlet response = compressResponse(uncompressedResponse, request)\n```\n\nSee the [`response` documentation](https://github.com/remix-run/remix/tree/main/packages/response#readme) for more details.\n\n### Working with HTML\n\nFor working with HTML strings and safe HTML interpolation, see the [`html-template`](https://github.com/remix-run/remix/tree/main/packages/html-template) package. It provides a `html` template tag with automatic escaping to prevent XSS vulnerabilities.\n\n```ts\nimport { html } from 'remix/html-template'\nimport { createHtmlResponse } from 'remix/response/html'\n\n// Use the template tag to escape unsafe variables in HTML.\nlet unsafe = '<script>alert(1)</script>'\nlet response = createHtmlResponse(html`<h1>${unsafe}</h1>`, { status: 400 })\n```\n\nThe `html.raw` template tag can be used to interpolate values without escaping them. This has the same semantics as `String.raw` but for HTML snippets that have already been escaped or are from trusted sources:\n\n```ts\n// Use html.raw as a template tag to skip escaping interpolations\nlet safeHtml = '<b>Bold</b>'\nlet content = html.raw`<div class=\"content\">${safeHtml}</div>`\nlet response = createHtmlResponse(content)\n\n// This is particularly useful when building HTML from multiple safe fragments\nlet header = '<header>Title</header>'\nlet body = '<main>Content</main>'\nlet footer = '<footer>Footer</footer>'\nlet page = html.raw`\n  <!DOCTYPE html>\n  <html>\n    <body>\n      ${header}\n      ${body}\n      ${footer}\n    </body>\n  </html>\n`\n\n// You can nest html.raw inside html to preserve SafeHtml fragments\nlet icon = html.raw`<svg>...</svg>`\nlet button = html`<button>${icon} Click me</button>` // icon is not escaped\n```\n\n**Warning**: Only use `html.raw` with trusted content. Unlike the regular `html` template tag, `html.raw` does not escape its interpolations, which can lead to XSS vulnerabilities if used with untrusted user input.\n\nSee the [`html-template` documentation](https://github.com/remix-run/remix/tree/main/packages/html-template#readme) for more details.\n\n### Testing\n\nTesting is straightforward because `fetch-router` uses the standard `fetch()` API:\n\n```ts\nimport * as assert from 'node:assert/strict'\nimport { describe, it } from 'node:test'\n\ndescribe('blog routes', () => {\n  it('creates a new post', async () => {\n    let response = await router.fetch('https://api.remix.run/posts', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({ title: 'Hello', content: 'World' }),\n    })\n\n    assert.equal(response.status, 201)\n    let post = await response.json()\n    assert.equal(post.title, 'Hello')\n  })\n\n  it('returns 404 for missing posts', async () => {\n    let response = await router.fetch('https://api.remix.run/posts/not-found')\n    assert.equal(response.status, 404)\n  })\n})\n```\n\nNo special test harness or mocking required! Just use `fetch()` like you would in production.\n\n## Related Packages\n\n- [auth-middleware](https://github.com/remix-run/remix/tree/main/packages/auth-middleware) - Request authentication and route protection helpers\n- [session-middleware](https://github.com/remix-run/remix/tree/main/packages/session-middleware) - Load and persist sessions in request context\n- [form-data-middleware](https://github.com/remix-run/remix/tree/main/packages/form-data-middleware) - Parse request bodies into `context.formData` (or `context.get(FormData)`)\n- [response](https://github.com/remix-run/remix/tree/main/packages/response) - Response helpers for HTML, JSON, files, and redirects\n\n## Related Work\n\n- [headers](https://github.com/remix-run/remix/tree/main/packages/headers) - A library for working with HTTP headers\n- [form-data-parser](https://github.com/remix-run/remix/tree/main/packages/form-data-parser) - A library for parsing multipart/form-data requests\n- [route-pattern](https://github.com/remix-run/remix/tree/main/packages/route-pattern) - The pattern matching library that powers `fetch-router`\n- [Express](https://expressjs.com/) - The classic Node.js web framework\n\n## License\n\nSee [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)\n","readmeFilename":"README.md"}