Skip to content

perf(types): optimize deeply nested type computations#51

Merged
halvaradop merged 5 commits into
masterfrom
perf/optimize-types
Jun 4, 2026
Merged

perf(types): optimize deeply nested type computations#51
halvaradop merged 5 commits into
masterfrom
perf/optimize-types

Conversation

@halvaradop
Copy link
Copy Markdown
Member

@halvaradop halvaradop commented Jun 3, 2026

Description

This pull request optimizes deeply nested type computations across the library by reducing generic propagation and removing unnecessary uses of the Prettify utility type within endpoint, middleware, and request context definitions.

This work was initially motivated by issues discovered in @aura-stack/auth, where several consumers encountered the following TypeScript compiler error:

TS2589: Type instantiation is excessively deep and possibly infinite

The primary goal of this PR is to improve compiler performance, reduce type complexity, and make type inference more predictable when working with complex endpoint definitions and schema validators.

One of the first optimizations was reducing the usage of the Prettify utility type, which was heavily used to flatten complex inferred types such as RequestContext in handlers and middlewares. While this utility improves type readability, it also introduces additional type computations that contribute to excessive type instantiation.

However, further investigation revealed that Prettify was only a small part of the problem.


Key Changes

  • Reduced generic propagation across internal endpoint and middleware types
  • Removed unnecessary uses of the Prettify utility type
  • Simplified internal type computations
  • Improved compiler performance and type-checking stability
  • Refined schema inference utilities and endpoint generation types

History

While working on this PR, several important observations were made regarding schema validator support within Aura Router.

Over the last few releases, Aura Router has added support for multiple schema validation libraries, including:

  • Zod v4
  • Valibot
  • ArkType
  • TypeBox

During this process, we identified that some utility types provided by these libraries introduce significant compiler overhead. Previous investigations revealed issues with types such as:

  • InferOutput from Valibot
  • Static from TypeBox

To mitigate the Valibot issue, we introduced custom inference utilities such as InferValibotSchema, which was added in #45 and provides equivalent behavior with substantially lower type complexity.

Initially, we believed these optimizations had resolved the majority of the performance issues. However, additional profiling revealed a much larger source of complexity.

Using:

tsc --extendedDiagnostics

we compared compiler metrics before and after introducing TypeBox's Static type and observed a dramatic increase in type-checking costs.

Compiler Metrics Comparison

Metric Without Static With Static Increase
Files 425 855 +101.18%
Lines of Definitions 115,411 121,795 +5.53%
Lines of TypeScript 1,409 1,504 +6.74%
Identifiers 180,286 208,020 +15.38%
Symbols 111,027 223,211 +101.04%
Types 8,739 150,366 +1,620.66%
Instantiations 16,154 1,187,356 +7,250.88%
Memory Used 183,967K 553,401K +200.82%
Assignability Cache Size 1,375 90,776 +6,501.89%
Identity Cache Size 22 1,394 +6,236.36%
Program Time 0.58s 0.76s +31.03%
Bind Time 0.15s 0.19s +26.67%
Check Time 0.23s 1.65s +617.39%
Total Time 0.96s 2.60s +170.83%

Raw Output

Files:                         425  855
Lines of Library:            51352  51352
Lines of Definitions:       115411  121795
Lines of TypeScript:          1409  1504
Identifiers:                180286  208020
Symbols:                    111027  223211
Types:                        8739  150366
Instantiations:              16154  1187356
Memory used:               183967K  553401K
Assignability cache size:     1375  90776
Identity cache size:            22  1394
Subtype cache size:            160  168
Strict subtype cache size:     115  117
I/O Read time:               0.06s  0.11s
Parse time:                  0.29s  0.31s
ResolveModule time:          0.15s  0.24s
ResolveTypeReference time:   0.01s  0.01s
ResolveLibrary time:         0.01s  0.01s
Program time:                0.58s  0.76s
Bind time:                   0.15s  0.19s
Check time:                  0.23s  1.65s
transformTime time:          0.02s  0.02s
Total time:                  0.96s  2.60s

These results indicate that the TypeBox Static type is currently one of the largest contributors to type instantiation growth within the project.

As a result, future work will focus on evaluating alternatives, reducing dependency on Static, or potentially revisiting the current TypeBox integration strategy if a sustainable solution cannot be found.

