chore: standardize min SDK to ^3.9.0 and unify lints

Standardize package environments and lint configurations across the monorepo to ensure consistent analysis and modern Dart syntax support.

- Bump minimum Dart SDK constraint to ^3.9.0 across all packages
- Update mono_repo CI matrices to analyze uniformly against Dart 3.9.0
- Unify repository analysis options and lint rules (including global deprecation ignore handling)
- Apply modern code formatting required by the SDK bump
diff --git a/.github/workflows/compliance.yml b/.github/workflows/compliance.yml
index 3bda370..34038cf 100644
--- a/.github/workflows/compliance.yml
+++ b/.github/workflows/compliance.yml
@@ -21,7 +21,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/_shelf_compliance;commands:command"
@@ -36,7 +36,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs__shelf_compliance_pub_upgrade
         name: pkgs/_shelf_compliance; dart pub upgrade
         run: dart pub upgrade
diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml
index 62367e5..5d25010 100644
--- a/.github/workflows/dart.yml
+++ b/.github/workflows/dart.yml
@@ -21,7 +21,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:stable"
@@ -34,32 +34,41 @@
           sdk: stable
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - name: mono_repo self validate
         run: dart pub global activate mono_repo 6.6.3
       - name: mono_repo self validate
         run: dart pub global run mono_repo generate --validate
   job_002:
-    name: "analyze_and_format; linux; Dart 3.3.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_static; `dart analyze --fatal-infos .`"
+    name: "analyze_and_format; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart analyze --fatal-infos .`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static;commands:analyze"
+          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:analyze"
           restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0
+            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket
+            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
             os:ubuntu-latest;pub-cache-hosted
             os:ubuntu-latest
       - name: Setup Dart SDK
         uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
         with:
-          sdk: "3.3.0"
+          sdk: "3.9.0"
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+      - id: pkgs_shelf_pub_upgrade
+        name: pkgs/shelf; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf
+      - name: "pkgs/shelf; dart analyze --fatal-infos ."
+        run: dart analyze --fatal-infos .
+        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf
       - id: pkgs_shelf_packages_handler_pub_upgrade
         name: pkgs/shelf_packages_handler; dart pub upgrade
         run: dart pub upgrade
@@ -87,6 +96,15 @@
         run: dart analyze --fatal-infos .
         if: "always() && steps.pkgs_shelf_router_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_router
+      - id: pkgs_shelf_router_generator_pub_upgrade
+        name: pkgs/shelf_router_generator; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf_router_generator
+      - name: "pkgs/shelf_router_generator; dart analyze --fatal-infos ."
+        run: dart analyze --fatal-infos .
+        if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf_router_generator
       - id: pkgs_shelf_static_pub_upgrade
         name: pkgs/shelf_static; dart pub upgrade
         run: dart pub upgrade
@@ -96,27 +114,6 @@
         run: dart analyze --fatal-infos .
         if: "always() && steps.pkgs_shelf_static_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_static
-  job_003:
-    name: "analyze_and_format; linux; Dart 3.5.0; PKGS: pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart analyze --fatal-infos .`"
-    runs-on: ubuntu-latest
-    steps:
-      - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
-        with:
-          path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:analyze"
-          restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0
-            os:ubuntu-latest;pub-cache-hosted
-            os:ubuntu-latest
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.5.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
       - id: pkgs_shelf_test_handler_pub_upgrade
         name: pkgs/shelf_test_handler; dart pub upgrade
         run: dart pub upgrade
@@ -135,51 +132,12 @@
         run: dart analyze --fatal-infos .
         if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_web_socket
-  job_004:
-    name: "analyze_and_format; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_router_generator; `dart analyze --fatal-infos .`"
-    runs-on: ubuntu-latest
-    steps:
-      - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
-        with:
-          path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator;commands:analyze"
-          restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
-            os:ubuntu-latest;pub-cache-hosted
-            os:ubuntu-latest
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.9.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-      - id: pkgs_shelf_pub_upgrade
-        name: pkgs/shelf; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf
-      - name: "pkgs/shelf; dart analyze --fatal-infos ."
-        run: dart analyze --fatal-infos .
-        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf
-      - id: pkgs_shelf_router_generator_pub_upgrade
-        name: pkgs/shelf_router_generator; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf_router_generator
-      - name: "pkgs/shelf_router_generator; dart analyze --fatal-infos ."
-        run: dart analyze --fatal-infos .
-        if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf_router_generator
-  job_005:
+  job_003:
     name: "analyze_and_format; linux; Dart dev; PKGS: pkgs/_shelf_compliance, pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart analyze --fatal-infos .`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/_shelf_compliance-pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:analyze"
@@ -194,7 +152,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs__shelf_compliance_pub_upgrade
         name: pkgs/_shelf_compliance; dart pub upgrade
         run: dart pub upgrade
@@ -276,12 +234,12 @@
         run: dart analyze --fatal-infos .
         if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_web_socket
-  job_006:
+  job_004:
     name: "analyze_and_format; linux; Dart dev; PKGS: pkgs/_shelf_compliance, pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart format --output=none --set-exit-if-changed .`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/_shelf_compliance-pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:format"
@@ -296,7 +254,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs__shelf_compliance_pub_upgrade
         name: pkgs/_shelf_compliance; dart pub upgrade
         run: dart pub upgrade
@@ -378,27 +336,80 @@
         run: "dart format --output=none --set-exit-if-changed ."
         if: "always() && steps.pkgs_shelf_web_socket_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_web_socket
-  job_007:
-    name: "unit_test; linux; Dart 3.3.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_static; `dart test --test-randomize-ordering-seed=random`"
+  job_005:
+    name: "unit_test; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static;commands:test_0"
+          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_test_handler;commands:test_1"
           restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0;packages:pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_static
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.3.0
+            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_test_handler
+            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
             os:ubuntu-latest;pub-cache-hosted
             os:ubuntu-latest
       - name: Setup Dart SDK
         uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
         with:
-          sdk: "3.3.0"
+          sdk: "3.9.0"
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+      - id: pkgs_shelf_pub_upgrade
+        name: pkgs/shelf; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf
+      - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
+        run: "dart test --test-randomize-ordering-seed=random -p chrome"
+        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf
+      - id: pkgs_shelf_test_handler_pub_upgrade
+        name: pkgs/shelf_test_handler; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf_test_handler
+      - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
+        run: "dart test --test-randomize-ordering-seed=random -p chrome"
+        if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf_test_handler
+    needs:
+      - job_001
+      - job_002
+      - job_003
+      - job_004
+  job_006:
+    name: "unit_test; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
+    runs-on: ubuntu-latest
+    steps:
+      - name: Cache Pub hosted dependencies
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
+        with:
+          path: "~/.pub-cache/hosted"
+          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:test_0"
+          restore-keys: |
+            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket
+            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
+            os:ubuntu-latest;pub-cache-hosted
+            os:ubuntu-latest
+      - name: Setup Dart SDK
+        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
+        with:
+          sdk: "3.9.0"
+      - id: checkout
+        name: Checkout repository
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+      - id: pkgs_shelf_pub_upgrade
+        name: pkgs/shelf; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf
+      - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random"
+        run: "dart test --test-randomize-ordering-seed=random"
+        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf
       - id: pkgs_shelf_packages_handler_pub_upgrade
         name: pkgs/shelf_packages_handler; dart pub upgrade
         run: dart pub upgrade
@@ -426,6 +437,15 @@
         run: "dart test --test-randomize-ordering-seed=random"
         if: "always() && steps.pkgs_shelf_router_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_router
+      - id: pkgs_shelf_router_generator_pub_upgrade
+        name: pkgs/shelf_router_generator; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf_router_generator
+      - name: "pkgs/shelf_router_generator; dart test --test-randomize-ordering-seed=random"
+        run: "dart test --test-randomize-ordering-seed=random"
+        if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf_router_generator
       - id: pkgs_shelf_static_pub_upgrade
         name: pkgs/shelf_static; dart pub upgrade
         run: dart pub upgrade
@@ -435,71 +455,6 @@
         run: "dart test --test-randomize-ordering-seed=random"
         if: "always() && steps.pkgs_shelf_static_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_static
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_008:
-    name: "unit_test; linux; Dart 3.5.0; PKG: pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
-    runs-on: ubuntu-latest
-    steps:
-      - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
-        with:
-          path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler;commands:test_1"
-          restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0
-            os:ubuntu-latest;pub-cache-hosted
-            os:ubuntu-latest
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.5.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-      - id: pkgs_shelf_test_handler_pub_upgrade
-        name: pkgs/shelf_test_handler; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf_test_handler
-      - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
-        run: "dart test --test-randomize-ordering-seed=random -p chrome"
-        if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf_test_handler
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_009:
-    name: "unit_test; linux; Dart 3.5.0; PKGS: pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
-    runs-on: ubuntu-latest
-    steps:
-      - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
-        with:
-          path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:test_0"
-          restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0;packages:pkgs/shelf_test_handler-pkgs/shelf_web_socket
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.5.0
-            os:ubuntu-latest;pub-cache-hosted
-            os:ubuntu-latest
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.5.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
       - id: pkgs_shelf_test_handler_pub_upgrade
         name: pkgs/shelf_test_handler; dart pub upgrade
         run: dart pub upgrade
@@ -523,97 +478,12 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_010:
-    name: "unit_test; linux; Dart 3.9.0; PKG: pkgs/shelf; `dart test --test-randomize-ordering-seed=random -p chrome`"
-    runs-on: ubuntu-latest
-    steps:
-      - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
-        with:
-          path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf;commands:test_1"
-          restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
-            os:ubuntu-latest;pub-cache-hosted
-            os:ubuntu-latest
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.9.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-      - id: pkgs_shelf_pub_upgrade
-        name: pkgs/shelf; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf
-      - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
-        run: "dart test --test-randomize-ordering-seed=random -p chrome"
-        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_011:
-    name: "unit_test; linux; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_router_generator; `dart test --test-randomize-ordering-seed=random`"
-    runs-on: ubuntu-latest
-    steps:
-      - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
-        with:
-          path: "~/.pub-cache/hosted"
-          key: "os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator;commands:test_0"
-          restore-keys: |
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0;packages:pkgs/shelf-pkgs/shelf_router_generator
-            os:ubuntu-latest;pub-cache-hosted;sdk:3.9.0
-            os:ubuntu-latest;pub-cache-hosted
-            os:ubuntu-latest
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.9.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-      - id: pkgs_shelf_pub_upgrade
-        name: pkgs/shelf; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf
-      - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random"
-        run: "dart test --test-randomize-ordering-seed=random"
-        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf
-      - id: pkgs_shelf_router_generator_pub_upgrade
-        name: pkgs/shelf_router_generator; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf_router_generator
-      - name: "pkgs/shelf_router_generator; dart test --test-randomize-ordering-seed=random"
-        run: "dart test --test-randomize-ordering-seed=random"
-        if: "always() && steps.pkgs_shelf_router_generator_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf_router_generator
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_012:
+  job_007:
     name: "unit_test; linux; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome -c dart2wasm`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf-pkgs/shelf_test_handler;commands:test_2"
@@ -628,7 +498,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_pub_upgrade
         name: pkgs/shelf; dart pub upgrade
         run: dart pub upgrade
@@ -652,14 +522,12 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_013:
+  job_008:
     name: "unit_test; linux; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf-pkgs/shelf_test_handler;commands:test_1"
@@ -674,7 +542,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_pub_upgrade
         name: pkgs/shelf; dart pub upgrade
         run: dart pub upgrade
@@ -698,14 +566,12 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_014:
+  job_009:
     name: "unit_test; linux; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_packages_handler, pkgs/shelf_proxy, pkgs/shelf_router, pkgs/shelf_router_generator, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf-pkgs/shelf_packages_handler-pkgs/shelf_proxy-pkgs/shelf_router-pkgs/shelf_router_generator-pkgs/shelf_static-pkgs/shelf_test_handler-pkgs/shelf_web_socket;commands:test_0"
@@ -720,7 +586,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_pub_upgrade
         name: pkgs/shelf; dart pub upgrade
         run: dart pub upgrade
@@ -798,14 +664,12 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_015:
+  job_010:
     name: "unit_test; linux; Dart dev; PKG: pkgs/shelf_router_generator; `dart test --run-skipped -t presubmit-only`"
     runs-on: ubuntu-latest
     steps:
       - name: Cache Pub hosted dependencies
-        uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9
+        uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
         with:
           path: "~/.pub-cache/hosted"
           key: "os:ubuntu-latest;pub-cache-hosted;sdk:dev;packages:pkgs/shelf_router_generator;commands:test_3"
@@ -820,7 +684,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_router_generator_pub_upgrade
         name: pkgs/shelf_router_generator; dart pub upgrade
         run: dart pub upgrade
@@ -835,19 +699,51 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_016:
-    name: "unit_test; windows; Dart 3.3.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_static; `dart test --test-randomize-ordering-seed=random`"
+  job_011:
+    name: "unit_test; windows; Dart 3.9.0; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
     runs-on: windows-latest
     steps:
       - name: Setup Dart SDK
         uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
         with:
-          sdk: "3.3.0"
+          sdk: "3.9.0"
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
+      - id: pkgs_shelf_pub_upgrade
+        name: pkgs/shelf; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf
+      - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
+        run: "dart test --test-randomize-ordering-seed=random -p chrome"
+        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf
+      - id: pkgs_shelf_test_handler_pub_upgrade
+        name: pkgs/shelf_test_handler; dart pub upgrade
+        run: dart pub upgrade
+        if: "always() && steps.checkout.conclusion == 'success'"
+        working-directory: pkgs/shelf_test_handler
+      - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
+        run: "dart test --test-randomize-ordering-seed=random -p chrome"
+        if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
+        working-directory: pkgs/shelf_test_handler
+    needs:
+      - job_001
+      - job_002
+      - job_003
+      - job_004
+  job_012:
+    name: "unit_test; windows; Dart 3.9.0; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
+    runs-on: windows-latest
+    steps:
+      - name: Setup Dart SDK
+        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
+        with:
+          sdk: "3.9.0"
+      - id: checkout
+        name: Checkout repository
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_packages_handler_pub_upgrade
         name: pkgs/shelf_packages_handler; dart pub upgrade
         run: dart pub upgrade
@@ -866,51 +762,6 @@
         run: "dart test --test-randomize-ordering-seed=random"
         if: "always() && steps.pkgs_shelf_static_pub_upgrade.conclusion == 'success'"
         working-directory: pkgs/shelf_static
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_017:
-    name: "unit_test; windows; Dart 3.5.0; PKG: pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
-    runs-on: windows-latest
-    steps:
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.5.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-      - id: pkgs_shelf_test_handler_pub_upgrade
-        name: pkgs/shelf_test_handler; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf_test_handler
-      - name: "pkgs/shelf_test_handler; dart test --test-randomize-ordering-seed=random -p chrome"
-        run: "dart test --test-randomize-ordering-seed=random -p chrome"
-        if: "always() && steps.pkgs_shelf_test_handler_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf_test_handler
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_018:
-    name: "unit_test; windows; Dart 3.5.0; PKGS: pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
-    runs-on: windows-latest
-    steps:
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.5.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
       - id: pkgs_shelf_test_handler_pub_upgrade
         name: pkgs/shelf_test_handler; dart pub upgrade
         run: dart pub upgrade
