alien-middleware 0.8.2 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,22 @@
1
1
  import { Any, noop } from 'radashi';
2
2
  import { AdapterRequestContext, HattipHandler } from '@hattip/core';
3
3
 
4
+ type Eval<T> = {} & {
5
+ [K in keyof T]: T[K];
6
+ };
7
+ type Keys<T> = T extends any ? keyof T : never;
8
+ type IsOptional<T, K> = K extends keyof T ? T[K] extends Required<T>[K] ? false : true : true;
9
+ type PossiblyUndefined<T, K extends keyof T> = undefined extends Required<T>[K] ? true : false;
10
+ type MergeProperty<TSource, TOverrides, K> = (K extends keyof TOverrides ? PossiblyUndefined<TOverrides, K> extends true ? TOverrides[K] : Exclude<TOverrides[K], undefined> : never) | (IsOptional<TOverrides, K> extends true ? K extends keyof TSource ? TSource[K] : undefined : never) extends infer TProperty ? TProperty : never;
11
+ /**
12
+ * Merge a union of object types (possibly undefined) into a single object type.
13
+ *
14
+ * **FIXME:** Optional properties resolve as `foo: Foo | undefined` instead of `foo?: Foo`.
15
+ */
16
+ type Merge<TSource extends object, TOverrides extends object | undefined> = {} & Eval<Omit<TSource, Keys<TOverrides>> & {
17
+ [K in Keys<TOverrides>]: TOverrides extends any ? MergeProperty<TSource, TOverrides, K> : never;
18
+ }>;
19
+
4
20
  type RequestEnvPlugin = {
5
21
  /**
6
22
  * Add type-safe environment variables. These are accessed with the `env()`
@@ -72,16 +88,18 @@ type Middleware<TEnv extends object = any, TProperties extends object = any, TPl
72
88
  * Extract a `Middleware` type from a `MiddlewareChain` type.
73
89
  */
74
90
  type ExtractMiddleware<T extends MiddlewareChain> = Middleware<Env<T>, Properties<T>, Platform<T>>;
75
- type Merge<TSource extends object, TOverrides extends object | undefined> = {} & (TOverrides extends object ? {
76
- [K in keyof TSource | keyof TOverrides]: K extends keyof TOverrides ? TOverrides[K] : K extends keyof TSource ? TSource[K] : never;
77
- } : TSource);
78
- type ApplyRequestPlugin<TParent extends MiddlewareChain, TPlugin extends RequestPlugin> = {} & MiddlewareTypes<Merge<Env<TParent>, TPlugin['env']>, Merge<Properties<TParent>, Omit<TPlugin, keyof RequestEnvPlugin>>>;
91
+ /**
92
+ * Merge a request plugin into a middleware chain.
93
+ */
94
+ type ApplyMiddlewareResult<TParent extends MiddlewareChain, TResult> = {} & MiddlewareTypes<Merge<Env<TParent>, TResult extends {
95
+ env: infer TEnv extends object | undefined;
96
+ } ? TEnv : undefined>, Merge<Properties<TParent>, TResult extends RequestPlugin ? Omit<TResult, keyof RequestEnvPlugin> : undefined>>;
79
97
  /**
80
98
  * This applies a middleware to a chain. If the type `TMiddleware` is itself a
81
99
  * chain, it's treated as a nested chain, which won't leak its plugins into the
82
100
  * parent chain.
83
101
  */
84
- type ApplyMiddleware<TFirst extends MiddlewareChain, TSecond extends Middleware<Env<TFirst>, Properties<TFirst>, Platform<TFirst>>> = RequestHandler<Inputs<TFirst>, TSecond extends MiddlewareChain ? MiddlewareTypes<Merge<Env<TFirst>, Env<TSecond>>, Merge<Properties<TFirst>, Properties<TSecond>>> : TSecond extends (...args: any[]) => Awaitable<infer TResult> ? TResult extends RequestPlugin ? ApplyRequestPlugin<TFirst, TResult> : Current<TFirst> : Current<TFirst>, Platform<TFirst>>;
102
+ type ApplyMiddleware<TFirst extends MiddlewareChain, TSecond extends Middleware<Env<TFirst>, Properties<TFirst>, Platform<TFirst>>> = RequestHandler<Inputs<TFirst>, TSecond extends MiddlewareChain ? MiddlewareTypes<Merge<Env<TFirst>, Env<TSecond>>, Merge<Properties<TFirst>, Properties<TSecond>>> : TSecond extends (...args: any[]) => Awaitable<infer TResult> ? ApplyMiddlewareResult<TFirst, TResult> : Current<TFirst>, Platform<TFirst>>;
85
103
  type EmptyMiddlewareChain = MiddlewareChain<MiddlewareTypes<{}, {}>, MiddlewareTypes<{}, {}>, unknown>;
86
104
  type ApplyFirstMiddleware<T extends Middleware> = T extends MiddlewareChain ? T : ApplyMiddleware<EmptyMiddlewareChain, T>;
87
105
  type RouteMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'HEAD';
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import 'radashi';
2
- export { A as ApplyMiddleware, e as ExtractMiddleware, f as Middleware, M as MiddlewareChain, a as MiddlewareContext, g as RequestContext, h as RequestHandler, i as RequestMiddleware, j as RequestPlugin, k as ResponseMiddleware, d as chain } from './index-Bpx2B6hx.js';
2
+ export { A as ApplyMiddleware, e as ExtractMiddleware, f as Middleware, M as MiddlewareChain, a as MiddlewareContext, g as RequestContext, h as RequestHandler, i as RequestMiddleware, j as RequestPlugin, k as ResponseMiddleware, d as chain } from './index-BbUg2fQl.js';
3
3
  import '@hattip/core';
package/dist/router.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { InferParams } from 'pathic';
2
- import { M as MiddlewareChain, E as EmptyMiddlewareChain, a as MiddlewareContext, R as RouteHandler, b as RouteMethod } from './index-Bpx2B6hx.js';
3
- export { c as RouterContext } from './index-Bpx2B6hx.js';
2
+ import { M as MiddlewareChain, E as EmptyMiddlewareChain, a as MiddlewareContext, R as RouteHandler, b as RouteMethod } from './index-BbUg2fQl.js';
3
+ export { c as RouterContext } from './index-BbUg2fQl.js';
4
4
  import 'radashi';
5
5
  import '@hattip/core';
6
6
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "alien-middleware",
3
3
  "type": "module",
4
- "version": "0.8.2",
4
+ "version": "0.8.3",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",