In short, while Prettify contributed to the issue, the investigation showed that Static is responsible for a significantly larger portion of the compiler overhead.

Summary by CodeRabbit

  • Refactoring

    • Modernized TypeScript type system for routing, middleware, and request handling with improved type inference across endpoints
    • Enhanced schema validation abstractions supporting Zod, Valibot, TypeBox, and Arktype libraries
  • Chores

    • Added VS Code extension recommendations and formatter configuration
    • Added TypeScript diagnostic configuration file

@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 3, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
router Ready Ready Preview, Comment Jun 4, 2026 2:59am

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 3, 2026

Review Change Stack

Warning

Review limit reached

@halvaradop, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 46 minutes and 2 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ce888656-93ca-4a15-84cb-3560185d80ff

📥 Commits

Reviewing files that changed from the base of the PR and between ae2cde4 and 2fc31a5.

📒 Files selected for processing (2)
  • bench/router.bench.ts
  • src/@types/types.ts
📝 Walkthrough

Walkthrough

Refactors types to unify Zod/Valibot/TypeBox/Arktype schema handling, adds EndpointMeta-driven RequestContext, updates client/endpoint/middleware generics to include HTTP method, migrates Zod imports to v4, and aligns benches/tests/configs to the new typing.

Changes

Type System Modernization