@@ -934,36 +785,7 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_019:
-    name: "unit_test; windows; Dart 3.9.0; PKG: pkgs/shelf; `dart test --test-randomize-ordering-seed=random -p chrome`"
-    runs-on: windows-latest
-    steps:
-      - name: Setup Dart SDK
-        uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
-        with:
-          sdk: "3.9.0"
-      - id: checkout
-        name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
-      - id: pkgs_shelf_pub_upgrade
-        name: pkgs/shelf; dart pub upgrade
-        run: dart pub upgrade
-        if: "always() && steps.checkout.conclusion == 'success'"
-        working-directory: pkgs/shelf
-      - name: "pkgs/shelf; dart test --test-randomize-ordering-seed=random -p chrome"
-        run: "dart test --test-randomize-ordering-seed=random -p chrome"
-        if: "always() && steps.pkgs_shelf_pub_upgrade.conclusion == 'success'"
-        working-directory: pkgs/shelf
-    needs:
-      - job_001
-      - job_002
-      - job_003
-      - job_004
-      - job_005
-      - job_006
-  job_020:
+  job_013:
     name: "unit_test; windows; Dart dev; PKGS: pkgs/shelf, pkgs/shelf_test_handler; `dart test --test-randomize-ordering-seed=random -p chrome`"
     runs-on: windows-latest
     steps:
@@ -973,7 +795,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_pub_upgrade
         name: pkgs/shelf; dart pub upgrade
         run: dart pub upgrade
@@ -997,9 +819,7 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
-  job_021:
+  job_014:
     name: "unit_test; windows; Dart dev; PKGS: pkgs/shelf_packages_handler, pkgs/shelf_static, pkgs/shelf_test_handler, pkgs/shelf_web_socket; `dart test --test-randomize-ordering-seed=random`"
     runs-on: windows-latest
     steps:
@@ -1009,7 +829,7 @@
           sdk: dev
       - id: checkout
         name: Checkout repository
-        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
       - id: pkgs_shelf_packages_handler_pub_upgrade
         name: pkgs/shelf_packages_handler; dart pub upgrade
         run: dart pub upgrade
@@ -1051,5 +871,3 @@
       - job_002
       - job_003
       - job_004
-      - job_005
-      - job_006
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 772ee38..bc03473 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -6,6 +6,7 @@
   language:
     strict-raw-types: true
   errors:
+    deprecated_member_use: ignore
     deprecated_member_use_from_same_package: ignore
 
 linter:
diff --git a/pkgs/_shelf_compliance/lib/src/compliance_result.dart b/pkgs/_shelf_compliance/lib/src/compliance_result.dart
index f434dff..32f0ee0 100644
--- a/pkgs/_shelf_compliance/lib/src/compliance_result.dart
+++ b/pkgs/_shelf_compliance/lib/src/compliance_result.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+// ignore_for_file: constant_identifier_names
+
 class ComplianceResult {
   final Map<String, dynamic> _json;
 
@@ -20,5 +22,4 @@
   Map<String, dynamic> toJson() => _json;
 }
 
-// ignore: constant_identifier_names
 enum ResultVerdict { Pass, Fail, Warn, Skip, Error }
diff --git a/pkgs/shelf/mono_pkg.yaml b/pkgs/shelf/mono_pkg.yaml
index 9ae1f10..f7da38e 100644
--- a/pkgs/shelf/mono_pkg.yaml
+++ b/pkgs/shelf/mono_pkg.yaml
@@ -1,3 +1,4 @@
+# mono_repo config
 sdk:
 - pubspec
 - dev
diff --git a/pkgs/shelf_packages_handler/CHANGELOG.md b/pkgs/shelf_packages_handler/CHANGELOG.md
index ade7747..d08cb14 100644
--- a/pkgs/shelf_packages_handler/CHANGELOG.md
+++ b/pkgs/shelf_packages_handler/CHANGELOG.md
@@ -1,6 +1,6 @@
 ## 3.0.3-wip
 
-* Require Dart `^3.3.0`.
+* Require Dart `^3.9.0`.
 
 ## 3.0.2
 
diff --git a/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart b/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart
index 2ffb091..71dc8d4 100644
--- a/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart
+++ b/pkgs/shelf_packages_handler/lib/src/package_config_handler.dart
@@ -21,7 +21,7 @@
   final Map<String, Uri>? _packageMap;
 
   PackageConfigHandler({Map<String, Uri>? packageMap})
-      : _packageMap = packageMap;
+    : _packageMap = packageMap;
 
   /// The callback for handling a single request.
   Future<Response> handleRequest(Request request) async {
@@ -39,14 +39,17 @@
           packageUri = _packageMap[packageName];
         } else {
           final fakeResolvedUri = await Isolate.resolvePackageUri(
-              Uri(scheme: 'package', path: '$packageName/'));
+            Uri(scheme: 'package', path: '$packageName/'),
+          );
           packageUri = fakeResolvedUri;
         }
 
         final handler = packageUri == null
             ? (_) => Response.notFound('Package $packageName not found.')
-            : createStaticHandler(p.fromUri(packageUri),
-                serveFilesOutsidePath: true);
+            : createStaticHandler(
+                p.fromUri(packageUri),
+                serveFilesOutsidePath: true,
+              );
 
         return handler;
       });
diff --git a/pkgs/shelf_packages_handler/pubspec.yaml b/pkgs/shelf_packages_handler/pubspec.yaml
index 0d674ff..70041d6 100644
--- a/pkgs/shelf_packages_handler/pubspec.yaml
+++ b/pkgs/shelf_packages_handler/pubspec.yaml
@@ -9,7 +9,7 @@
   - shelf
 
 environment:
-  sdk: ^3.3.0
+  sdk: ^3.9.0
 
 dependencies:
   path: ^1.8.0
diff --git a/pkgs/shelf_packages_handler/test/packages_handler_test.dart b/pkgs/shelf_packages_handler/test/packages_handler_test.dart
index 3b6bcc2..deecfd4 100644
--- a/pkgs/shelf_packages_handler/test/packages_handler_test.dart
+++ b/pkgs/shelf_packages_handler/test/packages_handler_test.dart
@@ -11,12 +11,14 @@
 void main() {
   late String dir;
   setUp(() {
-    dir =
-        Directory.systemTemp.createTempSync('shelf_packages_handler_test').path;
+    dir = Directory.systemTemp
+        .createTempSync('shelf_packages_handler_test')
+        .path;
     Directory(dir).createSync();
     Directory('$dir/foo').createSync();
-    File('$dir/foo/foo.dart')
-        .writeAsStringSync("void main() => print('in foo');");
+    File(
+      '$dir/foo/foo.dart',
+    ).writeAsStringSync("void main() => print('in foo');");
   });
 
   tearDown(() {
@@ -27,44 +29,55 @@
     test('defaults to the current method of package resolution', () async {
       final handler = packagesHandler();
       final request = Request(
-          'GET',
-          Uri.parse('http://example.com/shelf_packages_handler/'
-              'shelf_packages_handler.dart'));
+        'GET',
+        Uri.parse(
+          'http://example.com/shelf_packages_handler/'
+          'shelf_packages_handler.dart',
+        ),
+      );
       final response = await handler(request);
       expect(response.statusCode, equals(200));
       expect(
-          await response.readAsString(), contains('Handler packagesHandler'));
+        await response.readAsString(),
+        contains('Handler packagesHandler'),
+      );
     });
 
     group('with a package map', () {
       late Handler handler;
 
       setUp(() {
-        handler = packagesHandler(packageMap: {
-          'foo': Uri.file('$dir/foo/'),
-        });
+        handler = packagesHandler(packageMap: {'foo': Uri.file('$dir/foo/')});
       });
 
       test('looks up a real file', () async {
-        final request =
-            Request('GET', Uri.parse('http://example.com/foo/foo.dart'));
+        final request = Request(
+          'GET',
+          Uri.parse('http://example.com/foo/foo.dart'),
+        );
         final response = await handler(request);
         expect(response.statusCode, equals(200));
         expect(await response.readAsString(), contains('in foo'));
       });
 
       test('404s for a nonexistent package', () async {
-        final request =
-            Request('GET', Uri.parse('http://example.com/bar/foo.dart'));
+        final request = Request(
+          'GET',
+          Uri.parse('http://example.com/bar/foo.dart'),
+        );
         final response = await handler(request);
         expect(response.statusCode, equals(404));
         expect(
-            await response.readAsString(), contains('Package bar not found'));
+          await response.readAsString(),
+          contains('Package bar not found'),
+        );
       });
 
       test('404s for a nonexistent file', () async {
-        final request =
-            Request('GET', Uri.parse('http://example.com/foo/bar.dart'));
+        final request = Request(
+          'GET',
+          Uri.parse('http://example.com/foo/bar.dart'),
+        );
         final response = await handler(request);
         expect(response.statusCode, equals(404));
       });
@@ -75,33 +88,46 @@
     test('supports a directory at the root of the URL', () async {
       final handler = packagesDirHandler();
       final request = Request(
-          'GET',
-          Uri.parse('http://example.com/packages/shelf_packages_handler/'
-              'shelf_packages_handler.dart'));
+        'GET',
+        Uri.parse(
+          'http://example.com/packages/shelf_packages_handler/'
+          'shelf_packages_handler.dart',
+        ),
+      );
       final response = await handler(request);
       expect(response.statusCode, equals(200));
       expect(
-          await response.readAsString(), contains('Handler packagesHandler'));
+        await response.readAsString(),
+        contains('Handler packagesHandler'),
+      );
     });
 
     test('supports a directory deep in the URL', () async {
       final handler = packagesDirHandler();
       final request = Request(
-          'GET',
-          Uri.parse('http://example.com/foo/bar/very/deep/packages/'
-              'shelf_packages_handler/shelf_packages_handler.dart'));
+        'GET',
+        Uri.parse(
+          'http://example.com/foo/bar/very/deep/packages/'
+          'shelf_packages_handler/shelf_packages_handler.dart',
+        ),
+      );
       final response = await handler(request);
       expect(response.statusCode, equals(200));
       expect(
-          await response.readAsString(), contains('Handler packagesHandler'));
+        await response.readAsString(),
+        contains('Handler packagesHandler'),
+      );
     });
 
     test('404s for a URL without a packages directory', () async {
       final handler = packagesDirHandler();
       final request = Request(
-          'GET',
-          Uri.parse('http://example.com/shelf_packages_handler/'
-              'shelf_packages_handler.dart'));
+        'GET',
+        Uri.parse(
+          'http://example.com/shelf_packages_handler/'
+          'shelf_packages_handler.dart',
+        ),
+      );
       final response = await handler(request);
       expect(response.statusCode, equals(404));
     });
@@ -109,9 +135,12 @@
     test('404s for a non-existent file within a packages directory', () async {
       final handler = packagesDirHandler();
       final request = Request(
-          'GET',
-          Uri.parse('http://example.com/packages/shelf_packages_handler/'
-              'non_existent.dart'));
+        'GET',
+        Uri.parse(
+          'http://example.com/packages/shelf_packages_handler/'
+          'non_existent.dart',
+        ),
+      );
       final response = await handler(request);
       expect(response.statusCode, equals(404));
     });
diff --git a/pkgs/shelf_proxy/CHANGELOG.md b/pkgs/shelf_proxy/CHANGELOG.md
index 37e518f..3e22882 100644
--- a/pkgs/shelf_proxy/CHANGELOG.md
+++ b/pkgs/shelf_proxy/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.6-wip
+
+* Require Dart `^3.9.0`.
+
 ## 1.0.5
 
 * Correctly handle multiple `Cookie` headers in requests and `Set-Cookie`
diff --git a/pkgs/shelf_proxy/lib/shelf_proxy.dart b/pkgs/shelf_proxy/lib/shelf_proxy.dart
index 12f97f6..59a8ae3 100644
--- a/pkgs/shelf_proxy/lib/shelf_proxy.dart
+++ b/pkgs/shelf_proxy/lib/shelf_proxy.dart
@@ -47,15 +47,19 @@
       // The Cookie header is special: multiple cookies are joined with a
       // semicolon and a space, while other headers use a comma.
       // See https://datatracker.ietf.org/doc/html/rfc6265#section-5.4
-      clientRequest.headers[name] =
-          values.join(name.toLowerCase() == 'cookie' ? '; ' : ', ');
+      clientRequest.headers[name] = values.join(
+        name.toLowerCase() == 'cookie' ? '; ' : ', ',
+      );
     });
     clientRequest.headers['Host'] = uri.authority;
 
     // Add a Via header. See
     // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.45
-    _addHeader(clientRequest.headers, 'via',
-        '${serverRequest.protocolVersion} $proxyName');
+    _addHeader(
+      clientRequest.headers,
+      'via',
+      '${serverRequest.protocolVersion} $proxyName',
+    );
 
     serverRequest
         .read()
@@ -65,13 +69,17 @@
         .ignore();
     final clientResponse = await nonNullClient.send(clientRequest);
     final headers = clientResponse.headers;
-    final headersAll =
-        Map<String, List<String>>.from(clientResponse.headersSplitValues);
+    final headersAll = Map<String, List<String>>.from(
+      clientResponse.headersSplitValues,
+    );
 
     // Add a Via header. See
     // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.45
-    headersAll.update('via', (values) => [...values, '1.1 $proxyName'],
-        ifAbsent: () => ['1.1 $proxyName']);
+    headersAll.update(
+      'via',
+      (values) => [...values, '1.1 $proxyName'],
+      ifAbsent: () => ['1.1 $proxyName'],
+    );
 
     // Remove the transfer-encoding since the body has already been decoded by
     // [client].
@@ -86,8 +94,10 @@
       // Add a Warning header. See
       // http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.2
       headersAll.update(
-          'warning', (values) => [...values, '214 $proxyName "GZIP decoded"'],
-          ifAbsent: () => ['214 $proxyName "GZIP decoded"']);
+        'warning',
+        (values) => [...values, '214 $proxyName "GZIP decoded"'],
+        ifAbsent: () => ['214 $proxyName "GZIP decoded"'],
+      );
     }
 
     // Make sure the Location header is pointing to the proxy server rather
@@ -96,15 +106,18 @@
       final location = requestUrl.resolve(headers['location']!).toString();
       if (p.url.isWithin(uri.toString(), location)) {
         headersAll['location'] = [
-          '/${p.url.relative(location, from: uri.toString())}'
+          '/${p.url.relative(location, from: uri.toString())}',
         ];
       } else {
         headersAll['location'] = [location];
       }
     }
 
-    return Response(clientResponse.statusCode,
-        body: clientResponse.stream, headers: headersAll);
+    return Response(
+      clientResponse.statusCode,
+      body: clientResponse.stream,
+      headers: headersAll,
+    );
   };
 }
 
