StackToolbox / aws-sam-webpack-plugin

A Webpack plugin to replace the build step for SAM CLI
MIT License
148 stars 28 forks source link

Support ES Modules #87

Open ffMathy opened 1 year ago

ffMathy commented 1 year ago

See https://aws.amazon.com/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/

Here is my template file:

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Runtime: nodejs18.x

Resources:
  Lambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: app.handler
      Timeout: 10
      Architectures:
      - arm64
      Events:
        Api:
          Type: HttpApi
          Properties:
            Path: /events
            Method: POST

When running the plugin, the final template file generated is this:

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Globals:
  Function:
    Runtime: nodejs18.x
Resources:
  Lambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: Lambda
      Handler: app.mjs.handler
      Timeout: 10
      Architectures:
        - arm64
      Events:
        Api:
          Type: HttpApi
          Properties:
            Path: /events
            Method: POST

Note that app.mjs.handler is wrong. It should be just app.handler.

In my webpack.config.js, I have:

In my package.json, type is set to "module".

With this, .mjs files are generated instead of .js files. But because the file generated is called app.mjs.js instead of app.mjs, Lambda doesn't load it as an ES Module.

ffMathy commented 1 year ago

If I manually go in and rename the app.mjs.js file to app.mjs and then change the template.yml to also point to app.handler instead of app.mjs.handler, it works just fine.

So I suppose this should be an easy fix maybe?

What do you think?

ffMathy commented 1 year ago

As a workaround, I can do this:

filename: (chunkData) => awsSamPlugin.filename(chunkData).replace(".js", ".mjs")

In the config.