serverless-nextjs / serverless-next.js

⚡ Deploy your Next.js apps on AWS Lambda@Edge via Serverless Components
MIT License
4.43k stars 451 forks source link

CDK Construct - S3 Deployment stage missing `basePath` #1620

Open ghsyeung opened 3 years ago

ghsyeung commented 3 years ago

If basePath is set in next.config.js, the build would put static assets within ${sererlessBuildOutDir}/assets/${basePath}.

However, in the CDK construct (NextJSLambdaEdge), it tries to read the assets from ${sererlessBuildOutDir}/assets without including the basePath

https://github.com/serverless-nextjs/serverless-next.js/blob/145c16d9e163aca7b5f6a753f60404363c842b8f/packages/serverless-components/nextjs-cdk-construct/src/index.ts#L404

The function returns with an empty assets object leading to none of the assets being uploaded.

Similar code in s3-static-assets handle this correctly

https://github.com/serverless-nextjs/serverless-next.js/blob/145c16d9e163aca7b5f6a753f60404363c842b8f/packages/libs/s3-static-assets/src/index.ts#L67

The fix looks relatively straight forward and it works for my use case.

const { basePath } = this.routesManifest || {};
const normalizedBasePath = basePath && basePath.length > 0? basePath.slice(1) : "";
const assets = readAssetsDirectory({ assetsDirectory: path.join(assetsDirectory, normalizedBasePath) }); 
dphang commented 2 years ago

Thanks @ghsyeung. Feel free to raise a PR to fix it and I'll merge it.