@netlify/plugin-nextjs 4.30.1 → 4.30.3-als.0
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.
package/lib/helpers/config.js
CHANGED
|
@@ -9,6 +9,7 @@ const fs_extra_1 = require("fs-extra");
|
|
|
9
9
|
const pathe_1 = require("pathe");
|
|
10
10
|
const slash_1 = __importDefault(require("slash"));
|
|
11
11
|
const constants_1 = require("../constants");
|
|
12
|
+
const utils_1 = require("./utils");
|
|
12
13
|
const ROUTES_MANIFEST_FILE = 'routes-manifest.json';
|
|
13
14
|
const defaultFailBuild = (message, { error }) => {
|
|
14
15
|
throw new Error(`${message}\n${error && error.stack}`);
|
|
@@ -133,7 +134,8 @@ const generateCustomHeaders = (nextConfig, netlifyHeaders = []) => {
|
|
|
133
134
|
const useLocale = ((_a = i18n === null || i18n === void 0 ? void 0 : i18n.locales) === null || _a === void 0 ? void 0 : _a.length) > 0 && localeEnabled !== false;
|
|
134
135
|
if (useLocale) {
|
|
135
136
|
const { locales } = i18n;
|
|
136
|
-
|
|
137
|
+
// escape the locale strings to match the way Next writes the routes-manifest.json file
|
|
138
|
+
const joinedLocales = locales.map((locale) => (0, utils_1.escapeStringRegexp)(locale)).join('|');
|
|
137
139
|
/**
|
|
138
140
|
* converts e.g.
|
|
139
141
|
* /:nextInternalLocale(en|fr)/some-path
|
package/lib/helpers/edge.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.writeEdgeFunctions = exports.writeRscDataEdgeFunction = exports.writeDevEdgeFunction = exports.cleanupEdgeFunctions = exports.loadPrerenderManifest = exports.loadAppPathRoutesManifest = exports.loadMiddlewareManifest = exports.isAppDirRoute = void 0;
|
|
6
|
+
exports.writeEdgeFunctions = exports.getEdgeFunctionPatternForPage = exports.writeRscDataEdgeFunction = exports.writeDevEdgeFunction = exports.cleanupEdgeFunctions = exports.loadPrerenderManifest = exports.loadAppPathRoutesManifest = exports.loadMiddlewareManifest = exports.isAppDirRoute = void 0;
|
|
7
7
|
const fs_1 = require("fs");
|
|
8
8
|
const path_1 = require("path");
|
|
9
9
|
const chalk_1 = require("chalk");
|
|
@@ -36,12 +36,18 @@ const preamble = /* js */ `
|
|
|
36
36
|
import {
|
|
37
37
|
decode as _base64Decode,
|
|
38
38
|
} from "https://deno.land/std@0.159.0/encoding/base64.ts";
|
|
39
|
+
|
|
40
|
+
import { AsyncLocalStorage } from "https://raw.githubusercontent.com/crowlKats/deno_std/asynclocalstorage/node/async_hooks.ts";
|
|
41
|
+
|
|
39
42
|
// Deno defines "window", but naughty libraries think this means it's a browser
|
|
40
43
|
delete globalThis.window
|
|
41
44
|
globalThis.process = { env: {...Deno.env.toObject(), NEXT_RUNTIME: 'edge', 'NEXT_PRIVATE_MINIMAL_MODE': '1' } }
|
|
42
45
|
globalThis.EdgeRuntime = "netlify-edge"
|
|
43
46
|
let _ENTRIES = {}
|
|
44
47
|
|
|
48
|
+
// Next.js expects this as a global
|
|
49
|
+
globalThis.AsyncLocalStorage = AsyncLocalStorage
|
|
50
|
+
|
|
45
51
|
// Next.js uses this extension to the Headers API implemented by Cloudflare workerd
|
|
46
52
|
if(!('getAll' in Headers.prototype)) {
|
|
47
53
|
Headers.prototype.getAll = function getAll(name) {
|
|
@@ -87,6 +93,7 @@ const IMPORT_UNSUPPORTED = [
|
|
|
87
93
|
const getMiddlewareBundle = async ({ edgeFunctionDefinition, netlifyConfig, }) => {
|
|
88
94
|
const { publish } = netlifyConfig.build;
|
|
89
95
|
const chunks = [preamble];
|
|
96
|
+
chunks.push(`export const _DEFINITION = ${JSON.stringify(edgeFunctionDefinition)}`);
|
|
90
97
|
if ('wasm' in edgeFunctionDefinition) {
|
|
91
98
|
for (const { name, filePath } of edgeFunctionDefinition.wasm) {
|
|
92
99
|
const wasm = await fs_1.promises.readFile((0, path_1.join)(publish, filePath));
|
|
@@ -212,12 +219,19 @@ const writeRscDataEdgeFunction = async ({ prerenderManifest, appPathRoutesManife
|
|
|
212
219
|
exports.writeRscDataEdgeFunction = writeRscDataEdgeFunction;
|
|
213
220
|
const getEdgeFunctionPatternForPage = ({ edgeFunctionDefinition, pageRegexMap, appPathRoutesManifest, }) => {
|
|
214
221
|
// We don't just use the matcher from the edge function definition, because it doesn't handle trailing slashes
|
|
215
|
-
var _a;
|
|
222
|
+
var _a, _b;
|
|
216
223
|
// appDir functions have a name that _isn't_ the route name, but rather the route with `/page` appended
|
|
217
224
|
const regexp = pageRegexMap.get((_a = appPathRoutesManifest === null || appPathRoutesManifest === void 0 ? void 0 : appPathRoutesManifest[edgeFunctionDefinition.page]) !== null && _a !== void 0 ? _a : edgeFunctionDefinition.page);
|
|
225
|
+
if (regexp) {
|
|
226
|
+
return regexp;
|
|
227
|
+
}
|
|
228
|
+
if ('regexp' in edgeFunctionDefinition) {
|
|
229
|
+
return edgeFunctionDefinition.regexp.replace(/([^/])\$$/, '$1/?$');
|
|
230
|
+
}
|
|
218
231
|
// If we need to fall back to the matcher, we need to add an optional trailing slash
|
|
219
|
-
return
|
|
232
|
+
return (_b = edgeFunctionDefinition.matchers) === null || _b === void 0 ? void 0 : _b[0].regexp.replace(/([^/])\$$/, '$1/?$');
|
|
220
233
|
};
|
|
234
|
+
exports.getEdgeFunctionPatternForPage = getEdgeFunctionPatternForPage;
|
|
221
235
|
/**
|
|
222
236
|
* Writes Edge Functions for the Next middleware
|
|
223
237
|
*/
|
|
@@ -282,13 +296,17 @@ const writeEdgeFunctions = async ({ netlifyConfig, routesManifest, }) => {
|
|
|
282
296
|
});
|
|
283
297
|
manifest.functions.push(...matchers.map((matcher) => middlewareMatcherToEdgeFunctionDefinition(matcher, functionName)));
|
|
284
298
|
}
|
|
299
|
+
// Functions (i.e. not middleware, but edge SSR and API routes)
|
|
285
300
|
if (typeof middlewareManifest.functions === 'object') {
|
|
286
301
|
// When using the app dir, we also need to check if the EF matches a page
|
|
287
302
|
const appPathRoutesManifest = await (0, exports.loadAppPathRoutesManifest)(netlifyConfig);
|
|
303
|
+
// A map of all route pages to their page regex. This is used for pages dir and appDir.
|
|
288
304
|
const pageRegexMap = new Map([...(routesManifest.dynamicRoutes || []), ...(routesManifest.staticRoutes || [])].map((route) => [
|
|
289
305
|
route.page,
|
|
290
306
|
route.regex,
|
|
291
307
|
]));
|
|
308
|
+
// Create a map of pages-dir routes to their data route regex (appDir uses the same route as the HTML)
|
|
309
|
+
const dataRoutesMap = new Map([...(routesManifest.dataRoutes || [])].map((route) => [route.page, route.dataRouteRegex]));
|
|
292
310
|
for (const edgeFunctionDefinition of Object.values(middlewareManifest.functions)) {
|
|
293
311
|
usesEdge = true;
|
|
294
312
|
const functionName = sanitizeName(edgeFunctionDefinition.name);
|
|
@@ -298,7 +316,7 @@ const writeEdgeFunctions = async ({ netlifyConfig, routesManifest, }) => {
|
|
|
298
316
|
netlifyConfig,
|
|
299
317
|
functionName,
|
|
300
318
|
});
|
|
301
|
-
const pattern = getEdgeFunctionPatternForPage({
|
|
319
|
+
const pattern = (0, exports.getEdgeFunctionPatternForPage)({
|
|
302
320
|
edgeFunctionDefinition,
|
|
303
321
|
pageRegexMap,
|
|
304
322
|
appPathRoutesManifest,
|
|
@@ -310,6 +328,16 @@ const writeEdgeFunctions = async ({ netlifyConfig, routesManifest, }) => {
|
|
|
310
328
|
// cache: "manual" is currently experimental, so we restrict it to sites that use experimental appDir
|
|
311
329
|
cache: usesAppDir ? 'manual' : undefined,
|
|
312
330
|
});
|
|
331
|
+
// pages-dir page routes also have a data route. If there's a match, add an entry mapping that to the function too
|
|
332
|
+
const dataRoute = dataRoutesMap.get(edgeFunctionDefinition.page);
|
|
333
|
+
if (dataRoute) {
|
|
334
|
+
manifest.functions.push({
|
|
335
|
+
function: functionName,
|
|
336
|
+
name: edgeFunctionDefinition.name,
|
|
337
|
+
pattern: dataRoute,
|
|
338
|
+
cache: usesAppDir ? 'manual' : undefined,
|
|
339
|
+
});
|
|
340
|
+
}
|
|
313
341
|
}
|
|
314
342
|
}
|
|
315
343
|
if (usesEdge) {
|
package/lib/helpers/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getRemotePatterns = exports.isBundleSizeCheckDisabled = exports.getCustomImageResponseHeaders = exports.isNextAuthInstalled = exports.findModuleFromBase = exports.shouldSkip = exports.getPreviewRewrites = exports.getApiRewrites = exports.redirectsForNextRouteWithData = exports.redirectsForNext404Route = exports.redirectsForNextRoute = exports.is404Route = exports.isApiRoute = exports.localizeRoute = exports.routeToDataRoute = exports.generateNetlifyRoutes = exports.toNetlifyRoute = exports.getFunctionNameForPage = void 0;
|
|
6
|
+
exports.escapeStringRegexp = exports.getRemotePatterns = exports.isBundleSizeCheckDisabled = exports.getCustomImageResponseHeaders = exports.isNextAuthInstalled = exports.findModuleFromBase = exports.shouldSkip = exports.getPreviewRewrites = exports.getApiRewrites = exports.redirectsForNextRouteWithData = exports.redirectsForNext404Route = exports.redirectsForNextRoute = exports.is404Route = exports.isApiRoute = exports.localizeRoute = exports.routeToDataRoute = exports.generateNetlifyRoutes = exports.toNetlifyRoute = exports.getFunctionNameForPage = void 0;
|
|
7
7
|
const globby_1 = __importDefault(require("globby"));
|
|
8
8
|
const pathe_1 = require("pathe");
|
|
9
9
|
const constants_1 = require("../constants");
|
|
@@ -207,3 +207,8 @@ const getRemotePatterns = (experimental, images) => {
|
|
|
207
207
|
return [];
|
|
208
208
|
};
|
|
209
209
|
exports.getRemotePatterns = getRemotePatterns;
|
|
210
|
+
// Taken from next/src/shared/lib/escape-regexp.ts
|
|
211
|
+
const reHasRegExp = /[|\\{}()[\]^$+*?.-]/;
|
|
212
|
+
const reReplaceRegExp = /[|\\{}()[\]^$+*?.-]/g;
|
|
213
|
+
const escapeStringRegexp = (str) => (reHasRegExp.test(str) ? str.replace(reReplaceRegExp, '\\$&') : str);
|
|
214
|
+
exports.escapeStringRegexp = escapeStringRegexp;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@netlify/plugin-nextjs",
|
|
3
|
-
"version": "4.30.
|
|
3
|
+
"version": "4.30.3-als.0",
|
|
4
4
|
"description": "Run Next.js seamlessly on Netlify",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -36,12 +36,12 @@
|
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@delucis/if-env": "^1.1.2",
|
|
39
|
-
"@netlify/build": "^29.5.
|
|
39
|
+
"@netlify/build": "^29.5.2",
|
|
40
40
|
"@types/fs-extra": "^9.0.13",
|
|
41
41
|
"@types/jest": "^27.4.1",
|
|
42
42
|
"@types/merge-stream": "^1.1.2",
|
|
43
43
|
"@types/node": "^17.0.25",
|
|
44
|
-
"next": "^13.
|
|
44
|
+
"next": "^13.1.5",
|
|
45
45
|
"npm-run-all": "^4.1.5",
|
|
46
46
|
"typescript": "^4.6.3"
|
|
47
47
|
},
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This placeholder is replaced with the compiled Next.js bundle at build time
|
|
3
3
|
* @param {Object} props
|
|
4
|
-
* @param {import("./runtime.ts").RequestData} props.request
|
|
4
|
+
* @param {import("./function-runtime.ts").RequestData} props.request
|
|
5
5
|
* @returns {Promise<import("../edge-shared/utils.ts").FetchEventResult>}
|
|
6
6
|
*/
|
|
7
7
|
export default async ({ request }) => {}
|
|
8
|
+
export const _DEFINITION = { env: [], files: [], page: 'placeholder', name: 'pages_placeholder', matchers: [] }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Context } from 'https://edge.netlify.com'
|
|
2
2
|
// Available at build time
|
|
3
|
-
import edgeFunction from './bundle.js'
|
|
3
|
+
import { _DEFINITION as edgeFunctionDefinition, default as edgeFunction } from './bundle.js'
|
|
4
4
|
import { buildNextRequest, buildResponse, redirectTrailingSlash } from '../edge-shared/utils.ts'
|
|
5
5
|
import nextConfig from '../edge-shared/nextConfig.json' assert { type: 'json' }
|
|
6
6
|
|
|
@@ -11,6 +11,7 @@ const handler = async (req: Request, context: Context) => {
|
|
|
11
11
|
return redirect
|
|
12
12
|
}
|
|
13
13
|
const request = buildNextRequest(req, context, nextConfig)
|
|
14
|
+
request.headers['x-matched-path'] ||= edgeFunctionDefinition.page
|
|
14
15
|
try {
|
|
15
16
|
const result = await edgeFunction({ request })
|
|
16
17
|
return buildResponse({ result, request: req, context })
|