@opennextjs/aws 3.7.0 → 3.7.1

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.
@@ -7,14 +7,16 @@ import routingHandler, { INTERNAL_EVENT_REQUEST_ID, INTERNAL_HEADER_INITIAL_URL,
7
7
  globalThis.internalFetch = fetch;
8
8
  globalThis.__openNextAls = new AsyncLocalStorage();
9
9
  const defaultHandler = async (internalEvent, options) => {
10
- const config = globalThis.openNextConfig.middleware;
11
- const originResolver = await resolveOriginResolver(config?.originResolver);
12
- const externalRequestProxy = await resolveProxyRequest(config?.override?.proxyExternalRequest);
13
- const assetResolver = await resolveAssetResolver(config?.assetResolver);
10
+ // We know that the middleware is external when this adapter is used
11
+ const middlewareConfig = globalThis.openNextConfig
12
+ .middleware;
13
+ const originResolver = await resolveOriginResolver(middlewareConfig?.originResolver);
14
+ const externalRequestProxy = await resolveProxyRequest(middlewareConfig?.override?.proxyExternalRequest);
15
+ const assetResolver = await resolveAssetResolver(middlewareConfig?.assetResolver);
14
16
  //#override includeCacheInMiddleware
15
- globalThis.tagCache = await resolveTagCache(config?.override?.tagCache);
16
- globalThis.queue = await resolveQueue(config?.override?.queue);
17
- globalThis.incrementalCache = await resolveIncrementalCache(config?.override?.incrementalCache);
17
+ globalThis.tagCache = await resolveTagCache(middlewareConfig?.override?.tagCache);
18
+ globalThis.queue = await resolveQueue(middlewareConfig?.override?.queue);
19
+ globalThis.incrementalCache = await resolveIncrementalCache(middlewareConfig?.override?.incrementalCache);
18
20
  //#endOverride
19
21
  const requestId = Math.random().toString(36);
20
22
  // We run everything in the async local storage context so that it is available in the external middleware
@@ -139,6 +139,7 @@ async function generateBundle(name, options, fnOptions, codeCustomization) {
139
139
  const isAfter141 = buildHelper.compareSemver(options.nextVersion, ">=", "14.1");
140
140
  const isAfter142 = buildHelper.compareSemver(options.nextVersion, ">=", "14.2");
141
141
  const isAfter152 = buildHelper.compareSemver(options.nextVersion, ">=", "15.2.0");
142
+ const isAfter154 = buildHelper.compareSemver(options.nextVersion, ">=", "15.4.0");
142
143
  const disableRouting = isBefore13413 || config.middleware?.external;
143
144
  const updater = new ContentUpdater(options);
144
145
  const additionalPlugins = codeCustomization?.additionalPlugins
@@ -153,6 +154,7 @@ async function generateBundle(name, options, fnOptions, codeCustomization) {
153
154
  ...(disableRouting ? ["withRouting"] : []),
154
155
  ...(isAfter142 ? ["patchAsyncStorage"] : []),
155
156
  ...(isAfter141 ? ["appendPrefetch"] : []),
157
+ ...(isAfter154 ? [] : ["setInitialURL"]),
156
158
  ],
157
159
  }),
158
160
  openNextReplacementPlugin({
@@ -61,11 +61,13 @@ export async function generateOutput(options) {
61
61
  const edgeFunctions = {};
62
62
  const isExternalMiddleware = config.middleware?.external ?? false;
63
63
  if (isExternalMiddleware) {
64
+ const middlewareConfig = options.config
65
+ .middleware;
64
66
  edgeFunctions.middleware = {
65
67
  bundle: ".open-next/middleware",
66
68
  handler: "handler.handler",
67
- pathResolver: await extractOverrideName("pattern-env", config.middleware.originResolver),
68
- ...(await extractOverrideFn(config.middleware?.override)),
69
+ pathResolver: await extractOverrideName("pattern-env", middlewareConfig.originResolver),
70
+ ...(await extractOverrideFn(middlewareConfig.override)),
69
71
  };
70
72
  }
71
73
  // Add edge functions
@@ -72,7 +72,9 @@ export function validateConfig(config) {
72
72
  It is safe to disable if you only use page router`);
73
73
  }
74
74
  validateFunctionOptions(config.imageOptimization ?? {});
75
- validateFunctionOptions(config.middleware ?? {});
75
+ if (config.middleware?.external === true) {
76
+ validateFunctionOptions(config.middleware ?? {});
77
+ }
76
78
  //@ts-expect-error - Revalidate custom wrapper type is different
77
79
  validateFunctionOptions(config.revalidate ?? {});
78
80
  //@ts-expect-error - Warmer custom wrapper type is different
@@ -4,8 +4,10 @@ export async function createGenericHandler(handler) {
4
4
  // @ts-expect-error `./open-next.config.mjs` exists only in the build output
5
5
  const config = await import("./open-next.config.mjs").then((m) => m.default);
6
6
  globalThis.openNextConfig = config;
7
- const override = config[handler.type]
8
- ?.override;
7
+ const handlerConfig = config[handler.type];
8
+ const override = handlerConfig && "override" in handlerConfig
9
+ ? handlerConfig.override
10
+ : undefined;
9
11
  // From the config, we create the converter
10
12
  const converter = await resolveConverter(override?.converter);
11
13
  // Then we create the handler
@@ -4,7 +4,7 @@ import { runWithOpenNextRequestContext } from "../utils/promise";
4
4
  import { NextConfig } from "../adapters/config/index";
5
5
  import { debug, error } from "../adapters/logger";
6
6
  import { patchAsyncStorage } from "./patchAsyncStorage";
7
- import { constructNextUrl, convertRes, convertToQuery, createServerResponse, } from "./routing/util";
7
+ import { constructNextUrl, convertRes, convertToQuery, convertToQueryString, createServerResponse, } from "./routing/util";
8
8
  import routingHandler, { INTERNAL_EVENT_REQUEST_ID, INTERNAL_HEADER_INITIAL_URL, INTERNAL_HEADER_RESOLVED_ROUTES, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_HEADER_PREFIX_LEN, } from "./routingHandler";
9
9
  import { requestHandler, setNextjsPrebundledReact } from "./util";
10
10
  // This is used to identify requests in the cache
@@ -167,7 +167,10 @@ async function processRequest(req, res, routingResult) {
167
167
  // Here we try to apply as much request metadata as possible
168
168
  // We apply every metadata from `resolve-routes` https://github.com/vercel/next.js/blob/916f105b97211de50f8580f0b39c9e7c60de4886/packages/next/src/server/lib/router-utils/resolve-routes.ts
169
169
  // and `router-server` https://github.com/vercel/next.js/blob/916f105b97211de50f8580f0b39c9e7c60de4886/packages/next/src/server/lib/router-server.ts
170
- const initialURL = new URL(routingResult.initialURL);
170
+ const initialURL = new URL(
171
+ // We always assume that only the routing layer can set this header.
172
+ routingResult.internalEvent.headers[INTERNAL_HEADER_INITIAL_URL] ??
173
+ routingResult.initialURL);
171
174
  let invokeStatus;
172
175
  if (routingResult.internalEvent.rawPath === "/500") {
173
176
  invokeStatus = 500;
@@ -194,6 +197,13 @@ async function processRequest(req, res, routingResult) {
194
197
  setNextjsPrebundledReact(routingResult.internalEvent.rawPath);
195
198
  //#endOverride
196
199
  // Next Server
200
+ // TODO: only enable this on Next 15.4+
201
+ // We need to set the pathname to the data request path
202
+ //#override setInitialURL
203
+ req.url =
204
+ initialURL.pathname +
205
+ convertToQueryString(routingResult.internalEvent.query);
206
+ //#endOverride
197
207
  await requestHandler(requestMetadata)(req, res);
198
208
  }
199
209
  catch (e) {
@@ -1,4 +1,4 @@
1
- import type { BaseEventOrResult, DefaultOverrideOptions, InternalEvent, InternalResult, OpenNextConfig, OverrideOptions } from "../types/open-next";
1
+ import type { BaseEventOrResult, DefaultOverrideOptions, ExternalMiddlewareConfig, InternalEvent, InternalResult, OpenNextConfig, OverrideOptions } from "../types/open-next";
2
2
  import type { Converter, TagCache, Wrapper } from "../types/overrides";
3
3
  type RemoveUndefined<T> = T extends undefined ? never : T;
4
4
  export declare function resolveConverter<E extends BaseEventOrResult = InternalEvent, R extends BaseEventOrResult = InternalResult>(converter: DefaultOverrideOptions<E, R>["converter"]): Promise<Converter<E, R>>;
@@ -34,7 +34,7 @@ export declare function resolveImageLoader(imageLoader: RemoveUndefined<OpenNext
34
34
  * @returns
35
35
  * @__PURE__
36
36
  */
37
- export declare function resolveOriginResolver(originResolver: RemoveUndefined<OpenNextConfig["middleware"]>["originResolver"]): Promise<import("../types/overrides").OriginResolver>;
37
+ export declare function resolveOriginResolver(originResolver: RemoveUndefined<ExternalMiddlewareConfig>["originResolver"]): Promise<import("../types/overrides").OriginResolver>;
38
38
  /**
39
39
  * @returns
40
40
  * @__PURE__
@@ -244,43 +244,56 @@ export interface SplittedFunctionOptions extends FunctionOptions {
244
244
  */
245
245
  patterns: string[];
246
246
  }
247
+ /**
248
+ * MiddlewareConfig that applies to both external and internal middlewares
249
+ *
250
+ * Note: this type is internal and included in both `ExternalMiddlewareConfig` and `InternalMiddlewareConfig`
251
+ */
252
+ type CommonMiddlewareConfig = {
253
+ /**
254
+ * The assetResolver is used to resolve assets in the routing layer.
255
+ *
256
+ * @default "dummy"
257
+ */
258
+ assetResolver?: IncludedAssetResolver | LazyLoadedOverride<AssetResolver>;
259
+ };
260
+ /** MiddlewareConfig that applies to external middlewares only */
261
+ export type ExternalMiddlewareConfig = DefaultFunctionOptions & CommonMiddlewareConfig & {
262
+ external: true;
263
+ /**
264
+ * The runtime used by next for the middleware.
265
+ * @default "edge"
266
+ */
267
+ runtime?: "node" | "edge";
268
+ /**
269
+ * The override options for the middleware.
270
+ * By default the lite override are used (.i.e. s3-lite, dynamodb-lite, sqs-lite)
271
+ * @default undefined
272
+ */
273
+ override?: OverrideOptions;
274
+ /**
275
+ * Origin resolver is used to resolve the origin for internal rewrite.
276
+ * By default, it uses the pattern-env origin resolver.
277
+ * Pattern env uses pattern set in split function options and an env variable OPEN_NEXT_ORIGIN
278
+ * OPEN_NEXT_ORIGIN should be a json stringified object with the key of the splitted function as key and the origin as value
279
+ * @default "pattern-env"
280
+ */
281
+ originResolver?: IncludedOriginResolver | LazyLoadedOverride<OriginResolver>;
282
+ };
283
+ /** MiddlewareConfig that applies to internal middlewares only */
284
+ export type InternalMiddlewareConfig = {
285
+ external: false;
286
+ } & CommonMiddlewareConfig;
247
287
  export interface OpenNextConfig {
248
288
  default: FunctionOptions;
249
289
  functions?: Record<string, SplittedFunctionOptions>;
250
290
  /**
251
291
  * Override the default middleware
252
- * If you set this options, the middleware need to be deployed separately.
292
+ * When `external` is true, the middleware need to be deployed separately.
253
293
  * It supports both edge and node runtime.
254
- * @default undefined
294
+ * @default undefined - Which is equivalent to `external: false`
255
295
  */
256
- middleware?: DefaultFunctionOptions & {
257
- external: true;
258
- /**
259
- * The runtime used by next for the middleware.
260
- * @default "edge"
261
- */
262
- runtime?: "node" | "edge";
263
- /**
264
- * The override options for the middleware.
265
- * By default the lite override are used (.i.e. s3-lite, dynamodb-lite, sqs-lite)
266
- * @default undefined
267
- */
268
- override?: OverrideOptions;
269
- /**
270
- * Origin resolver is used to resolve the origin for internal rewrite.
271
- * By default, it uses the pattern-env origin resolver.
272
- * Pattern env uses pattern set in split function options and an env variable OPEN_NEXT_ORIGIN
273
- * OPEN_NEXT_ORIGIN should be a json stringified object with the key of the splitted function as key and the origin as value
274
- * @default "pattern-env"
275
- */
276
- originResolver?: IncludedOriginResolver | LazyLoadedOverride<OriginResolver>;
277
- /**
278
- * The assetResolver is used to resolve assets in the routing layer.
279
- *
280
- * @default "dummy"
281
- */
282
- assetResolver?: IncludedAssetResolver | LazyLoadedOverride<AssetResolver>;
283
- };
296
+ middleware?: ExternalMiddlewareConfig | InternalMiddlewareConfig;
284
297
  /**
285
298
  * Override the default warmer
286
299
  * By default, works for lambda only.
@@ -362,3 +375,4 @@ export interface OpenNextConfig {
362
375
  */
363
376
  edgeExternals?: string[];
364
377
  }
378
+ export {};
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "access": "public"
4
4
  },
5
5
  "name": "@opennextjs/aws",
6
- "version": "3.7.0",
6
+ "version": "3.7.1",
7
7
  "bin": {
8
8
  "open-next": "./dist/index.js"
9
9
  },