{"record":{"id":"f73b902e8076c7da","repo":"remix-run/react-router","slug":"the-future-v8-trailingslashawaredatarequests-fla","errorCode":null,"errorMessage":"The `future.v8_trailingSlashAwareDataRequests` flag has been removed because trailing slash-aware data requests are now the default behavior","messagePattern":"The `future\\.v8_trailingSlashAwareDataRequests` flag has been removed because trailing slash-aware data requests are now the default behavior","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/react-router-dev/config/config.ts","lineNumber":735,"sourceCode":"      \"v8_passThroughRequests\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_passThroughRequests` flag has been removed because pass-through requests are now the default behavior\",\n      );\n    }\n    if (\n      \"unstable_middleware\" in futureConfig ||\n      \"v8_middleware\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_middleware` flag has been removed because middleware is now always enabled\",\n      );\n    }\n    if (\n      \"unstable_trailingSlashAwareDataRequests\" in futureConfig ||\n      \"v8_trailingSlashAwareDataRequests\" in futureConfig\n    ) {\n      return err(\n        \"The `future.v8_trailingSlashAwareDataRequests` flag has been removed because trailing slash-aware data requests are now the default behavior\",\n      );\n    }\n    if (\"unstable_subResourceIntegrity\" in futureConfig) {\n      return err(\n        \"The `future.unstable_subResourceIntegrity` flag has been stabilized and moved to a top-level `config.subResourceIntegrity` field\",\n      );\n    }\n  }\n\n  let future: FutureConfig = {\n    unstable_enableNodeReadableStream:\n      userAndPresetConfigs.future?.unstable_enableNodeReadableStream ?? false,\n    unstable_optimizeDeps:\n      userAndPresetConfigs.future?.unstable_optimizeDeps ?? false,\n  };\n\n  let allowedActionOrigins = userAndPresetConfigs.allowedActionOrigins ?? false;","sourceCodeStart":717,"sourceCodeEnd":753,"githubUrl":"https://github.com/remix-run/react-router/blob/6beaca39526d5716c3c112ebb0782765baa5a9ce/packages/react-router-dev/config/config.ts#L717-L753","documentation":"Fatal config-validation error: readConfig rejects configs whose `future` object still has `unstable_trailingSlashAwareDataRequests` or `v8_trailingSlashAwareDataRequests`. Client data requests now always preserve/normalize trailing slashes to match the router's trailing-slash config, so the flag was removed; its presence (any value) aborts dev/build/typegen with this message.","triggerScenarios":"Any config-loading run with `future: { v8_trailingSlashAwareDataRequests: ... }` or `future: { unstable_trailingSlashAwareDataRequests: ... }` in the effective config, including inherited presets.","commonSituations":"v7 apps that opted in to fix double-slash or redirect-loop issues between the browser and `.data` requests; upgrading after the behavior became the default; stale shared configs in monorepos.","solutions":["Remove the `v8_trailingSlashAwareDataRequests` / `unstable_trailingSlashAwareDataRequests` key from `future` — the behavior is default now","If you previously set it to false, re-test routes whose paths differ by a trailing slash (e.g. `/path` vs `/path/`) since the aware behavior now always applies","Run typegen/typecheck to catch lingering typed references","Strip all removed v8_* future flags in one cleanup commit"],"exampleFix":"// before - react-router.config.ts\nexport default {\n  future: { v8_trailingSlashAwareDataRequests: true },\n} satisfies Config;\n\n// after\nexport default {} satisfies Config; // trailing slash-aware data requests are the default","handlingStrategy":"validation","validationCode":"import fs from \"node:fs\";\nlet cfg = fs.readFileSync(\"react-router.config.ts\", \"utf8\");\nif (/unstable_trailingSlashAwareDataRequests|v8_trailingSlashAwareDataRequests/.test(cfg)) {\n  throw new Error(\"Remove `future.v8_trailingSlashAwareDataRequests` — it is now the default\");\n}","typeGuard":"function isCurrentFutureConfig(f: unknown): boolean {\n  return typeof f === \"object\" && f !== null &&\n    !(\"v8_trailingSlashAwareDataRequests\" in f) && !(\"unstable_trailingSlashAwareDataRequests\" in f);\n}","tryCatchPattern":"try {\n  await runReactRouterCli(\"build\");\n} catch (e) {\n  if (e instanceof Error && e.message.includes(\"v8_trailingSlashAwareDataRequests\")) {\n    // strip the key and re-run; then smoke-test /path vs /path/ data requests\n  } else throw e;\n}","preventionTips":["Keep trailing-slash integration tests (with and without the slash) so the now-default behavior is covered after upgrades","Use `satisfies Config` typing on the config file to catch removed keys at compile time","Centralize config in one file per app instead of duplicating future flags across packages"],"tags":["config","future-flags","trailing-slash","upgrade","build-error"],"backgroundTag":"removed-feature-flag","analyzedSha":"6beaca39526d5716c3c112ebb0782765baa5a9ce","analyzedAt":"2026-08-18T18:04:14.938Z","contentChangedAt":"2026-08-18T18:04:14.938Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}