Layer / File(s) Summary
Schema type utilities foundation
src/@types/schemas.ts
New file introduces SupportedSchema union (Zod v4, Valibot, TypeBox, Arktype), SchemaKind<T>, and InferValibotSchema.
Core type-system and client inference
src/@types/types.ts, src/@types/client.ts
Switches Zod imports to zod/v4/core, replaces per-library schema unions with SupportedSchema, adds EndpointMeta and RequestContext derived from it, exports UnwrapSchema, adjusts InferMethod/GetHttpHandlers, and updates InferSchema/client schema helpers.
Endpoint factory and middleware API
src/endpoint.ts, src/middlewares.ts, src/assert.ts, src/context.ts
createEndpoint/createEndpointConfig generics now include Method; executeMiddlewares and middleware types accept RequestContext<EndpointMeta<...>>; Zod imports/types migrated to v4 core; type-guard signatures adjusted.
Build, benches, and tests
tsconfig.diag.json, deno.json, .vscode/*, bench/router.bench.ts, test/*
Adds tsconfig.diag.json, minor deno.json formatting change, VSCode settings, updates benchmark typings, and rewrites many type-tests and middleware tests to the new EndpointMeta-centric APIs (one // @ts-ignore`` added).

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • aura-stack-ts/router#44: Both PRs extend endpoint schema typing to recognize Arktype Type<...> via schema inference and SupportedSchema/SchemaKind machinery.
  • aura-stack-ts/router#48: Both PRs refactor EndpointSchemas and UnwrapSchema to unify TypeBox TObject support alongside Zod and Valibot.
  • aura-stack-ts/router#43: This PR adds Valibot schema runtime validation wiring, complementing the main PR's Valibot type inference updates via InferValibotSchema/SupportedSchema.

Poem

🐇 I stitched four schema threads into one,
Zod sings deeper from a v4 sun,
Valibot's secrets peek through typed seams,
Endpoints now carry method-born dreams,
Hop, nudge, and type — a rabbit's quiet cheer.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main objective of the PR: optimizing deeply nested type computations across the codebase by refactoring type inference and removing Prettify usage.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch perf/optimize-types

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
tsconfig.diag.json (1)

3-6: Drop or wire up tsconfig.diag.json

  • tsconfig.diag.json extends ./tsconfig.json, which already sets "noEmit": true and "skipLibCheck": true, so these options are redundant.
  • No repo files/scripts/CI references tsconfig.diag.json; package.json’s type-check runs tsc --noEmit without -p tsconfig.diag.json.
  • Remove it to avoid confusion, or update the intended script/CI/IDE config to explicitly use tsc -p tsconfig.diag.json.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tsconfig.diag.json` around lines 3 - 6, tsconfig.diag.json is redundant
because it duplicates settings from tsconfig.json and isn’t referenced by CI or
scripts; either delete tsconfig.diag.json to avoid confusion, or wire it up by
updating the package.json "type-check" script (currently running "tsc --noEmit")
and any CI/IDE configurations to run "tsc -p tsconfig.diag.json" so the file is
actually used; ensure references to "tsconfig.json" remain correct if you remove
or change the diag file.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/`@types/client.ts:
- Around line 34-44: The tuple-check `[SchemaValues<Schemas>] extends
[SupportedSchema]` treats an empty `Schemas = {}` (where `SchemaValues<{}> =
never`) as matching, so update the type logic in HasSchemas and InferContent to
explicitly handle the `never` case: first check whether `[SchemaValues<Schemas>]
extends [never]` and return false/unknown for empty schemas, otherwise proceed
to test against SupportedSchema and yield true or the inferred
RemoveUndefined<ToInferSchema<Schemas>> as appropriate; modify the discriminated
branches in HasSchemas and InferContent that currently reference EndpointConfig
and unstable__EndpointConfig so they short-circuit on the never case before
checking SupportedSchema.

In `@src/`@types/types.ts:
- Around line 263-270: The conditional type InferMethod currently matches a
mutable array pattern and thus fails for readonly tuples; update its conditional
to infer a readonly element type by changing the check from "Endpoints extends
(infer Endpoint)[]" to "Endpoints extends readonly (infer Endpoint)[]", keeping
the subsequent extraction of Method from unstable__RouteEndpoint and the same
fallback logic so readonly/as const endpoint tuples correctly produce the HTTP
method union used by GetHttpHandlers.

In `@src/endpoint.ts`:
- Around line 43-44: The return type of createEndpoint narrows the config to {
schemas?: Schemas } and drops the optional use middleware; update the generic
return type so it preserves the full unstable__EndpointConfig (including use).
Concretely, change the third type parameter on unstable__RouteEndpoint from {
schemas?: Schemas } to unstable__EndpointConfig<Route, Method, Schemas> (or a
suitably named generic that forwards the exact config type), ensuring
createEndpoint(Route, Method, Schemas, Handler) returns
unstable__RouteEndpoint<Route, Method, unstable__EndpointConfig<Route, Method,
Schemas>, Handler> so endpoint.config.use remains typed.

---

Nitpick comments:
In `@tsconfig.diag.json`:
- Around line 3-6: tsconfig.diag.json is redundant because it duplicates
settings from tsconfig.json and isn’t referenced by CI or scripts; either delete
tsconfig.diag.json to avoid confusion, or wire it up by updating the
package.json "type-check" script (currently running "tsc --noEmit") and any
CI/IDE configurations to run "tsc -p tsconfig.diag.json" so the file is actually
used; ensure references to "tsconfig.json" remain correct if you remove or
change the diag file.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b3709313-ebe1-4cae-bda1-c5e5225e497a

📥 Commits

Reviewing files that changed from the base of the PR and between c12a086 and cd85536.

📒 Files selected for processing (8)
  • deno.json
  • src/@types/client.ts
  • src/@types/schemas.ts
  • src/@types/types.ts
  • src/assert.ts
  • src/context.ts
  • src/endpoint.ts
  • tsconfig.diag.json

Comment thread src/@types/client.ts
Comment thread src/@types/types.ts Outdated
Comment thread src/endpoint.ts Outdated
@halvaradop halvaradop added the enhancement New feature or request label Jun 4, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/context.ts (1)

131-165: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Return undefined when there is no typed body.

RequestContext.body is published as undefined for schema-less endpoints, but getBody() returns null on Line 133 and Line 165. Since src/router.ts forwards this value directly, handlers can observe a runtime shape that contradicts the exported type.

Proposed fix
 export const getBody = async <Config extends EndpointConfig<any, any, any>>(request: Request, config: Config) => {
     if (!isSupportedBodyMethod(request.method)) {
-        return null
+        return undefined
     }
@@
-        return null
+        return undefined
     } catch {
         throw new RouterError("UNPROCESSABLE_ENTITY", "Invalid request body, the content-type does not match the body format")
     }
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/context.ts` around lines 131 - 165, getBody currently returns null for
unsupported methods and when no body is parsed (seen in the early return after
isSupportedBodyMethod and the final return), but RequestContext.body is
typed/published as undefined for schema-less endpoints; update getBody to return
undefined instead of null in both places so the runtime matches the exported
type (adjust the Promise return type if needed), and ensure callers in router.ts
that forward the value continue to accept undefined. Reference symbols: getBody,
isSupportedBodyMethod, RequestContext.body and the router.ts forwarding logic.
bench/router.bench.ts (1)

8-15: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Fix benchmark endpoint generation to use the index (not the element)
Array.from({ length: N }) creates undefined elements; with the callback signature ((idx) => ...), idx is always undefined, so the 100/1000-endpoint suites generate duplicate /endpoint-undefined routes (also affects the response payload).
Applies to bench/router.bench.ts lines 8-15, 22-29, and 41-48.

Proposed fix
-    const endpoints = Array.from({ length: 100 }).map<RouteEndpoint<any, any, any, any>>((idx) => ({
+    const endpoints = Array.from({ length: 100 }).map<RouteEndpoint<any, any, any, any>>((_, idx) => ({
@@
-    const endpoints = Array.from({ length: 100 }).map<RouteEndpoint<any, any, any, any>>((idx) => ({
+    const endpoints = Array.from({ length: 100 }).map<RouteEndpoint<any, any, any, any>>((_, idx) => ({
@@
-    const endpoints = Array.from({ length: 1000 }).map<RouteEndpoint<any, any, any, any>>((idx) => ({
+    const endpoints = Array.from({ length: 1000 }).map<RouteEndpoint<any, any, any, any>>((_, idx) => ({
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@bench/router.bench.ts` around lines 8 - 15, The benchmark generates duplicate
routes because the Array.from callback currently receives the element
(undefined) as the first arg, so "idx" is undefined; change the mapping callback
to accept the index (e.g., use (_, idx) => ...) so the index is used for route
and response generation in the endpoints array; update occurrences inside the
object created for each RouteEndpoint (route `/endpoint-${idx}`, handler
response `Endpoint ${idx}`, and any config references) so each entry uses the
actual numeric index rather than the undefined element.
src/@types/client.ts (1)

55-69: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Handle readonly endpoint tuples in Client.

Client accepts readonly endpoints, but the top-level conditional uses Endpoints extends unknown[], which only matches mutable arrays—so Client<readonly [...]> (e.g., as const endpoint lists) can collapse to {}. Update the conditional to Endpoints extends readonly unknown[] so the recursive tuple mapping runs for readonly tuples.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/`@types/client.ts around lines 55 - 69, The Client type's top-level
conditional uses "Endpoints extends unknown[]" which fails to match readonly
tuples (e.g., as const) and causes Client<readonly [...]> to resolve to {};
change the conditional to "Endpoints extends readonly unknown[]" so the
recursive tuple mapping runs for readonly endpoint tuples; update the Client
declaration that references Endpoints and RouteEndpoint<...> accordingly to use
the readonly check.
src/middlewares.ts (1)

54-70: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve original RouterErrors from middleware execution.

Lines 68-69 currently swallow every RouterError raised above and replace it with a generic "Handler threw an error". That means "Middleware must be a function" and any middleware-thrown RouterError never reach the caller intact.

Suggested fix
 export const executeMiddlewares = async <
     Route extends RoutePattern,
     Method extends HTTPMethod | HTTPMethod[],
     Config extends EndpointSchemas = EndpointSchemas,
 >(
     context: RequestContext<EndpointMeta<Route, Method, Config>>,
     use: MiddlewareFunction<Route, Method, Config>[] = []
 ) => {
-    try {
-        let ctx = context
-        for (const middleware of use) {
-            if (typeof middleware !== "function") {
-                throw new RouterError("BAD_REQUEST", "Middleware must be a function")
-            }
-            try {
-                ctx = (await middleware(ctx)) as RequestContext<EndpointMeta<Route, Method, Config>>
-            } catch (error) {
-                if (error instanceof RouterError) throw error
-                throw new RouterError("BAD_REQUEST", "Handler threw an error", "MiddlewareError")
-            }
-        }
-        return ctx
-    } catch {
-        throw new RouterError("BAD_REQUEST", "Handler threw an error")
+    let ctx = context
+    for (const middleware of use) {
+        if (typeof middleware !== "function") {
+            throw new RouterError("BAD_REQUEST", "Middleware must be a function")
+        }
+        try {
+            ctx = (await middleware(ctx)) as RequestContext<EndpointMeta<Route, Method, Config>>
+        } catch (error) {
+            if (error instanceof RouterError) throw error
+            throw new RouterError("BAD_REQUEST", "Handler threw an error", "MiddlewareError")
+        }
     }
+    return ctx
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/middlewares.ts` around lines 54 - 70, The outer catch currently swallows
specific RouterError instances and replaces them with a generic error; modify
the final catch to capture the thrown error (catch (error)) and rethrow it if it
is an instance of RouterError, otherwise wrap it in a new RouterError. Locate
the middleware execution block that uses variables ctx, context, use and the
RouterError class; change the trailing catch { ... } to catch (error) { if
(error instanceof RouterError) throw error; throw new RouterError("BAD_REQUEST",
"Handler threw an error"); } so original RouterError messages like "Middleware
must be a function" propagate unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/`@types/types.ts:
- Around line 167-182: The Config generic for RouteHandler and RouteEndpoint is
too loose and can be mismatched with Method; update both declarations so Config
is bound to the same Method generic (i.e. change Config extends
EndpointConfig<Route, any, any> to Config extends EndpointConfig<Route, Method,
any>) so middleware/use types in EndpointConfig are correctly inferred for the
endpoint method; update the RouteHandler and RouteEndpoint signatures
(referencing the RouteHandler, RouteEndpoint and EndpointConfig symbols) to use
this tightened constraint and keep other generics the same.

---

Outside diff comments:
In `@bench/router.bench.ts`:
- Around line 8-15: The benchmark generates duplicate routes because the
Array.from callback currently receives the element (undefined) as the first arg,
so "idx" is undefined; change the mapping callback to accept the index (e.g.,
use (_, idx) => ...) so the index is used for route and response generation in
the endpoints array; update occurrences inside the object created for each
RouteEndpoint (route `/endpoint-${idx}`, handler response `Endpoint ${idx}`, and
any config references) so each entry uses the actual numeric index rather than
the undefined element.

In `@src/`@types/client.ts:
- Around line 55-69: The Client type's top-level conditional uses "Endpoints
extends unknown[]" which fails to match readonly tuples (e.g., as const) and
causes Client<readonly [...]> to resolve to {}; change the conditional to
"Endpoints extends readonly unknown[]" so the recursive tuple mapping runs for
readonly endpoint tuples; update the Client declaration that references
Endpoints and RouteEndpoint<...> accordingly to use the readonly check.

In `@src/context.ts`:
- Around line 131-165: getBody currently returns null for unsupported methods
and when no body is parsed (seen in the early return after isSupportedBodyMethod
and the final return), but RequestContext.body is typed/published as undefined
for schema-less endpoints; update getBody to return undefined instead of null in
both places so the runtime matches the exported type (adjust the Promise return
type if needed), and ensure callers in router.ts that forward the value continue
to accept undefined. Reference symbols: getBody, isSupportedBodyMethod,
RequestContext.body and the router.ts forwarding logic.

In `@src/middlewares.ts`:
- Around line 54-70: The outer catch currently swallows specific RouterError
instances and replaces them with a generic error; modify the final catch to
capture the thrown error (catch (error)) and rethrow it if it is an instance of
RouterError, otherwise wrap it in a new RouterError. Locate the middleware
execution block that uses variables ctx, context, use and the RouterError class;
change the trailing catch { ... } to catch (error) { if (error instanceof
RouterError) throw error; throw new RouterError("BAD_REQUEST", "Handler threw an
error"); } so original RouterError messages like "Middleware must be a function"
propagate unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 46f4c49a-365e-42c2-9f46-e68d37f6333d

📥 Commits

Reviewing files that changed from the base of the PR and between cd85536 and ae2cde4.

📒 Files selected for processing (12)
  • .vscode/extensions.json
  • .vscode/settings.json
  • bench/router.bench.ts
  • src/@types/client.ts
  • src/@types/types.ts
  • src/assert.ts
  • src/context.ts
  • src/endpoint.ts
  • src/middlewares.ts
  • test/client.test.ts
  • test/middlewares.test.ts
  • test/type.test-d.ts
✅ Files skipped from review due to trivial changes (2)
  • .vscode/extensions.json
  • .vscode/settings.json

Comment thread src/@types/types.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant