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>
155 lines
6.1 KiB
Text
155 lines
6.1 KiB
Text
import { parseXML } from "@aws-sdk/xml-builder";
|
|
import { FromStringShapeDeserializer } from "@smithy/core/protocols";
|
|
import { NormalizedSchema } from "@smithy/core/schema";
|
|
import { getValueFromTextNode } from "@smithy/smithy-client";
|
|
import { toUtf8 } from "@smithy/util-utf8";
|
|
import { SerdeContextConfig } from "../ConfigurableSerdeContext";
|
|
import { UnionSerde } from "../UnionSerde";
|
|
export class XmlShapeDeserializer extends SerdeContextConfig {
|
|
settings;
|
|
stringDeserializer;
|
|
constructor(settings) {
|
|
super();
|
|
this.settings = settings;
|
|
this.stringDeserializer = new FromStringShapeDeserializer(settings);
|
|
}
|
|
setSerdeContext(serdeContext) {
|
|
this.serdeContext = serdeContext;
|
|
this.stringDeserializer.setSerdeContext(serdeContext);
|
|
}
|
|
read(schema, bytes, key) {
|
|
const ns = NormalizedSchema.of(schema);
|
|
const memberSchemas = ns.getMemberSchemas();
|
|
const isEventPayload = ns.isStructSchema() &&
|
|
ns.isMemberSchema() &&
|
|
!!Object.values(memberSchemas).find((memberNs) => {
|
|
return !!memberNs.getMemberTraits().eventPayload;
|
|
});
|
|
if (isEventPayload) {
|
|
const output = {};
|
|
const memberName = Object.keys(memberSchemas)[0];
|
|
const eventMemberSchema = memberSchemas[memberName];
|
|
if (eventMemberSchema.isBlobSchema()) {
|
|
output[memberName] = bytes;
|
|
}
|
|
else {
|
|
output[memberName] = this.read(memberSchemas[memberName], bytes);
|
|
}
|
|
return output;
|
|
}
|
|
const xmlString = (this.serdeContext?.utf8Encoder ?? toUtf8)(bytes);
|
|
const parsedObject = this.parseXml(xmlString);
|
|
return this.readSchema(schema, key ? parsedObject[key] : parsedObject);
|
|
}
|
|
readSchema(_schema, value) {
|
|
const ns = NormalizedSchema.of(_schema);
|
|
if (ns.isUnitSchema()) {
|
|
return;
|
|
}
|
|
const traits = ns.getMergedTraits();
|
|
if (ns.isListSchema() && !Array.isArray(value)) {
|
|
return this.readSchema(ns, [value]);
|
|
}
|
|
if (value == null) {
|
|
return value;
|
|
}
|
|
if (typeof value === "object") {
|
|
const sparse = !!traits.sparse;
|
|
const flat = !!traits.xmlFlattened;
|
|
if (ns.isListSchema()) {
|
|
const listValue = ns.getValueSchema();
|
|
const buffer = [];
|
|
const sourceKey = listValue.getMergedTraits().xmlName ?? "member";
|
|
const source = flat ? value : (value[0] ?? value)[sourceKey];
|
|
const sourceArray = Array.isArray(source) ? source : [source];
|
|
for (const v of sourceArray) {
|
|
if (v != null || sparse) {
|
|
buffer.push(this.readSchema(listValue, v));
|
|
}
|
|
}
|
|
return buffer;
|
|
}
|
|
const buffer = {};
|
|
if (ns.isMapSchema()) {
|
|
const keyNs = ns.getKeySchema();
|
|
const memberNs = ns.getValueSchema();
|
|
let entries;
|
|
if (flat) {
|
|
entries = Array.isArray(value) ? value : [value];
|
|
}
|
|
else {
|
|
entries = Array.isArray(value.entry) ? value.entry : [value.entry];
|
|
}
|
|
const keyProperty = keyNs.getMergedTraits().xmlName ?? "key";
|
|
const valueProperty = memberNs.getMergedTraits().xmlName ?? "value";
|
|
for (const entry of entries) {
|
|
const key = entry[keyProperty];
|
|
const value = entry[valueProperty];
|
|
if (value != null || sparse) {
|
|
buffer[key] = this.readSchema(memberNs, value);
|
|
}
|
|
}
|
|
return buffer;
|
|
}
|
|
if (ns.isStructSchema()) {
|
|
const union = ns.isUnionSchema();
|
|
let unionSerde;
|
|
if (union) {
|
|
unionSerde = new UnionSerde(value, buffer);
|
|
}
|
|
for (const [memberName, memberSchema] of ns.structIterator()) {
|
|
const memberTraits = memberSchema.getMergedTraits();
|
|
const xmlObjectKey = !memberTraits.httpPayload
|
|
? memberSchema.getMemberTraits().xmlName ?? memberName
|
|
: memberTraits.xmlName ?? memberSchema.getName();
|
|
if (union) {
|
|
unionSerde.mark(xmlObjectKey);
|
|
}
|
|
if (value[xmlObjectKey] != null) {
|
|
buffer[memberName] = this.readSchema(memberSchema, value[xmlObjectKey]);
|
|
}
|
|
}
|
|
if (union) {
|
|
unionSerde.writeUnknown();
|
|
}
|
|
return buffer;
|
|
}
|
|
if (ns.isDocumentSchema()) {
|
|
return value;
|
|
}
|
|
throw new Error(`@aws-sdk/core/protocols - xml deserializer unhandled schema type for ${ns.getName(true)}`);
|
|
}
|
|
if (ns.isListSchema()) {
|
|
return [];
|
|
}
|
|
if (ns.isMapSchema() || ns.isStructSchema()) {
|
|
return {};
|
|
}
|
|
return this.stringDeserializer.read(ns, value);
|
|
}
|
|
parseXml(xml) {
|
|
if (xml.length) {
|
|
let parsedObj;
|
|
try {
|
|
parsedObj = parseXML(xml);
|
|
}
|
|
catch (e) {
|
|
if (e && typeof e === "object") {
|
|
Object.defineProperty(e, "$responseBodyText", {
|
|
value: xml,
|
|
});
|
|
}
|
|
throw e;
|
|
}
|
|
const textNodeName = "#text";
|
|
const key = Object.keys(parsedObj)[0];
|
|
const parsedObjToReturn = parsedObj[key];
|
|
if (parsedObjToReturn[textNodeName]) {
|
|
parsedObjToReturn[key] = parsedObjToReturn[textNodeName];
|
|
delete parsedObjToReturn[textNodeName];
|
|
}
|
|
return getValueFromTextNode(parsedObjToReturn);
|
|
}
|
|
return {};
|
|
}
|
|
}
|