diff --git a/pkgs/shelf_proxy/pubspec.yaml b/pkgs/shelf_proxy/pubspec.yaml
index 3fa2457..06d10aa 100644
--- a/pkgs/shelf_proxy/pubspec.yaml
+++ b/pkgs/shelf_proxy/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf_proxy
-version: 1.0.5
+version: 1.0.6-wip
 description: A shelf handler for proxying HTTP requests to another server.
 repository: https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_proxy
 issue_tracker: https://github.com/dart-lang/shelf/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Ashelf_proxy
@@ -9,7 +9,7 @@
   - shelf
 
 environment:
-  sdk: ^3.3.0
+  sdk: ^3.9.0
 
 dependencies:
   http: ^1.2.0
diff --git a/pkgs/shelf_proxy/test/shelf_proxy_test.dart b/pkgs/shelf_proxy/test/shelf_proxy_test.dart
index 5f3ceaa..c792988 100644
--- a/pkgs/shelf_proxy/test/shelf_proxy_test.dart
+++ b/pkgs/shelf_proxy/test/shelf_proxy_test.dart
@@ -41,16 +41,21 @@
 
     test('joins multiple request cookies with a semicolon', () async {
       final client = MockClient((request) {
-        expect(request.headers,
-            containsPair('cookie', 'cookie1=value1; cookie2=value2'));
+        expect(
+          request.headers,
+          containsPair('cookie', 'cookie1=value1; cookie2=value2'),
+        );
         return Future.value(http.Response(':)', 200));
       });
 
       final handler = proxyHandler('http://dartlang.org', client: client);
-      final request =
-          shelf.Request('GET', Uri.parse('http://localhost/'), headers: {
-        'cookie': ['cookie1=value1', 'cookie2=value2']
-      });
+      final request = shelf.Request(
+        'GET',
+        Uri.parse('http://localhost/'),
+        headers: {
+          'cookie': ['cookie1=value1', 'cookie2=value2'],
+        },
+      );
       await handler(request);
     });
 
@@ -71,8 +76,10 @@
     });
 
     test('forwards response headers', () async {
-      await createProxy((request) =>
-          shelf.Response.ok(':)', headers: {'foo': 'bar', 'accept': '*/*'}));
+      await createProxy(
+        (request) =>
+            shelf.Response.ok(':)', headers: {'foo': 'bar', 'accept': '*/*'}),
+      );
 
       final response = await get();
 
@@ -80,27 +87,32 @@
       expect(response.headers, containsPair('accept', '*/*'));
     });
 
-    test('preserves multiple Set-Cookie headers in response, including dates',
-        () async {
-      await createProxy((request) {
-        return shelf.Response.ok(':)', headers: {
-          'set-cookie': [
-            'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
-            'cookie2=value2'
-          ],
+    test(
+      'preserves multiple Set-Cookie headers in response, including dates',
+      () async {
+        await createProxy((request) {
+          return shelf.Response.ok(
+            ':)',
+            headers: {
+              'set-cookie': [
+                'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
+                'cookie2=value2',
+              ],
+            },
+          );
         });
-      });
 
-      final client = HttpClient();
-      final request = await client.getUrl(proxyUri);
-      final response = await request.close();
+        final client = HttpClient();
+        final request = await client.getUrl(proxyUri);
+        final response = await request.close();
 
-      final setCookies = response.headers['set-cookie'];
-      expect(setCookies, [
-        'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
-        'cookie2=value2'
-      ]);
-    });
+        final setCookies = response.headers['set-cookie'];
+        expect(setCookies, [
+          'cookie1=value1; Expires=Mon, 20 Apr 2026 17:22:59 GMT',
+          'cookie2=value2',
+        ]);
+      },
+    );
 
     test('forwards response body', () async {
       await createProxy((request) => shelf.Response.ok('hello, client'));
@@ -130,8 +142,10 @@
 
     test("adds to a request's existing Via header", () async {
       await createProxy((request) {
-        expect(request.headers,
-            containsPair('via', '1.0 something, 1.1 shelf_proxy'));
+        expect(
+          request.headers,
+          containsPair('via', '1.0 something, 1.1 shelf_proxy'),
+        );
         return shelf.Response.ok(':)');
       });
 
@@ -146,65 +160,88 @@
     });
 
     test("adds to a response's existing Via header", () async {
-      await createProxy((request) =>
-          shelf.Response.ok(':)', headers: {'via': '1.0 something'}));
+      await createProxy(
+        (request) => shelf.Response.ok(':)', headers: {'via': '1.0 something'}),
+      );
 
       final response = await get();
-      expect(response.headers,
-          containsPair('via', '1.0 something, 1.1 shelf_proxy'));
+      expect(
+        response.headers,
+        containsPair('via', '1.0 something, 1.1 shelf_proxy'),
+      );
     });
   });
 
   group('redirects', () {
     test("doesn't modify a Location for a foreign server", () async {
       await createProxy(
-          (request) => shelf.Response.found('http://dartlang.org'));
+        (request) => shelf.Response.found('http://dartlang.org'),
+      );
 
       final response = await get();
       expect(response.headers, containsPair('location', 'http://dartlang.org'));
     });
 
     test('relativizes a reachable root-relative Location', () async {
-      await createProxy((request) => shelf.Response.found('/foo/bar'),
-          targetPath: '/foo');
+      await createProxy(
+        (request) => shelf.Response.found('/foo/bar'),
+        targetPath: '/foo',
+      );
 
       final response = await get();
       expect(response.headers, containsPair('location', '/bar'));
     });
 
     test('absolutizes an unreachable root-relative Location', () async {
-      await createProxy((request) => shelf.Response.found('/baz'),
-          targetPath: '/foo');
+      await createProxy(
+        (request) => shelf.Response.found('/baz'),
+        targetPath: '/foo',
+      );
 
       final response = await get();
-      expect(response.headers,
-          containsPair('location', targetUri.resolve('/baz').toString()));
+      expect(
+        response.headers,
+        containsPair('location', targetUri.resolve('/baz').toString()),
+      );
     });
   });
 
   test('removes a transfer-encoding header', () async {
-    final handler = mockHandler((request) =>
-        http.Response('', 200, headers: {'transfer-encoding': 'chunked'}));
+    final handler = mockHandler(
+      (request) =>
+          http.Response('', 200, headers: {'transfer-encoding': 'chunked'}),
+    );
 
-    final response =
-        await handler(shelf.Request('GET', Uri.parse('http://localhost/')));
+    final response = await handler(
+      shelf.Request('GET', Uri.parse('http://localhost/')),
+    );
 
     expect(response.headers, isNot(contains('transfer-encoding')));
   });
 
-  test('removes content-length and content-encoding for a gzipped response',
-      () async {
-    final handler = mockHandler((request) => http.Response('', 200,
-        headers: {'content-encoding': 'gzip', 'content-length': '1234'}));
+  test(
+    'removes content-length and content-encoding for a gzipped response',
+    () async {
+      final handler = mockHandler(
+        (request) => http.Response(
+          '',
+          200,
+          headers: {'content-encoding': 'gzip', 'content-length': '1234'},
+        ),
+      );
 
-    final response =
-        await handler(shelf.Request('GET', Uri.parse('http://localhost/')));
+      final response = await handler(
+        shelf.Request('GET', Uri.parse('http://localhost/')),
+      );
 
-    expect(response.headers, isNot(contains('content-encoding')));
-    expect(response.headers, isNot(contains('content-length')));
-    expect(response.headers,
-        containsPair('warning', '214 shelf_proxy "GZIP decoded"'));
-  });
+      expect(response.headers, isNot(contains('content-encoding')));
+      expect(response.headers, isNot(contains('content-length')));
+      expect(
+        response.headers,
+        containsPair('warning', '214 shelf_proxy "GZIP decoded"'),
+      );
+    },
+  );
 }
 
 /// Creates a proxy server proxying to a server running [handler].
@@ -216,8 +253,10 @@
   final targetServer = await shelf_io.serve(handler, 'localhost', 0);
   targetUri = Uri.parse('http://localhost:${targetServer.port}');
   if (targetPath != null) targetUri = targetUri.resolve(targetPath);
-  final proxyServerHandler =
-      expectAsync1(proxyHandler(targetUri), reason: 'proxy server handler');
+  final proxyServerHandler = expectAsync1(
+    proxyHandler(targetUri),
+    reason: 'proxy server handler',
+  );
 
   final proxyServer = await shelf_io.serve(proxyServerHandler, 'localhost', 0);
   proxyUri = Uri.parse('http://localhost:${proxyServer.port}');
@@ -231,7 +270,8 @@
 /// Creates a [shelf.Handler] that's backed by a [MockClient] running
 /// [callback].
 shelf.Handler mockHandler(
-    FutureOr<http.Response> Function(http.Request) callback) {
+  FutureOr<http.Response> Function(http.Request) callback,
+) {
   final client = MockClient((request) async => await callback(request));
   return proxyHandler('http://dartlang.org', client: client);
 }
diff --git a/pkgs/shelf_router/CHANGELOG.md b/pkgs/shelf_router/CHANGELOG.md
index e43718f..eaec2e6 100644
--- a/pkgs/shelf_router/CHANGELOG.md
+++ b/pkgs/shelf_router/CHANGELOG.md
@@ -1,7 +1,7 @@
 ## 1.1.5-wip
 
 * Fixed automatic `HEAD` request handling to not modify content-length.
-* Require Dart `^3.3.0`.
+* Require Dart `^3.9.0`.
 
 ## 1.1.4
 
diff --git a/pkgs/shelf_router/benchmark/router_benchmark.dart b/pkgs/shelf_router/benchmark/router_benchmark.dart
index 54e0d83..63944ea 100644
--- a/pkgs/shelf_router/benchmark/router_benchmark.dart
+++ b/pkgs/shelf_router/benchmark/router_benchmark.dart
@@ -17,9 +17,11 @@
     // Creating request for the LAST route in the VERY LAST controller to
     // trigger worst-case matching
     request = Request(
-        'GET',
-        Uri.parse(
-            'http://localhost/api/controller_${_controllers - 1}/resource/${_routesPerController - 1}/details'));
+      'GET',
+      Uri.parse(
+        'http://localhost/api/controller_${_controllers - 1}/resource/${_routesPerController - 1}/details',
+      ),
+    );
   }
 
   @override
@@ -41,9 +43,9 @@
 
     // Creating request that does not match ANY of the routes
     request = Request(
-        'GET',
-        Uri.parse(
-            'http://localhost/api/controller_${_controllers - 1}/foo/bar'));
+      'GET',
+      Uri.parse('http://localhost/api/controller_${_controllers - 1}/foo/bar'),
+    );
   }
 
   @override
diff --git a/pkgs/shelf_router/lib/src/route.dart b/pkgs/shelf_router/lib/src/route.dart
index 419a741..30b5d2a 100644
--- a/pkgs/shelf_router/lib/src/route.dart
+++ b/pkgs/shelf_router/lib/src/route.dart
@@ -86,7 +86,5 @@
   const Route.trace(this.route) : verb = 'TRACE';
 
   /// Route `MOUNT` requests matching [route] to annotated method.
-  const Route.mount(String prefix)
-      : verb = r'$mount',
-        route = prefix;
+  const Route.mount(String prefix) : verb = r'$mount', route = prefix;
 }
diff --git a/pkgs/shelf_router/lib/src/router.dart b/pkgs/shelf_router/lib/src/router.dart
index 8ba3c12..3c1d03e 100644
--- a/pkgs/shelf_router/lib/src/router.dart
+++ b/pkgs/shelf_router/lib/src/router.dart
@@ -60,14 +60,14 @@
 
 /// Middleware to remove body from response for HEAD requests.
 Handler _removeBody(Handler handler) => (request) {
-      Response processResponse(Response r) => r.change(body: const <int>[]);
+  Response processResponse(Response r) => r.change(body: const <int>[]);
 
-      final response = handler(request);
-      if (response is Future<Response>) {
-        return response.then(processResponse);
-      }
-      return processResponse(response);
-    };
+  final response = handler(request);
+  if (response is Future<Response>) {
+    return response.then(processResponse);
+  }
+  return processResponse(response);
+};
 
 /// A shelf [Router] routes requests to handlers based on HTTP verb and route
 /// pattern.
@@ -121,7 +121,7 @@
   /// The [notFoundHandler] will be invoked for requests where no matching route
   /// was found. By default, a simple [Response.notFound] will be used instead.
   Router({Handler notFoundHandler = _defaultNotFound})
-      : _notFoundHandler = notFoundHandler;
+    : _notFoundHandler = notFoundHandler;
 
   /// Add [handler] for [verb] requests to [route].
   ///
diff --git a/pkgs/shelf_router/lib/src/router_entry.dart b/pkgs/shelf_router/lib/src/router_entry.dart
index d92f4d7..98907fa 100644
--- a/pkgs/shelf_router/lib/src/router_entry.dart
+++ b/pkgs/shelf_router/lib/src/router_entry.dart
@@ -50,8 +50,15 @@
   /// List of parameter names in the route pattern.
   List<String> get params => _params.toList(); // exposed for using generator.
 
-  RouterEntry._(this.verb, this.route, this._handler, this._middleware,
-      this._routePattern, this._params, this.trieIndex);
+  RouterEntry._(
+    this.verb,
+    this.route,
+    this._handler,
+    this._middleware,
+    this._routePattern,
+    this._params,
+    this.trieIndex,
+  );
 
   factory RouterEntry(
     String verb,
@@ -64,7 +71,10 @@
 
     if (!route.startsWith('/')) {
       throw ArgumentError.value(
-          route, 'route', 'expected route to start with a slash');
+        route,
+        'route',
+        'expected route to start with a slash',
+      );
     }
 
     final params = <String>[];
@@ -75,7 +85,10 @@
         params.add(m[2]!);
         if (m[3] != null && !_isNoCapture(m[3]!)) {
           throw ArgumentError.value(
-              route, 'route', 'expression for "${m[2]}" is capturing');
+            route,
+            'route',
+            'expression for "${m[2]}" is capturing',
+          );
         }
         pattern += '(${m[3] ?? r'[^/]+'})';
       }
@@ -83,7 +96,14 @@
     final routePattern = RegExp('^$pattern\$');
 
     return RouterEntry._(
-        verb, route, handler, middleware, routePattern, params, trieIndex);
+      verb,
+      route,
+      handler,
+      middleware,
+      routePattern,
+      params,
+      trieIndex,
+    );
   }
 
   /// Returns a map from parameter name to value, if the path matches the
@@ -113,9 +133,10 @@
         return await _handler(request) as Response;
       }
       return await Function.apply(_handler, [
-        request,
-        ..._params.map((n) => params[n]),
-      ]) as Response;
+            request,
+            ..._params.map((n) => params[n]),
+          ])
+          as Response;
     })(request);
   }
 }
diff --git a/pkgs/shelf_router/lib/src/trie.dart b/pkgs/shelf_router/lib/src/trie.dart
index 9e292fe..bc7b33b 100644
--- a/pkgs/shelf_router/lib/src/trie.dart
+++ b/pkgs/shelf_router/lib/src/trie.dart
@@ -75,12 +75,15 @@
     // segment. This works correctly for both partial segments (e.g. `image_`
     // from `/files/image_<id>.png`) and for full segments that are just before
     // a parameter (e.g. the empty segment from `/users/<id>`).
