Skip to content

Commit d7d3966

Browse files
vicbconico974
andauthored
fix: middleware type (#922)
Co-authored-by: conico974 <[email protected]>
1 parent eb14a61 commit d7d3966

File tree

7 files changed

+68
-33
lines changed

7 files changed

+68
-33
lines changed

.changeset/slimy-turkeys-smoke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@opennextjs/aws": patch
3+
---
4+
5+
fix: middleware configuration type

packages/open-next/src/adapters/middleware.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {
2+
ExternalMiddlewareConfig,
23
InternalEvent,
34
InternalResult,
45
MiddlewareResult,
@@ -30,22 +31,30 @@ const defaultHandler = async (
3031
internalEvent: InternalEvent,
3132
options?: OpenNextHandlerOptions,
3233
): Promise<InternalResult | MiddlewareResult> => {
33-
const config = globalThis.openNextConfig.middleware;
34-
const originResolver = await resolveOriginResolver(config?.originResolver);
34+
// We know that the middleware is external when this adapter is used
35+
const middlewareConfig = globalThis.openNextConfig
36+
.middleware as ExternalMiddlewareConfig;
37+
const originResolver = await resolveOriginResolver(
38+
middlewareConfig?.originResolver,
39+
);
3540

3641
const externalRequestProxy = await resolveProxyRequest(
37-
config?.override?.proxyExternalRequest,
42+
middlewareConfig?.override?.proxyExternalRequest,
3843
);
3944

40-
const assetResolver = await resolveAssetResolver(config?.assetResolver);
45+
const assetResolver = await resolveAssetResolver(
46+
middlewareConfig?.assetResolver,
47+
);
4148

4249
//#override includeCacheInMiddleware
43-
globalThis.tagCache = await resolveTagCache(config?.override?.tagCache);
50+
globalThis.tagCache = await resolveTagCache(
51+
middlewareConfig?.override?.tagCache,
52+
);
4453

45-
globalThis.queue = await resolveQueue(config?.override?.queue);
54+
globalThis.queue = await resolveQueue(middlewareConfig?.override?.queue);
4655

4756
globalThis.incrementalCache = await resolveIncrementalCache(
48-
config?.override?.incrementalCache,
57+
middlewareConfig?.override?.incrementalCache,
4958
);
5059
//#endOverride
5160

packages/open-next/src/build/generateOutput.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import path from "node:path";
33
import type {
44
BaseOverride,
55
DefaultOverrideOptions,
6+
ExternalMiddlewareConfig,
67
FunctionOptions,
78
LazyLoadedOverride,
89
OverrideOptions,
@@ -164,14 +165,16 @@ export async function generateOutput(options: BuildOptions) {
164165
const edgeFunctions: OpenNextOutput["edgeFunctions"] = {};
165166
const isExternalMiddleware = config.middleware?.external ?? false;
166167
if (isExternalMiddleware) {
168+
const middlewareConfig = options.config
169+
.middleware as ExternalMiddlewareConfig;
167170
edgeFunctions.middleware = {
168171
bundle: ".open-next/middleware",
169172
handler: "handler.handler",
170173
pathResolver: await extractOverrideName(
171174
"pattern-env",
172-
config.middleware!.originResolver,
175+
middlewareConfig.originResolver,
173176
),
174-
...(await extractOverrideFn(config.middleware?.override)),
177+
...(await extractOverrideFn(middlewareConfig.override)),
175178
};
176179
}
177180
// Add edge functions

packages/open-next/src/build/validateConfig.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ export function validateConfig(config: OpenNextConfig) {
109109
);
110110
}
111111
validateFunctionOptions(config.imageOptimization ?? {});
112-
validateFunctionOptions(config.middleware ?? {});
112+
if (config.middleware?.external === true) {
113+
validateFunctionOptions(config.middleware ?? {});
114+
}
113115
//@ts-expect-error - Revalidate custom wrapper type is different
114116
validateFunctionOptions(config.revalidate ?? {});
115117
//@ts-expect-error - Warmer custom wrapper type is different

packages/open-next/src/core/createGenericHandler.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ export async function createGenericHandler<
3737
);
3838

3939
globalThis.openNextConfig = config;
40-
const override = config[handler.type]
41-
?.override as any as DefaultOverrideOptions<E, R>;
40+
const handlerConfig = config[handler.type];
41+
const override =
42+
handlerConfig && "override" in handlerConfig
43+
? (handlerConfig.override as any as DefaultOverrideOptions<E, R>)
44+
: undefined;
4245

4346
// From the config, we create the converter
4447
const converter = await resolveConverter<E, R>(override?.converter);

packages/open-next/src/core/resolve.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type {
22
BaseEventOrResult,
33
DefaultOverrideOptions,
4+
ExternalMiddlewareConfig,
45
InternalEvent,
56
InternalResult,
67
OpenNextConfig,
@@ -105,9 +106,7 @@ export async function resolveImageLoader(
105106
* @__PURE__
106107
*/
107108
export async function resolveOriginResolver(
108-
originResolver: RemoveUndefined<
109-
OpenNextConfig["middleware"]
110-
>["originResolver"],
109+
originResolver: RemoveUndefined<ExternalMiddlewareConfig>["originResolver"],
111110
) {
112111
if (typeof originResolver === "function") {
113112
return originResolver();

packages/open-next/src/types/open-next.ts

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -363,20 +363,24 @@ export interface SplittedFunctionOptions extends FunctionOptions {
363363
patterns: string[];
364364
}
365365

366-
export interface OpenNextConfig {
367-
default: FunctionOptions;
368-
functions?: Record<string, SplittedFunctionOptions>;
369-
366+
/**
367+
* MiddlewareConfig that applies to both external and internal middlewares
368+
*
369+
* Note: this type is internal and included in both `ExternalMiddlewareConfig` and `InternalMiddlewareConfig`
370+
*/
371+
type CommonMiddlewareConfig = {
370372
/**
371-
* Override the default middleware
372-
* If you set this options, the middleware need to be deployed separately.
373-
* It supports both edge and node runtime.
374-
* @default undefined
373+
* The assetResolver is used to resolve assets in the routing layer.
374+
*
375+
* @default "dummy"
375376
*/
376-
middleware?: DefaultFunctionOptions & {
377-
//We force the middleware to be a function
378-
external: true;
377+
assetResolver?: IncludedAssetResolver | LazyLoadedOverride<AssetResolver>;
378+
};
379379

380+
/** MiddlewareConfig that applies to external middlewares only */
381+
export type ExternalMiddlewareConfig = DefaultFunctionOptions &
382+
CommonMiddlewareConfig & {
383+
external: true;
380384
/**
381385
* The runtime used by next for the middleware.
382386
* @default "edge"
@@ -400,15 +404,25 @@ export interface OpenNextConfig {
400404
originResolver?:
401405
| IncludedOriginResolver
402406
| LazyLoadedOverride<OriginResolver>;
403-
404-
/**
405-
* The assetResolver is used to resolve assets in the routing layer.
406-
*
407-
* @default "dummy"
408-
*/
409-
assetResolver?: IncludedAssetResolver | LazyLoadedOverride<AssetResolver>;
410407
};
411408

409+
/** MiddlewareConfig that applies to internal middlewares only */
410+
export type InternalMiddlewareConfig = {
411+
external: false;
412+
} & CommonMiddlewareConfig;
413+
414+
export interface OpenNextConfig {
415+
default: FunctionOptions;
416+
functions?: Record<string, SplittedFunctionOptions>;
417+
418+
/**
419+
* Override the default middleware
420+
* When `external` is true, the middleware need to be deployed separately.
421+
* It supports both edge and node runtime.
422+
* @default undefined - Which is equivalent to `external: false`
423+
*/
424+
middleware?: ExternalMiddlewareConfig | InternalMiddlewareConfig;
425+
412426
/**
413427
* Override the default warmer
414428
* By default, works for lambda only.

0 commit comments

Comments
 (0)