UNPKG

@aws-amplify/graphql-api-construct

Version:

AppSync GraphQL Api Construct using Amplify GraphQL Transformer.

125 lines 16 kB
"use strict"; 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==