@sladg/nextjs-lambda
Version:
Plug-and-play lambda for replacing default NextJS image optimization handler.
1,111 lines (1,081 loc) • 53.8 kB
JavaScript
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/serverless-http/lib/finish.js
var require_finish = __commonJS({
"node_modules/serverless-http/lib/finish.js"(exports, module2) {
"use strict";
module2.exports = async function finish(item, transform, ...details) {
await new Promise((resolve, reject) => {
if (item.finished || item.complete) {
resolve();
return;
}
let finished = false;
function done(err) {
if (finished) {
return;
}
finished = true;
item.removeListener("error", done);
item.removeListener("end", done);
item.removeListener("finish", done);
if (err) {
reject(err);
} else {
resolve();
}
}
item.once("error", done);
item.once("end", done);
item.once("finish", done);
});
if (typeof transform === "function") {
await transform(item, ...details);
} else if (typeof transform === "object" && transform !== null) {
Object.assign(item, transform);
}
return item;
};
}
});
// node_modules/serverless-http/lib/response.js
var require_response = __commonJS({
"node_modules/serverless-http/lib/response.js"(exports, module2) {
"use strict";
var http = require("http");
var headerEnd = "\r\n\r\n";
var BODY = Symbol();
var HEADERS = Symbol();
function getString(data) {
if (Buffer.isBuffer(data)) {
return data.toString("utf8");
} else if (typeof data === "string") {
return data;
} else {
throw new Error(`response.write() of unexpected type: ${typeof data}`);
}
}
function addData(stream, data) {
if (Buffer.isBuffer(data) || typeof data === "string" || data instanceof Uint8Array) {
stream[BODY].push(Buffer.from(data));
} else {
throw new Error(`response.write() of unexpected type: ${typeof data}`);
}
}
module2.exports = class ServerlessResponse extends http.ServerResponse {
static from(res) {
const response = new ServerlessResponse(res);
response.statusCode = res.statusCode;
response[HEADERS] = res.headers;
response[BODY] = [Buffer.from(res.body)];
response.end();
return response;
}
static body(res) {
return Buffer.concat(res[BODY]);
}
static headers(res) {
const headers = typeof res.getHeaders === "function" ? res.getHeaders() : res._headers;
return Object.assign(headers, res[HEADERS]);
}
get headers() {
return this[HEADERS];
}
setHeader(key, value) {
if (this._wroteHeader) {
this[HEADERS][key] = value;
} else {
super.setHeader(key, value);
}
}
writeHead(statusCode, reason, obj) {
const headers = typeof reason === "string" ? obj : reason;
for (const name in headers) {
this.setHeader(name, headers[name]);
if (!this._wroteHeader) {
break;
}
}
super.writeHead(statusCode, reason, obj);
}
constructor({ method }) {
super({ method });
this[BODY] = [];
this[HEADERS] = {};
this.useChunkedEncodingByDefault = false;
this.chunkedEncoding = false;
this._header = "";
this.assignSocket({
_writableState: {},
writable: true,
on: Function.prototype,
removeListener: Function.prototype,
destroy: Function.prototype,
cork: Function.prototype,
uncork: Function.prototype,
write: (data, encoding, cb) => {
if (typeof encoding === "function") {
cb = encoding;
encoding = null;
}
if (this._header === "" || this._wroteHeader) {
addData(this, data);
} else {
const string = getString(data);
const index = string.indexOf(headerEnd);
if (index !== -1) {
const remainder = string.slice(index + headerEnd.length);
if (remainder) {
addData(this, remainder);
}
this._wroteHeader = true;
}
}
if (typeof cb === "function") {
cb();
}
}
});
this.once("finish", () => {
this.emit("close");
});
}
};
}
});
// node_modules/serverless-http/lib/framework/get-framework.js
var require_get_framework = __commonJS({
"node_modules/serverless-http/lib/framework/get-framework.js"(exports, module2) {
"use strict";
var http = require("http");
var Response = require_response();
function common(cb) {
return (request) => {
const response = new Response(request);
cb(request, response);
return response;
};
}
module2.exports = function getFramework(app) {
if (app instanceof http.Server) {
return (request) => {
const response = new Response(request);
app.emit("request", request, response);
return response;
};
}
if (typeof app.callback === "function") {
return common(app.callback());
}
if (typeof app.handle === "function") {
return common((request, response) => {
app.handle(request, response);
});
}
if (typeof app.handler === "function") {
return common((request, response) => {
app.handler(request, response);
});
}
if (typeof app._onRequest === "function") {
return common((request, response) => {
app._onRequest(request, response);
});
}
if (typeof app === "function") {
return common(app);
}
if (app.router && typeof app.router.route == "function") {
return common((req, res) => {
const { url, method, headers, body } = req;
app.router.route({ url, method, headers, body }, res);
});
}
if (app._core && typeof app._core._dispatch === "function") {
return common(app._core._dispatch({
app
}));
}
if (typeof app.inject === "function") {
return async (request) => {
const { method, url, headers, body } = request;
const res = await app.inject({ method, url, headers, payload: body });
return Response.from(res);
};
}
if (typeof app.main === "function") {
return common(app.main);
}
throw new Error("Unsupported framework");
};
}
});
// node_modules/serverless-http/lib/provider/aws/clean-up-event.js
var require_clean_up_event = __commonJS({
"node_modules/serverless-http/lib/provider/aws/clean-up-event.js"(exports, module2) {
"use strict";
function removeBasePath(path3 = "/", basePath) {
if (basePath) {
const basePathIndex = path3.indexOf(basePath);
if (basePathIndex > -1) {
return path3.substr(basePathIndex + basePath.length) || "/";
}
}
return path3;
}
function isString(value) {
return typeof value === "string" || value instanceof String;
}
function specialDecodeURIComponent(value) {
if (!isString(value)) {
return value;
}
let decoded;
try {
decoded = decodeURIComponent(value.replace(/[+]/g, "%20"));
} catch (err) {
decoded = value.replace(/[+]/g, "%20");
}
return decoded;
}
function recursiveURLDecode(value) {
if (isString(value)) {
return specialDecodeURIComponent(value);
} else if (Array.isArray(value)) {
const decodedArray = [];
for (let index in value) {
decodedArray.push(recursiveURLDecode(value[index]));
}
return decodedArray;
} else if (value instanceof Object) {
const decodedObject = {};
for (let key of Object.keys(value)) {
decodedObject[specialDecodeURIComponent(key)] = recursiveURLDecode(value[key]);
}
return decodedObject;
}
return value;
}
module2.exports = function cleanupEvent(evt, options) {
const event = evt || {};
event.requestContext = event.requestContext || {};
event.body = event.body || "";
event.headers = event.headers || {};
if ("elb" in event.requestContext) {
if (event.multiValueQueryStringParameters) {
event.multiValueQueryStringParameters = recursiveURLDecode(event.multiValueQueryStringParameters);
}
if (event.queryStringParameters) {
event.queryStringParameters = recursiveURLDecode(event.queryStringParameters);
}
}
if (event.version === "2.0") {
event.requestContext.authorizer = event.requestContext.authorizer || {};
event.requestContext.http.method = event.requestContext.http.method || "GET";
event.rawPath = removeBasePath(event.requestPath || event.rawPath, options.basePath);
} else {
event.requestContext.identity = event.requestContext.identity || {};
event.httpMethod = event.httpMethod || "GET";
event.path = removeBasePath(event.requestPath || event.path, options.basePath);
}
return event;
};
}
});
// node_modules/serverless-http/lib/request.js
var require_request = __commonJS({
"node_modules/serverless-http/lib/request.js"(exports, module2) {
"use strict";
var http = require("http");
module2.exports = class ServerlessRequest extends http.IncomingMessage {
constructor({ method, url, headers, body, remoteAddress }) {
super({
encrypted: true,
readable: false,
remoteAddress,
address: () => ({ port: 443 }),
end: Function.prototype,
destroy: Function.prototype
});
if (typeof headers["content-length"] === "undefined") {
headers["content-length"] = Buffer.byteLength(body);
}
Object.assign(this, {
ip: remoteAddress,
complete: true,
httpVersion: "1.1",
httpVersionMajor: "1",
httpVersionMinor: "1",
method,
headers,
body,
url
});
this._read = () => {
this.push(body);
this.push(null);
};
}
};
}
});
// node_modules/serverless-http/lib/provider/aws/create-request.js
var require_create_request = __commonJS({
"node_modules/serverless-http/lib/provider/aws/create-request.js"(exports, module2) {
"use strict";
var URL = require("url");
var Request = require_request();
function requestMethod(event) {
if (event.version === "2.0") {
return event.requestContext.http.method;
}
return event.httpMethod;
}
function requestRemoteAddress(event) {
if (event.version === "2.0") {
return event.requestContext.http.sourceIp;
}
return event.requestContext.identity.sourceIp;
}
function requestHeaders(event) {
const initialHeader = event.version === "2.0" && Array.isArray(event.cookies) ? { cookie: event.cookies.join("; ") } : {};
if (event.multiValueHeaders) {
return Object.keys(event.multiValueHeaders).reduce((headers, key) => {
headers[key.toLowerCase()] = event.multiValueHeaders[key].join(", ");
return headers;
}, initialHeader);
}
return Object.keys(event.headers).reduce((headers, key) => {
headers[key.toLowerCase()] = event.headers[key];
return headers;
}, initialHeader);
}
function requestBody(event) {
const type = typeof event.body;
if (Buffer.isBuffer(event.body)) {
return event.body;
} else if (type === "string") {
return Buffer.from(event.body, event.isBase64Encoded ? "base64" : "utf8");
} else if (type === "object") {
return Buffer.from(JSON.stringify(event.body));
}
throw new Error(`Unexpected event.body type: ${typeof event.body}`);
}
function requestUrl(event) {
if (event.version === "2.0") {
return URL.format({
pathname: event.rawPath,
search: event.rawQueryString
});
}
const query = event.multiValueQueryStringParameters || {};
if (event.queryStringParameters) {
Object.keys(event.queryStringParameters).forEach((key) => {
if (Array.isArray(query[key])) {
if (!query[key].includes(event.queryStringParameters[key])) {
query[key].push(event.queryStringParameters[key]);
}
} else {
query[key] = [event.queryStringParameters[key]];
}
});
}
return URL.format({
pathname: event.path,
query
});
}
module2.exports = (event, context, options) => {
const method = requestMethod(event);
const remoteAddress = requestRemoteAddress(event);
const headers = requestHeaders(event);
const body = requestBody(event);
const url = requestUrl(event);
if (typeof options.requestId === "string" && options.requestId.length > 0) {
const header = options.requestId.toLowerCase();
const requestId = headers[header] || event.requestContext.requestId;
if (requestId) {
headers[header] = requestId;
}
}
const req = new Request({
method,
headers,
body,
remoteAddress,
url
});
req.requestContext = event.requestContext;
req.apiGateway = {
event,
context
};
return req;
};
}
});
// node_modules/serverless-http/lib/provider/aws/is-binary.js
var require_is_binary = __commonJS({
"node_modules/serverless-http/lib/provider/aws/is-binary.js"(exports, module2) {
"use strict";
var BINARY_ENCODINGS = ["gzip", "deflate", "br"];
var BINARY_CONTENT_TYPES = (process.env.BINARY_CONTENT_TYPES || "").split(",");
function isBinaryEncoding(headers) {
const contentEncoding = headers["content-encoding"];
if (typeof contentEncoding === "string") {
return contentEncoding.split(",").some(
(value) => BINARY_ENCODINGS.some((binaryEncoding) => value.indexOf(binaryEncoding) !== -1)
);
}
}
function isBinaryContent(headers, options) {
const contentTypes = [].concat(
options.binary ? options.binary : BINARY_CONTENT_TYPES
).map(
(candidate) => new RegExp(`^${candidate.replace(/\*/g, ".*")}$`)
);
const contentType = (headers["content-type"] || "").split(";")[0];
return !!contentType && contentTypes.some((candidate) => candidate.test(contentType));
}
module2.exports = function isBinary(headers, options) {
if (options.binary === false) {
return false;
}
if (options.binary === true) {
return true;
}
if (typeof options.binary === "function") {
return options.binary(headers);
}
return isBinaryEncoding(headers) || isBinaryContent(headers, options);
};
}
});
// node_modules/serverless-http/lib/provider/aws/sanitize-headers.js
var require_sanitize_headers = __commonJS({
"node_modules/serverless-http/lib/provider/aws/sanitize-headers.js"(exports, module2) {
"use strict";
module2.exports = function sanitizeHeaders(headers) {
return Object.keys(headers).reduce((memo, key) => {
const value = headers[key];
if (Array.isArray(value)) {
memo.multiValueHeaders[key] = value;
if (key.toLowerCase() !== "set-cookie") {
memo.headers[key] = value.join(", ");
}
} else {
memo.headers[key] = value == null ? "" : value.toString();
}
return memo;
}, {
headers: {},
multiValueHeaders: {}
});
};
}
});
// node_modules/serverless-http/lib/provider/aws/format-response.js
var require_format_response = __commonJS({
"node_modules/serverless-http/lib/provider/aws/format-response.js"(exports, module2) {
"use strict";
var isBinary = require_is_binary();
var Response = require_response();
var sanitizeHeaders = require_sanitize_headers();
module2.exports = (event, response, options) => {
const { statusCode } = response;
const { headers, multiValueHeaders } = sanitizeHeaders(Response.headers(response));
let cookies = [];
if (multiValueHeaders["set-cookie"]) {
cookies = multiValueHeaders["set-cookie"];
}
const isBase64Encoded = isBinary(headers, options);
const encoding = isBase64Encoded ? "base64" : "utf8";
let body = Response.body(response).toString(encoding);
if (headers["transfer-encoding"] === "chunked" || response.chunkedEncoding) {
const raw = Response.body(response).toString().split("\r\n");
const parsed = [];
for (let i = 0; i < raw.length; i += 2) {
const size = parseInt(raw[i], 16);
const value = raw[i + 1];
if (value) {
parsed.push(value.substring(0, size));
}
}
body = parsed.join("");
}
let formattedResponse = { statusCode, headers, isBase64Encoded, body };
if (event.version === "2.0" && cookies.length) {
formattedResponse["cookies"] = cookies;
}
if ((!event.version || event.version === "1.0") && Object.keys(multiValueHeaders).length) {
formattedResponse["multiValueHeaders"] = multiValueHeaders;
}
return formattedResponse;
};
}
});
// node_modules/serverless-http/lib/provider/aws/index.js
var require_aws = __commonJS({
"node_modules/serverless-http/lib/provider/aws/index.js"(exports, module2) {
var cleanUpEvent = require_clean_up_event();
var createRequest = require_create_request();
var formatResponse = require_format_response();
module2.exports = (options) => {
return (getResponse) => async (event_, context = {}) => {
const event = cleanUpEvent(event_, options);
const request = createRequest(event, context, options);
const response = await getResponse(request, event, context);
return formatResponse(event, response, options);
};
};
}
});
// node_modules/serverless-http/lib/provider/azure/clean-up-request.js
var require_clean_up_request = __commonJS({
"node_modules/serverless-http/lib/provider/azure/clean-up-request.js"(exports, module2) {
"use strict";
function getUrl({ requestPath, url }) {
if (requestPath) {
return requestPath;
}
return typeof url === "string" ? url : "/";
}
function getRequestContext(request) {
const requestContext = {};
requestContext.identity = {};
const forwardedIp = request.headers["x-forwarded-for"];
const clientIp = request.headers["client-ip"];
const ip = forwardedIp ? forwardedIp : clientIp ? clientIp : "";
if (ip) {
requestContext.identity.sourceIp = ip.split(":")[0];
}
return requestContext;
}
module2.exports = function cleanupRequest(req, options) {
const request = req || {};
request.requestContext = getRequestContext(req);
request.method = request.method || "GET";
request.url = getUrl(request);
request.body = request.body || "";
request.headers = request.headers || {};
if (options.basePath) {
const basePathIndex = request.url.indexOf(options.basePath);
if (basePathIndex > -1) {
request.url = request.url.substr(basePathIndex + options.basePath.length);
}
}
return request;
};
}
});
// node_modules/serverless-http/lib/provider/azure/create-request.js
var require_create_request2 = __commonJS({
"node_modules/serverless-http/lib/provider/azure/create-request.js"(exports, module2) {
"use strict";
var url = require("url");
var Request = require_request();
function requestHeaders(request) {
return Object.keys(request.headers).reduce((headers, key) => {
headers[key.toLowerCase()] = request.headers[key];
return headers;
}, {});
}
function requestBody(request) {
const type = typeof request.rawBody;
if (Buffer.isBuffer(request.rawBody)) {
return request.rawBody;
} else if (type === "string") {
return Buffer.from(request.rawBody, "utf8");
} else if (type === "object") {
return Buffer.from(JSON.stringify(request.rawBody));
}
throw new Error(`Unexpected request.body type: ${typeof request.rawBody}`);
}
module2.exports = (request) => {
const method = request.method;
const query = request.query;
const headers = requestHeaders(request);
const body = requestBody(request);
const req = new Request({
method,
headers,
body,
url: url.format({
pathname: request.url,
query
})
});
req.requestContext = request.requestContext;
return req;
};
}
});
// node_modules/serverless-http/lib/provider/azure/is-binary.js
var require_is_binary2 = __commonJS({
"node_modules/serverless-http/lib/provider/azure/is-binary.js"(exports, module2) {
"use strict";
var BINARY_ENCODINGS = ["gzip", "deflate", "br"];
var BINARY_CONTENT_TYPES = (process.env.BINARY_CONTENT_TYPES || "").split(",");
function isBinaryEncoding(headers) {
const contentEncoding = headers["content-encoding"];
if (typeof contentEncoding === "string") {
return contentEncoding.split(",").some(
(value) => BINARY_ENCODINGS.some((binaryEncoding) => value.indexOf(binaryEncoding) !== -1)
);
}
}
function isBinaryContent(headers, options) {
const contentTypes = [].concat(
options.binary ? options.binary : BINARY_CONTENT_TYPES
).map(
(candidate) => new RegExp(`^${candidate.replace(/\*/g, ".*")}$`)
);
const contentType = (headers["content-type"] || "").split(";")[0];
return !!contentType && contentTypes.some((candidate) => candidate.test(contentType));
}
module2.exports = function isBinary(headers, options) {
if (options.binary === false) {
return false;
}
if (options.binary === true) {
return true;
}
if (typeof options.binary === "function") {
return options.binary(headers);
}
return isBinaryEncoding(headers) || isBinaryContent(headers, options);
};
}
});
// node_modules/serverless-http/lib/provider/azure/set-cookie.json
var require_set_cookie = __commonJS({
"node_modules/serverless-http/lib/provider/azure/set-cookie.json"(exports, module2) {
module2.exports = { variations: ["set-cookie", "Set-cookie", "sEt-cookie", "SEt-cookie", "seT-cookie", "SeT-cookie", "sET-cookie", "SET-cookie", "set-Cookie", "Set-Cookie", "sEt-Cookie", "SEt-Cookie", "seT-Cookie", "SeT-Cookie", "sET-Cookie", "SET-Cookie", "set-cOokie", "Set-cOokie", "sEt-cOokie", "SEt-cOokie", "seT-cOokie", "SeT-cOokie", "sET-cOokie", "SET-cOokie", "set-COokie", "Set-COokie", "sEt-COokie", "SEt-COokie", "seT-COokie", "SeT-COokie", "sET-COokie", "SET-COokie", "set-coOkie", "Set-coOkie", "sEt-coOkie", "SEt-coOkie", "seT-coOkie", "SeT-coOkie", "sET-coOkie", "SET-coOkie", "set-CoOkie", "Set-CoOkie", "sEt-CoOkie", "SEt-CoOkie", "seT-CoOkie", "SeT-CoOkie", "sET-CoOkie", "SET-CoOkie", "set-cOOkie", "Set-cOOkie", "sEt-cOOkie", "SEt-cOOkie", "seT-cOOkie", "SeT-cOOkie", "sET-cOOkie", "SET-cOOkie", "set-COOkie", "Set-COOkie", "sEt-COOkie", "SEt-COOkie", "seT-COOkie", "SeT-COOkie", "sET-COOkie", "SET-COOkie", "set-cooKie", "Set-cooKie", "sEt-cooKie", "SEt-cooKie", "seT-cooKie", "SeT-cooKie", "sET-cooKie", "SET-cooKie", "set-CooKie", "Set-CooKie", "sEt-CooKie", "SEt-CooKie", "seT-CooKie", "SeT-CooKie", "sET-CooKie", "SET-CooKie", "set-cOoKie", "Set-cOoKie", "sEt-cOoKie", "SEt-cOoKie", "seT-cOoKie", "SeT-cOoKie", "sET-cOoKie", "SET-cOoKie", "set-COoKie", "Set-COoKie", "sEt-COoKie", "SEt-COoKie", "seT-COoKie", "SeT-COoKie", "sET-COoKie", "SET-COoKie", "set-coOKie", "Set-coOKie", "sEt-coOKie", "SEt-coOKie", "seT-coOKie", "SeT-coOKie", "sET-coOKie", "SET-coOKie", "set-CoOKie", "Set-CoOKie", "sEt-CoOKie", "SEt-CoOKie", "seT-CoOKie", "SeT-CoOKie", "sET-CoOKie", "SET-CoOKie", "set-cOOKie", "Set-cOOKie", "sEt-cOOKie", "SEt-cOOKie", "seT-cOOKie", "SeT-cOOKie", "sET-cOOKie", "SET-cOOKie", "set-COOKie", "Set-COOKie", "sEt-COOKie", "SEt-COOKie", "seT-COOKie", "SeT-COOKie", "sET-COOKie", "SET-COOKie", "set-cookIe", "Set-cookIe", "sEt-cookIe", "SEt-cookIe", "seT-cookIe", "SeT-cookIe", "sET-cookIe", "SET-cookIe", "set-CookIe", "Set-CookIe", "sEt-CookIe", "SEt-CookIe", "seT-CookIe", "SeT-CookIe", "sET-CookIe", "SET-CookIe", "set-cOokIe", "Set-cOokIe", "sEt-cOokIe", "SEt-cOokIe", "seT-cOokIe", "SeT-cOokIe", "sET-cOokIe", "SET-cOokIe", "set-COokIe", "Set-COokIe", "sEt-COokIe", "SEt-COokIe", "seT-COokIe", "SeT-COokIe", "sET-COokIe", "SET-COokIe", "set-coOkIe", "Set-coOkIe", "sEt-coOkIe", "SEt-coOkIe", "seT-coOkIe", "SeT-coOkIe", "sET-coOkIe", "SET-coOkIe", "set-CoOkIe", "Set-CoOkIe", "sEt-CoOkIe", "SEt-CoOkIe", "seT-CoOkIe", "SeT-CoOkIe", "sET-CoOkIe", "SET-CoOkIe", "set-cOOkIe", "Set-cOOkIe", "sEt-cOOkIe", "SEt-cOOkIe", "seT-cOOkIe", "SeT-cOOkIe", "sET-cOOkIe", "SET-cOOkIe", "set-COOkIe", "Set-COOkIe", "sEt-COOkIe", "SEt-COOkIe", "seT-COOkIe", "SeT-COOkIe", "sET-COOkIe", "SET-COOkIe", "set-cooKIe", "Set-cooKIe", "sEt-cooKIe", "SEt-cooKIe", "seT-cooKIe", "SeT-cooKIe", "sET-cooKIe", "SET-cooKIe", "set-CooKIe", "Set-CooKIe", "sEt-CooKIe", "SEt-CooKIe", "seT-CooKIe", "SeT-CooKIe", "sET-CooKIe", "SET-CooKIe", "set-cOoKIe", "Set-cOoKIe", "sEt-cOoKIe", "SEt-cOoKIe", "seT-cOoKIe", "SeT-cOoKIe", "sET-cOoKIe", "SET-cOoKIe", "set-COoKIe", "Set-COoKIe", "sEt-COoKIe", "SEt-COoKIe", "seT-COoKIe", "SeT-COoKIe", "sET-COoKIe", "SET-COoKIe", "set-coOKIe", "Set-coOKIe", "sEt-coOKIe", "SEt-coOKIe", "seT-coOKIe", "SeT-coOKIe", "sET-coOKIe", "SET-coOKIe", "set-CoOKIe", "Set-CoOKIe", "sEt-CoOKIe", "SEt-CoOKIe", "seT-CoOKIe", "SeT-CoOKIe", "sET-CoOKIe", "SET-CoOKIe", "set-cOOKIe", "Set-cOOKIe", "sEt-cOOKIe", "SEt-cOOKIe", "seT-cOOKIe", "SeT-cOOKIe", "sET-cOOKIe", "SET-cOOKIe", "set-COOKIe", "Set-COOKIe", "sEt-COOKIe", "SEt-COOKIe", "seT-COOKIe", "SeT-COOKIe", "sET-COOKIe", "SET-COOKIe", "set-cookiE", "Set-cookiE", "sEt-cookiE", "SEt-cookiE", "seT-cookiE", "SeT-cookiE", "sET-cookiE", "SET-cookiE", "set-CookiE", "Set-CookiE", "sEt-CookiE", "SEt-CookiE", "seT-CookiE", "SeT-CookiE", "sET-CookiE", "SET-CookiE", "set-cOokiE", "Set-cOokiE", "sEt-cOokiE", "SEt-cOokiE", "seT-cOokiE", "SeT-cOokiE", "sET-cOokiE", "SET-cOokiE", "set-COokiE", "Set-COokiE", "sEt-COokiE", "SEt-COokiE", "seT-COokiE", "SeT-COokiE", "sET-COokiE", "SET-COokiE", "set-coOkiE", "Set-coOkiE", "sEt-coOkiE", "SEt-coOkiE", "seT-coOkiE", "SeT-coOkiE", "sET-coOkiE", "SET-coOkiE", "set-CoOkiE", "Set-CoOkiE", "sEt-CoOkiE", "SEt-CoOkiE", "seT-CoOkiE", "SeT-CoOkiE", "sET-CoOkiE", "SET-CoOkiE", "set-cOOkiE", "Set-cOOkiE", "sEt-cOOkiE", "SEt-cOOkiE", "seT-cOOkiE", "SeT-cOOkiE", "sET-cOOkiE", "SET-cOOkiE", "set-COOkiE", "Set-COOkiE", "sEt-COOkiE", "SEt-COOkiE", "seT-COOkiE", "SeT-COOkiE", "sET-COOkiE", "SET-COOkiE", "set-cooKiE", "Set-cooKiE", "sEt-cooKiE", "SEt-cooKiE", "seT-cooKiE", "SeT-cooKiE", "sET-cooKiE", "SET-cooKiE", "set-CooKiE", "Set-CooKiE", "sEt-CooKiE", "SEt-CooKiE", "seT-CooKiE", "SeT-CooKiE", "sET-CooKiE", "SET-CooKiE", "set-cOoKiE", "Set-cOoKiE", "sEt-cOoKiE", "SEt-cOoKiE", "seT-cOoKiE", "SeT-cOoKiE", "sET-cOoKiE", "SET-cOoKiE", "set-COoKiE", "Set-COoKiE", "sEt-COoKiE", "SEt-COoKiE", "seT-COoKiE", "SeT-COoKiE", "sET-COoKiE", "SET-COoKiE", "set-coOKiE", "Set-coOKiE", "sEt-coOKiE", "SEt-coOKiE", "seT-coOKiE", "SeT-coOKiE", "sET-coOKiE", "SET-coOKiE", "set-CoOKiE", "Set-CoOKiE", "sEt-CoOKiE", "SEt-CoOKiE", "seT-CoOKiE", "SeT-CoOKiE", "sET-CoOKiE", "SET-CoOKiE", "set-cOOKiE", "Set-cOOKiE", "sEt-cOOKiE", "SEt-cOOKiE", "seT-cOOKiE", "SeT-cOOKiE", "sET-cOOKiE", "SET-cOOKiE", "set-COOKiE", "Set-COOKiE", "sEt-COOKiE", "SEt-COOKiE", "seT-COOKiE", "SeT-COOKiE", "sET-COOKiE", "SET-COOKiE", "set-cookIE", "Set-cookIE", "sEt-cookIE", "SEt-cookIE", "seT-cookIE", "SeT-cookIE", "sET-cookIE", "SET-cookIE", "set-CookIE", "Set-CookIE", "sEt-CookIE", "SEt-CookIE", "seT-CookIE", "SeT-CookIE", "sET-CookIE", "SET-CookIE", "set-cOokIE", "Set-cOokIE", "sEt-cOokIE", "SEt-cOokIE", "seT-cOokIE", "SeT-cOokIE", "sET-cOokIE", "SET-cOokIE", "set-COokIE", "Set-COokIE", "sEt-COokIE", "SEt-COokIE", "seT-COokIE", "SeT-COokIE", "sET-COokIE", "SET-COokIE", "set-coOkIE", "Set-coOkIE", "sEt-coOkIE", "SEt-coOkIE", "seT-coOkIE", "SeT-coOkIE", "sET-coOkIE", "SET-coOkIE", "set-CoOkIE", "Set-CoOkIE", "sEt-CoOkIE", "SEt-CoOkIE", "seT-CoOkIE", "SeT-CoOkIE", "sET-CoOkIE", "SET-CoOkIE", "set-cOOkIE", "Set-cOOkIE", "sEt-cOOkIE", "SEt-cOOkIE", "seT-cOOkIE", "SeT-cOOkIE", "sET-cOOkIE", "SET-cOOkIE", "set-COOkIE", "Set-COOkIE", "sEt-COOkIE", "SEt-COOkIE", "seT-COOkIE", "SeT-COOkIE", "sET-COOkIE", "SET-COOkIE", "set-cooKIE", "Set-cooKIE", "sEt-cooKIE", "SEt-cooKIE", "seT-cooKIE", "SeT-cooKIE", "sET-cooKIE", "SET-cooKIE", "set-CooKIE", "Set-CooKIE", "sEt-CooKIE", "SEt-CooKIE", "seT-CooKIE", "SeT-CooKIE", "sET-CooKIE", "SET-CooKIE", "set-cOoKIE", "Set-cOoKIE", "sEt-cOoKIE", "SEt-cOoKIE", "seT-cOoKIE", "SeT-cOoKIE", "sET-cOoKIE", "SET-cOoKIE", "set-COoKIE", "Set-COoKIE", "sEt-COoKIE", "SEt-COoKIE", "seT-COoKIE", "SeT-COoKIE", "sET-COoKIE", "SET-COoKIE", "set-coOKIE", "Set-coOKIE", "sEt-coOKIE", "SEt-coOKIE", "seT-coOKIE", "SeT-coOKIE", "sET-coOKIE", "SET-coOKIE", "set-CoOKIE", "Set-CoOKIE", "sEt-CoOKIE", "SEt-CoOKIE", "seT-CoOKIE", "SeT-CoOKIE", "sET-CoOKIE", "SET-CoOKIE", "set-cOOKIE", "Set-cOOKIE", "sEt-cOOKIE", "SEt-cOOKIE", "seT-cOOKIE", "SeT-cOOKIE", "sET-cOOKIE", "SET-cOOKIE", "set-COOKIE", "Set-COOKIE", "sEt-COOKIE", "SEt-COOKIE", "seT-COOKIE", "SeT-COOKIE", "sET-COOKIE", "SET-COOKIE"] };
}
});
// node_modules/serverless-http/lib/provider/azure/sanitize-headers.js
var require_sanitize_headers2 = __commonJS({
"node_modules/serverless-http/lib/provider/azure/sanitize-headers.js"(exports, module2) {
"use strict";
var setCookieVariations = require_set_cookie().variations;
module2.exports = function sanitizeHeaders(headers) {
return Object.keys(headers).reduce((memo, key) => {
const value = headers[key];
if (Array.isArray(value)) {
if (key.toLowerCase() === "set-cookie") {
value.forEach((cookie, i) => {
memo[setCookieVariations[i]] = cookie;
});
} else {
memo[key] = value.join(", ");
}
} else {
memo[key] = value == null ? "" : value.toString();
}
return memo;
}, {});
};
}
});
// node_modules/serverless-http/lib/provider/azure/format-response.js
var require_format_response2 = __commonJS({
"node_modules/serverless-http/lib/provider/azure/format-response.js"(exports, module2) {
var isBinary = require_is_binary2();
var Response = require_response();
var sanitizeHeaders = require_sanitize_headers2();
module2.exports = (response, options) => {
const { statusCode } = response;
const headers = sanitizeHeaders(Response.headers(response));
if (headers["transfer-encoding"] === "chunked" || response.chunkedEncoding) {
throw new Error("chunked encoding not supported");
}
const isBase64Encoded = isBinary(headers, options);
const encoding = isBase64Encoded ? "base64" : "utf8";
const body = Response.body(response).toString(encoding);
return { status: statusCode, headers, isBase64Encoded, body };
};
}
});
// node_modules/serverless-http/lib/provider/azure/index.js
var require_azure = __commonJS({
"node_modules/serverless-http/lib/provider/azure/index.js"(exports, module2) {
var cleanupRequest = require_clean_up_request();
var createRequest = require_create_request2();
var formatResponse = require_format_response2();
module2.exports = (options) => {
return (getResponse) => async (context, req) => {
const event = cleanupRequest(req, options);
const request = createRequest(event, options);
const response = await getResponse(request, context, event);
context.log(response);
return formatResponse(response, options);
};
};
}
});
// node_modules/serverless-http/lib/provider/get-provider.js
var require_get_provider = __commonJS({
"node_modules/serverless-http/lib/provider/get-provider.js"(exports, module2) {
var aws = require_aws();
var azure = require_azure();
var providers = {
aws,
azure
};
module2.exports = function getProvider(options) {
const { provider = "aws" } = options;
if (provider in providers) {
return providers[provider](options);
}
throw new Error(`Unsupported provider ${provider}`);
};
}
});
// node_modules/serverless-http/serverless-http.js
var require_serverless_http = __commonJS({
"node_modules/serverless-http/serverless-http.js"(exports, module2) {
"use strict";
var finish = require_finish();
var getFramework = require_get_framework();
var getProvider = require_get_provider();
var defaultOptions = {
requestId: "x-request-id"
};
module2.exports = function(app, opts) {
const options = Object.assign({}, defaultOptions, opts);
const framework = getFramework(app);
const provider = getProvider(options);
return provider(async (request, ...context) => {
await finish(request, options.request, ...context);
const response = await framework(request);
await finish(response, options.response, ...context);
return response;
});
};
}
});
// lib/index.ts
var lib_exports = {};
__export(lib_exports, {
CdkUtils: () => CdkUtils,
NextStandaloneStack: () => NextStandaloneStack,
serverHandler: () => handler
});
module.exports = __toCommonJS(lib_exports);
// lib/cdk/utils/apiGw.ts
var import_aws_apigatewayv2_alpha = require("@aws-cdk/aws-apigatewayv2-alpha");
var import_aws_apigatewayv2_integrations_alpha = require("@aws-cdk/aws-apigatewayv2-integrations-alpha");
var import_aws_cdk_lib = require("aws-cdk-lib");
var setupApiGateway = (scope, { imageLambda, imageBasePath, serverLambda, serverBasePath }) => {
const apiGateway = new import_aws_apigatewayv2_alpha.HttpApi(scope, "ServerProxy");
apiGateway.addRoutes({ path: `${serverBasePath}/{proxy+}`, integration: new import_aws_apigatewayv2_integrations_alpha.HttpLambdaIntegration("LambdaApigwIntegration", serverLambda) });
apiGateway.addRoutes({ path: `${imageBasePath}/{proxy+}`, integration: new import_aws_apigatewayv2_integrations_alpha.HttpLambdaIntegration("ImagesApigwIntegration", imageLambda) });
new import_aws_cdk_lib.CfnOutput(scope, "apiGwUrlServerUrl", { value: `${apiGateway.apiEndpoint}${serverBasePath}` });
new import_aws_cdk_lib.CfnOutput(scope, "apiGwUrlImageUrl", { value: `${apiGateway.apiEndpoint}${imageBasePath}` });
return apiGateway;
};
// lib/cdk/utils/cfnCertificate.ts
var import_aws_cdk_lib2 = require("aws-cdk-lib");
var import_aws_certificatemanager = require("aws-cdk-lib/aws-certificatemanager");
var setupCfnCertificate = (scope, { domains }) => {
const [firstDomain, ...otherDomains] = domains;
const multiZoneMap = otherDomains.reduce((acc, curr) => ({ ...acc, [curr.domain]: curr.zone }), {});
const certificate = new import_aws_certificatemanager.DnsValidatedCertificate(scope, "Certificate", {
domainName: firstDomain.domain,
hostedZone: firstDomain.zone,
subjectAlternativeNames: otherDomains.map((a) => a.domain),
validation: import_aws_certificatemanager.CertificateValidation.fromDnsMultiZone(multiZoneMap),
region: "us-east-1"
});
new import_aws_cdk_lib2.CfnOutput(scope, "certificateArn", { value: certificate.certificateArn });
return certificate;
};
// lib/cdk/utils/cfnDistro.ts
var import_aws_cdk_lib3 = require("aws-cdk-lib");
var import_aws_cloudfront = require("aws-cdk-lib/aws-cloudfront");
var import_aws_cloudfront_origins = require("aws-cdk-lib/aws-cloudfront-origins");
var setupCfnDistro = (scope, { apiGateway, imageBasePath, serverBasePath, assetsBucket, domains, certificate, customApiOrigin }) => {
const apiGwDomainName = `${apiGateway.apiId}.execute-api.${scope.region}.amazonaws.com`;
const serverOrigin = new import_aws_cloudfront_origins.HttpOrigin(apiGwDomainName, { originPath: serverBasePath });
const imageOrigin = new import_aws_cloudfront_origins.HttpOrigin(apiGwDomainName, { originPath: imageBasePath });
const assetsOrigin = new import_aws_cloudfront_origins.S3Origin(assetsBucket);
const defaultOptions = {
viewerProtocolPolicy: import_aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
allowedMethods: import_aws_cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS
};
const defaultCacheOptions = {
headerBehavior: import_aws_cloudfront.CacheHeaderBehavior.allowList("accept", "accept-language", "content-language", "content-type", "user-agent", "authorization"),
queryStringBehavior: import_aws_cloudfront.CacheQueryStringBehavior.all(),
cookieBehavior: import_aws_cloudfront.CacheCookieBehavior.all()
};
const imagesCachePolicy = new import_aws_cloudfront.CachePolicy(scope, "NextImageCachePolicy", {
queryStringBehavior: import_aws_cloudfront.CacheQueryStringBehavior.all(),
enableAcceptEncodingGzip: true,
defaultTtl: import_aws_cdk_lib3.Duration.days(30)
});
const serverCachePolicy = new import_aws_cloudfront.CachePolicy(scope, "NextServerCachePolicy", {
...defaultCacheOptions
});
const assetsCachePolicy = new import_aws_cloudfront.CachePolicy(scope, "NextPublicCachePolicy", {
queryStringBehavior: import_aws_cloudfront.CacheQueryStringBehavior.all(),
enableAcceptEncodingGzip: true,
defaultTtl: import_aws_cdk_lib3.Duration.hours(12)
});
const cfnDistro = new import_aws_cloudfront.Distribution(scope, "CfnDistro", {
defaultRootObject: "",
comment: `CloudFront distribution for ${scope.stackName}`,
enableIpv6: true,
priceClass: import_aws_cloudfront.PriceClass.PRICE_CLASS_100,
domainNames: domains.length > 0 ? domains.map((a) => a.domain) : void 0,
certificate,
defaultBehavior: {
origin: serverOrigin,
allowedMethods: import_aws_cloudfront.AllowedMethods.ALLOW_ALL,
cachePolicy: serverCachePolicy,
viewerProtocolPolicy: import_aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS
},
additionalBehaviors: {
"/api*": {
...defaultOptions,
origin: customApiOrigin != null ? customApiOrigin : serverOrigin,
allowedMethods: import_aws_cloudfront.AllowedMethods.ALLOW_ALL,
cachePolicy: import_aws_cloudfront.CachePolicy.CACHING_DISABLED
},
"_next/data/*": {
...defaultOptions,
origin: serverOrigin
},
"_next/image*": {
...defaultOptions,
origin: imageOrigin,
cachePolicy: imagesCachePolicy,
compress: true
},
"_next/*": {
...defaultOptions,
origin: assetsOrigin
},
"assets/*": {
...defaultOptions,
origin: assetsOrigin,
cachePolicy: assetsCachePolicy
}
}
});
new import_aws_cdk_lib3.CfnOutput(scope, "cfnDistroUrl", { value: cfnDistro.distributionDomainName });
new import_aws_cdk_lib3.CfnOutput(scope, "cfnDistroId", { value: cfnDistro.distributionId });
return cfnDistro;
};
// lib/cdk/utils/dnsRecords.ts
var import_aws_cdk_lib4 = require("aws-cdk-lib");
var import_aws_route53 = require("aws-cdk-lib/aws-route53");
var import_aws_route53_targets = require("aws-cdk-lib/aws-route53-targets");
var import_child_process = require("child_process");
var import_fs = require("fs");
var import_os = require("os");
var import_path = __toESM(require("path"));
var getAvailableHostedZones = (profile) => {
const tmpDir = import_path.default.join((0, import_os.tmpdir)(), "hosted-zones.json");
const profileFlag = profile ? `--profile ${profile}` : "";
(0, import_child_process.execSync)(`aws route53 list-hosted-zones --output json ${profileFlag} > ${tmpDir}`);
const output = JSON.parse((0, import_fs.readFileSync)(tmpDir, "utf8"));
return output.HostedZones.map((zone) => zone.Name);
};
var matchDomainToHostedZone = (domainToMatch, zones) => {
const matchedZone = zones.reduce((acc, curr) => {
var _a2;
const matchRegex = new RegExp(`(.*)${curr}$`);
const isMatching = !!`${domainToMatch}.`.match(matchRegex);
const isMoreSpecific = curr.split(".").length > ((_a2 = acc == null ? void 0 : acc.split(".").length) != null ? _a2 : 0);
if (isMatching && isMoreSpecific) {
return curr;
} else {
return acc;
}
}, null);
if (!matchedZone) {
throw new Error(`No hosted zone found for domain: ${domainToMatch}`);
}
return matchedZone.endsWith(".") ? matchedZone.slice(0, -1) : matchedZone;
};
var prepareDomains = (scope, { domains, profile }) => {
const zones = getAvailableHostedZones(profile);
return domains.map((domain, index) => {
const hostedZone = matchDomainToHostedZone(domain, zones);
const subdomain = domain.replace(hostedZone, "");
const recordName = subdomain.endsWith(".") ? subdomain.slice(0, -1) : subdomain;
const zone = import_aws_route53.HostedZone.fromLookup(scope, `Zone_${index}`, { domainName: hostedZone });
return { zone, recordName, domain, subdomain, hostedZone };
});
};
var setupDnsRecords = (scope, { domains, cfnDistro }) => {
const target = import_aws_route53.RecordTarget.fromAlias(new import_aws_route53_targets.CloudFrontTarget(cfnDistro));
domains.forEach(({ recordName, zone }, index) => {
const dnsARecord = new import_aws_route53.ARecord(scope, `AAliasRecord_${index}`, { recordName, target, zone });
const dnsAaaaRecord = new import_aws_route53.AaaaRecord(scope, `AaaaAliasRecord_${index}`, { recordName, target, zone });
new import_aws_cdk_lib4.CfnOutput(scope, `dns_A_Record_${index}`, { value: dnsARecord.domainName });
new import_aws_cdk_lib4.CfnOutput(scope, `dns_AAAA_Record_${index}`, { value: dnsAaaaRecord.domainName });
});
};
// lib/cdk/utils/imageLambda.ts
var import_aws_cdk_lib5 = require("aws-cdk-lib");
var import_aws_lambda = require("aws-cdk-lib/aws-lambda");
var DEFAULT_MEMORY = 512;
var DEFAULT_TIMEOUT = 10;
var setupImageLambda = (scope, { assetsBucket, codePath, handler: handler2, layerPath, lambdaHash, memory = DEFAULT_MEMORY, timeout = DEFAULT_TIMEOUT }) => {
const depsLayer = new import_aws_lambda.LayerVersion(scope, "ImageOptimizationLayer", {
code: import_aws_lambda.Code.fromAsset(layerPath, {
assetHash: lambdaHash + "_layer",
assetHashType: import_aws_cdk_lib5.AssetHashType.CUSTOM
})
});
const imageLambda = new import_aws_lambda.Function(scope, "ImageOptimizationNextJs", {
code: import_aws_lambda.Code.fromAsset(codePath, {
assetHash: lambdaHash + "_code",
assetHashType: import_aws_cdk_lib5.AssetHashType.CUSTOM
}),
// @NOTE: Make sure to keep python3.8 as binaries seems to be messed for other versions.
runtime: import_aws_lambda.Runtime.PYTHON_3_8,
handler: handler2,
memorySize: memory,
timeout: import_aws_cdk_lib5.Duration.seconds(timeout),
layers: [depsLayer],
environment: {
S3_BUCKET_NAME: assetsBucket.bucketName
}
});
assetsBucket.grantRead(imageLambda);
new import_aws_cdk_lib5.CfnOutput(scope, "imageLambdaArn", { value: imageLambda.functionArn });
return imageLambda;
};
// lib/cdk/utils/s3.ts
var import_aws_cdk_lib6 = require("aws-cdk-lib");
var import_aws_s3 = require("aws-cdk-lib/aws-s3");
var import_aws_s3_deployment = require("aws-cdk-lib/aws-s3-deployment");
var setupAssetsBucket = (scope) => {
const assetsBucket = new import_aws_s3.Bucket(scope, "NextAssetsBucket", {
// Those settings are necessary for bucket to be removed on stack removal.
removalPolicy: import_aws_cdk_lib6.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
publicReadAccess: false
});
new import_aws_cdk_lib6.CfnOutput(scope, "assetsBucketUrl", { value: assetsBucket.bucketDomainName });
new import_aws_cdk_lib6.CfnOutput(scope, "assetsBucketName", { value: assetsBucket.bucketName });
return assetsBucket;
};
var uploadStaticAssets = (scope, { assetsBucket, assetsPath, cfnDistribution }) => {
new import_aws_s3_deployment.BucketDeployment(scope, "PublicFilesDeployment", {
destinationBucket: assetsBucket,
sources: [import_aws_s3_deployment.Source.asset(assetsPath)],
// Invalidate all paths after deployment.
distribution: cfnDistribution,
distributionPaths: ["/*"]
});
};
// lib/cdk/utils/serverLambda.ts
var import_aws_cdk_lib7 = require("aws-cdk-lib");
var import_aws_lambda2 = require("aws-cdk-lib/aws-lambda");
var DEFAULT_MEMORY2 = 1024;
var DEFAULT_TIMEOUT2 = 20;
var DEFAULT_RUNTIME = import_aws_lambda2.Runtime.NODEJS_16_X;
var setupServerLambda = (scope, { basePath, codePath, dependenciesPath, handler: handler2, memory = DEFAULT_MEMORY2, timeout = DEFAULT_TIMEOUT2, runtime = DEFAULT_RUNTIME }) => {
const depsLayer = new import_aws_lambda2.LayerVersion(scope, "DepsLayer", {
// This folder does not use Custom hash as depenendencies are most likely changing every time we deploy.
code: import_aws_lambda2.Code.fromAsset(dependenciesPath)
});
const serverLambda = new import_aws_lambda2.Function(scope, "DefaultNextJs", {
code: import_aws_lambda2.Code.fromAsset(codePath),
runtime,
handler: handler2,
layers: [depsLayer],
// No need for big memory as image handling is done elsewhere.
memorySize: memory,
timeout: import_aws_cdk_lib7.Duration.seconds(timeout),
environment: {
// Set env vars based on what's available in environment.
...Object.entries(process.env).filter(([key]) => key.startsWith("NEXT_")).reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}),
NEXTJS_LAMBDA_BASE_PATH: basePath
}
});
new import_aws_cdk_lib7.CfnOutput(scope, "serverLambdaArn", { value: serverLambda.functionArn });
return serverLambda;
};
// lib/cdk/stack.ts
var import_aws_cdk_lib9 = require("aws-cdk-lib");
var import_aws_cloudfront_origins2 = require("aws-cdk-lib/aws-cloudfront-origins");
// lib/cdk/utils/redirect.ts
var import_aws_cdk_lib8 = require("aws-cdk-lib");
var import_aws_route53_patterns = require("aws-cdk-lib/aws-route53-patterns");
var setupApexRedirect = (scope, { domain }) => {
new import_aws_route53_patterns.HttpsRedirect(scope, `ApexRedirect`, {
// Currently supports only apex (root) domain.
zone: domain.zone,
targetDomain: domain.domain
});
new import_aws_cdk_lib8.CfnOutput(scope, "RedirectFrom", { value: domain.zone.zoneName });
};
// lib/cdk/stack.ts
var NextStandaloneStack = class extends import_aws_cdk_lib9.Stack {
constructor(scope, id, config2) {
super(scope, id, config2);
this.domains = [];
console.log("CDK's config:", config2);
if (!!config2.customApiDomain && config2.domainNames.length > 1) {
throw new Error("Cannot use Apex redirect with multiple domains");
}
this.assetsBucket = this.setupAssetsBucket();
this.imageLambda = this.setupImageLambda({
codePath: config2.imageHandlerZipPath,
handler: config2.customImageHandler,
assetsBucket: this.assetsBucket,
lambdaHash: config2.imageLambdaHash,
layerPath: config2.imageLayerZipPath,
timeout: config2.imageLambdaTimeout,
memory: config2.imageLambdaMemory
});
this.serverLambda = this.setupServerLambda({
basePath: config2.apigwServerPath,
codePath: config2.codeZipPath,
handler: config2.customServerHandler,
dependenciesPath: config2.dependenciesZipPath,
timeout: config2.lambdaTimeout,
memory: config2.lambdaMemory,
runtime: config2.lambdaRuntime
});
this.apiGateway = this.setupApiGateway({
imageLambda: this.imageLambda,
serverLambda: this.serverLambda,
imageBasePath: config2.apigwImagePath,
serverBasePath: config2.apigwServerPath
});
if (config2.domainNames.length > 0) {
this.domains = this.prepareDom