text: 'use strict';
  
  const _ = require('lodash');
  const BbPromise = require('bluebird');
  
  module.exports = {
    compileApi() {
      this.websocketsApiLogicalId = this.provider.naming.getWebsocketsApiLogicalId();
  
      const RouteSelectionExpression = this.serverless.service.provider
          .websocketsApiRouteSelectionExpression || '$request.body.action';
  
      _.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, {
        [this.websocketsApiLogicalId]: {
          Type: 'AWS::ApiGatewayV2::Api',
          Properties: {
            Name: this.provider.naming.getWebsocketsApiName(),
            RouteSelectionExpression,
            Description: this.serverless.service.provider
              .websocketsDescription || 'Serverless Websockets',
            ProtocolType: 'WEBSOCKET',
          },
        },
      });
  
      const defaultRoleResource = this.serverless.service.provider.compiledCloudFormationTemplate
        .Resources[this.provider.naming.getRoleLogicalId()];
  
      if (defaultRoleResource) {
        // insert policy that allows functions to postToConnection
        const websocketsPolicy = {
          Effect: 'Allow',
          Action: ['execute-api:ManageConnections'],
          Resource: ['arn:aws:execute-api:*:*:*/@connections/*'],
        };
  
        this.serverless.service.provider.compiledCloudFormationTemplate
          .Resources[this.provider.naming.getRoleLogicalId()]
          .Properties
          .Policies[0]
          .PolicyDocument
          .Statement
          .push(websocketsPolicy);
      }
  
      return BbPromise.resolve();
    },
  };
  