Support ES Modules
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:
output.library.typeset to"module".output.library.chunkFormatset to"module".experiments.outputModuleset totrue.
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.
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?
As a workaround, I can do this:
filename: (chunkData) => awsSamPlugin.filename(chunkData).replace(".js", ".mjs")
In the config.