Source: Cloudformation/cloudformation.js

import LambdaEvent from '../lambdaEvent';
import Response from './response';

/**
 * Provides a simple interface for working with Custom Cloudformation Resource events.
 *
 * @constructor Cloudformation
 *
 * @extends LambdaEvent
 *
 * @param {object} event - The event being received from AWS Lambda. The content of this object is
 *  determined greatly by the resource it is being invoked against.
 *  [See here]{@link http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-requests.html}
 * @param {string} event.RequestType - The type of Cloudformation request
 * @param {string} event.ResponseURL - The response URL identifies a pre-signed S3 bucket
 * @param {string} event.StackId - The Amazon Resource Name (ARN) that identifies the stack
 * @param {string} event.RequestId - A unique ID for the request
 * @param {string} event.ResourceType - The custom named resource type as defined in the cloudformation
 * @param {string} event.LogicalResourceId - The template developer-chosen name
 *  (logical ID) of the custom resource in the AWS CloudFormation template
 * @param {string} [event.PhysicalResourceId=null] - An ID of the associated
 *  AWS resource created by the custom resource. Null on Create
 * @param {object} event.ResourceProperties - The properties defined by the custom resource definition
 * @param {object} [event.OldResourceProperties=null] - Used only for Update
 *  requests. Contains the resource properties that were declared previous to the update request
 * @param {object} context - The context of the event being received
 *  [See here]{@link http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html}
 * @param {lambdaCallback} cb - The callback function passed through from Lambda
 *
 * @see {@link http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html|Custom Cloudformation Resources}
 *
 * @tutorial Cloudformation
 */
export default class extends LambdaEvent {
  respond(...args) {
    return new Response(this.event, this.cb).respond(...args);
  }

  /**
   * Executes the action determined by the request type that
   * Cloudformation has invoked this function with.
   *
   * @note This function is automatically called.
   *
   * @function Cloudformation#perform
   */
  perform() {
    this[this.type]();
  }

  /**
   * Returns the properties for the custom Cloudformation request without
   * the accompanying ServiceToken.
   *
   * @member {Object} Cloudformation#properties
   */
  get properties() {
    delete this.event.ResourceProperties.ServiceToken;
    return this.event.ResourceProperties;
  }

  /**
   * Returns the PhysicalResourceId that is associated with the custom
   * resource that this lambda function controls. For Create requests, this
   * will return null.
   *
   * @member {null|String} Cloudformation#id
   */
  get id() {
    return this.event.PhysicalResourceId;
  }

  /**
   * Return the type of request. Typically this will member will return "create",
   * "update" or "delete". This member is used to determine which action the
   * lambda function should perform.
   *
   * @member {String} Cloudformation#type
   * @see Cloudformation#perform
   */
  get type() {
    switch (this.event.RequestType) {
      default:
        return this.event.RequestType.toLowerCase();
    }
  }
}