-    final segmentsToTraverse =
-        (paramIndex != -1) ? segments.take(segments.length - 1) : segments;
+    final segmentsToTraverse = (paramIndex != -1)
+        ? segments.take(segments.length - 1)
+        : segments;
 
     for (final segment in segmentsToTraverse) {
-      currentNode =
-          currentNode.staticChildren.putIfAbsent(segment, _TrieNode.new);
+      currentNode = currentNode.staticChildren.putIfAbsent(
+        segment,
+        _TrieNode.new,
+      );
     }
 
     // Add the entry to the deepest FULLY static node we reached.
diff --git a/pkgs/shelf_router/pubspec.yaml b/pkgs/shelf_router/pubspec.yaml
index 4a72727..4141b21 100644
--- a/pkgs/shelf_router/pubspec.yaml
+++ b/pkgs/shelf_router/pubspec.yaml
@@ -11,7 +11,7 @@
   - shelf
 
 environment:
-  sdk: ^3.3.0
+  sdk: ^3.9.0
 
 dependencies:
   http_methods: ^1.1.0
diff --git a/pkgs/shelf_router/test/route_entry_test.dart b/pkgs/shelf_router/test/route_entry_test.dart
index 1012f9a..9274a82 100644
--- a/pkgs/shelf_router/test/route_entry_test.dart
+++ b/pkgs/shelf_router/test/route_entry_test.dart
@@ -36,40 +36,36 @@
     });
   }
 
-  testPattern('/hello', match: {
-    '/hello': {},
-  }, notMatch: [
-    '/not-hello',
-    '/',
-  ]);
+  testPattern('/hello', match: {'/hello': {}}, notMatch: ['/not-hello', '/']);
 
-  testPattern(r'/user/<user>/groups/<group|\d+>', match: {
-    '/user/jonasfj/groups/42': {
-      'user': 'jonasfj',
-      'group': '42',
+  testPattern(
+    r'/user/<user>/groups/<group|\d+>',
+    match: {
+      '/user/jonasfj/groups/42': {'user': 'jonasfj', 'group': '42'},
+      '/user/jonasfj/groups/0': {'user': 'jonasfj', 'group': '0'},
+      '/user/123/groups/101': {'user': '123', 'group': '101'},
     },
-    '/user/jonasfj/groups/0': {
-      'user': 'jonasfj',
-      'group': '0',
-    },
-    '/user/123/groups/101': {
-      'user': '123',
-      'group': '101',
-    },
-  }, notMatch: [
-    '/user/',
-    '/user/jonasfj/groups/5-3',
-    '/user/jonasfj/test/groups/5',
-    '/user/jonasfjtest/groups/4/',
-    '/user/jonasfj/groups/',
-    '/not-hello',
-    '/',
-  ]);
+    notMatch: [
+      '/user/',
+      '/user/jonasfj/groups/5-3',
+      '/user/jonasfj/test/groups/5',
+      '/user/jonasfjtest/groups/4/',
+      '/user/jonasfj/groups/',
+      '/not-hello',
+      '/',
+    ],
+  );
 
   test('non-capture regex only', () {
     expect(
-        () => RouterEntry('GET', '/users/<user|([^]*)>/info', () {}),
-        throwsA(isArgumentError.having((e) => e.message, 'message',
-            'expression for "user" is capturing')));
+      () => RouterEntry('GET', '/users/<user|([^]*)>/info', () {}),
+      throwsA(
+        isArgumentError.having(
+          (e) => e.message,
+          'message',
+          'expression for "user" is capturing',
+        ),
+      ),
+    );
   });
 }
