Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
54 lines
1.9 KiB
Text
54 lines
1.9 KiB
Text
import { collectBodyString } from "../common";
|
|
export const parseJsonBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {
|
|
if (encoded.length) {
|
|
try {
|
|
return JSON.parse(encoded);
|
|
}
|
|
catch (e) {
|
|
if (e?.name === "SyntaxError") {
|
|
Object.defineProperty(e, "$responseBodyText", {
|
|
value: encoded,
|
|
});
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
return {};
|
|
});
|
|
export const parseJsonErrorBody = async (errorBody, context) => {
|
|
const value = await parseJsonBody(errorBody, context);
|
|
value.message = value.message ?? value.Message;
|
|
return value;
|
|
};
|
|
export const loadRestJsonErrorCode = (output, data) => {
|
|
const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());
|
|
const sanitizeErrorCode = (rawValue) => {
|
|
let cleanValue = rawValue;
|
|
if (typeof cleanValue === "number") {
|
|
cleanValue = cleanValue.toString();
|
|
}
|
|
if (cleanValue.indexOf(",") >= 0) {
|
|
cleanValue = cleanValue.split(",")[0];
|
|
}
|
|
if (cleanValue.indexOf(":") >= 0) {
|
|
cleanValue = cleanValue.split(":")[0];
|
|
}
|
|
if (cleanValue.indexOf("#") >= 0) {
|
|
cleanValue = cleanValue.split("#")[1];
|
|
}
|
|
return cleanValue;
|
|
};
|
|
const headerKey = findKey(output.headers, "x-amzn-errortype");
|
|
if (headerKey !== undefined) {
|
|
return sanitizeErrorCode(output.headers[headerKey]);
|
|
}
|
|
if (data && typeof data === "object") {
|
|
const codeKey = findKey(data, "code");
|
|
if (codeKey && data[codeKey] !== undefined) {
|
|
return sanitizeErrorCode(data[codeKey]);
|
|
}
|
|
if (data["__type"] !== undefined) {
|
|
return sanitizeErrorCode(data["__type"]);
|
|
}
|
|
}
|
|
};
|