@aws-amplify/graphql-api-construct
Version:
AppSync GraphQL Api Construct using Amplify GraphQL Transformer.
125 lines • 16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseUserDefinedSlots = exports.getSlotName = exports.separateSlots = exports.validateFunctionSlots = void 0;
/**
* Validate that only supported props are being passed into the funciton slots.
* @param functionSlots the slot inputs to validate.
*/
const validateFunctionSlots = (functionSlots) => {
functionSlots.forEach(({ function: { responseMappingTemplate, requestMappingTemplate } }) => {
if (!requestMappingTemplate && !responseMappingTemplate) {
throw new Error('Expected at least one of either requestMappingTemplate or responseMappingTemplate');
}
});
};
exports.validateFunctionSlots = validateFunctionSlots;
/**
* We'll partition any slots have both a request and response mapping template into two to make the existing system work.
* @param functionSlots the possibly consolidated slots.
* @returns no longer consolidated slots.
*/
const separateSlots = (functionSlots) => functionSlots.flatMap((slot) => {
if (slot.function.requestMappingTemplate && slot.function.responseMappingTemplate) {
return [
{
...slot,
function: {
requestMappingTemplate: slot.function.requestMappingTemplate,
},
},
{
...slot,
function: {
responseMappingTemplate: slot.function.responseMappingTemplate,
},
},
];
}
return [slot];
});
exports.separateSlots = separateSlots;
/**
* Given a set of strongly typed input params, generate a valid transformer slot name.
* @param params the slot configuration
* @returns the slot id
*/
const getSlotName = (params) => [
params.typeName,
params.fieldName,
params.slotName,
params.slotIndex,
params.function.requestMappingTemplate ? 'req' : 'res',
'vtl',
].join('.');
exports.getSlotName = getSlotName;
/**
* Utility to avoid using lodash.
* @param obj the object to deeply set values in.
* @param path the access path.
* @param val the value to set.
*/
const setIn = (obj, path, val) => {
if (path.length === 1) {
// eslint-disable-next-line no-param-reassign
obj[path[0]] = val;
return;
}
if (!obj[path[0]]) {
// eslint-disable-next-line no-param-reassign
obj[path[0]] = {};
}
setIn(obj[path[0]], path.slice(1), val);
};
const parseUserDefinedSlots = (userDefinedTemplates) => {
const groupedResolversMap = {};
userDefinedTemplates
.map((slot) => [
(0, exports.getSlotName)(slot),
slot.function.requestMappingTemplate
? slot.function.requestMappingTemplate.renderTemplate()
: slot.function.responseMappingTemplate?.renderTemplate() ?? '',
])
.forEach(([fileName, template]) => {
const slicedSlotName = fileName.split('.');
const resolverType = slicedSlotName[slicedSlotName.length - 2] === 'res' ? 'responseResolver' : 'requestResolver';
const resolverName = [slicedSlotName[0], slicedSlotName[1]].join('.');
const slotName = slicedSlotName[2];
const resolverOrder = `order${Number(slicedSlotName[3]) || 0}`;
const resolver = {
fileName,
template,
};
const slotHash = `${resolverName}#${slotName}`;
// because a slot can have a request and response resolver, we need to group corresponding request and response resolvers
if (slotHash in groupedResolversMap && resolverOrder in groupedResolversMap[slotHash]) {
setIn(groupedResolversMap, [slotHash, resolverOrder, resolverType], resolver);
}
else {
const slot = {
resolverTypeName: slicedSlotName[0],
resolverFieldName: slicedSlotName[1],
slotName,
[resolverType]: resolver,
};
setIn(groupedResolversMap, [slotHash, resolverOrder], slot);
}
});
return Object.entries(groupedResolversMap)
.map(([resolverNameKey, numberedSlots]) => ({
orderedSlots: Object.entries(numberedSlots)
.sort(([i], [j]) => i.localeCompare(j))
.map(([_, slot]) => slot),
resolverName: resolverNameKey.split('#')[0],
}))
.reduce((acc, { orderedSlots, resolverName }) => {
if (acc[resolverName]) {
acc[resolverName].push(...orderedSlots);
}
else {
acc[resolverName] = orderedSlots;
}
return acc;
}, {});
};
exports.parseUserDefinedSlots = parseUserDefinedSlots;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1kZWZpbmVkLXNsb3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVybmFsL3VzZXItZGVmaW5lZC1zbG90cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQTs7O0dBR0c7QUFDSSxNQUFNLHFCQUFxQixHQUFHLENBQUMsYUFBNkIsRUFBUSxFQUFFO0lBQzNFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQzFGLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRkFBbUYsQ0FBQyxDQUFDO1FBQ3ZHLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQU5XLFFBQUEscUJBQXFCLHlCQU1oQztBQUVGOzs7O0dBSUc7QUFDSSxNQUFNLGFBQWEsR0FBRyxDQUFDLGFBQTZCLEVBQWtCLEVBQUUsQ0FDN0UsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQzdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbEYsT0FBTztZQUNMO2dCQUNFLEdBQUcsSUFBSTtnQkFDUCxRQUFRLEVBQUU7b0JBQ1Isc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7aUJBQzdEO2FBQ0Y7WUFDRDtnQkFDRSxHQUFHLElBQUk7Z0JBQ1AsUUFBUSxFQUFFO29CQUNSLHVCQUF1QixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCO2lCQUMvRDthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEIsQ0FBQyxDQUFDLENBQUM7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QzFDLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBdUMsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQztBQXBEVyxRQUFBLHFCQUFxQix5QkFvRGhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlckRlZmluZWRTbG90LCBVc2VyRGVmaW5lZFJlc29sdmVyIH0gZnJvbSAnQGF3cy1hbXBsaWZ5L2dyYXBocWwtdHJhbnNmb3JtZXItY29yZSc7XG5pbXBvcnQgeyBGdW5jdGlvblNsb3QgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBvbmx5IHN1cHBvcnRlZCBwcm9wcyBhcmUgYmVpbmcgcGFzc2VkIGludG8gdGhlIGZ1bmNpdG9uIHNsb3RzLlxuICogQHBhcmFtIGZ1bmN0aW9uU2xvdHMgdGhlIHNsb3QgaW5wdXRzIHRvIHZhbGlkYXRlLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVGdW5jdGlvblNsb3RzID0gKGZ1bmN0aW9uU2xvdHM6IEZ1bmN0aW9uU2xvdFtdKTogdm9pZCA9PiB7XG4gIGZ1bmN0aW9uU2xvdHMuZm9yRWFjaCgoeyBmdW5jdGlvbjogeyByZXNwb25zZU1hcHBpbmdUZW1wbGF0ZSwgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZSB9IH0pID0+IHtcbiAgICBpZiAoIXJlcXVlc3RNYXBwaW5nVGVtcGxhdGUgJiYgIXJlc3BvbnNlTWFwcGluZ1RlbXBsYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSBvZiBlaXRoZXIgcmVxdWVzdE1hcHBpbmdUZW1wbGF0ZSBvciByZXNwb25zZU1hcHBpbmdUZW1wbGF0ZScpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFdlJ2xsIHBhcnRpdGlvbiBhbnkgc2xvdHMgaGF2ZSBib3RoIGEgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWFwcGluZyB0ZW1wbGF0ZSBpbnRvIHR3byB0byBtYWtlIHRoZSBleGlzdGluZyBzeXN0ZW0gd29yay5cbiAqIEBwYXJhbSBmdW5jdGlvblNsb3RzIHRoZSBwb3NzaWJseSBjb25zb2xpZGF0ZWQgc2xvdHMuXG4gKiBAcmV0dXJucyBubyBsb25nZXIgY29uc29saWRhdGVkIHNsb3RzLlxuICovXG5leHBvcnQgY29uc3Qgc2VwYXJhdGVTbG90cyA9IChmdW5jdGlvblNsb3RzOiBGdW5jdGlvblNsb3RbXSk6IEZ1bmN0aW9uU2xvdFtdID0+XG4gIGZ1bmN0aW9uU2xvdHMuZmxhdE1hcCgoc2xvdCkgPT4ge1xuICAgIGlmIChzbG90LmZ1bmN0aW9uLnJlcXVlc3RNYXBwaW5nVGVtcGxhdGUgJiYgc2xvdC5mdW5jdGlvbi5yZXNwb25zZU1hcHBpbmdUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLnNsb3QsXG4gICAgICAgICAgZnVuY3Rpb246IHtcbiAgICAgICAgICAgIHJlcXVlc3RNYXBwaW5nVGVtcGxhdGU6IHNsb3QuZnVuY3Rpb24ucmVxdWVzdE1hcHBpbmdUZW1wbGF0ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc2xvdCxcbiAgICAgICAgICBmdW5jdGlvbjoge1xuICAgICAgICAgICAgcmVzcG9uc2VNYXBwaW5nVGVtcGxhdGU6IHNsb3QuZnVuY3Rpb24ucmVzcG9uc2VNYXBwaW5nVGVtcGxhdGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBbc2xvdF07XG4gIH0pO1xuXG4vKipcbiAqIEdpdmVuIGEgc2V0IG9mIHN0cm9uZ2x5IHR5cGVkIGlucHV0IHBhcmFtcywgZ2VuZXJhdGUgYSB2YWxpZCB0cmFuc2Zvcm1lciBzbG90IG5hbWUuXG4gKiBAcGFyYW0gcGFyYW1zIHRoZSBzbG90IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIHRoZSBzbG90IGlkXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTbG90TmFtZSA9IChwYXJhbXM6IEZ1bmN0aW9uU2xvdCk6IHN0cmluZyA9PlxuICBbXG4gICAgcGFyYW1zLnR5cGVOYW1lLFxuICAgIHBhcmFtcy5maWVsZE5hbWUsXG4gICAgcGFyYW1zLnNsb3ROYW1lLFxuICAgIHBhcmFtcy5zbG90SW5kZXgsXG4gICAgcGFyYW1zLmZ1bmN0aW9uLnJlcXVlc3RNYXBwaW5nVGVtcGxhdGUgPyAncmVxJyA6ICdyZXMnLFxuICAgICd2dGwnLFxuICBdLmpvaW4oJy4nKTtcblxuLyoqXG4gKiBVdGlsaXR5IHRvIGF2b2lkIHVzaW5nIGxvZGFzaC5cbiAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBkZWVwbHkgc2V0IHZhbHVlcyBpbi5cbiAqIEBwYXJhbSBwYXRoIHRoZSBhY2Nlc3MgcGF0aC5cbiAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIHRvIHNldC5cbiAqL1xuY29uc3Qgc2V0SW4gPSAob2JqOiBSZWNvcmQ8YW55LCBhbnk+LCBwYXRoOiBhbnlbXSwgdmFsOiBhbnkpOiB2b2lkID0+IHtcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgb2JqW3BhdGhbMF1dID0gdmFsO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIW9ialtwYXRoWzBdXSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIG9ialtwYXRoWzBdXSA9IHt9O1xuICB9XG4gIHNldEluKG9ialtwYXRoWzBdXSwgcGF0aC5zbGljZSgxKSwgdmFsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZVVzZXJEZWZpbmVkU2xvdHMgPSAodXNlckRlZmluZWRUZW1wbGF0ZXM6IEZ1bmN0aW9uU2xvdFtdKTogUmVjb3JkPHN0cmluZywgVXNlckRlZmluZWRTbG90W10+ID0+IHtcbiAgdHlwZSBSZXNvbHZlcktleSA9IHN0cmluZztcbiAgdHlwZSBSZXNvbHZlck9yZGVyID0gbnVtYmVyO1xuICBjb25zdCBncm91cGVkUmVzb2x2ZXJzTWFwOiBSZWNvcmQ8UmVzb2x2ZXJLZXksIFJlY29yZDxSZXNvbHZlck9yZGVyLCBVc2VyRGVmaW5lZFNsb3Q+PiA9IHt9O1xuXG4gIHVzZXJEZWZpbmVkVGVtcGxhdGVzXG4gICAgLm1hcCgoc2xvdCkgPT4gW1xuICAgICAgZ2V0U2xvdE5hbWUoc2xvdCksXG4gICAgICBzbG90LmZ1bmN0aW9uLnJlcXVlc3RNYXBwaW5nVGVtcGxhdGVcbiAgICAgICAgPyBzbG90LmZ1bmN0aW9uLnJlcXVlc3RNYXBwaW5nVGVtcGxhdGUucmVuZGVyVGVtcGxhdGUoKVxuICAgICAgICA6IHNsb3QuZnVuY3Rpb24ucmVzcG9uc2VNYXBwaW5nVGVtcGxhdGU/LnJlbmRlclRlbXBsYXRlKCkgPz8gJycsXG4gICAgXSlcbiAgICAuZm9yRWFjaCgoW2ZpbGVOYW1lLCB0ZW1wbGF0ZV0pID0+IHtcbiAgICAgIGNvbnN0IHNsaWNlZFNsb3ROYW1lID0gZmlsZU5hbWUuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IHJlc29sdmVyVHlwZSA9IHNsaWNlZFNsb3ROYW1lW3NsaWNlZFNsb3ROYW1lLmxlbmd0aCAtIDJdID09PSAncmVzJyA/ICdyZXNwb25zZVJlc29sdmVyJyA6ICdyZXF1ZXN0UmVzb2x2ZXInO1xuICAgICAgY29uc3QgcmVzb2x2ZXJOYW1lID0gW3NsaWNlZFNsb3ROYW1lWzBdLCBzbGljZWRTbG90TmFtZVsxXV0uam9pbignLicpO1xuICAgICAgY29uc3Qgc2xvdE5hbWUgPSBzbGljZWRTbG90TmFtZVsyXTtcbiAgICAgIGNvbnN0IHJlc29sdmVyT3JkZXIgPSBgb3JkZXIke051bWJlcihzbGljZWRTbG90TmFtZVszXSkgfHwgMH1gO1xuICAgICAgY29uc3QgcmVzb2x2ZXI6IFVzZXJEZWZpbmVkUmVzb2x2ZXIgPSB7XG4gICAgICAgIGZpbGVOYW1lLFxuICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzbG90SGFzaCA9IGAke3Jlc29sdmVyTmFtZX0jJHtzbG90TmFtZX1gO1xuICAgICAgLy8gYmVjYXVzZSBhIHNsb3QgY2FuIGhhdmUgYSByZXF1ZXN0IGFuZCByZXNwb25zZSByZXNvbHZlciwgd2UgbmVlZCB0byBncm91cCBjb3JyZXNwb25kaW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHJlc29sdmVyc1xuICAgICAgaWYgKHNsb3RIYXNoIGluIGdyb3VwZWRSZXNvbHZlcnNNYXAgJiYgcmVzb2x2ZXJPcmRlciBpbiBncm91cGVkUmVzb2x2ZXJzTWFwW3Nsb3RIYXNoXSkge1xuICAgICAgICBzZXRJbihncm91cGVkUmVzb2x2ZXJzTWFwLCBbc2xvdEhhc2gsIHJlc29sdmVyT3JkZXIsIHJlc29sdmVyVHlwZV0sIHJlc29sdmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNsb3QgPSB7XG4gICAgICAgICAgcmVzb2x2ZXJUeXBlTmFtZTogc2xpY2VkU2xvdE5hbWVbMF0sXG4gICAgICAgICAgcmVzb2x2ZXJGaWVsZE5hbWU6IHNsaWNlZFNsb3ROYW1lWzFdLFxuICAgICAgICAgIHNsb3ROYW1lLFxuICAgICAgICAgIFtyZXNvbHZlclR5cGVdOiByZXNvbHZlcixcbiAgICAgICAgfTtcbiAgICAgICAgc2V0SW4oZ3JvdXBlZFJlc29sdmVyc01hcCwgW3Nsb3RIYXNoLCByZXNvbHZlck9yZGVyXSwgc2xvdCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdyb3VwZWRSZXNvbHZlcnNNYXApXG4gICAgLm1hcCgoW3Jlc29sdmVyTmFtZUtleSwgbnVtYmVyZWRTbG90c10pID0+ICh7XG4gICAgICBvcmRlcmVkU2xvdHM6IE9iamVjdC5lbnRyaWVzKG51bWJlcmVkU2xvdHMpXG4gICAgICAgIC5zb3J0KChbaV0sIFtqXSkgPT4gaS5sb2NhbGVDb21wYXJlKGopKVxuICAgICAgICAubWFwKChbXywgc2xvdF0pID0+IHNsb3QpLFxuICAgICAgcmVzb2x2ZXJOYW1lOiByZXNvbHZlck5hbWVLZXkuc3BsaXQoJyMnKVswXSxcbiAgICB9KSlcbiAgICAucmVkdWNlKChhY2MsIHsgb3JkZXJlZFNsb3RzLCByZXNvbHZlck5hbWUgfSkgPT4ge1xuICAgICAgaWYgKGFjY1tyZXNvbHZlck5hbWVdKSB7XG4gICAgICAgIGFjY1tyZXNvbHZlck5hbWVdLnB1c2goLi4ub3JkZXJlZFNsb3RzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1tyZXNvbHZlck5hbWVdID0gb3JkZXJlZFNsb3RzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBVc2VyRGVmaW5lZFNsb3RbXT4pO1xufTtcbiJdfQ==