diff --git a/pkgs/shelf_router/test/router_test.dart b/pkgs/shelf_router/test/router_test.dart
index 50e8e71..fd8ca8e 100644
--- a/pkgs/shelf_router/test/router_test.dart
+++ b/pkgs/shelf_router/test/router_test.dart
@@ -99,8 +99,11 @@
   test('params by arguments', () async {
     var app = Router();
 
-    app.get(r'/user/<user>/groups/<group|\d+>',
-        (Request request, String user, String group) {
+    app.get(r'/user/<user>/groups/<group|\d+>', (
+      Request request,
+      String user,
+      String group,
+    ) {
       return Response.ok('$user / $group');
     });
 
@@ -149,10 +152,7 @@
     );
 
     var app = Router();
-    app.mount(
-      '/api/',
-      middleware.addHandler(api.call),
-    );
+    app.mount('/api/', middleware.addHandler(api.call));
 
     server.mount(app.call);
 
@@ -195,9 +195,15 @@
     server.mount(api.call);
 
     expect(
-        get('/hi'),
-        throwsA(isA<http.ClientException>()
-            .having((e) => e.message, 'message', contains('404: Not Found.'))));
+      get('/hi'),
+      throwsA(
+        isA<http.ClientException>().having(
+          (e) => e.message,
+          'message',
+          contains('404: Not Found.'),
+        ),
+      ),
+    );
   });
 
   test('can invoke custom handler if no route matches', () {
diff --git a/pkgs/shelf_router/test/trie_test.dart b/pkgs/shelf_router/test/trie_test.dart
index bf79d74..c7b224f 100644
--- a/pkgs/shelf_router/test/trie_test.dart
+++ b/pkgs/shelf_router/test/trie_test.dart
@@ -32,8 +32,10 @@
 
   test('stops parsing static prefix at first parameter', () async {
     final router = Router();
-    router.get('/<user>/details',
-        (Request request, String user) => Response.ok('immediateParam-$user'));
+    router.get(
+      '/<user>/details',
+      (Request request, String user) => Response.ok('immediateParam-$user'),
+    );
 
     var response = await get(router, '/alice/details');
     expect(await response.readAsString(), 'immediateParam-alice');
@@ -41,24 +43,33 @@
 
   test('handles mid-segment parameters properly', () async {
     final router = Router();
-    router.get('/files/image_<id>.png',
-        (Request request, String id) => Response.ok('midSegmentParam-$id'));
+    router.get(
+      '/files/image_<id>.png',
+      (Request request, String id) => Response.ok('midSegmentParam-$id'),
+    );
 
     var response = await get(router, '/files/image_123.png');
     expect(await response.readAsString(), 'midSegmentParam-123');
   });
 
-  test('maintains registration priority regardless of route specificity',
-      () async {
-    final router = Router();
-    router.get('/<any|.*>', (Request request) => Response.ok('catchAll'));
-    router.get('/users/details', (Request request) => Response.ok('specific'));
-    router.get(
-        '/users/<id>', (Request request, String id) => Response.ok('wildcard'));
+  test(
+    'maintains registration priority regardless of route specificity',
+    () async {
+      final router = Router();
+      router.get('/<any|.*>', (Request request) => Response.ok('catchAll'));
+      router.get(
+        '/users/details',
+        (Request request) => Response.ok('specific'),
+      );
+      router.get(
+        '/users/<id>',
+        (Request request, String id) => Response.ok('wildcard'),
+      );
 
-    var response = await get(router, '/users/details');
-    expect(await response.readAsString(), 'catchAll');
-  });
+      var response = await get(router, '/users/details');
+      expect(await response.readAsString(), 'catchAll');
+    },
+  );
 
   test('isolates unrelated branches', () async {
     final router = Router();
diff --git a/pkgs/shelf_router_generator/CHANGELOG.md b/pkgs/shelf_router_generator/CHANGELOG.md
index 79f67bd..1677451 100644
--- a/pkgs/shelf_router_generator/CHANGELOG.md
+++ b/pkgs/shelf_router_generator/CHANGELOG.md
@@ -1,3 +1,5 @@
+## 1.1.6-wip
+
 ## 1.1.5
 
 * Support `analyzer` versions up to `14.x`.
diff --git a/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart b/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
index 87848c7..081a614 100644
--- a/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
+++ b/pkgs/shelf_router_generator/lib/src/shelf_router_generator.dart
@@ -22,8 +22,8 @@
 import 'package:http_methods/http_methods.dart' show isHttpMethod;
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf_router/shelf_router.dart' as shelf_router;
-import 'package:shelf_router/src/router_entry.dart' // ignore: implementation_imports
-    show RouterEntry;
+// ignore: implementation_imports
+import 'package:shelf_router/src/router_entry.dart' show RouterEntry;
 import 'package:source_gen/source_gen.dart' as g;
 
 // Type checkers that we need later
diff --git a/pkgs/shelf_router_generator/pubspec.yaml b/pkgs/shelf_router_generator/pubspec.yaml
index cefc418..c88bbe7 100644
--- a/pkgs/shelf_router_generator/pubspec.yaml
+++ b/pkgs/shelf_router_generator/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf_router_generator
-version: 1.1.5
+version: 1.1.6-wip
 description: >
   A package:build-compatible builder for generating request routers for the
   shelf web-framework based on source annotations.
diff --git a/pkgs/shelf_static/CHANGELOG.md b/pkgs/shelf_static/CHANGELOG.md
index e6f77bb..37b3ebc 100644
--- a/pkgs/shelf_static/CHANGELOG.md
+++ b/pkgs/shelf_static/CHANGELOG.md
@@ -7,6 +7,7 @@
 * Add `generateETag` and `maxAge` parameters to `createStaticHandler` and
   `createFileHandler` to support `ETag` and `Cache-Control` headers. 
   Default ETags are generated based on file size and modified time.
+* Require Dart `^3.9.0`.
 
 ## 1.1.3
 
diff --git a/pkgs/shelf_static/benchmark/static_benchmark.dart b/pkgs/shelf_static/benchmark/static_benchmark.dart
index 77ceb96..97a18d6 100644
--- a/pkgs/shelf_static/benchmark/static_benchmark.dart
+++ b/pkgs/shelf_static/benchmark/static_benchmark.dart
@@ -36,7 +36,8 @@
     smallFileStopwatch.stop();
     print('Total time: ${smallFileStopwatch.elapsedMilliseconds} ms');
     print(
-        'Req/sec (small.txt): ${(iterationsSmall / smallFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}');
+      'Req/sec (small.txt): ${(iterationsSmall / smallFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}',
+    );
 
     print('Warming up large.txt...');
     for (var i = 0; i < 10; i++) {
@@ -56,7 +57,8 @@
     largeFileStopwatch.stop();
     print('Total time: ${largeFileStopwatch.elapsedMilliseconds} ms');
     print(
-        'Req/sec (large.txt): ${(iterationsLarge / largeFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}');
+      'Req/sec (large.txt): ${(iterationsLarge / largeFileStopwatch.elapsedMicroseconds * 1000000).toStringAsFixed(2)}',
+    );
   } finally {
     tempDir.deleteSync(recursive: true);
   }
diff --git a/pkgs/shelf_static/example/example.dart b/pkgs/shelf_static/example/example.dart
index 1e37235..5b0ca0a 100644
--- a/pkgs/shelf_static/example/example.dart
+++ b/pkgs/shelf_static/example/example.dart
@@ -31,8 +31,10 @@
   }
 
   if (!FileSystemEntity.isFileSync('example/example.dart')) {
-    throw StateError('Server expects to be started the '
-        'root of the project.');
+    throw StateError(
+      'Server expects to be started the '
+      'root of the project.',
+    );
   }
   var pipeline = const shelf.Pipeline();
 
@@ -45,8 +47,13 @@
     defaultDoc = null;
   }
 
-  final handler = pipeline.addHandler(createStaticHandler('example/files',
-      defaultDocument: defaultDoc, listDirectories: listDirectories));
+  final handler = pipeline.addHandler(
+    createStaticHandler(
+      'example/files',
+      defaultDocument: defaultDoc,
+      listDirectories: listDirectories,
+    ),
+  );
 
   io.serve(handler, 'localhost', port).then((server) {
     print('Serving at http://${server.address.host}:${server.port}');
@@ -56,10 +63,13 @@
 ArgParser _getParser() => ArgParser()
   ..addFlag('logging', abbr: 'l', defaultsTo: true)
   ..addOption('port', abbr: 'p', defaultsTo: '8080')
-  ..addFlag('list-directories',
-      abbr: 'f',
-      negatable: false,
-      help: 'List the files in the source directory instead of serving the '
-          'default document - "$_defaultDoc".');
+  ..addFlag(
+    'list-directories',
+    abbr: 'f',
+    negatable: false,
+    help:
+        'List the files in the source directory instead of serving the '
+        'default document - "$_defaultDoc".',
+  );
 
 const _defaultDoc = 'index.html';
diff --git a/pkgs/shelf_static/lib/src/directory_listing.dart b/pkgs/shelf_static/lib/src/directory_listing.dart
index 4698f9c..45bf98f 100644
--- a/pkgs/shelf_static/lib/src/directory_listing.dart
+++ b/pkgs/shelf_static/lib/src/directory_listing.dart
@@ -9,7 +9,8 @@
 import 'package:path/path.dart' as path;
 import 'package:shelf/shelf.dart';
 
-String _getHeader(String sanitizedHeading) => '''<!DOCTYPE html>
+String _getHeader(String sanitizedHeading) =>
+    '''<!DOCTYPE html>
 <html>
 <head>
   <meta charset="utf-8">
@@ -163,8 +164,11 @@
   return '$y-$m-$d $h:$min';
 }
 
-Future<Response> listDirectory(String fileSystemPath, String dirPath,
-    {bool serveFilesOutsidePath = false}) async {
+Future<Response> listDirectory(
+  String fileSystemPath,
+  String dirPath, {
+  bool serveFilesOutsidePath = false,
+}) async {
   if (!serveFilesOutsidePath) {
     if (!path.isWithin(fileSystemPath, dirPath) &&
         !path.equals(fileSystemPath, dirPath)) {
@@ -213,29 +217,29 @@
     return e1.path.compareTo(e2.path);
   });
 
-  final entitiesWithStats = (await Future.wait(entities.map((e) async {
-    if (!serveFilesOutsidePath) {
-      try {
-        final resolvedPath = await e.resolveSymbolicLinks();
-        if (!path.isWithin(fileSystemPath, resolvedPath) &&
-            !path.equals(fileSystemPath, resolvedPath)) {
+  final entitiesWithStats = (await Future.wait(
+    entities.map((e) async {
+      if (!serveFilesOutsidePath) {
+        try {
+          final resolvedPath = await e.resolveSymbolicLinks();
+          if (!path.isWithin(fileSystemPath, resolvedPath) &&
+              !path.equals(fileSystemPath, resolvedPath)) {
+            return null;
+          }
+        } catch (_) {
+          // On error resolving symlink, we can't determine if it's safe.
+          // So we don't list it.
           return null;
         }
-      } catch (_) {
-        // On error resolving symlink, we can't determine if it's safe.
-        // So we don't list it.
-        return null;
       }
-    }
-    try {
-      return (e, await e.stat());
-    } catch (_) {
-      // On error stating file, we can still list it, just without details.
-      return (e, null);
-    }
-  })))
-      .whereType<(FileSystemEntity, FileStat?)>()
-      .toList();
+      try {
+        return (e, await e.stat());
+      } catch (_) {
+        // On error stating file, we can still list it, just without details.
+        return (e, null);
+      }
+    }),
+  )).whereType<(FileSystemEntity, FileStat?)>().toList();
 
   for (final (entity, stat) in entitiesWithStats) {
     final isDir = entity is Directory;
diff --git a/pkgs/shelf_static/lib/src/static_handler.dart b/pkgs/shelf_static/lib/src/static_handler.dart
index dcd7704..ca4d5bf 100644
--- a/pkgs/shelf_static/lib/src/static_handler.dart
+++ b/pkgs/shelf_static/lib/src/static_handler.dart
@@ -50,18 +50,22 @@
 ///
 /// If [maxAge] is provided, it is used to set the `Cache-Control` header
 /// with a `max-age` value in seconds.
-Handler createStaticHandler(String fileSystemPath,
-    {bool serveFilesOutsidePath = false,
-    String? defaultDocument,
-    bool listDirectories = false,
-    bool useHeaderBytesForContentType = false,
-    MimeTypeResolver? contentTypeResolver,
-    FutureOr<String?> Function(File, FileStat)? generateETag,
-    Duration? maxAge}) {
+Handler createStaticHandler(
+  String fileSystemPath, {
+  bool serveFilesOutsidePath = false,
+  String? defaultDocument,
+  bool listDirectories = false,
+  bool useHeaderBytesForContentType = false,
+  MimeTypeResolver? contentTypeResolver,
+  FutureOr<String?> Function(File, FileStat)? generateETag,
+  Duration? maxAge,
+}) {
   final rootDir = Directory(fileSystemPath);
   if (!rootDir.existsSync()) {
-    throw ArgumentError('A directory corresponding to fileSystemPath '
-        '"$fileSystemPath" could not be found');
+    throw ArgumentError(
+      'A directory corresponding to fileSystemPath '
+      '"$fileSystemPath" could not be found',
+    );
   }
 
   fileSystemPath = rootDir.resolveSymbolicLinksSync();
@@ -100,8 +104,11 @@
       if (fileFound == null && listDirectories) {
         final uri = request.requestedUri;
         if (!uri.path.endsWith('/')) return _redirectToAddTrailingSlash(uri);
-        return listDirectory(fileSystemPath, fsPath,
-            serveFilesOutsidePath: serveFilesOutsidePath);
+        return listDirectory(
+          fileSystemPath,
+          fsPath,
+          serveFilesOutsidePath: serveFilesOutsidePath,
+        );
       }
     }
 
@@ -127,31 +134,41 @@
       return _redirectToAddTrailingSlash(uri);
     }
 
-    return _handleFile(request, file, () async {
-      if (useHeaderBytesForContentType) {
-        final length =
-            math.min(mimeResolver.magicNumbersMaxLength, await file.length());
+    return _handleFile(
+      request,
+      file,
+      () async {
+        if (useHeaderBytesForContentType) {
+          final length = math.min(
+            mimeResolver.magicNumbersMaxLength,
+            await file.length(),
+          );
 
-        final byteSink = ByteAccumulatorSink();
+          final byteSink = ByteAccumulatorSink();
 
-        await file.openRead(0, length).listen(byteSink.add).asFuture<void>();
+          await file.openRead(0, length).listen(byteSink.add).asFuture<void>();
 
-        return mimeResolver.lookup(file.path, headerBytes: byteSink.bytes);
-      } else {
-        return mimeResolver.lookup(file.path);
-      }
-    }, generateETag: generateETag, maxAge: maxAge, fileStat: fileStat);
+          return mimeResolver.lookup(file.path, headerBytes: byteSink.bytes);
+        } else {
+          return mimeResolver.lookup(file.path);
+        }
+      },
+      generateETag: generateETag,
+      maxAge: maxAge,
+      fileStat: fileStat,
+    );
   };
 }
 
 Response _redirectToAddTrailingSlash(Uri uri) {
   final location = Uri(
-      scheme: uri.scheme,
-      userInfo: uri.userInfo,
-      host: uri.host,
-      port: uri.port,
-      path: '${uri.path}/',
-      query: uri.query);
+    scheme: uri.scheme,
+    userInfo: uri.userInfo,
+    host: uri.host,
+    port: uri.port,
+    path: '${uri.path}/',
+    query: uri.query,
+  );
 
   return Response.movedPermanently(location.toString());
 }
@@ -175,11 +192,13 @@
 ///
 /// If [maxAge] is provided, it is used to set the `Cache-Control` header
 /// with a `max-age` value in seconds.
-Handler createFileHandler(String path,
-    {String? url,
-    String? contentType,
-    FutureOr<String?> Function(File, FileStat)? generateETag,
-    Duration? maxAge}) {
+Handler createFileHandler(
+  String path, {
+  String? url,
+  String? contentType,
+  FutureOr<String?> Function(File, FileStat)? generateETag,
+  Duration? maxAge,
+}) {
   final file = File(path);
   if (!file.existsSync()) {
     throw ArgumentError.value(path, 'path', 'does not exist.');
@@ -192,8 +211,13 @@
 
   return (request) async {
     if (request.url.path != url) return Response.notFound('Not Found');
-    return _handleFile(request, file, () => mimeType,
-        generateETag: generateETag, maxAge: maxAge);
+    return _handleFile(
+      request,
+      file,
+      () => mimeType,
+      generateETag: generateETag,
+      maxAge: maxAge,
+    );
   };
 }
 
@@ -203,10 +227,13 @@
 /// indicates that it has the latest version of a file. Otherwise, it calls
 /// [getContentType] and uses it to populate the Content-Type header.
 Future<Response> _handleFile(
-    Request request, File file, FutureOr<String?> Function() getContentType,
-    {FutureOr<String?> Function(File, FileStat)? generateETag,
-    Duration? maxAge,
-    FileStat? fileStat}) async {
+  Request request,
+  File file,
+  FutureOr<String?> Function() getContentType, {
+  FutureOr<String?> Function(File, FileStat)? generateETag,
+  Duration? maxAge,
+  FileStat? fileStat,
+}) async {
   final stat = fileStat ?? await file.stat();
   final ifModifiedSince = request.ifModifiedSince;
   final ifNoneMatch = request.headers[HttpHeaders.ifNoneMatchHeader];
@@ -216,7 +243,7 @@
 
   final cacheHeaders = {
     HttpHeaders.lastModifiedHeader: formatHttpDate(stat.modified),
-    if (etag != null) HttpHeaders.etagHeader: etag,
+    HttpHeaders.etagHeader: ?etag,
     if (maxAge != null)
       HttpHeaders.cacheControlHeader: 'public, max-age=${maxAge.inSeconds}',
   };
@@ -242,7 +269,7 @@
   final headers = {
     ...cacheHeaders,
     HttpHeaders.acceptRangesHeader: 'bytes',
-    if (contentType != null) HttpHeaders.contentTypeHeader: contentType,
+    HttpHeaders.contentTypeHeader: ?contentType,
   };
 
   return _fileRangeResponse(request, file, stat.size, headers) ??
@@ -267,7 +294,11 @@
 ///
 /// Ranges that end past the end of the file are truncated.
 Response? _fileRangeResponse(
-    Request request, File file, int actualLength, Map<String, Object> headers) {
+  Request request,
+  File file,
+  int actualLength,
+  Map<String, Object> headers,
+) {
   final range = request.headers[HttpHeaders.rangeHeader];
   if (range == null) return null;
   final matches = _bytesMatcher.firstMatch(range);
@@ -297,10 +328,7 @@
     end = actualLength - 1;
   }
   if (start >= actualLength) {
-    return Response(
-      HttpStatus.requestedRangeNotSatisfiable,
-      headers: headers,
-    );
+    return Response(HttpStatus.requestedRangeNotSatisfiable, headers: headers);
   }
   return Response(
     HttpStatus.partialContent,
diff --git a/pkgs/shelf_static/lib/src/util.dart b/pkgs/shelf_static/lib/src/util.dart
index ba62177..3d83c6c 100644
--- a/pkgs/shelf_static/lib/src/util.dart
+++ b/pkgs/shelf_static/lib/src/util.dart
@@ -4,8 +4,7 @@
 
 DateTime toSecondResolution(DateTime dt) {
   if (dt.millisecond == 0 && dt.microsecond == 0) return dt;
-  return dt.subtract(Duration(
-    milliseconds: dt.millisecond,
-    microseconds: dt.microsecond,
-  ));
+  return dt.subtract(
+    Duration(milliseconds: dt.millisecond, microseconds: dt.microsecond),
+  );
 }
diff --git a/pkgs/shelf_static/pubspec.yaml b/pkgs/shelf_static/pubspec.yaml
index 2ef67e6..7c0caa1 100644
--- a/pkgs/shelf_static/pubspec.yaml
+++ b/pkgs/shelf_static/pubspec.yaml
@@ -9,7 +9,7 @@
   - shelf
 
 environment:
-  sdk: ^3.3.0
+  sdk: ^3.9.0
 
 dependencies:
   convert: ^3.0.0
diff --git a/pkgs/shelf_static/test/alternative_root_test.dart b/pkgs/shelf_static/test/alternative_root_test.dart
index 3a18e96..202eca3 100644
--- a/pkgs/shelf_static/test/alternative_root_test.dart
+++ b/pkgs/shelf_static/test/alternative_root_test.dart
@@ -15,15 +15,18 @@
     await d.file('root.txt', 'root txt').create();
     await d.dir('files', [
       d.file('test.txt', 'test txt content'),
-      d.file('with space.txt', 'with space content')
+      d.file('with space.txt', 'with space content'),
     ]).create();
   });
 
   test('access root file', () async {
     final handler = createStaticHandler(d.sandbox);
 
-    final response =
-        await makeRequest(handler, '/static/root.txt', handlerPath: 'static');
+    final response = await makeRequest(
+      handler,
+      '/static/root.txt',
+      handlerPath: 'static',
+    );
     expect(response.statusCode, HttpStatus.ok);
     expect(response.contentLength, 8);
     expect(response.readAsString(), completion('root txt'));
@@ -33,8 +36,10 @@
     final handler = createStaticHandler(d.sandbox);
 
     final response = await makeRequest(
-        handler, '/static/files/with%20space.txt',
-        handlerPath: 'static');
+      handler,
+      '/static/files/with%20space.txt',
+      handlerPath: 'static',
+    );
     expect(response.statusCode, HttpStatus.ok);
     expect(response.contentLength, 18);
     expect(response.readAsString(), completion('with space content'));
@@ -44,8 +49,10 @@
     final handler = createStaticHandler(d.sandbox);
 
     final response = await makeRequest(
-        handler, '/static/files/with%20space.txt',
-        handlerPath: 'static');
+      handler,
+      '/static/files/with%20space.txt',
+      handlerPath: 'static',
+    );
     expect(response.statusCode, HttpStatus.ok);
     expect(response.contentLength, 18);
     expect(response.readAsString(), completion('with space content'));
@@ -54,8 +61,11 @@
   test('access file under directory', () async {
     final handler = createStaticHandler(d.sandbox);
 
-    final response = await makeRequest(handler, '/static/files/test.txt',
-        handlerPath: 'static');
+    final response = await makeRequest(
+      handler,
+      '/static/files/test.txt',
+      handlerPath: 'static',
+    );
     expect(response.statusCode, HttpStatus.ok);
     expect(response.contentLength, 16);
     expect(response.readAsString(), completion('test txt content'));
@@ -64,8 +74,11 @@
   test('file not found', () async {
     final handler = createStaticHandler(d.sandbox);
 
-    final response = await makeRequest(handler, '/static/not_here.txt',
-        handlerPath: 'static');
+    final response = await makeRequest(
+      handler,
+      '/static/not_here.txt',
+      handlerPath: 'static',
+    );
     expect(response.statusCode, HttpStatus.notFound);
   });
 }
diff --git a/pkgs/shelf_static/test/basic_file_test.dart b/pkgs/shelf_static/test/basic_file_test.dart
index bc86f98..d76ffd9 100644
--- a/pkgs/shelf_static/test/basic_file_test.dart
+++ b/pkgs/shelf_static/test/basic_file_test.dart
@@ -35,7 +35,7 @@
       d.file('test.txt', 'test txt content'),
       d.file('with space.txt', 'with space content'),
       d.file('header_bytes_test_image', base64Decode(pngBytesContent)),
-      d.file('header_bytes_test_webp', base64Decode(webpBytesContent))
+      d.file('header_bytes_test_webp', base64Decode(webpBytesContent)),
     ]).create();
   });
 
@@ -109,11 +109,14 @@
       final modified = File(rootPath).statSync().modified.toUtc();
 
       final headers = {
-        HttpHeaders.ifModifiedSinceHeader: formatHttpDate(modified)
+        HttpHeaders.ifModifiedSinceHeader: formatHttpDate(modified),
       };
 
-      final response =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response.statusCode, HttpStatus.notModified);
       expect(response.contentLength, 0);
     });
@@ -125,12 +128,16 @@
       final modified = File(rootPath).statSync().modified.toUtc();
 
       final headers = {
-        HttpHeaders.ifModifiedSinceHeader:
-            formatHttpDate(modified.subtract(const Duration(seconds: 1)))
+        HttpHeaders.ifModifiedSinceHeader: formatHttpDate(
+          modified.subtract(const Duration(seconds: 1)),
+        ),
       };
 
-      final response =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response.statusCode, HttpStatus.ok);
       expect(response.lastModified, atSameTimeToSecond(modified));
     });
@@ -142,12 +149,16 @@
       final modified = File(rootPath).statSync().modified.toUtc();
 
       final headers = {
-        HttpHeaders.ifModifiedSinceHeader:
-            formatHttpDate(modified.add(const Duration(seconds: 1)))
+        HttpHeaders.ifModifiedSinceHeader: formatHttpDate(
+          modified.add(const Duration(seconds: 1)),
+        ),
       };
 
-      final response =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response.statusCode, HttpStatus.notModified);
       expect(response.contentLength, 0);
     });
@@ -169,15 +180,21 @@
       File(rootPath).writeAsStringSync('updated root txt');
 
       final headers = {
-        HttpHeaders.ifModifiedSinceHeader:
-            formatHttpDate(originalModificationDate)
+        HttpHeaders.ifModifiedSinceHeader: formatHttpDate(
+          originalModificationDate,
+        ),
       };
 
-      final response2 =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response2 = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response2.statusCode, HttpStatus.ok);
-      expect(response2.lastModified!.millisecondsSinceEpoch,
-          greaterThan(originalModificationDate.millisecondsSinceEpoch));
+      expect(
+        response2.lastModified!.millisecondsSinceEpoch,
+        greaterThan(originalModificationDate.millisecondsSinceEpoch),
+      );
     });
   });
 
@@ -191,8 +208,11 @@
 
       final headers = {HttpHeaders.ifNoneMatchHeader: etag!};
 
-      final response2 =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response2 = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response2.statusCode, HttpStatus.notModified);
       expect(response2.contentLength, 0);
     });
@@ -202,8 +222,11 @@
 
       final headers = {HttpHeaders.ifNoneMatchHeader: '"not-the-right-etag"'};
 
-      final response =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response.statusCode, HttpStatus.ok);
       expect(response.contentLength, 8);
     });
@@ -216,8 +239,11 @@
 
       final headers = {HttpHeaders.ifNoneMatchHeader: '"other-etag", $etag'};
 
-      final response2 =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response2 = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response2.statusCode, HttpStatus.notModified);
     });
 
@@ -226,26 +252,36 @@
 
       final headers = {HttpHeaders.ifNoneMatchHeader: '*'};
 
-      final response =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response.statusCode, HttpStatus.notModified);
     });
 
     test('custom etag generator', () async {
-      final handler = createStaticHandler(d.sandbox,
-          generateETag: (file, stat) => 'custom');
+      final handler = createStaticHandler(
+        d.sandbox,
+        generateETag: (file, stat) => 'custom',
+      );
 
       final headers = {HttpHeaders.ifNoneMatchHeader: 'custom'};
 
-      final response =
-          await makeRequest(handler, '/root.txt', headers: headers);
+      final response = await makeRequest(
+        handler,
+        '/root.txt',
+        headers: headers,
+      );
       expect(response.statusCode, HttpStatus.notModified);
       expect(response.headers[HttpHeaders.etagHeader], 'custom');
     });
 
     test('disable etag', () async {
-      final handler =
-          createStaticHandler(d.sandbox, generateETag: (file, stat) => null);
+      final handler = createStaticHandler(
+        d.sandbox,
+        generateETag: (file, stat) => null,
+      );
 
       final response = await makeRequest(handler, '/root.txt');
       expect(response.headers.keys, isNot(contains(HttpHeaders.etagHeader)));
@@ -254,20 +290,26 @@
 
   group('cache control', () {
     test('maxAge adds header', () async {
-      final handler =
-          createStaticHandler(d.sandbox, maxAge: const Duration(seconds: 3600));
+      final handler = createStaticHandler(
+        d.sandbox,
+        maxAge: const Duration(seconds: 3600),
+      );
 
       final response = await makeRequest(handler, '/root.txt');
-      expect(response.headers[HttpHeaders.cacheControlHeader],
-          'public, max-age=3600');
+      expect(
+        response.headers[HttpHeaders.cacheControlHeader],
+        'public, max-age=3600',
+      );
     });
 
     test('no maxAge means no header', () async {
       final handler = createStaticHandler(d.sandbox);
 
       final response = await makeRequest(handler, '/root.txt');
-      expect(response.headers.keys,
-          isNot(contains(HttpHeaders.cacheControlHeader)));
+      expect(
+        response.headers.keys,
+        isNot(contains(HttpHeaders.cacheControlHeader)),
+      );
     });
   });
 
@@ -294,11 +336,15 @@
     });
 
     test('header_bytes_test_image should be image/png', () async {
-      final handler =
-          createStaticHandler(d.sandbox, useHeaderBytesForContentType: true);
+      final handler = createStaticHandler(
+        d.sandbox,
+        useHeaderBytesForContentType: true,
+      );
 
-      final response =
-          await makeRequest(handler, '/files/header_bytes_test_image');
+      final response = await makeRequest(
+        handler,
+        '/files/header_bytes_test_image',
+      );
       expect(response.mimeType, 'image/png');
     });
 
@@ -307,19 +353,24 @@
         ..addMagicNumber(
           <int>[
             0x52, 0x49, 0x46, 0x46, 0x00, 0x00, //
-            0x00, 0x00, 0x57, 0x45, 0x42, 0x50
+            0x00, 0x00, 0x57, 0x45, 0x42, 0x50,
           ],
           'image/webp',
           mask: <int>[
             0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, //
-            0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF
+            0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
           ],
         );
-      final handler = createStaticHandler(d.sandbox,
-          useHeaderBytesForContentType: true, contentTypeResolver: resolver);
+      final handler = createStaticHandler(
+        d.sandbox,
+        useHeaderBytesForContentType: true,
+        contentTypeResolver: resolver,
+      );
 
-      final response =
-          await makeRequest(handler, '/files/header_bytes_test_webp');
+      final response = await makeRequest(
+        handler,
+        '/files/header_bytes_test_webp',
+      );
       expect(response.mimeType, 'image/webp');
     });
   });
diff --git a/pkgs/shelf_static/test/create_file_handler_test.dart b/pkgs/shelf_static/test/create_file_handler_test.dart
index 91c4c86..31f0899 100644
--- a/pkgs/shelf_static/test/create_file_handler_test.dart
+++ b/pkgs/shelf_static/test/create_file_handler_test.dart
@@ -32,8 +32,10 @@
   });
 
   test('serves the file contents under a custom URL', () async {
-    final handler =
-        createFileHandler(p.join(d.sandbox, 'file.txt'), url: 'foo/bar');
+    final handler = createFileHandler(
+      p.join(d.sandbox, 'file.txt'),
+      url: 'foo/bar',
+    );
     final response = await makeRequest(handler, '/foo/bar');
     expect(response.statusCode, equals(HttpStatus.ok));
     expect(response.contentLength, equals(8));
@@ -41,8 +43,10 @@
   });
 
   test("serves a 404 if the custom URL isn't matched", () async {
-    final handler =
-        createFileHandler(p.join(d.sandbox, 'file.txt'), url: 'foo/bar');
+    final handler = createFileHandler(
+      p.join(d.sandbox, 'file.txt'),
+      url: 'foo/bar',
+    );
     final response = await makeRequest(handler, '/file.txt');
     expect(response.statusCode, equals(HttpStatus.notFound));
   });
@@ -63,8 +67,10 @@
     });
 
     test('comes from the contentType parameter', () async {
-      final handler = createFileHandler(p.join(d.sandbox, 'file.txt'),
-          contentType: 'something/weird');
+      final handler = createFileHandler(
+        p.join(d.sandbox, 'file.txt'),
+        contentType: 'something/weird',
+      );
       final response = await makeRequest(handler, '/file.txt');
       expect(response.statusCode, equals(HttpStatus.ok));
       expect(response.mimeType, equals('something/weird'));
@@ -98,10 +104,7 @@
         '/file.txt',
         headers: {'range': 'bytes=0-9'},
       );
-      expect(
-        response.statusCode,
-        equals(HttpStatus.partialContent),
-      );
+      expect(response.statusCode, equals(HttpStatus.partialContent));
       expect(
         response.headers,
         containsPair(HttpHeaders.acceptRangesHeader, 'bytes'),
@@ -125,10 +128,7 @@
         response.headers,
         containsPair(HttpHeaders.acceptRangesHeader, 'bytes'),
       );
-      expect(
-        response.statusCode,
-        HttpStatus.requestedRangeNotSatisfiable,
-      );
+      expect(response.statusCode, HttpStatus.requestedRangeNotSatisfiable);
     });
 
     test('ignores invalid request with start > end', () async {
@@ -182,15 +182,20 @@
 
   group('throws an ArgumentError for', () {
     test("a file that doesn't exist", () {
-      expect(() => createFileHandler(p.join(d.sandbox, 'nothing.txt')),
-          throwsArgumentError);
+      expect(
+        () => createFileHandler(p.join(d.sandbox, 'nothing.txt')),
+        throwsArgumentError,
+      );
     });
 
     test('an absolute URL', () {
       expect(
-          () => createFileHandler(p.join(d.sandbox, 'nothing.txt'),
-              url: '/foo/bar'),
-          throwsArgumentError);
+        () => createFileHandler(
+          p.join(d.sandbox, 'nothing.txt'),
+          url: '/foo/bar',
+        ),
+        throwsArgumentError,
+      );
     });
   });
 }
diff --git a/pkgs/shelf_static/test/default_document_test.dart b/pkgs/shelf_static/test/default_document_test.dart
index c6b5fb1..f83cf1b 100644
--- a/pkgs/shelf_static/test/default_document_test.dart
+++ b/pkgs/shelf_static/test/default_document_test.dart
@@ -16,7 +16,7 @@
     await d.file('root.txt', 'root txt').create();
     await d.dir('files', [
       d.file('index.html', '<html><body>files</body></html>'),
-      d.file('with space.txt', 'with space content')
+      d.file('with space.txt', 'with space content'),
     ]).create();
   });
 
@@ -27,12 +27,14 @@
         '/bar.txt',
         '//bar.txt',
         '//news/bar.txt',
-        'foo/../bar.txt'
+        'foo/../bar.txt',
       ];
 
       for (var val in invalidValues) {
-        expect(() => createStaticHandler(d.sandbox, defaultDocument: val),
-            throwsArgumentError);
+        expect(
+          () => createStaticHandler(d.sandbox, defaultDocument: val),
+          throwsArgumentError,
+        );
       }
     });
   });
@@ -71,8 +73,10 @@
 
   group('default document specified', () {
     test('access "/index.html"', () async {
-      final handler =
-          createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+      final handler = createStaticHandler(
+        d.sandbox,
+        defaultDocument: 'index.html',
+      );
 
       final response = await makeRequest(handler, '/index.html');
       expect(response.statusCode, HttpStatus.ok);
@@ -82,8 +86,10 @@
     });
 
     test('access "/"', () async {
-      final handler =
-          createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+      final handler = createStaticHandler(
+        d.sandbox,
+        defaultDocument: 'index.html',
+      );
 
       final response = await makeRequest(handler, '/');
       expect(response.statusCode, HttpStatus.ok);
@@ -93,24 +99,32 @@
     });
 
     test('access "/files"', () async {
-      final handler =
-          createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+      final handler = createStaticHandler(
+        d.sandbox,
+        defaultDocument: 'index.html',
+      );
 
       final response = await makeRequest(handler, '/files');
       expect(response.statusCode, HttpStatus.movedPermanently);
-      expect(response.headers,
-          containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'));
+      expect(
+        response.headers,
+        containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'),
+      );
     });
 
     test('access "/files/" dir', () async {
-      final handler =
-          createStaticHandler(d.sandbox, defaultDocument: 'index.html');
+      final handler = createStaticHandler(
+        d.sandbox,
+        defaultDocument: 'index.html',
+      );
 
       final response = await makeRequest(handler, '/files/');
       expect(response.statusCode, HttpStatus.ok);
       expect(response.contentLength, 31);
-      expect(response.readAsString(),
-          completion('<html><body>files</body></html>'));
+      expect(
+        response.readAsString(),
+        completion('<html><body>files</body></html>'),
+      );
       expect(response.mimeType, 'text/html');
     });
   });
diff --git a/pkgs/shelf_static/test/directory_listing_test.dart b/pkgs/shelf_static/test/directory_listing_test.dart
index 4846428..488b62f 100644
--- a/pkgs/shelf_static/test/directory_listing_test.dart
+++ b/pkgs/shelf_static/test/directory_listing_test.dart
@@ -41,8 +41,10 @@
 
     final response = await makeRequest(handler, '/files');
     expect(response.statusCode, HttpStatus.movedPermanently);
-    expect(response.headers,
-        containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'));
+    expect(
+      response.headers,
+      containsPair(HttpHeaders.locationHeader, 'http://localhost/files/'),
+    );
   });
 
   test('access "/files/"', () async {
@@ -59,9 +61,12 @@
     final response = await makeRequest(handler, '/files/empty subfolder');
     expect(response.statusCode, HttpStatus.movedPermanently);
     expect(
-        response.headers,
-        containsPair(HttpHeaders.locationHeader,
-            'http://localhost/files/empty%20subfolder/'));
+      response.headers,
+      containsPair(
+        HttpHeaders.locationHeader,
+        'http://localhost/files/empty%20subfolder/',
+      ),
+    );
   });
 
   test('access "/files/empty subfolder/"', () async {
@@ -117,49 +122,59 @@
   });
 
   test('allows directory traversal if serveFilesOutsidePath is true', () async {
-    final response = await listDirectory(d.sandbox, p.join(d.sandbox, '..'),
-        serveFilesOutsidePath: true);
+    final response = await listDirectory(
+      d.sandbox,
+      p.join(d.sandbox, '..'),
+      serveFilesOutsidePath: true,
+    );
     expect(response.statusCode, HttpStatus.ok);
   });
 
-  test('blocks directory traversal via symlinks in directory listings',
-      () async {
-    // Create a symlink pointing outside the `files` directory but within
-    // sandbox.
-    // The handler root is `files`, so `outside.txt` is outside root.
-    await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
+  test(
+    'blocks directory traversal via symlinks in directory listings',
+    () async {
+      // Create a symlink pointing outside the `files` directory but within
+      // sandbox.
+      // The handler root is `files`, so `outside.txt` is outside root.
+      await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
 
-    // We serve from d.sandbox/files
-    final filesDir = p.join(d.sandbox, 'files');
+      // We serve from d.sandbox/files
+      final filesDir = p.join(d.sandbox, 'files');
 
-    // Create symlink inside `files` pointing to `outside`
-    final linkPath = p.join(filesDir, 'symlink');
-    Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
+      // Create symlink inside `files` pointing to `outside`
+      final linkPath = p.join(filesDir, 'symlink');
+      Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
 
-    final response = await listDirectory(filesDir, filesDir);
-    expect(response.statusCode, HttpStatus.ok);
+      final response = await listDirectory(filesDir, filesDir);
+      expect(response.statusCode, HttpStatus.ok);
 
-    final html = await response.readAsString();
-    // Symlink pointing outside should not be listed if
-    // serveFilesOutsidePath is false
-    expect(html, isNot(contains('symlink')));
-  });
+      final html = await response.readAsString();
+      // Symlink pointing outside should not be listed if
+      // serveFilesOutsidePath is false
+      expect(html, isNot(contains('symlink')));
+    },
+  );
 
-  test('allows symlinks out of root if serveFilesOutsidePath is true',
-      () async {
-    await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
-    final filesDir = p.join(d.sandbox, 'files');
+  test(
+    'allows symlinks out of root if serveFilesOutsidePath is true',
+    () async {
+      await d.dir('outside', [d.file('outside.txt', 'contents')]).create();
+      final filesDir = p.join(d.sandbox, 'files');
 
-    final linkPath = p.join(filesDir, 'symlink_out');
-    Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
+      final linkPath = p.join(filesDir, 'symlink_out');
+      Link(linkPath).createSync(p.join(d.sandbox, 'outside'));
 
-    final response =
-        await listDirectory(filesDir, filesDir, serveFilesOutsidePath: true);
-    expect(response.statusCode, HttpStatus.ok);
+      final response = await listDirectory(
+        filesDir,
+        filesDir,
+        serveFilesOutsidePath: true,
+      );
+      expect(response.statusCode, HttpStatus.ok);
 
-    final html = await response.readAsString();
-    expect(html, contains('symlink_out'));
-  });
+      final html = await response.readAsString();
+      expect(html, contains('symlink_out'));
+    },
+  );
 
   test('gracefully ignores broken symlinks in directory listings', () async {
     final filesDir = p.join(d.sandbox, 'files');
diff --git a/pkgs/shelf_static/test/get_handler_test.dart b/pkgs/shelf_static/test/get_handler_test.dart
index 5ca5c80..029f083 100644
--- a/pkgs/shelf_static/test/get_handler_test.dart
+++ b/pkgs/shelf_static/test/get_handler_test.dart
@@ -12,7 +12,7 @@
     await d.file('root.txt', 'root txt').create();
     await d.dir('files', [
       d.file('test.txt', 'test txt content'),
-      d.file('with space.txt', 'with space content')
+      d.file('with space.txt', 'with space content'),
     ]).create();
   });
 
diff --git a/pkgs/shelf_static/test/sample_test.dart b/pkgs/shelf_static/test/sample_test.dart
index 0a0249a..6b2259e 100644
--- a/pkgs/shelf_static/test/sample_test.dart
+++ b/pkgs/shelf_static/test/sample_test.dart
@@ -65,7 +65,9 @@
 }
 
 Future<void> _expectCompletesWithBytes(
-    Response response, List<int> expectedBytes) async {
+  Response response,
+  List<int> expectedBytes,
+) async {
   final bytes = await response.read().toList();
   final flatBytes = bytes.expand((e) => e);
   expect(flatBytes, orderedEquals(expectedBytes));
diff --git a/pkgs/shelf_static/test/symbolic_link_test.dart b/pkgs/shelf_static/test/symbolic_link_test.dart
index 80ba32c..f82b1b0 100644
--- a/pkgs/shelf_static/test/symbolic_link_test.dart
+++ b/pkgs/shelf_static/test/symbolic_link_test.dart
@@ -17,9 +17,7 @@
 
 void main() {
   setUp(() async {
-    await d.dir('originals', [
-      d.file('index.html', '<html></html>'),
-    ]).create();
+    await d.dir('originals', [d.file('index.html', '<html></html>')]).create();
 
     await d.dir('alt_root').create();
 
@@ -30,8 +28,9 @@
 
     Link(p.join(d.sandbox, 'link_dir')).createSync(originalsDir);
 
-    Link(p.join(d.sandbox, 'alt_root', 'link_index.html'))
-        .createSync(originalsIndex);
+    Link(
+      p.join(d.sandbox, 'alt_root', 'link_index.html'),
+    ).createSync(originalsIndex);
 
     Link(p.join(d.sandbox, 'alt_root', 'link_dir')).createSync(originalsDir);
   });
@@ -47,18 +46,14 @@
     });
 
     group('links under root dir', () {
-      test(
-        'access sym linked file in real dir',
-        () async {
-          final handler = createStaticHandler(d.sandbox);
+      test('access sym linked file in real dir', () async {
+        final handler = createStaticHandler(d.sandbox);
 
-          final response = await makeRequest(handler, '/link_index.html');
-          expect(response.statusCode, HttpStatus.ok);
-          expect(response.contentLength, 13);
-          expect(response.readAsString(), completion('<html></html>'));
-        },
-        onPlatform: _skipSymlinksOnWindows,
-      );
+        final response = await makeRequest(handler, '/link_index.html');
+        expect(response.statusCode, HttpStatus.ok);
+        expect(response.contentLength, 13);
+        expect(response.readAsString(), completion('<html></html>'));
+      }, onPlatform: _skipSymlinksOnWindows);
 
       test('access file in sym linked dir', () async {
         final handler = createStaticHandler(d.sandbox);
@@ -89,8 +84,10 @@
 
   group('access outside of root enabled', () {
     test('access real file', () async {
-      final handler =
-          createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+      final handler = createStaticHandler(
+        d.sandbox,
+        serveFilesOutsidePath: true,
+      );
 
       final response = await makeRequest(handler, '/originals/index.html');
       expect(response.statusCode, HttpStatus.ok);
@@ -99,23 +96,23 @@
     });
 
     group('links under root dir', () {
-      test(
-        'access sym linked file in real dir',
-        () async {
-          final handler =
-              createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+      test('access sym linked file in real dir', () async {
+        final handler = createStaticHandler(
+          d.sandbox,
+          serveFilesOutsidePath: true,
+        );
 
-          final response = await makeRequest(handler, '/link_index.html');
-          expect(response.statusCode, HttpStatus.ok);
-          expect(response.contentLength, 13);
-          expect(response.readAsString(), completion('<html></html>'));
-        },
-        onPlatform: _skipSymlinksOnWindows,
-      );
+        final response = await makeRequest(handler, '/link_index.html');
+        expect(response.statusCode, HttpStatus.ok);
+        expect(response.contentLength, 13);
+        expect(response.readAsString(), completion('<html></html>'));
+      }, onPlatform: _skipSymlinksOnWindows);
 
       test('access file in sym linked dir', () async {
-        final handler =
-            createStaticHandler(d.sandbox, serveFilesOutsidePath: true);
+        final handler = createStaticHandler(
+          d.sandbox,
+          serveFilesOutsidePath: true,
+        );
 
         final response = await makeRequest(handler, '/link_dir/index.html');
         expect(response.statusCode, HttpStatus.ok);
@@ -125,23 +122,23 @@
     });
 
     group('links not under root dir', () {
-      test(
-        'access sym linked file in real dir',
-        () async {
-          final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),
-              serveFilesOutsidePath: true);
+      test('access sym linked file in real dir', () async {
+        final handler = createStaticHandler(
+          p.join(d.sandbox, 'alt_root'),
+          serveFilesOutsidePath: true,
+        );
 
-          final response = await makeRequest(handler, '/link_index.html');
-          expect(response.statusCode, HttpStatus.ok);
-          expect(response.contentLength, 13);
-          expect(response.readAsString(), completion('<html></html>'));
-        },
-        onPlatform: _skipSymlinksOnWindows,
-      );
+        final response = await makeRequest(handler, '/link_index.html');
+        expect(response.statusCode, HttpStatus.ok);
+        expect(response.contentLength, 13);
+        expect(response.readAsString(), completion('<html></html>'));
+      }, onPlatform: _skipSymlinksOnWindows);
 
       test('access file in sym linked dir', () async {
-        final handler = createStaticHandler(p.join(d.sandbox, 'alt_root'),
-            serveFilesOutsidePath: true);
+        final handler = createStaticHandler(
+          p.join(d.sandbox, 'alt_root'),
+          serveFilesOutsidePath: true,
+        );
 
         final response = await makeRequest(handler, '/link_dir/index.html');
         expect(response.statusCode, HttpStatus.ok);
diff --git a/pkgs/shelf_static/test/test_util.dart b/pkgs/shelf_static/test/test_util.dart
index 81d5ead..3b65e54 100644
--- a/pkgs/shelf_static/test/test_util.dart
+++ b/pkgs/shelf_static/test/test_util.dart
@@ -25,8 +25,7 @@
   String path,
   Map<String, String>? headers, {
   required String method,
-}) =>
-    Request(method, Uri.parse('http://localhost$path'), headers: headers);
+}) => Request(method, Uri.parse('http://localhost$path'), headers: headers);
 
 Handler _rootHandler(String? path, Handler handler) {
   if (path == null || path.isEmpty) {
@@ -52,7 +51,7 @@
   final DateTime _target;
 
   _SecondResolutionDateTimeMatcher(DateTime target)
-      : _target = toSecondResolution(target);
+    : _target = toSecondResolution(target);
 
   @override
   bool matches(dynamic item, Map<dynamic, dynamic> matchState) {
@@ -62,9 +61,10 @@
   }
 
   @override
-  Description describe(Description description) =>
-      description.add('Must be at the same moment as $_target with resolution '
-          'to the second.');
+  Description describe(Description description) => description.add(
+    'Must be at the same moment as $_target with resolution '
+    'to the second.',
+  );
 }
 
 bool _datesEqualToSecond(DateTime d1, DateTime d2) =>
diff --git a/pkgs/shelf_test_handler/CHANGELOG.md b/pkgs/shelf_test_handler/CHANGELOG.md
index cb89546..253514b 100644
--- a/pkgs/shelf_test_handler/CHANGELOG.md
+++ b/pkgs/shelf_test_handler/CHANGELOG.md
@@ -2,7 +2,7 @@
 
 * Require `shelf: ^1.1.0`
 * Require `test: ^1.25.15`
-* Require `sdk: ^3.5.0`.
+* Require Dart `^3.9.0`.
 
 ## 2.0.2
 
diff --git a/pkgs/shelf_test_handler/lib/src/expectation.dart b/pkgs/shelf_test_handler/lib/src/expectation.dart
index c08808b..6b02323 100644
--- a/pkgs/shelf_test_handler/lib/src/expectation.dart
+++ b/pkgs/shelf_test_handler/lib/src/expectation.dart
@@ -20,7 +20,5 @@
   Expectation(this.method, this.path, this.handler);
 
   /// Creates an expectation that allows any method and path.
-  Expectation.anything(this.handler)
-      : method = null,
-        path = null;
+  Expectation.anything(this.handler) : method = null, path = null;
 }
diff --git a/pkgs/shelf_test_handler/lib/src/handler.dart b/pkgs/shelf_test_handler/lib/src/handler.dart
index f2b77da..d446da3 100644
--- a/pkgs/shelf_test_handler/lib/src/handler.dart
+++ b/pkgs/shelf_test_handler/lib/src/handler.dart
@@ -34,9 +34,9 @@
   /// The [description] is used in debugging output for this handler. It
   /// defaults to "ShelfTestHandler".
   ShelfTestHandler({bool log = true, String? description})
-      : _log = log,
-        description = description ?? 'ShelfTestHandler',
-        _zone = Zone.current;
+    : _log = log,
+      description = description ?? 'ShelfTestHandler',
+      _zone = Zone.current;
 
   /// Expects that a single HTTP request with the given [method] and [path] will
   /// be made to `this`.
@@ -69,7 +69,8 @@
     try {
       if (_expectations.isEmpty) {
         throw TestFailure(
-            '$description received unexpected request $requestInfo.');
+          '$description received unexpected request $requestInfo.',
+        );
       }
 
       var expectation = _expectations.removeFirst();
diff --git a/pkgs/shelf_test_handler/lib/src/server.dart b/pkgs/shelf_test_handler/lib/src/server.dart
index d784ae4..ab1cad9 100644
--- a/pkgs/shelf_test_handler/lib/src/server.dart
+++ b/pkgs/shelf_test_handler/lib/src/server.dart
@@ -32,8 +32,10 @@
   ///
   /// The [description] is used in debugging output for this handler. It
   /// defaults to "ShelfTestHandler".
-  static Future<ShelfTestServer> create(
-      {bool log = true, String? description}) async {
+  static Future<ShelfTestServer> create({
+    bool log = true,
+    String? description,
+  }) async {
     var server = await HttpMultiServer.loopback(0);
     var handler = ShelfTestHandler(log: log, description: description);
     serveRequests(server, handler.call);
diff --git a/pkgs/shelf_test_handler/pubspec.yaml b/pkgs/shelf_test_handler/pubspec.yaml
index c842049..eb43bbc 100644
--- a/pkgs/shelf_test_handler/pubspec.yaml
+++ b/pkgs/shelf_test_handler/pubspec.yaml
@@ -9,7 +9,7 @@
   - shelf
 
 environment:
-  sdk: ^3.5.0
+  sdk: ^3.9.0
 
 dependencies:
   http_multi_server: ^3.0.0
diff --git a/pkgs/shelf_test_handler/test/handler_test.dart b/pkgs/shelf_test_handler/test/handler_test.dart
index 5b91119..7994c7a 100644
--- a/pkgs/shelf_test_handler/test/handler_test.dart
+++ b/pkgs/shelf_test_handler/test/handler_test.dart
@@ -43,11 +43,13 @@
     });
 
     test('for expectAnything()', () async {
-      handler.expectAnything(expectAsync1((request) {
-        expect(request.method, equals('GET'));
-        expect(request.url.path, equals('foo/bar'));
-        return Response.ok('');
-      }));
+      handler.expectAnything(
+        expectAsync1((request) {
+          expect(request.method, equals('GET'));
+          expect(request.url.path, equals('foo/bar'));
+          return Response.ok('');
+        }),
+      );
 
       var response = await handler(_get('/foo/bar'));
       expect(response.statusCode, equals(200));
@@ -75,14 +77,12 @@
       _expectZoneFailure(() async {
         var handler = ShelfTestHandler();
         handler.expect(
-            'POST',
-            '/',
-            expectAsync1(
-              (_) {
-                fail('should never get here');
-              },
-              count: 0,
-            ));
+          'POST',
+          '/',
+          expectAsync1((_) {
+            fail('should never get here');
+          }, count: 0),
+        );
         await handler(_get('/'));
       });
     });
@@ -91,32 +91,41 @@
       _expectZoneFailure(() async {
         var handler = ShelfTestHandler();
         handler.expect(
-            'GET',
-            '/foo',
-            expectAsync1((_) {
-              fail('should never get here');
-            }, count: 0));
+          'GET',
+          '/foo',
+          expectAsync1((_) {
+            fail('should never get here');
+          }, count: 0),
+        );
         await handler(_get('/'));
       });
     });
   });
 
   test("doesn't swallow handler errors", () {
-    runZonedGuarded(() async {
-      var handler = ShelfTestHandler();
-      handler.expect('GET', '/', (_) => throw StateError('oh heck'));
-      await handler(_get('/'));
-    }, expectAsync2((error, stack) {
-      expect(error,
-          isA<StateError>().having((p0) => p0.message, 'message', 'oh heck'));
-    }));
+    runZonedGuarded(
+      () async {
+        var handler = ShelfTestHandler();
+        handler.expect('GET', '/', (_) => throw StateError('oh heck'));
+        await handler(_get('/'));
+      },
+      expectAsync2((error, stack) {
+        expect(
+          error,
+          isA<StateError>().having((p0) => p0.message, 'message', 'oh heck'),
+        );
+      }),
+    );
   });
 }
 
 void _expectZoneFailure(Future<void> Function() callback) {
-  runZonedGuarded(callback, expectAsync2((error, stack) {
-    expect(error, isA<TestFailure>());
-  }));
+  runZonedGuarded(
+    callback,
+    expectAsync2((error, stack) {
+      expect(error, isA<TestFailure>());
+    }),
+  );
 }
 
 Request _get(String path) =>
diff --git a/pkgs/shelf_test_handler/test/server_test.dart b/pkgs/shelf_test_handler/test/server_test.dart
index d92e85e..314398a 100644
--- a/pkgs/shelf_test_handler/test/server_test.dart
+++ b/pkgs/shelf_test_handler/test/server_test.dart
@@ -28,14 +28,18 @@
     var server = await ShelfTestServer.create();
     addTearDown(server.close);
 
-    server.handler.expect('GET', '/',
-        webSocketHandler((WebSocketChannel webSocket, _) {
-      webSocket.sink.add('hello!');
-      webSocket.sink.close();
-    }));
+    server.handler.expect(
+      'GET',
+      '/',
+      webSocketHandler((WebSocketChannel webSocket, _) {
+        webSocket.sink.add('hello!');
+        webSocket.sink.close();
+      }),
+    );
 
-    var webSocket =
-        await WebSocket.connect('ws://localhost:${server.url.port}');
+    var webSocket = await WebSocket.connect(
+      'ws://localhost:${server.url.port}',
+    );
     expect(webSocket, emits('hello!'));
   });
 }
diff --git a/pkgs/shelf_web_socket/CHANGELOG.md b/pkgs/shelf_web_socket/CHANGELOG.md
index 980b77f..e5d0c67 100644
--- a/pkgs/shelf_web_socket/CHANGELOG.md
+++ b/pkgs/shelf_web_socket/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 3.0.1-wip
 
+* Require Dart `^3.9.0`.
+
 ## 3.0.0
 
 * **BREAKING:**: Change the signature of the `webSocketHandler` method's
diff --git a/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart b/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart
index e86010f..d2c36c2 100644
--- a/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart
+++ b/pkgs/shelf_web_socket/lib/src/web_socket_handler.dart
@@ -13,8 +13,8 @@
 ///
 /// This takes a [WebSocketChannel] as its first argument and an optional
 /// [subprotocol] as its second argument.
-typedef ConnectionCallback = void Function(
-    WebSocketChannel webSocket, String? subprotocol);
+typedef ConnectionCallback =
+    void Function(WebSocketChannel webSocket, String? subprotocol);
 
 /// A class that exposes a handler for upgrading WebSocket requests.
 class WebSocketHandler {
@@ -30,8 +30,12 @@
   /// The ping interval used for verifying connection, or `null`.
   final Duration? _pingInterval;
 
-  WebSocketHandler(this._onConnection, this._protocols, this._allowedOrigins,
-      this._pingInterval);
+  WebSocketHandler(
+    this._onConnection,
+    this._protocols,
+    this._allowedOrigins,
+    this._pingInterval,
+  );
 
   /// The [Handler].
   Response handle(Request request) {
@@ -39,8 +43,10 @@
 
     final connection = request.headers['Connection'];
     if (connection == null) return _notFound();
-    final tokens =
-        connection.toLowerCase().split(',').map((token) => token.trim());
+    final tokens = connection
+        .toLowerCase()
+        .split(',')
+        .map((token) => token.trim());
     if (!tokens.contains('upgrade')) return _notFound();
 
     final upgrade = request.headers['Upgrade'];
@@ -55,16 +61,20 @@
     }
 
     if (request.protocolVersion != '1.1') {
-      return _badRequest('unexpected HTTP version '
-          '"${request.protocolVersion}".');
+      return _badRequest(
+        'unexpected HTTP version '
+        '"${request.protocolVersion}".',
+      );
     }
 
     final key = request.headers['Sec-WebSocket-Key'];
     if (key == null) return _badRequest('missing Sec-WebSocket-Key header.');
 
     if (!request.canHijack) {
-      throw ArgumentError('webSocketHandler may only be used with a server '
-          'that supports request hijacking.');
+      throw ArgumentError(
+        'webSocketHandler may only be used with a server '
+        'that supports request hijacking.',
+      );
     }
 
     // The Origin header is always set by browser connections. By filtering out
@@ -80,10 +90,12 @@
     final protocol = _chooseProtocol(request);
     request.hijack((channel) {
       final sink = utf8.encoder.startChunkedConversion(channel.sink)
-        ..add('HTTP/1.1 101 Switching Protocols\r\n'
-            'Upgrade: websocket\r\n'
-            'Connection: Upgrade\r\n'
-            'Sec-WebSocket-Accept: ${WebSocketChannel.signKey(key)}\r\n');
+        ..add(
+          'HTTP/1.1 101 Switching Protocols\r\n'
+          'Upgrade: websocket\r\n'
+          'Connection: Upgrade\r\n'
+          'Sec-WebSocket-Accept: ${WebSocketChannel.signKey(key)}\r\n',
+        );
       if (protocol != null) sink.add('Sec-WebSocket-Protocol: $protocol\r\n');
       sink.add('\r\n');
 
@@ -91,9 +103,11 @@
         throw ArgumentError('channel.sink must be a dart:io `Socket`.');
       }
 
-      final webSocket = WebSocket.fromUpgradedSocket(channel.sink as Socket,
-          protocol: protocol, serverSide: true)
-        ..pingInterval = _pingInterval;
+      final webSocket = WebSocket.fromUpgradedSocket(
+        channel.sink as Socket,
+        protocol: protocol,
+        serverSide: true,
+      )..pingInterval = _pingInterval;
 
       _onConnection(IOWebSocketChannel(webSocket), protocol);
     });
@@ -115,19 +129,28 @@
 
   /// Returns a 404 Not Found response.
   Response _notFound() => _htmlResponse(
-      404, '404 Not Found', 'Only WebSocket connections are supported.');
+    404,
+    '404 Not Found',
+    'Only WebSocket connections are supported.',
+  );
 
   /// Returns a 400 Bad Request response.
   ///
   /// [message] will be HTML-escaped before being included in the response body.
   Response _badRequest(String message) => _htmlResponse(
-      400, '400 Bad Request', 'Invalid WebSocket upgrade request: $message');
+    400,
+    '400 Bad Request',
+    'Invalid WebSocket upgrade request: $message',
+  );
 
   /// Returns a 403 Forbidden response.
   ///
   /// [message] will be HTML-escaped before being included in the response body.
   Response _forbidden(String message) => _htmlResponse(
-      403, '403 Forbidden', 'WebSocket upgrade refused: $message');
+    403,
+    '403 Forbidden',
+    'WebSocket upgrade refused: $message',
+  );
 
   /// Creates an HTTP response with the given [statusCode] and an HTML body with
   /// [title] and [message].
@@ -136,7 +159,10 @@
   Response _htmlResponse(int statusCode, String title, String message) {
     title = htmlEscape.convert(title);
     message = htmlEscape.convert(message);
-    return Response(statusCode, body: '''
+    return Response(
+      statusCode,
+      body:
+          '''
       <!doctype html>
       <html>
         <head><title>$title</title></head>
@@ -145,6 +171,8 @@
           <p>$message</p>
         </body>
       </html>
-    ''', headers: {'content-type': 'text/html'});
+    ''',
+      headers: {'content-type': 'text/html'},
+    );
   }
 }
diff --git a/pkgs/shelf_web_socket/pubspec.yaml b/pkgs/shelf_web_socket/pubspec.yaml
index 9d142dd..3166f81 100644
--- a/pkgs/shelf_web_socket/pubspec.yaml
+++ b/pkgs/shelf_web_socket/pubspec.yaml
@@ -9,7 +9,7 @@
   - shelf
 
 environment:
-  sdk: ^3.5.0
+  sdk: ^3.9.0
 
 dependencies:
   shelf: ^1.1.0
diff --git a/pkgs/shelf_web_socket/test/web_socket_test.dart b/pkgs/shelf_web_socket/test/web_socket_test.dart
index 5199c47..f50fe95 100644
--- a/pkgs/shelf_web_socket/test/web_socket_test.dart
+++ b/pkgs/shelf_web_socket/test/web_socket_test.dart
@@ -13,26 +13,31 @@
 import 'package:web_socket_channel/web_socket_channel.dart';
 
 Map<String, String> get _handshakeHeaders => {
-      'Upgrade': 'websocket',
-      'Connection': 'Upgrade',
-      'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
-      'Sec-WebSocket-Version': '13'
-    };
+  'Upgrade': 'websocket',
+  'Connection': 'Upgrade',
+  'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
+  'Sec-WebSocket-Version': '13',
+};
 
 void main() {
   test('can communicate with a dart:io WebSocket client', () async {
-    final server = await shelf_io.serve(webSocketHandler((webSocket, _) {
-      webSocket.sink.add('hello!');
-      webSocket.stream.first.then((request) {
-        expect(request, equals('ping'));
-        webSocket.sink.add('pong');
-        webSocket.sink.close();
-      });
-    }), 'localhost', 0);
+    final server = await shelf_io.serve(
+      webSocketHandler((webSocket, _) {
+        webSocket.sink.add('hello!');
+        webSocket.stream.first.then((request) {
+          expect(request, equals('ping'));
+          webSocket.sink.add('pong');
+          webSocket.sink.close();
+        });
+      }),
+      'localhost',
+      0,
+    );
 
     try {
-      final webSocket =
-          await WebSocket.connect('ws://localhost:${server.port}');
+      final webSocket = await WebSocket.connect(
+        'ws://localhost:${server.port}',
+      );
       var n = 0;
       await webSocket.listen((message) {
         if (n == 0) {
@@ -54,16 +59,19 @@
 
   test('negotiates the sub-protocol', () async {
     final server = await shelf_io.serve(
-        webSocketHandler((WebSocketChannel webSocket, String? protocol) {
-          expect(protocol, equals('two'));
-          webSocket.sink.close();
-        }, protocols: ['three', 'two', 'x']),
-        'localhost',
-        0);
+      webSocketHandler((WebSocketChannel webSocket, String? protocol) {
+        expect(protocol, equals('two'));
+        webSocket.sink.close();
+      }, protocols: ['three', 'two', 'x']),
+      'localhost',
+      0,
+    );
 
     try {
-      final webSocket = await WebSocket.connect('ws://localhost:${server.port}',
-          protocols: ['one', 'two', 'three']);
+      final webSocket = await WebSocket.connect(
+        'ws://localhost:${server.port}',
+        protocols: ['one', 'two', 'three'],
+      );
       expect(webSocket.protocol, equals('two'));
       return await webSocket.close();
     } finally {
@@ -72,13 +80,19 @@
   });
 
   test('handles protocol header without allowed protocols', () async {
-    final server = await shelf_io.serve(webSocketHandler((webSocket, _) {
-      webSocket.sink.close();
-    }), 'localhost', 0);
+    final server = await shelf_io.serve(
+      webSocketHandler((webSocket, _) {
+        webSocket.sink.close();
+      }),
+      'localhost',
+      0,
+    );
 
     try {
-      final webSocket = await WebSocket.connect('ws://localhost:${server.port}',
-          protocols: ['one', 'two', 'three']);
+      final webSocket = await WebSocket.connect(
+        'ws://localhost:${server.port}',
+        protocols: ['one', 'two', 'three'],
+      );
       expect(webSocket.protocol, isNull);
       return await webSocket.close();
     } finally {
@@ -88,14 +102,19 @@
 
   test('allows two argument callbacks without protocols', () async {
     final server = await shelf_io.serve(
-        webSocketHandler((WebSocketChannel webSocket, String? protocol) {
-      expect(protocol, isNull);
-      webSocket.sink.close();
-    }), 'localhost', 0);
+      webSocketHandler((WebSocketChannel webSocket, String? protocol) {
+        expect(protocol, isNull);
+        webSocket.sink.close();
+      }),
+      'localhost',
+      0,
+    );
 
     try {
-      final webSocket = await WebSocket.connect('ws://localhost:${server.port}',
-          protocols: ['one', 'two', 'three']);
+      final webSocket = await WebSocket.connect(
+        'ws://localhost:${server.port}',
+        protocols: ['one', 'two', 'three'],
+      );
       expect(webSocket.protocol, isNull);
       return await webSocket.close();
     } finally {
@@ -104,29 +123,40 @@
   });
 
   test('cannot hijack non-Socket StreamChannel', () async {
-    final handler =
-        webSocketHandler((WebSocketChannel webSocket, String? protocol) {
+    final handler = webSocketHandler((
+      WebSocketChannel webSocket,
+      String? protocol,
+    ) {
       expect(protocol, isNull);
       webSocket.sink.close();
     });
 
     expect(
-        () => handler(Request('GET', Uri.parse('ws://example.com/'),
-                protocolVersion: '1.1',
-                headers: {
-                  'Host': 'example.com',
-                  'Upgrade': 'websocket',
-                  'Connection': 'Upgrade',
-                  'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
-                  'Sec-WebSocket-Version': '13',
-                  'Origin': 'http://example.com',
-                }, onHijack: (fn) {
-              // `.foreign` is not a Socket so hijacking the request should
-              // fail.
-              expect(() => fn(StreamChannelController<List<int>>().foreign),
-                  throwsArgumentError);
-            })),
-        throwsA(isA<HijackException>()));
+      () => handler(
+        Request(
+          'GET',
+          Uri.parse('ws://example.com/'),
+          protocolVersion: '1.1',
+          headers: {
+            'Host': 'example.com',
+            'Upgrade': 'websocket',
+            'Connection': 'Upgrade',
+            'Sec-WebSocket-Key': 'x3JJHMbDL1EzLkh9GBhXDw==',
+            'Sec-WebSocket-Version': '13',
+            'Origin': 'http://example.com',
+          },
+          onHijack: (fn) {
+            // `.foreign` is not a Socket so hijacking the request should
+            // fail.
+            expect(
+              () => fn(StreamChannelController<List<int>>().foreign),
+              throwsArgumentError,
+            );
+          },
+        ),
+      ),
+      throwsA(isA<HijackException>()),
+    );
   });
 
   group('with a set of allowed origins', () {
@@ -134,11 +164,12 @@
     late Uri url;
     setUp(() async {
       server = await shelf_io.serve(
-          webSocketHandler((webSocket, _) {
-            webSocket.sink.close();
-          }, allowedOrigins: ['pub.dartlang.org', 'GoOgLe.CoM']),
-          'localhost',
-          0);
+        webSocketHandler((webSocket, _) {
+          webSocket.sink.close();
+        }, allowedOrigins: ['pub.dartlang.org', 'GoOgLe.CoM']),
+        'localhost',
+        0,
+      );
       url = Uri.http('localhost:${server.port}', '');
     });
 
@@ -175,24 +206,34 @@
 
   // Regression test for issue 21894.
   test('allows a Connection header with multiple values', () async {
-    final server = await shelf_io.serve(webSocketHandler((webSocket, _) {
-      webSocket.sink.close();
-    }), 'localhost', 0);
+    final server = await shelf_io.serve(
+      webSocketHandler((webSocket, _) {
+        webSocket.sink.close();
+      }),
+      'localhost',
+      0,
+    );
 
     final url = Uri.http('localhost:${server.port}', '');
     final headers = _handshakeHeaders;
     headers['Connection'] = 'Other-Token, Upgrade';
-    expect(http.get(url, headers: headers).whenComplete(server.close),
-        hasStatus(101));
+    expect(
+      http.get(url, headers: headers).whenComplete(server.close),
+      hasStatus(101),
+    );
   });
 
   group('HTTP errors', () {
     late HttpServer server;
     late Uri url;
     setUp(() async {
-      server = await shelf_io.serve(webSocketHandler((_, __) {
-        fail('should not create a WebSocket');
-      }), 'localhost', 0);
+      server = await shelf_io.serve(
+        webSocketHandler((_, _) {
+          fail('should not create a WebSocket');
+        }),
+        'localhost',
+        0,
+      );
       url = Uri.http('localhost:${server.port}', '');
     });
 
@@ -231,8 +272,10 @@
   });
 }
 
-Matcher hasStatus(int status) => completion(predicate((http.Response response) {
-      expect(response, isA<http.Response>());
-      expect(response.statusCode, equals(status));
-      return true;
-    }));
+Matcher hasStatus(int status) => completion(
+  predicate((http.Response response) {
+    expect(response, isA<http.Response>());
+    expect(response.statusCode, equals(status));
+    return true;
+  }),
+);