cdk-nextjs 0.3.10 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -3938,7 +3938,7 @@
3938
3938
  "stability": "stable"
3939
3939
  },
3940
3940
  "homepage": "https://github.com/cdklabs/cdk-nextjs.git",
3941
- "jsiiVersion": "5.5.32 (build 07ab32f)",
3941
+ "jsiiVersion": "5.8.8 (build cca5125)",
3942
3942
  "keywords": [
3943
3943
  "aws",
3944
3944
  "aws-cdk",
@@ -3958,7 +3958,7 @@
3958
3958
  },
3959
3959
  "name": "cdk-nextjs",
3960
3960
  "readme": {
3961
- "markdown": "![Version](https://img.shields.io/github/v/release/cdklabs/cdk-nextjs)\n[![npm version](https://img.shields.io/npm/v/cdk-nextjs.svg?style=flat-square)](https://www.npmjs.org/package/cdk-nextjs)\n![License](https://img.shields.io/github/license/cdklabs/cdk-nextjs)\n\n# CDK Next.js Construct Library\n\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nDeploy [Next.js](https://nextjs.org/) apps on [AWS](https://aws.amazon.com/) with the [AWS CDK](https://aws.amazon.com/cdk/).\n\n## Features\n\n- Supports all features of Next.js App and Pages Router for [Node.js Runtime](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes#nodejs-runtime)\n- Choose your AWS architecture for Next.js with the supported constructs: `NextjsGlobalFunctions`, `NextjsGlobalContainers`, `NextjsRegionalContainers`.\n- Global Content Delivery Network (CDN) built with [Amazon CloudFront](https://aws.amazon.com/cloudfront/) to deliver content with low latency and high transfer speeds.\n- Serverless functions powered by [AWS Lambda](https://aws.amazon.com/lambda/) or serverless containers powered by [AWS Fargate](https://aws.amazon.com/fargate/).\n- Static assets (JS, CSS, public folder) are stored and served from [Amazon Simple Storage Service (S3)](https://aws.amazon.com/s3/) for global constructs to decrease latency and reduce compute costs.\n- [Optimized images](https://nextjs.org/docs/pages/building-your-application/optimizing/images), [data cache](https://nextjs.org/docs/app/building-your-application/caching#data-cache), and [full route cache](https://nextjs.org/docs/app/building-your-application/caching#full-route-cache) are shared across compute with [Amazon Elastic File System (EFS)](https://aws.amazon.com/efs/).\n- Customize every construct via `overrides`.\n- WIP: When using AWS Lambda for compute, async revalidation is supported with [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/).\n- AWS security and operational best practices are utilized, guided by [cdk-nag](https://github.com/cdklabs/cdk-nag).\n- First class support for [monorepos](https://monorepo.tools/).\n- [AWS GovCloud (US)](https://aws.amazon.com/govcloud-us) compatible (with `NextjsRegionalContainers`).\n\n## Getting Started\n\n1. If you don’t have a Next.js project yet, follow [these steps](https://nextjs.org/docs/getting-started) to create one.\n1. Install [Docker](https://www.docker.com/). We recommend [Rancher Desktop](https://rancherdesktop.io/) with dockerd (moby) container engine enabled.\n1. Install [Node.js](https://nodejs.org/en). We recommend the long term support (LTS) version.\n1. Set your [next.config.js](https://nextjs.org/docs/pages/api-reference/next-config-js) [output](https://nextjs.org/docs/pages/api-reference/next-config-js/output) key to `\"standalone\"`. Learn more here about [Standalone Output](https://nextjs.org/docs/pages/api-reference/next-config-js/output#automatically-copying-traced-files).\n1. Setup [AWS Cloud Development Kit](https://docs.aws.amazon.com/cdk/v2/guide/home.html) app.\n1. Install the construct package: `npm install cdk-nextjs`\n1. `cdk deploy`\n1. Visit URL printed in terminal (CloudFormation Output) to view your Next.js app!\n\n## Basic Example CDK App\n\n```ts\nimport { App, Stack, StackProps } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { fileURLToPath } from \"node:url\";\nimport { NextjsGlobalFunctions } from \"cdk-nextjs\";\n\nclass NextjsStack extends Stack {\n constructor(scope: Construct, id: string, props: StackProps = {}) {\n super(scope, id, props);\n new NextjsGlobalFunctions(this, \"Nextjs\", {\n healthCheckPath: \"/api/health\",\n buildContext: fileURLToPath(new URL(\"..\", import.meta.url)),\n });\n }\n}\n\nconst app = new App();\n\nnew NextjsStack(app, \"nextjs\");\n```\n\nSee [examples/](./examples/) for more usage examples.\n\n## Architecture\n\n### `NextjsGlobalFunctions`\n\nArchitecture includes [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) Functions to respond to dynamic requests and [CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) Distribution to globally serve requests and distribute static assets. Use this construct when you have unpredictable traffic, can afford occasional latency (i.e. cold starts - [typically 1% of production traffic](https://aws.amazon.com/blogs/compute/operating-lambda-performance-optimization-part-1/)), and/or want the most granular pricing model. ([code](./src/root-constructs/nextjs-global-functions.ts#L81))\n\n![NextjsGlobalFunctions](./docs/cdk-nextjs-NextjsGlobalFunctions.png)\n\n### `NextjsGlobalContainers`\n\nArchitecture includes [ECS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) containers to respond to dynamic requests and [CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) Distribution to globally serve requests and distribute static assets. Use this option when you have predictable traffic, need the lowest latency, and/or can afford a less granular pricing model. ([code](./src/root-constructs/nextjs-global-containers.ts#L76))\n\n![NextjsGlobalContainers](./docs/cdk-nextjs-NextjsGlobalContainers.png)\n\n### `NextjsRegionalContainers`\n\nArchitecture includes [ECS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) containers to respond to dynamic requests and [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/) to regionally serve requests. Use this options when you cannot use Amazon CloudFront (i.e. [AWS GovCloud](https://aws.amazon.com/govcloud-us/?whats-new.sort-by=item.additionalFields.postDateTime&whats-new.sort-order=desc)). ([code](./src/root-constructs/nextjs-regional-containers.ts#L41))\n\n![NextjsRegionalContainers](./docs/cdk-nextjs-NextjsRegionalContainers.png)\n\n## Why\n\nThe simplest path to deploy Next.js is on [Vercel](https://vercel.com/) - the Platform-as-a-Service company behind Next.js. However, deploying to Vercel can be expensive and some developers want all of their workloads running _directly_ on AWS. Developers can deploy Next.js on AWS through [AWS Amplify Hosting](https://docs.aws.amazon.com/amplify/latest/userguide/ssr-Amplifysupport.html), but Amplify does not support all Next.js features and manages AWS resources for you so they cannot be customized. If Amplify meets your requirements we recommend you use it, but if you want to use all Next.js features or want more visibility into the AWS resources then this construct is for you.\n\n## Design Principles\n\n- Treat Next.js as black box. Minimize reliance on Next.js internal APIs to reduce chance of incompatibility between this construct and future versions of Next.js.\n- Security first.\n- One architecture does not fit all.\n- Enable customization everywhere.\n\n## Limitations\n\n- If using `NextjsGlobalFunctions` or `NextjsGlobalContainers` (which use CloudFront), the number of top level files/directories cannot exceed 25, the max number of behaviors a CloudFront Distrubtion supports. We recommend you put all of your public assets into one top level directory (i.e. public/static) so you don't reach this limit. See [CloudFront Quotas](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html) for more information.\n- If using `NextjsGlobalFunctions`, when [revalidating data in Next.js](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#on-demand-revalidation) (i.e. [revalidatePath](https://nextjs.org/docs/app/api-reference/functions/revalidatePath)), the CloudFront Cache will still hold stale data. You'll need to use AWS SDK JS V3 [CreateInvalidationCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-cloudfront/Class/CreateInvalidationCommand/) to manually invalidate the path in CloudFront. See more [here](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html).\n- If using `NextjsGlobalFunctions`, setting an Authorization header won't work by default because of Lambda Function URL with IAM Auth is already using the Authorization header. You can use the `AWS_LWA_AUTHORIZATION_SOURCE` environment variable of [AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter) to set an alternative Authorization header in the client which will then be set to the Authorization header when it reaches your app.\n\n## Additional Security Recommendations\n\nThis construct by default implements all AWS security best practices that a CDK construct library reasonably can considering cost and complexity. Below are additional security practices we recommend you implement within your CDK app. Please see them below:\n\n- [VPC Flow Logs](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html). See [examples/](./examples) for sample implementation.\n- [Scan ECR Images For Vulnerabilities](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html).\n- For `NextjsGlobalFunctions` and `NextjsGlobalContainers`, [CloudFront Access Logs](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html). See [examples/](./examples) for sample implementation.\n- For `NextjsGlobalContainers` and `NextjsRegionalContainers`, [ALB HTTPS Listener](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html)\n- If using `NextjsGlobalContainers`, enable `ReadonlyRootFilesystem`. This will remove ability to use Static On-Demand feature of Next.js so it's not enabled by default, but is recommended for security.\n\n## Estimated Costs\n\nWIP\n\n## Contributing\n\nSteps to build locally:\n\n1. `git clone https://github.com/cdklabs/cdk-nextjs.git`\n2. `cd cdk-nextjs`\n3. `pnpm i && pnpm compile && pnpm build`\n\nThis project uses Projen, so make sure to not edit [Projen](https://projen.io/) created files and only edit .projenrc.ts.\n\n## FAQ\n\nQ: How does this compare to [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs)?<br/>\nA: cdk-nextjs-standalone relies on [OpenNext](https://github.com/sst/open-next). OpenNext injects custom code to interact with private Next.js APIs. While OpenNext is able to make some optimizations that are great for serverless environments, this comes at an increase maintenance cost and increased chances for breaking changes. A goal of cdk-nextjs is to customize Next.js as little as possible to reduce the maintenance burden and decrease chances of breaking changes.\n\nQ: Why not offer API Gateway version of construct?<br/>\nA: API Gateway does not support streaming.\n\nQ: Why EFS instead of S3?<br/>\nA: Next.js has 3 types of server caching that are persisted to disk: [Data Cache](https://nextjs.org/docs/app/building-your-application/caching#data-cache), [Full Route Cache](https://nextjs.org/docs/app/building-your-application/caching#full-route-cache), and [Image Optimization](https://nextjs.org/docs/pages/building-your-application/optimizing/images). Cached data is persisted at .next/cache/fetch-cache, cached full routes are persisted at .next/server/app, and optimized images are persisted at .next/cache/images. Next.js provides a way to customize where cached data or cached full routes are persisted through the [Custom Next.js Cache Handler](https://nextjs.org/docs/app/api-reference/next-config-js/incrementalCacheHandlerPath), but there currently is no way to persist optimized images. Therefore, we need a way to persist cached data at the file system level which is transparent to Next.js. To do this, we use [Amazon Elastic File System (EFS)](https://aws.amazon.com/efs/). Benefits of EFS include being able to cache any Next.js data persisted to disk and therefore being flexible to adapt to Next.js as the framework evolves caching additional types of data. One exception to not using the Custom Next.js Cache Handler is to support [Data Cache Time-based Revalidation](https://nextjs.org/docs/app/building-your-application/caching#time-based-revalidation) when using AWS Lambda functions. Functions only run when they are responding to a request preventing time-based revalidation unlike containers with AWS Fargate which run continually. For functions, an [Amazon SQS Queue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) and consuming function that will make a HEAD request with x-prerender-revalidate header needed for Next.js to update cache.\n\nQ: How customizable is the `cdk-nextjs` package for different use cases?<br/>\nA: The `cdk-nextjs` package offers deep customization through _prop-based_ overrides. These can be accessed in the construct props, allowing you to override settings like VPC configurations, CloudFront distribution, and ECS/Fargate setup. For example, you can modify `nextjsBuildProps` to customize the build process or use `nextjsDistributionProps` to adjust how CloudFront handles caching and routing. This level of control makes it easy to adapt the infrastructure to your application’s specific performance, networking, or deployment needs.\n\nQ: How can I use a custom domain with `cdk-nextjs`?<br/>\nA: See [low-cost example](./examples/low-cost/app.ts).\n\nQ: What is difference between `NextjsGlobalFunctionsProps.overrides.nextjsDistribution` and `NextjsGlobalFunctionsProps.overrides.nextjsGlobalFunctions.nextjsDistributionProps`<br/>\nA: `NextjsGlobalFunctionsProps.overrides.nextjsDistribution` allows you to customize any construct's props _within_ `NextjsDistribution` and is likely what you want whereas `NextjsGlobalFunctionsProps.overrides.nextjsGlobalFunctions.nextjsDistributionProps` allows you to customize the props passed into the construct: `NextjsDistribution`. This principle also applies to other similarly named overrides.\n\nQ: Why use container image for `NextjsGlobalFunctions`?<br />\nA: Read [The case for containers on Lambda (with benchmarks)](https://aaronstuyvenberg.com/posts/containers-on-lambda).\n\n## Acknowledgements\n\nThis construct was built on the shoulders of giants. Thank you to the contributors of [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs) and [open-next](https://github.com/sst/open-next).\n\n## 🥂 Thanks Contributors\n\nThank you for helping other developers deploy Next.js apps on AWS\n\n<a href=\"https://github.com/cdklabs/cdk-nextjs/graphs/contributors\">\n <img src=\"https://contrib.rocks/image?repo=cdklabs/cdk-nextjs\" />\n</a>\n"
3961
+ "markdown": "![Version](https://img.shields.io/github/v/release/cdklabs/cdk-nextjs)\n[![npm version](https://img.shields.io/npm/v/cdk-nextjs.svg?style=flat-square)](https://www.npmjs.org/package/cdk-nextjs)\n![License](https://img.shields.io/github/license/cdklabs/cdk-nextjs)\n\n# CDK Next.js Construct Library\n\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\nDeploy [Next.js](https://nextjs.org/) apps on [AWS](https://aws.amazon.com/) with the [AWS CDK](https://aws.amazon.com/cdk/).\n\n## Features\n\n- Supports all features of Next.js App and Pages Router for [Node.js Runtime](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes#nodejs-runtime)\n- Choose your AWS architecture for Next.js with the supported constructs: `NextjsGlobalFunctions`, `NextjsGlobalContainers`, `NextjsRegionalContainers`.\n- Global Content Delivery Network (CDN) built with [Amazon CloudFront](https://aws.amazon.com/cloudfront/) to deliver content with low latency and high transfer speeds.\n- Serverless functions powered by [AWS Lambda](https://aws.amazon.com/lambda/) or serverless containers powered by [AWS Fargate](https://aws.amazon.com/fargate/).\n- Static assets (JS, CSS, public folder) are stored and served from [Amazon Simple Storage Service (S3)](https://aws.amazon.com/s3/) for global constructs to decrease latency and reduce compute costs.\n- [Optimized images](https://nextjs.org/docs/pages/building-your-application/optimizing/images), [data cache](https://nextjs.org/docs/app/building-your-application/caching#data-cache), and [full route cache](https://nextjs.org/docs/app/building-your-application/caching#full-route-cache) are shared across compute with [Amazon Elastic File System (EFS)](https://aws.amazon.com/efs/).\n- Customize every construct via `overrides`.\n- WIP: When using AWS Lambda for compute, async revalidation is supported with [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/).\n- AWS security and operational best practices are utilized, guided by [cdk-nag](https://github.com/cdklabs/cdk-nag).\n- First class support for [monorepos](https://monorepo.tools/).\n- [AWS GovCloud (US)](https://aws.amazon.com/govcloud-us) compatible (with `NextjsRegionalContainers`).\n\n## Getting Started\n\n1. If you don’t have a Next.js project yet, follow [these steps](https://nextjs.org/docs/getting-started) to create one.\n1. Install [Docker](https://www.docker.com/). We recommend [Rancher Desktop](https://rancherdesktop.io/) with dockerd (moby) container engine enabled.\n1. Install [Node.js](https://nodejs.org/en). We recommend the long term support (LTS) version.\n1. Set your [next.config.js](https://nextjs.org/docs/pages/api-reference/next-config-js) [output](https://nextjs.org/docs/pages/api-reference/next-config-js/output) key to `\"standalone\"`. Learn more here about [Standalone Output](https://nextjs.org/docs/pages/api-reference/next-config-js/output#automatically-copying-traced-files).\n1. Setup [AWS Cloud Development Kit](https://docs.aws.amazon.com/cdk/v2/guide/home.html) app.\n1. Install the construct package: `npm install cdk-nextjs`\n1. `cdk deploy`\n1. Visit URL printed in terminal (CloudFormation Output) to view your Next.js app!\n\n## Basic Example CDK App\n\n```ts\nimport { App, Stack, StackProps } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { NextjsGlobalFunctions } from \"cdk-nextjs\";\nimport { join } from \"node:path\";\n\nclass NextjsStack extends Stack {\n constructor(scope: Construct, id: string, props?: StackProps) {\n super(scope, id, props);\n new NextjsGlobalFunctions(this, \"Nextjs\", {\n healthCheckPath: \"/api/health\",\n buildContext: join(import.meta.dirname, \"..\"),\n });\n }\n}\n\nconst app = new App();\n\nnew NextjsStack(app, \"nextjs\");\n```\n\nSee [examples/](./examples/) for more usage examples.\n\n## Architecture\n\n### `NextjsGlobalFunctions`\n\nArchitecture includes [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) Functions to respond to dynamic requests and [CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) Distribution to globally serve requests and distribute static assets. Use this construct when you have unpredictable traffic, can afford occasional latency (i.e. cold starts - [typically 1% of production traffic](https://aws.amazon.com/blogs/compute/operating-lambda-performance-optimization-part-1/)), and/or want the most granular pricing model. ([code](./src/root-constructs/nextjs-global-functions.ts#L81))\n\n![NextjsGlobalFunctions](./docs/cdk-nextjs-NextjsGlobalFunctions.png)\n\n### `NextjsGlobalContainers`\n\nArchitecture includes [ECS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) containers to respond to dynamic requests and [CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) Distribution to globally serve requests and distribute static assets. Use this option when you have predictable traffic, need the lowest latency, and/or can afford a less granular pricing model. ([code](./src/root-constructs/nextjs-global-containers.ts#L76))\n\n![NextjsGlobalContainers](./docs/cdk-nextjs-NextjsGlobalContainers.png)\n\n### `NextjsRegionalContainers`\n\nArchitecture includes [ECS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html) containers to respond to dynamic requests and [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/) to regionally serve requests. Use this options when you cannot use Amazon CloudFront (i.e. [AWS GovCloud](https://aws.amazon.com/govcloud-us/?whats-new.sort-by=item.additionalFields.postDateTime&whats-new.sort-order=desc)). ([code](./src/root-constructs/nextjs-regional-containers.ts#L41))\n\n![NextjsRegionalContainers](./docs/cdk-nextjs-NextjsRegionalContainers.png)\n\n## Why\n\nThe simplest path to deploy Next.js is on [Vercel](https://vercel.com/) - the Platform-as-a-Service company behind Next.js. However, deploying to Vercel can be expensive and some developers want all of their workloads running _directly_ on AWS. Developers can deploy Next.js on AWS through [AWS Amplify Hosting](https://docs.aws.amazon.com/amplify/latest/userguide/ssr-Amplifysupport.html), but Amplify does not support all Next.js features and manages AWS resources for you so they cannot be customized. If Amplify meets your requirements we recommend you use it, but if you want to use all Next.js features or want more visibility into the AWS resources then this construct is for you.\n\n## Design Principles\n\n- Treat Next.js as black box. Minimize reliance on Next.js internal APIs to reduce chance of incompatibility between this construct and future versions of Next.js.\n- Security first.\n- One architecture does not fit all.\n- Enable customization everywhere.\n\n## Limitations\n\n- If using `NextjsGlobalFunctions` or `NextjsGlobalContainers` (which use CloudFront), the number of top level files/directories cannot exceed 25, the max number of behaviors a CloudFront Distrubtion supports. We recommend you put all of your public assets into one top level directory (i.e. public/static) so you don't reach this limit. See [CloudFront Quotas](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html) for more information.\n- If using `NextjsGlobalFunctions`, when [revalidating data in Next.js](https://nextjs.org/docs/app/building-your-application/data-fetching/fetching-caching-and-revalidating#on-demand-revalidation) (i.e. [revalidatePath](https://nextjs.org/docs/app/api-reference/functions/revalidatePath)), the CloudFront Cache will still hold stale data. You'll need to use AWS SDK JS V3 [CreateInvalidationCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-client-cloudfront/Class/CreateInvalidationCommand/) to manually invalidate the path in CloudFront. See more [here](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html).\n- If using `NextjsGlobalFunctions`, setting an Authorization header won't work by default because of Lambda Function URL with IAM Auth is already using the Authorization header. You can use the `AWS_LWA_AUTHORIZATION_SOURCE` environment variable of [AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter) to set an alternative Authorization header in the client which will then be set to the Authorization header when it reaches your app.\n\n## Additional Security Recommendations\n\nThis construct by default implements all AWS security best practices that a CDK construct library reasonably can considering cost and complexity. Below are additional security practices we recommend you implement within your CDK app. Please see them below:\n\n- [VPC Flow Logs](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html). See [examples/](./examples) for sample implementation.\n- [Scan ECR Images For Vulnerabilities](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-scanning.html).\n- For `NextjsGlobalFunctions` and `NextjsGlobalContainers`, [CloudFront Access Logs](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html). See [examples/](./examples) for sample implementation.\n- For `NextjsGlobalContainers` and `NextjsRegionalContainers`, [ALB HTTPS Listener](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html)\n- If using `NextjsGlobalContainers`, enable `ReadonlyRootFilesystem`. This will remove ability to use Static On-Demand feature of Next.js so it's not enabled by default, but is recommended for security.\n\n## Estimated Costs\n\nWIP\n\n## Contributing\n\nSteps to build locally:\n\n1. `git clone https://github.com/cdklabs/cdk-nextjs.git`\n2. `cd cdk-nextjs`\n3. `pnpm i && pnpm compile && pnpm build`\n\nThis project uses Projen, so make sure to not edit [Projen](https://projen.io/) created files and only edit .projenrc.ts.\n\n## FAQ\n\nQ: How does this compare to [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs)?<br/>\nA: cdk-nextjs-standalone relies on [OpenNext](https://github.com/sst/open-next). OpenNext injects custom code to interact with private Next.js APIs. While OpenNext is able to make some optimizations that are great for serverless environments, this comes at an increase maintenance cost and increased chances for breaking changes. A goal of cdk-nextjs is to customize Next.js as little as possible to reduce the maintenance burden and decrease chances of breaking changes.\n\nQ: Why not offer API Gateway version of construct?<br/>\nA: API Gateway does not support streaming.\n\nQ: Why EFS instead of S3?<br/>\nA: Next.js has 3 types of server caching that are persisted to disk: [Data Cache](https://nextjs.org/docs/app/building-your-application/caching#data-cache), [Full Route Cache](https://nextjs.org/docs/app/building-your-application/caching#full-route-cache), and [Image Optimization](https://nextjs.org/docs/pages/building-your-application/optimizing/images). Cached data is persisted at .next/cache/fetch-cache, cached full routes are persisted at .next/server/app, and optimized images are persisted at .next/cache/images. Next.js provides a way to customize where cached data or cached full routes are persisted through the [Custom Next.js Cache Handler](https://nextjs.org/docs/app/api-reference/next-config-js/incrementalCacheHandlerPath), but there currently is no way to persist optimized images. Therefore, we need a way to persist cached data at the file system level which is transparent to Next.js. To do this, we use [Amazon Elastic File System (EFS)](https://aws.amazon.com/efs/). Benefits of EFS include being able to cache any Next.js data persisted to disk and therefore being flexible to adapt to Next.js as the framework evolves caching additional types of data. One exception to not using the Custom Next.js Cache Handler is to support [Data Cache Time-based Revalidation](https://nextjs.org/docs/app/building-your-application/caching#time-based-revalidation) when using AWS Lambda functions. Functions only run when they are responding to a request preventing time-based revalidation unlike containers with AWS Fargate which run continually. For functions, an [Amazon SQS Queue](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) and consuming function that will make a HEAD request with x-prerender-revalidate header needed for Next.js to update cache.\n\nQ: How customizable is the `cdk-nextjs` package for different use cases?<br/>\nA: The `cdk-nextjs` package offers deep customization through _prop-based_ overrides. These can be accessed in the construct props, allowing you to override settings like VPC configurations, CloudFront distribution, and ECS/Fargate setup. For example, you can modify `nextjsBuildProps` to customize the build process or use `nextjsDistributionProps` to adjust how CloudFront handles caching and routing. This level of control makes it easy to adapt the infrastructure to your application’s specific performance, networking, or deployment needs.\n\nQ: How can I use a custom domain with `cdk-nextjs`?<br/>\nA: See [low-cost example](./examples/low-cost/app.ts).\n\nQ: What is difference between `NextjsGlobalFunctionsProps.overrides.nextjsDistribution` and `NextjsGlobalFunctionsProps.overrides.nextjsGlobalFunctions.nextjsDistributionProps`<br/>\nA: `NextjsGlobalFunctionsProps.overrides.nextjsDistribution` allows you to customize any construct's props _within_ `NextjsDistribution` and is likely what you want whereas `NextjsGlobalFunctionsProps.overrides.nextjsGlobalFunctions.nextjsDistributionProps` allows you to customize the props passed into the construct: `NextjsDistribution`. This principle also applies to other similarly named overrides.\n\nQ: Why use container image for `NextjsGlobalFunctions`?<br />\nA: Read [The case for containers on Lambda (with benchmarks)](https://aaronstuyvenberg.com/posts/containers-on-lambda).\n\n## Acknowledgements\n\nThis construct was built on the shoulders of giants. Thank you to the contributors of [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs) and [open-next](https://github.com/sst/open-next).\n\n## 🥂 Thanks Contributors\n\nThank you for helping other developers deploy Next.js apps on AWS\n\n<a href=\"https://github.com/cdklabs/cdk-nextjs/graphs/contributors\">\n <img src=\"https://contrib.rocks/image?repo=cdklabs/cdk-nextjs\" />\n</a>\n"
3962
3962
  },
3963
3963
  "repository": {
3964
3964
  "type": "git",
@@ -4401,7 +4401,7 @@
4401
4401
  },
4402
4402
  "locationInModule": {
4403
4403
  "filename": "src/nextjs-assets-deployment.ts",
4404
- "line": 136
4404
+ "line": 141
4405
4405
  },
4406
4406
  "parameters": [
4407
4407
  {
@@ -4427,7 +4427,7 @@
4427
4427
  "kind": "class",
4428
4428
  "locationInModule": {
4429
4429
  "filename": "src/nextjs-assets-deployment.ts",
4430
- "line": 126
4430
+ "line": 131
4431
4431
  },
4432
4432
  "name": "NextjsAssetsDeployment",
4433
4433
  "properties": [
@@ -4437,7 +4437,7 @@
4437
4437
  },
4438
4438
  "locationInModule": {
4439
4439
  "filename": "src/nextjs-assets-deployment.ts",
4440
- "line": 127
4440
+ "line": 132
4441
4441
  },
4442
4442
  "name": "customResource",
4443
4443
  "type": {
@@ -4450,7 +4450,7 @@
4450
4450
  },
4451
4451
  "locationInModule": {
4452
4452
  "filename": "src/nextjs-assets-deployment.ts",
4453
- "line": 128
4453
+ "line": 133
4454
4454
  },
4455
4455
  "name": "dockerImageFunction",
4456
4456
  "type": {
@@ -4464,7 +4464,7 @@
4464
4464
  },
4465
4465
  "locationInModule": {
4466
4466
  "filename": "src/nextjs-assets-deployment.ts",
4467
- "line": 132
4467
+ "line": 137
4468
4468
  },
4469
4469
  "name": "previewModeId",
4470
4470
  "type": {
@@ -4512,7 +4512,7 @@
4512
4512
  "immutable": true,
4513
4513
  "locationInModule": {
4514
4514
  "filename": "src/nextjs-assets-deployment.ts",
4515
- "line": 33
4515
+ "line": 38
4516
4516
  },
4517
4517
  "name": "buildImageDigest",
4518
4518
  "type": {
@@ -4528,7 +4528,7 @@
4528
4528
  "immutable": true,
4529
4529
  "locationInModule": {
4530
4530
  "filename": "src/nextjs-assets-deployment.ts",
4531
- "line": 37
4531
+ "line": 42
4532
4532
  },
4533
4533
  "name": "containerMountPathForEfs",
4534
4534
  "type": {
@@ -4543,7 +4543,7 @@
4543
4543
  "immutable": true,
4544
4544
  "locationInModule": {
4545
4545
  "filename": "src/nextjs-assets-deployment.ts",
4546
- "line": 42
4546
+ "line": 47
4547
4547
  },
4548
4548
  "name": "dockerImageCode",
4549
4549
  "type": {
@@ -4558,7 +4558,7 @@
4558
4558
  "immutable": true,
4559
4559
  "locationInModule": {
4560
4560
  "filename": "src/nextjs-assets-deployment.ts",
4561
- "line": 43
4561
+ "line": 48
4562
4562
  },
4563
4563
  "name": "nextjsType",
4564
4564
  "type": {
@@ -4573,13 +4573,31 @@
4573
4573
  "immutable": true,
4574
4574
  "locationInModule": {
4575
4575
  "filename": "src/nextjs-assets-deployment.ts",
4576
- "line": 53
4576
+ "line": 58
4577
4577
  },
4578
4578
  "name": "vpc",
4579
4579
  "type": {
4580
4580
  "fqn": "aws-cdk-lib.aws_ec2.IVpc"
4581
4581
  }
4582
4582
  },
4583
+ {
4584
+ "abstract": true,
4585
+ "docs": {
4586
+ "example": "\"/my-base-path\"",
4587
+ "stability": "stable",
4588
+ "summary": "Prefix to the URI path the app will be served at."
4589
+ },
4590
+ "immutable": true,
4591
+ "locationInModule": {
4592
+ "filename": "src/nextjs-assets-deployment.ts",
4593
+ "line": 34
4594
+ },
4595
+ "name": "basePath",
4596
+ "optional": true,
4597
+ "type": {
4598
+ "primitive": "string"
4599
+ }
4600
+ },
4583
4601
  {
4584
4602
  "abstract": true,
4585
4603
  "docs": {
@@ -4589,7 +4607,7 @@
4589
4607
  "immutable": true,
4590
4608
  "locationInModule": {
4591
4609
  "filename": "src/nextjs-assets-deployment.ts",
4592
- "line": 41
4610
+ "line": 46
4593
4611
  },
4594
4612
  "name": "debug",
4595
4613
  "optional": true,
@@ -4605,7 +4623,7 @@
4605
4623
  "immutable": true,
4606
4624
  "locationInModule": {
4607
4625
  "filename": "src/nextjs-assets-deployment.ts",
4608
- "line": 44
4626
+ "line": 49
4609
4627
  },
4610
4628
  "name": "overrides",
4611
4629
  "optional": true,
@@ -4622,7 +4640,7 @@
4622
4640
  "immutable": true,
4623
4641
  "locationInModule": {
4624
4642
  "filename": "src/nextjs-assets-deployment.ts",
4625
- "line": 48
4643
+ "line": 53
4626
4644
  },
4627
4645
  "name": "relativePathToWorkspace",
4628
4646
  "optional": true,
@@ -4639,7 +4657,7 @@
4639
4657
  "immutable": true,
4640
4658
  "locationInModule": {
4641
4659
  "filename": "src/nextjs-assets-deployment.ts",
4642
- "line": 52
4660
+ "line": 57
4643
4661
  },
4644
4662
  "name": "staticAssetsBucket",
4645
4663
  "optional": true,
@@ -12465,7 +12483,7 @@
12465
12483
  "immutable": true,
12466
12484
  "locationInModule": {
12467
12485
  "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12468
- "line": 46
12486
+ "line": 51
12469
12487
  },
12470
12488
  "name": "accessPoint",
12471
12489
  "optional": true,
@@ -12473,6 +12491,23 @@
12473
12491
  "fqn": "aws-cdk-lib.aws_efs.AccessPoint"
12474
12492
  }
12475
12493
  },
12494
+ {
12495
+ "abstract": true,
12496
+ "docs": {
12497
+ "stability": "stable",
12498
+ "summary": "Prefix to the URI path the app will be served at."
12499
+ },
12500
+ "immutable": true,
12501
+ "locationInModule": {
12502
+ "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12503
+ "line": 27
12504
+ },
12505
+ "name": "basePath",
12506
+ "optional": true,
12507
+ "type": {
12508
+ "primitive": "string"
12509
+ }
12510
+ },
12476
12511
  {
12477
12512
  "abstract": true,
12478
12513
  "docs": {
@@ -12481,7 +12516,7 @@
12481
12516
  "immutable": true,
12482
12517
  "locationInModule": {
12483
12518
  "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12484
- "line": 42
12519
+ "line": 47
12485
12520
  },
12486
12521
  "name": "buildImageDigest",
12487
12522
  "optional": true,
@@ -12497,7 +12532,7 @@
12497
12532
  "immutable": true,
12498
12533
  "locationInModule": {
12499
12534
  "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12500
- "line": 38
12535
+ "line": 43
12501
12536
  },
12502
12537
  "name": "containerMountPathForEfs",
12503
12538
  "optional": true,
@@ -12530,7 +12565,7 @@
12530
12565
  "immutable": true,
12531
12566
  "locationInModule": {
12532
12567
  "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12533
- "line": 34
12568
+ "line": 39
12534
12569
  },
12535
12570
  "name": "dockerImageCode",
12536
12571
  "optional": true,
@@ -12546,7 +12581,7 @@
12546
12581
  "immutable": true,
12547
12582
  "locationInModule": {
12548
12583
  "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12549
- "line": 30
12584
+ "line": 35
12550
12585
  },
12551
12586
  "name": "nextjsType",
12552
12587
  "optional": true,
@@ -12595,7 +12630,7 @@
12595
12630
  "immutable": true,
12596
12631
  "locationInModule": {
12597
12632
  "filename": "src/generated-structs/OptionalNextjsAssetsDeploymentProps.ts",
12598
- "line": 26
12633
+ "line": 31
12599
12634
  },
12600
12635
  "name": "vpc",
12601
12636
  "optional": true,
@@ -13864,6 +13899,6 @@
13864
13899
  "symbolId": "src/nextjs-build/nextjs-build:PublicDirEntry"
13865
13900
  }
13866
13901
  },
13867
- "version": "0.3.10",
13868
- "fingerprint": "w3m/Qct1nI/4OubBk+l0S+LBvSX6OJGygME8DlIfh2g="
13902
+ "version": "0.3.11",
13903
+ "fingerprint": "jSbkbiihLnIoBCkEEvLESi9tPRhXm/cO1ESN/CAS1jk="
13869
13904
  }
package/API.md CHANGED
@@ -2210,6 +2210,7 @@ const nextjsAssetsDeploymentProps: NextjsAssetsDeploymentProps = { ... }
2210
2210
  | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.dockerImageCode">dockerImageCode</a></code> | <code>aws-cdk-lib.aws_lambda.DockerImageCode</code> | *No description.* |
2211
2211
  | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.nextjsType">nextjsType</a></code> | <code><a href="#cdk-nextjs.NextjsType">NextjsType</a></code> | *No description.* |
2212
2212
  | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.vpc">vpc</a></code> | <code>aws-cdk-lib.aws_ec2.IVpc</code> | *No description.* |
2213
+ | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.basePath">basePath</a></code> | <code>string</code> | Prefix to the URI path the app will be served at. |
2213
2214
  | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.debug">debug</a></code> | <code>boolean</code> | *No description.* |
2214
2215
  | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.overrides">overrides</a></code> | <code><a href="#cdk-nextjs.NextjsAssetDeploymentOverrides">NextjsAssetDeploymentOverrides</a></code> | *No description.* |
2215
2216
  | <code><a href="#cdk-nextjs.NextjsAssetsDeploymentProps.property.relativePathToWorkspace">relativePathToWorkspace</a></code> | <code>string</code> | *No description.* |
@@ -2281,6 +2282,25 @@ public readonly vpc: IVpc;
2281
2282
 
2282
2283
  ---
2283
2284
 
2285
+ ##### `basePath`<sup>Optional</sup> <a name="basePath" id="cdk-nextjs.NextjsAssetsDeploymentProps.property.basePath"></a>
2286
+
2287
+ ```typescript
2288
+ public readonly basePath: string;
2289
+ ```
2290
+
2291
+ - *Type:* string
2292
+
2293
+ Prefix to the URI path the app will be served at.
2294
+
2295
+ ---
2296
+
2297
+ *Example*
2298
+
2299
+ ```typescript
2300
+ "/my-base-path"
2301
+ ```
2302
+
2303
+
2284
2304
  ##### `debug`<sup>Optional</sup> <a name="debug" id="cdk-nextjs.NextjsAssetsDeploymentProps.property.debug"></a>
2285
2305
 
2286
2306
  ```typescript
@@ -8518,6 +8538,7 @@ const optionalNextjsAssetsDeploymentProps: OptionalNextjsAssetsDeploymentProps =
8518
8538
  | **Name** | **Type** | **Description** |
8519
8539
  | --- | --- | --- |
8520
8540
  | <code><a href="#cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.accessPoint">accessPoint</a></code> | <code>aws-cdk-lib.aws_efs.AccessPoint</code> | *No description.* |
8541
+ | <code><a href="#cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.basePath">basePath</a></code> | <code>string</code> | Prefix to the URI path the app will be served at. |
8521
8542
  | <code><a href="#cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.buildImageDigest">buildImageDigest</a></code> | <code>string</code> | *No description.* |
8522
8543
  | <code><a href="#cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.containerMountPathForEfs">containerMountPathForEfs</a></code> | <code>string</code> | *No description.* |
8523
8544
  | <code><a href="#cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.debug">debug</a></code> | <code>boolean</code> | *No description.* |
@@ -8539,6 +8560,18 @@ public readonly accessPoint: AccessPoint;
8539
8560
 
8540
8561
  ---
8541
8562
 
8563
+ ##### `basePath`<sup>Optional</sup> <a name="basePath" id="cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.basePath"></a>
8564
+
8565
+ ```typescript
8566
+ public readonly basePath: string;
8567
+ ```
8568
+
8569
+ - *Type:* string
8570
+
8571
+ Prefix to the URI path the app will be served at.
8572
+
8573
+ ---
8574
+
8542
8575
  ##### `buildImageDigest`<sup>Optional</sup> <a name="buildImageDigest" id="cdk-nextjs.OptionalNextjsAssetsDeploymentProps.property.buildImageDigest"></a>
8543
8576
 
8544
8577
  ```typescript
package/README.md CHANGED
@@ -52,15 +52,15 @@ Deploy [Next.js](https://nextjs.org/) apps on [AWS](https://aws.amazon.com/) wit
52
52
  ```ts
53
53
  import { App, Stack, StackProps } from "aws-cdk-lib";
54
54
  import { Construct } from "constructs";
55
- import { fileURLToPath } from "node:url";
56
55
  import { NextjsGlobalFunctions } from "cdk-nextjs";
56
+ import { join } from "node:path";
57
57
 
58
58
  class NextjsStack extends Stack {
59
- constructor(scope: Construct, id: string, props: StackProps = {}) {
59
+ constructor(scope: Construct, id: string, props?: StackProps) {
60
60
  super(scope, id, props);
61
61
  new NextjsGlobalFunctions(this, "Nextjs", {
62
62
  healthCheckPath: "/api/health",
63
- buildContext: fileURLToPath(new URL("..", import.meta.url)),
63
+ buildContext: join(import.meta.dirname, ".."),
64
64
  });
65
65
  }
66
66
  }
@@ -8755,7 +8755,7 @@ async function fsToS3(props, nextjsType) {
8755
8755
  debug(
8756
8756
  putObjectInputs.map((i) => ({
8757
8757
  bucket: i.Bucket,
8758
- key: i.ContentType
8758
+ key: i.Key
8759
8759
  }))
8760
8760
  );
8761
8761
  await Promise.all(
@@ -7,8 +7,8 @@ Example Next.js app based on [App Playground](https://app-router.vercel.app/) wi
7
7
  1. Follow setup steps in parent README [Contributing](../README.md#contributing) section
8
8
  1. Install dependencies: `cd examples && pnpm i`
9
9
  1. `cd cloudfront-lambda` for example. Tryout any of the other examples as well.
10
- 1. Create .env with `AWS_PROFILE="your-profile"` in each package you want to deploy. For setting up `AWS_PROFILE`, see: [AWS security credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html). Ensure `CDK_DEFAULT_ACCOUNT` and `CDK_DEFAULT_REGION` env vars are resolved during synthesis. See more at: [How to specify environments with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/configure-env.html).
11
- 1. Within package, run: `pnpm deploy:local`
10
+ 1. Create .env with `AWS_PROFILE="your-profile"` in each package you want to deploy. For setting up `AWS_PROFILE`, see: [AWS security credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html). See more at: [How to specify environments with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/configure-env.html).
11
+ 1. Within package, run: `pnpm run deploy`
12
12
 
13
13
  # Notes on app-playground
14
14
 
@@ -18,6 +18,11 @@ export interface OptionalNextjsAssetsDeploymentProps {
18
18
  * @stability stable
19
19
  */
20
20
  readonly debug?: boolean;
21
+ /**
22
+ * Prefix to the URI path the app will be served at.
23
+ * @stability stable
24
+ */
25
+ readonly basePath?: string;
21
26
  /**
22
27
  * @stability stable
23
28
  */
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcInBucG0gZGx4IHByb2plblwiLlxuaW1wb3J0IHR5cGUgeyBhd3NfZWMyLCBhd3NfZWZzLCBhd3NfbGFtYmRhLCBhd3NfczMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IE5leHRqc1R5cGUgfSBmcm9tICcuLi8nO1xuXG4vKipcbiAqIE9wdGlvbmFsTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMge1xuICAvKipcbiAgICogUmVxdWlyZWQgZm9yIGBOZXh0anNUeXBlLkdsb2JhbEZ1bmN0aW9uc2AgYW5kIGBOZXh0anNUeXBlLkdsb2JhbENvbnRhaW5lcnNgLlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0PzogYXdzX3MzLkJ1Y2tldDtcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBhd3NfZWMyLklWcGM7XG4gIC8qKlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dGpzVHlwZT86IE5leHRqc1R5cGU7XG4gIC8qKlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgZG9ja2VySW1hZ2VDb2RlPzogYXdzX2xhbWJkYS5Eb2NrZXJJbWFnZUNvZGU7XG4gIC8qKlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyTW91bnRQYXRoRm9yRWZzPzogc3RyaW5nO1xuICAvKipcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkSW1hZ2VEaWdlc3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ/OiBhd3NfZWZzLkFjY2Vzc1BvaW50O1xufVxuIl19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcInBucG0gZGx4IHByb2plblwiLlxuaW1wb3J0IHR5cGUgeyBhd3NfZWMyLCBhd3NfZWZzLCBhd3NfbGFtYmRhLCBhd3NfczMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IE5leHRqc1R5cGUgfSBmcm9tICcuLi8nO1xuXG4vKipcbiAqIE9wdGlvbmFsTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uYWxOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMge1xuICAvKipcbiAgICogUmVxdWlyZWQgZm9yIGBOZXh0anNUeXBlLkdsb2JhbEZ1bmN0aW9uc2AgYW5kIGBOZXh0anNUeXBlLkdsb2JhbENvbnRhaW5lcnNgLlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0PzogYXdzX3MzLkJ1Y2tldDtcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFByZWZpeCB0byB0aGUgVVJJIHBhdGggdGhlIGFwcCB3aWxsIGJlIHNlcnZlZCBhdC5cbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGF3c19lYzIuSVZwYztcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBuZXh0anNUeXBlPzogTmV4dGpzVHlwZTtcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBkb2NrZXJJbWFnZUNvZGU/OiBhd3NfbGFtYmRhLkRvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJNb3VudFBhdGhGb3JFZnM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRJbWFnZURpZ2VzdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NQb2ludD86IGF3c19lZnMuQWNjZXNzUG9pbnQ7XG59XG4iXX0=
@@ -47,7 +47,7 @@ async function fsToS3(props, nextjsType) {
47
47
  });
48
48
  (0, utils_1.debug)(putObjectInputs.map((i) => ({
49
49
  bucket: i.Bucket,
50
- key: i.ContentType,
50
+ key: i.Key,
51
51
  })));
52
52
  await Promise.all(putObjectInputs.map((input) => new lib_storage_1.Upload({ client: s3_1.s3, params: input }).done()));
53
53
  }
@@ -62,4 +62,4 @@ function createS3Key({ keyPrefix, path, basePath }) {
62
62
  objectKeyParts.push((0, node_path_1.relative)(basePath, path));
63
63
  return (0, node_path_1.join)(...objectKeyParts);
64
64
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdG8tczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9mcy10by1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLHdCQWtEQztBQVVELGtDQUtDO0FBL0VELHFDQUFxRTtBQUNyRSx5Q0FBMkM7QUFHM0MsNkRBQTZEO0FBQzdELHNEQUE4QztBQUM5Qyw2REFBNkQ7QUFDN0QsbUNBQW1DO0FBQ25DLHFDQUFxRDtBQUNyRCw2QkFBMEI7QUFDMUIsbUNBQWdDO0FBQ2hDLHlDQUEwQztBQUduQyxLQUFLLFVBQVUsTUFBTSxDQUFDLEtBQW1CLEVBQUUsVUFBdUI7SUFDdkUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUMxRSxNQUFNLGVBQWUsR0FBRyxJQUFBLHNCQUFhLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFLLEVBQUUsTUFBTSxhQUFhLElBQUksSUFBQSxtQkFBVSxFQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sZUFBZSxHQUE0QixhQUFhLENBQUMsR0FBRyxDQUNoRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1AsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUM7WUFDbkQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDO2dCQUN0QixTQUFTLEVBQUUsb0JBQW9CO2dCQUMvQixJQUFJO2dCQUNKLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUMsQ0FBQztZQUNILElBQUksSUFBeUIsQ0FBQztZQUM5QixJQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7Z0JBQzlDLFVBQVUsS0FBSyxtQkFBVSxDQUFDLGdCQUFnQixFQUMxQyxDQUFDO2dCQUNELDBFQUEwRTtnQkFDMUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLHNCQUFZLEVBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0saUJBQWlCLEdBQUcsSUFBQSxzQkFBWSxFQUNwQyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQ2xDO3FCQUNFLFFBQVEsRUFBRTtvQkFDWCxzRkFBc0Y7b0JBQ3RGLHlFQUF5RTtxQkFDeEUsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxHQUFHLGlCQUFpQixHQUFHLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxHQUFHO2FBQ1QsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBQSxhQUFLLEVBQ0gsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsR0FBRyxFQUFFLENBQUMsQ0FBQyxXQUFXO1NBQ25CLENBQUMsQ0FBQyxDQUNKLENBQUM7UUFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzVCLElBQUksb0JBQU0sQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQ2pELENBQ0YsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBT0Q7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBb0I7SUFDekUsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO0lBQ3BDLElBQUksU0FBUztRQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFBLG9CQUFRLEVBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUMsT0FBTyxJQUFBLGdCQUFJLEVBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgcmVhZEZpbGVTeW5jLCBSZWFkU3RyZWFtIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGpvaW4sIHJlbGF0aXZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgUHV0T2JqZWN0Q29tbWFuZElucHV0IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgVXBsb2FkIH0gZnJvbSBcIkBhd3Mtc2RrL2xpYi1zdG9yYWdlXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgKiBhcyBtaW1lIGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyBjaHVua0FycmF5LCBsaXN0RmlsZVBhdGhzIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQgeyBzMyB9IGZyb20gXCIuL3MzXCI7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBGc1RvUzNBY3Rpb24gfSBmcm9tIFwiLi4vLi4vbmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmc1RvUzMocHJvcHM6IEZzVG9TM0FjdGlvbiwgbmV4dGpzVHlwZT86IE5leHRqc1R5cGUpIHtcbiAgY29uc3QgeyBkZXN0aW5hdGlvbkJ1Y2tldE5hbWUsIGRlc3RpbmF0aW9uS2V5UHJlZml4LCBzb3VyY2VQYXRoIH0gPSBwcm9wcztcbiAgY29uc3Qgc291cmNlRmlsZVBhdGhzID0gbGlzdEZpbGVQYXRocyhzb3VyY2VQYXRoKTtcbiAgZm9yIGF3YWl0IChjb25zdCBmaWxlUGF0aENodW5rIG9mIGNodW5rQXJyYXkoc291cmNlRmlsZVBhdGhzLCAxMDApKSB7XG4gICAgY29uc3QgcHV0T2JqZWN0SW5wdXRzOiBQdXRPYmplY3RDb21tYW5kSW5wdXRbXSA9IGZpbGVQYXRoQ2h1bmsubWFwKFxuICAgICAgKHBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBtaW1lLmxvb2t1cChwYXRoKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGtleSA9IGNyZWF0ZVMzS2V5KHtcbiAgICAgICAgICBrZXlQcmVmaXg6IGRlc3RpbmF0aW9uS2V5UHJlZml4LFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgYmFzZVBhdGg6IHNvdXJjZVBhdGgsXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgYm9keTogc3RyaW5nIHwgUmVhZFN0cmVhbTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhdGguaW5jbHVkZXMoXCIubmV4dC9zdGF0aWMvY2h1bmtzL21haW4tYXBwLVwiKSAmJlxuICAgICAgICAgIG5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OU1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzZWUgc3JjL2xhbWJkYXMvYXNzZXRzLWRlcGxveW1lbnQvcGF0Y2gtZmV0Y2guanMgZm9yIHdoeSB0aGlzIGlzIG5lZWRlZFxuICAgICAgICAgIGNvbnN0IG1haW5BcHBGaWxlQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcbiAgICAgICAgICBjb25zdCBwYXRjaEZldGNoQ29udGVudCA9IHJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgIGpvaW4oX19kaXJuYW1lLCBcInBhdGNoLWZldGNoLmpzXCIpLFxuICAgICAgICAgIClcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAvLyByZW1vdmUgXCJ1c2Ugc3RyaWN0XCIgYmVjYXVzZSBpdCBjYXVzZXM6IFVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiBfTl9FIGlzIG5vdCBkZWZpbmVkXG4gICAgICAgICAgICAvLyBzaW5jZSBzdHJpY3QgbW9kZSBkb2Vzbid0IGFsbG93IHdlYnBhY2sgdG8gZGVmaW5lIHVuZGVjbGFyZWQgdmFyaWFibGVzXG4gICAgICAgICAgICAucmVwbGFjZSgnXCJ1c2Ugc3RyaWN0XCI7JywgXCJcIik7XG4gICAgICAgICAgYm9keSA9IHBhdGNoRmV0Y2hDb250ZW50ICsgXCJcXG5cIiArIG1haW5BcHBGaWxlQ29udGVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib2R5ID0gY3JlYXRlUmVhZFN0cmVhbShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIEJvZHk6IGJvZHksXG4gICAgICAgICAgQnVja2V0OiBkZXN0aW5hdGlvbkJ1Y2tldE5hbWUsXG4gICAgICAgICAgQ29udGVudFR5cGU6IGNvbnRlbnRUeXBlLFxuICAgICAgICAgIEtleToga2V5LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIGRlYnVnKFxuICAgICAgcHV0T2JqZWN0SW5wdXRzLm1hcCgoaSkgPT4gKHtcbiAgICAgICAgYnVja2V0OiBpLkJ1Y2tldCxcbiAgICAgICAga2V5OiBpLkNvbnRlbnRUeXBlLFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwdXRPYmplY3RJbnB1dHMubWFwKChpbnB1dCkgPT5cbiAgICAgICAgbmV3IFVwbG9hZCh7IGNsaWVudDogczMsIHBhcmFtczogaW5wdXQgfSkuZG9uZSgpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG5cbmludGVyZmFjZSBDcmVhdGVTM0tleVByb3BzIHtcbiAga2V5UHJlZml4Pzogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGJhc2VQYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWF0ZSBTMyBLZXkgZ2l2ZW4gbG9jYWwgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUzNLZXkoeyBrZXlQcmVmaXgsIHBhdGgsIGJhc2VQYXRoIH06IENyZWF0ZVMzS2V5UHJvcHMpIHtcbiAgY29uc3Qgb2JqZWN0S2V5UGFydHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChrZXlQcmVmaXgpIG9iamVjdEtleVBhcnRzLnB1c2goa2V5UHJlZml4KTtcbiAgb2JqZWN0S2V5UGFydHMucHVzaChyZWxhdGl2ZShiYXNlUGF0aCwgcGF0aCkpO1xuICByZXR1cm4gam9pbiguLi5vYmplY3RLZXlQYXJ0cyk7XG59XG4iXX0=
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtdG8tczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9mcy10by1zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLHdCQWtEQztBQVVELGtDQUtDO0FBL0VELHFDQUFxRTtBQUNyRSx5Q0FBMkM7QUFHM0MsNkRBQTZEO0FBQzdELHNEQUE4QztBQUM5Qyw2REFBNkQ7QUFDN0QsbUNBQW1DO0FBQ25DLHFDQUFxRDtBQUNyRCw2QkFBMEI7QUFDMUIsbUNBQWdDO0FBQ2hDLHlDQUEwQztBQUduQyxLQUFLLFVBQVUsTUFBTSxDQUFDLEtBQW1CLEVBQUUsVUFBdUI7SUFDdkUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUMxRSxNQUFNLGVBQWUsR0FBRyxJQUFBLHNCQUFhLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFLLEVBQUUsTUFBTSxhQUFhLElBQUksSUFBQSxtQkFBVSxFQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sZUFBZSxHQUE0QixhQUFhLENBQUMsR0FBRyxDQUNoRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1AsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUM7WUFDbkQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDO2dCQUN0QixTQUFTLEVBQUUsb0JBQW9CO2dCQUMvQixJQUFJO2dCQUNKLFFBQVEsRUFBRSxVQUFVO2FBQ3JCLENBQUMsQ0FBQztZQUNILElBQUksSUFBeUIsQ0FBQztZQUM5QixJQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7Z0JBQzlDLFVBQVUsS0FBSyxtQkFBVSxDQUFDLGdCQUFnQixFQUMxQyxDQUFDO2dCQUNELDBFQUEwRTtnQkFDMUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLHNCQUFZLEVBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLE1BQU0saUJBQWlCLEdBQUcsSUFBQSxzQkFBWSxFQUNwQyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQ2xDO3FCQUNFLFFBQVEsRUFBRTtvQkFDWCxzRkFBc0Y7b0JBQ3RGLHlFQUF5RTtxQkFDeEUsT0FBTyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxHQUFHLGlCQUFpQixHQUFHLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUN2RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxHQUFHO2FBQ1QsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBQSxhQUFLLEVBQ0gsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxQixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHO1NBQ1gsQ0FBQyxDQUFDLENBQ0osQ0FBQztRQUNGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDNUIsSUFBSSxvQkFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDakQsQ0FDRixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFPRDs7R0FFRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFvQjtJQUN6RSxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFDcEMsSUFBSSxTQUFTO1FBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUEsb0JBQVEsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLElBQUEsZ0JBQUksRUFBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtLCByZWFkRmlsZVN5bmMsIFJlYWRTdHJlYW0gfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBQdXRPYmplY3RDb21tYW5kSW5wdXQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBVcGxvYWQgfSBmcm9tIFwiQGF3cy1zZGsvbGliLXN0b3JhZ2VcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCAqIGFzIG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCB7IGNodW5rQXJyYXksIGxpc3RGaWxlUGF0aHMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IHMzIH0gZnJvbSBcIi4vczNcIjtcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZzVG9TM0FjdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtYXNzZXRzLWRlcGxveW1lbnRcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZzVG9TMyhwcm9wczogRnNUb1MzQWN0aW9uLCBuZXh0anNUeXBlPzogTmV4dGpzVHlwZSkge1xuICBjb25zdCB7IGRlc3RpbmF0aW9uQnVja2V0TmFtZSwgZGVzdGluYXRpb25LZXlQcmVmaXgsIHNvdXJjZVBhdGggfSA9IHByb3BzO1xuICBjb25zdCBzb3VyY2VGaWxlUGF0aHMgPSBsaXN0RmlsZVBhdGhzKHNvdXJjZVBhdGgpO1xuICBmb3IgYXdhaXQgKGNvbnN0IGZpbGVQYXRoQ2h1bmsgb2YgY2h1bmtBcnJheShzb3VyY2VGaWxlUGF0aHMsIDEwMCkpIHtcbiAgICBjb25zdCBwdXRPYmplY3RJbnB1dHM6IFB1dE9iamVjdENvbW1hbmRJbnB1dFtdID0gZmlsZVBhdGhDaHVuay5tYXAoXG4gICAgICAocGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IG1pbWUubG9va3VwKHBhdGgpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUzNLZXkoe1xuICAgICAgICAgIGtleVByZWZpeDogZGVzdGluYXRpb25LZXlQcmVmaXgsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBiYXNlUGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBib2R5OiBzdHJpbmcgfCBSZWFkU3RyZWFtO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcGF0aC5pbmNsdWRlcyhcIi5uZXh0L3N0YXRpYy9jaHVua3MvbWFpbi1hcHAtXCIpICYmXG4gICAgICAgICAgbmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHNlZSBzcmMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9wYXRjaC1mZXRjaC5qcyBmb3Igd2h5IHRoaXMgaXMgbmVlZGVkXG4gICAgICAgICAgY29uc3QgbWFpbkFwcEZpbGVDb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuICAgICAgICAgIGNvbnN0IHBhdGNoRmV0Y2hDb250ZW50ID0gcmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgam9pbihfX2Rpcm5hbWUsIFwicGF0Y2gtZmV0Y2guanNcIiksXG4gICAgICAgICAgKVxuICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgIC8vIHJlbW92ZSBcInVzZSBzdHJpY3RcIiBiZWNhdXNlIGl0IGNhdXNlczogVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IF9OX0UgaXMgbm90IGRlZmluZWRcbiAgICAgICAgICAgIC8vIHNpbmNlIHN0cmljdCBtb2RlIGRvZXNuJ3QgYWxsb3cgd2VicGFjayB0byBkZWZpbmUgdW5kZWNsYXJlZCB2YXJpYWJsZXNcbiAgICAgICAgICAgIC5yZXBsYWNlKCdcInVzZSBzdHJpY3RcIjsnLCBcIlwiKTtcbiAgICAgICAgICBib2R5ID0gcGF0Y2hGZXRjaENvbnRlbnQgKyBcIlxcblwiICsgbWFpbkFwcEZpbGVDb250ZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvZHkgPSBjcmVhdGVSZWFkU3RyZWFtKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgQm9keTogYm9keSxcbiAgICAgICAgICBCdWNrZXQ6IGRlc3RpbmF0aW9uQnVja2V0TmFtZSxcbiAgICAgICAgICBDb250ZW50VHlwZTogY29udGVudFR5cGUsXG4gICAgICAgICAgS2V5OiBrZXksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgZGVidWcoXG4gICAgICBwdXRPYmplY3RJbnB1dHMubWFwKChpKSA9PiAoe1xuICAgICAgICBidWNrZXQ6IGkuQnVja2V0LFxuICAgICAgICBrZXk6IGkuS2V5LFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwdXRPYmplY3RJbnB1dHMubWFwKChpbnB1dCkgPT5cbiAgICAgICAgbmV3IFVwbG9hZCh7IGNsaWVudDogczMsIHBhcmFtczogaW5wdXQgfSkuZG9uZSgpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG59XG5cbmludGVyZmFjZSBDcmVhdGVTM0tleVByb3BzIHtcbiAga2V5UHJlZml4Pzogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIGJhc2VQYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWF0ZSBTMyBLZXkgZ2l2ZW4gbG9jYWwgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUzNLZXkoeyBrZXlQcmVmaXgsIHBhdGgsIGJhc2VQYXRoIH06IENyZWF0ZVMzS2V5UHJvcHMpIHtcbiAgY29uc3Qgb2JqZWN0S2V5UGFydHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChrZXlQcmVmaXgpIG9iamVjdEtleVBhcnRzLnB1c2goa2V5UHJlZml4KTtcbiAgb2JqZWN0S2V5UGFydHMucHVzaChyZWxhdGl2ZShiYXNlUGF0aCwgcGF0aCkpO1xuICByZXR1cm4gam9pbiguLi5vYmplY3RLZXlQYXJ0cyk7XG59XG4iXX0=
@@ -12,6 +12,11 @@ export interface NextjsAssetDeploymentOverrides {
12
12
  }
13
13
  export interface NextjsAssetsDeploymentProps {
14
14
  readonly accessPoint: AccessPoint;
15
+ /**
16
+ * Prefix to the URI path the app will be served at.
17
+ * @example "/my-base-path"
18
+ */
19
+ readonly basePath?: string;
15
20
  /**
16
21
  * @see {@link NextjsBuild.buildImageDigest}
17
22
  */
@@ -48,13 +48,17 @@ class NextjsAssetsDeployment extends constructs_1.Construct {
48
48
  const root = "/app";
49
49
  const actions = [];
50
50
  if (this.props.staticAssetsBucket?.bucketName) {
51
+ // Prepare the destination key prefix with basePath when available
52
+ const staticKeyPrefix = this.props.basePath
53
+ ? `${this.props.basePath.replace(/^\//, "")}/_next/static`
54
+ : "_next/static";
51
55
  actions.push(
52
56
  // static files
53
57
  {
54
58
  type: "fs-to-s3",
55
59
  sourcePath: (0, posix_1.join)(root, ".next", "static"),
56
60
  destinationBucketName: this.props.staticAssetsBucket.bucketName,
57
- destinationKeyPrefix: "_next/static",
61
+ destinationKeyPrefix: staticKeyPrefix,
58
62
  },
59
63
  // public directory to s3 for CloudFront -> S3
60
64
  {
@@ -98,5 +102,5 @@ class NextjsAssetsDeployment extends constructs_1.Construct {
98
102
  }
99
103
  exports.NextjsAssetsDeployment = NextjsAssetsDeployment;
100
104
  _a = JSII_RTTI_SYMBOL_1;
101
- NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.3.10" };
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBS2dDO0FBRWhDLDJDQUF1QztBQUN2QyxxQ0FNa0I7QUF3R2xCOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQVVuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksWUFBWSxHQUE2QixTQUFTLENBQUM7UUFDdkQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVk7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2hDLFVBQVUs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Q0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQ25DLHdCQUFlLENBQ2hCO1lBQ0QsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUNqQyxxQkFBcUIsRUFBRSxJQUFBLFlBQUksRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixDQUFDO1NBQ3RFLENBQUM7UUFDRixPQUFPLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDaEQsVUFBVTtZQUNWLFlBQVksRUFBRSxnQ0FBZ0M7WUFDOUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeEhILHdEQXlIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aC9wb3NpeFwiO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IEFjY2Vzc1BvaW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lZnNcIjtcbmltcG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgRG9ja2VySW1hZ2VDb2RlLFxuICBEb2NrZXJJbWFnZUZ1bmN0aW9uLFxuICBGaWxlU3lzdGVtLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIERBVEFfQ0FDSEVfRElSLFxuICBGVUxMX1JPVVRFX0NBQ0hFX0RJUixcbiAgSU1BR0VfQ0FDSEVfRElSLFxuICBOZXh0anNUeXBlLFxuICBQVUJMSUNfRElSLFxufSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLXByb3BzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXREZXBsb3ltZW50T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgZG9ja2VySW1hZ2VGdW5jdGlvblByb3BzPzogT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzIHtcbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ6IEFjY2Vzc1BvaW50O1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQnVpbGQuYnVpbGRJbWFnZURpZ2VzdH1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkSW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0J1aWxkLmNvbnRhaW5lck1vdW50UGF0aEZvckVmc31cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRhaW5lck1vdW50UGF0aEZvckVmczogTmV4dGpzQnVpbGRbXCJjb250YWluZXJNb3VudFBhdGhGb3JFZnNcIl07XG4gIC8qKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRvY2tlckltYWdlQ29kZTogRG9ja2VySW1hZ2VDb2RlOyAvLyBUT0RPOiByZW1vdmUgYW5kIGJ1aWxkIGZyb20gY29tbW9uIGJ1aWxkZXIgYmFzZT9cbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQXNzZXREZXBsb3ltZW50T3ZlcnJpZGVzO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBmb3IgYE5leHRqc1R5cGUuR2xvYmFsRnVuY3Rpb25zYCBhbmQgYE5leHRqc1R5cGUuR2xvYmFsQ29udGFpbmVyc2BcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldD86IEJ1Y2tldDtcbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZzVG9TM0FjdGlvbiB7XG4gIHR5cGU6IFwiZnMtdG8tczNcIjtcbiAgZGVzdGluYXRpb25CdWNrZXROYW1lOiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uS2V5UHJlZml4Pzogc3RyaW5nO1xuICBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZzVG9Gc0FjdGlvbiB7XG4gIHR5cGU6IFwiZnMtdG8tZnNcIjtcbiAgc291cmNlUGF0aDogc3RyaW5nO1xuICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJ1bmVTM0FjdGlvbiB7XG4gIHR5cGU6IFwicHJ1bmUtczNcIjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgY291bnQgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lDb3VudFRvUHJ1bmU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgZGF0ZSB0byBwcnVuZVxuICAgKiBAZGVmYXVsdCBuZXcgRGF0ZShuZXcgRGF0ZSgpLnNldE1vbnRoKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSAtIDEpKVxuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lEYXRlVG9QcnVuZTogc3RyaW5nO1xuICBidWNrZXROYW1lOiBzdHJpbmc7XG4gIGJ1Y2tldFByZWZpeD86IHN0cmluZztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJ1bmVGc0FjdGlvbiB7XG4gIHR5cGU6IFwicHJ1bmUtZnNcIjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgY291bnQgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lDb3VudFRvUHJ1bmU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHByZXZpb3VzIGRlcGxveW1lbnQgZGF0ZSB0byBwcnVuZVxuICAgKiBAZGVmYXVsdCBuZXcgRGF0ZShuZXcgRGF0ZSgpLnNldE1vbnRoKG5ldyBEYXRlKCkuZ2V0TW9udGgoKSAtIDEpKVxuICAgKi9cbiAgbWluUHJldmlvdXNEZXBsb3lEYXRlVG9QcnVuZTogc3RyaW5nO1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMge1xuICBhY3Rpb25zOiAoRnNUb1MzQWN0aW9uIHwgRnNUb0ZzQWN0aW9uIHwgUHJ1bmVTM0FjdGlvbiB8IFBydW5lRnNBY3Rpb24pW107XG4gIC8qKlxuICAgKiB7QGxpbmsgTmV4dGpzQXNzZXREZXBsb3ltZW50UHJvcHMuYnVpbGRlckltYWdlRGlnZXN0fVxuICAgKi9cbiAgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICBpbWFnZUNhY2hlUGF0aDogc3RyaW5nO1xuICBwcmVyZW5kZXJNYW5pZmVzdFBhdGg6IHN0cmluZztcbiAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbn1cblxuLyoqXG4gKiBEZXBsb3lzIHN0YXRpYyBhc3NldHMgdG8gUzMgYW5kIGNhY2hlIGFzc2V0cyB0byBFRlMgaW4gTGFtYmRhIEN1c3RvbSBSZXNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0Fzc2V0c0RlcGxveW1lbnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjdXN0b21SZXNvdXJjZTogQ3VzdG9tUmVzb3VyY2U7XG4gIGRvY2tlckltYWdlRnVuY3Rpb246IERvY2tlckltYWdlRnVuY3Rpb247XG4gIC8qKlxuICAgKiBPbmx5IHVzZWQgZm9yIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgXG4gICAqL1xuICBwcmV2aWV3TW9kZUlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmRvY2tlckltYWdlRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uKCk7XG4gICAgdGhpcy5jdXN0b21SZXNvdXJjZSA9IHRoaXMuY3JlYXRlQ3VzdG9tUmVzb3VyY2UoKTtcbiAgICB0aGlzLnByZXZpZXdNb2RlSWQgPSB0aGlzLmN1c3RvbVJlc291cmNlLmdldEF0dFN0cmluZyhcInByZXZpZXdNb2RlSWRcIik7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uKCkge1xuICAgIGxldCBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSBcIng2NFwiKSB7XG4gICAgICBhcmNoaXRlY3R1cmUgPSBBcmNoaXRlY3R1cmUuWDg2XzY0O1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSBcImFybTY0XCIpIHtcbiAgICAgIGFyY2hpdGVjdHVyZSA9IEFyY2hpdGVjdHVyZS5BUk1fNjQ7XG4gICAgfVxuICAgIGNvbnN0IGZuID0gbmV3IERvY2tlckltYWdlRnVuY3Rpb24odGhpcywgXCJGblwiLCB7XG4gICAgICBhcmNoaXRlY3R1cmUsXG4gICAgICBjb2RlOiB0aGlzLnByb3BzLmRvY2tlckltYWdlQ29kZSxcbiAgICAgIG1lbW9yeVNpemU6IDIwNDgsXG4gICAgICBmaWxlc3lzdGVtOiBGaWxlU3lzdGVtLmZyb21FZnNBY2Nlc3NQb2ludChcbiAgICAgICAgdGhpcy5wcm9wcy5hY2Nlc3NQb2ludCxcbiAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICApLFxuICAgICAgdnBjOiB0aGlzLnByb3BzLnZwYyxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZG9ja2VySW1hZ2VGdW5jdGlvblByb3BzLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnByb3BzLmRlYnVnICE9PSBmYWxzZSkge1xuICAgICAgZm4uYWRkRW52aXJvbm1lbnQoXCJERUJVR1wiLCBcIjFcIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldCkge1xuICAgICAgdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm47XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUN1c3RvbVJlc291cmNlKCkge1xuICAgIGNvbnN0IHJvb3QgPSBcIi9hcHBcIjtcbiAgICBjb25zdCBhY3Rpb25zOiBDdXN0b21SZXNvdXJjZVByb3BlcnRpZXNbXCJhY3Rpb25zXCJdID0gW107XG4gICAgaWYgKHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0Py5idWNrZXROYW1lKSB7XG4gICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgIC8vIHN0YXRpYyBmaWxlc1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IFwiX25leHQvc3RhdGljXCIsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHB1YmxpYyBkaXJlY3RvcnkgdG8gczMgZm9yIENsb3VkRnJvbnQgLT4gUzNcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiZnMtdG8tczNcIixcbiAgICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwicHVibGljXCIpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGlvbnMucHVzaChcbiAgICAgIC8vIGRhdGEgY2FjaGUgLSBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi9jYWNoaW5nI2RhdGEtY2FjaGVcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwiLm5leHRcIiwgXCJjYWNoZVwiLCBcImZldGNoLWNhY2hlXCIpLFxuICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGpvaW4oXG4gICAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgICAgREFUQV9DQUNIRV9ESVIsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgLy8gZnVsbCByb3V0ZSBjYWNoZSAtIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZnVsbC1yb3V0ZS1jYWNoZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4oXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBcIi5uZXh0XCIsXG4gICAgICAgICAgXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgdGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSB8fCBcIlwiLFxuICAgICAgICAgIFwiLm5leHRcIixcbiAgICAgICAgICBcInNlcnZlclwiLFxuICAgICAgICAgIFwiYXBwXCIsXG4gICAgICAgICksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihcbiAgICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgICBGVUxMX1JPVVRFX0NBQ0hFX0RJUixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICAvLyBwdWJsaWMgZGlyZWN0b3J5IHRvIEVGUyBmb3IgbmVlZGVkIG9wdGltaXppbmcgaW1hZ2VzIGluIHB1YmxpYyBkaXJlY3RvcnlcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFwicHVibGljXCIpLFxuICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGpvaW4odGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsIFBVQkxJQ19ESVIpLFxuICAgICAgfSxcbiAgICAgIC8vIGltYWdlcyBhcmUgb3B0aW1pemVkIGF0IHJ1bnRpbWUgc28gbm90aGluZyB0byBkZXBsb3lcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IEN1c3RvbVJlc291cmNlUHJvcGVydGllcyA9IHtcbiAgICAgIGFjdGlvbnMsXG4gICAgICBidWlsZEltYWdlRGlnZXN0OiB0aGlzLnByb3BzLmJ1aWxkSW1hZ2VEaWdlc3QsXG4gICAgICBpbWFnZUNhY2hlUGF0aDogam9pbihcbiAgICAgICAgdGhpcy5wcm9wcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgIElNQUdFX0NBQ0hFX0RJUixcbiAgICAgICksXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLnByb3BzLm5leHRqc1R5cGUsXG4gICAgICBwcmVyZW5kZXJNYW5pZmVzdFBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcInByZXJlbmRlci1tYW5pZmVzdC5qc29uXCIpLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBcIkN1c3RvbVJlc291cmNlXCIsIHtcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpOZXh0anNBc3NldHNEZXBsb3ltZW50XCIsXG4gICAgICBzZXJ2aWNlVG9rZW46IHRoaXMuZG9ja2VySW1hZ2VGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICB9KTtcbiAgfVxufVxuIl19
105
+ NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.3.11" };
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBS2dDO0FBRWhDLDJDQUF1QztBQUN2QyxxQ0FNa0I7QUE2R2xCOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQVVuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksWUFBWSxHQUE2QixTQUFTLENBQUM7UUFDdkQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLFlBQVksR0FBRyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVk7WUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlO1lBQ2hDLFVBQVUs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LElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsbUJBQVUsQ0FBQztTQUN2RSxDQUVGLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBNkI7WUFDM0MsT0FBTztZQUNQLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1lBQzdDLGNBQWMsRUFBRSxJQUFBLFlBQUksRUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFDbkMsd0JBQWUsQ0FDaEI7WUFDRCxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLHFCQUFxQixFQUFFLElBQUEsWUFBSSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUseUJBQXlCLENBQUM7U0FDdEUsQ0FBQztRQUNGLE9BQU8sSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUNoRCxVQUFVO1lBQ1YsWUFBWSxFQUFFLGdDQUFnQztZQUM5QyxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVc7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3SEgsd0RBOEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgQWNjZXNzUG9pbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVmc1wiO1xuaW1wb3J0IHtcbiAgQXJjaGl0ZWN0dXJlLFxuICBEb2NrZXJJbWFnZUNvZGUsXG4gIERvY2tlckltYWdlRnVuY3Rpb24sXG4gIEZpbGVTeXN0ZW0sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgREFUQV9DQUNIRV9ESVIsXG4gIEZVTExfUk9VVEVfQ0FDSEVfRElSLFxuICBJTUFHRV9DQUNIRV9ESVIsXG4gIE5leHRqc1R5cGUsXG4gIFBVQkxJQ19ESVIsXG59IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wc1wiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWJhc2UtcHJvcHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldERlcGxveW1lbnRPdmVycmlkZXMge1xuICByZWFkb25seSBkb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlRnVuY3Rpb25Qcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMge1xuICByZWFkb25seSBhY2Nlc3NQb2ludDogQWNjZXNzUG9pbnQ7XG4gIC8qKlxuICAgKiBQcmVmaXggdG8gdGhlIFVSSSBwYXRoIHRoZSBhcHAgd2lsbCBiZSBzZXJ2ZWQgYXQuXG4gICAqIEBleGFtcGxlIFwiL215LWJhc2UtcGF0aFwiXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0J1aWxkLmJ1aWxkSW1hZ2VEaWdlc3R9XG4gICAqL1xuICByZWFkb25seSBidWlsZEltYWdlRGlnZXN0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCdWlsZC5jb250YWluZXJNb3VudFBhdGhGb3JFZnN9XG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IE5leHRqc0J1aWxkW1wiY29udGFpbmVyTW91bnRQYXRoRm9yRWZzXCJdO1xuICAvKipcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBkb2NrZXJJbWFnZUNvZGU6IERvY2tlckltYWdlQ29kZTsgLy8gVE9ETzogcmVtb3ZlIGFuZCBidWlsZCBmcm9tIGNvbW1vbiBidWlsZGVyIGJhc2U/XG4gIHJlYWRvbmx5IG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Fzc2V0RGVwbG95bWVudE92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aFRvV29ya3NwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogUmVxdWlyZWQgZm9yIGBOZXh0anNUeXBlLkdsb2JhbEZ1bmN0aW9uc2AgYW5kIGBOZXh0anNUeXBlLkdsb2JhbENvbnRhaW5lcnNgXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ/OiBCdWNrZXQ7XG4gIHJlYWRvbmx5IHZwYzogSVZwYztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGc1RvUzNBY3Rpb24ge1xuICB0eXBlOiBcImZzLXRvLXMzXCI7XG4gIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogc3RyaW5nO1xuICBkZXN0aW5hdGlvbktleVByZWZpeD86IHN0cmluZztcbiAgc291cmNlUGF0aDogc3RyaW5nO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGc1RvRnNBY3Rpb24ge1xuICB0eXBlOiBcImZzLXRvLWZzXCI7XG4gIHNvdXJjZVBhdGg6IHN0cmluZztcbiAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBydW5lUzNBY3Rpb24ge1xuICB0eXBlOiBcInBydW5lLXMzXCI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGNvdW50IHRvIHBydW5lXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95Q291bnRUb1BydW5lOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGRhdGUgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgbmV3IERhdGUobmV3IERhdGUoKS5zZXRNb250aChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgLSAxKSlcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95RGF0ZVRvUHJ1bmU6IHN0cmluZztcbiAgYnVja2V0TmFtZTogc3RyaW5nO1xuICBidWNrZXRQcmVmaXg/OiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBydW5lRnNBY3Rpb24ge1xuICB0eXBlOiBcInBydW5lLWZzXCI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGNvdW50IHRvIHBydW5lXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95Q291bnRUb1BydW5lOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBwcmV2aW91cyBkZXBsb3ltZW50IGRhdGUgdG8gcHJ1bmVcbiAgICogQGRlZmF1bHQgbmV3IERhdGUobmV3IERhdGUoKS5zZXRNb250aChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgLSAxKSlcbiAgICovXG4gIG1pblByZXZpb3VzRGVwbG95RGF0ZVRvUHJ1bmU6IHN0cmluZztcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzIHtcbiAgYWN0aW9uczogKEZzVG9TM0FjdGlvbiB8IEZzVG9Gc0FjdGlvbiB8IFBydW5lUzNBY3Rpb24gfCBQcnVuZUZzQWN0aW9uKVtdO1xuICAvKipcbiAgICoge0BsaW5rIE5leHRqc0Fzc2V0RGVwbG95bWVudFByb3BzLmJ1aWxkZXJJbWFnZURpZ2VzdH1cbiAgICovXG4gIGJ1aWxkSW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgaW1hZ2VDYWNoZVBhdGg6IHN0cmluZztcbiAgcHJlcmVuZGVyTWFuaWZlc3RQYXRoOiBzdHJpbmc7XG4gIG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG59XG5cbi8qKlxuICogRGVwbG95cyBzdGF0aWMgYXNzZXRzIHRvIFMzIGFuZCBjYWNoZSBhc3NldHMgdG8gRUZTIGluIExhbWJkYSBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNBc3NldHNEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY3VzdG9tUmVzb3VyY2U6IEN1c3RvbVJlc291cmNlO1xuICBkb2NrZXJJbWFnZUZ1bmN0aW9uOiBEb2NrZXJJbWFnZUZ1bmN0aW9uO1xuICAvKipcbiAgICogT25seSB1c2VkIGZvciBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYFxuICAgKi9cbiAgcHJldmlld01vZGVJZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5kb2NrZXJJbWFnZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVGdW5jdGlvbigpO1xuICAgIHRoaXMuY3VzdG9tUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUN1c3RvbVJlc291cmNlKCk7XG4gICAgdGhpcy5wcmV2aWV3TW9kZUlkID0gdGhpcy5jdXN0b21SZXNvdXJjZS5nZXRBdHRTdHJpbmcoXCJwcmV2aWV3TW9kZUlkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbigpIHtcbiAgICBsZXQgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gXCJ4NjRcIikge1xuICAgICAgYXJjaGl0ZWN0dXJlID0gQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gXCJhcm02NFwiKSB7XG4gICAgICBhcmNoaXRlY3R1cmUgPSBBcmNoaXRlY3R1cmUuQVJNXzY0O1xuICAgIH1cbiAgICBjb25zdCBmbiA9IG5ldyBEb2NrZXJJbWFnZUZ1bmN0aW9uKHRoaXMsIFwiRm5cIiwge1xuICAgICAgYXJjaGl0ZWN0dXJlLFxuICAgICAgY29kZTogdGhpcy5wcm9wcy5kb2NrZXJJbWFnZUNvZGUsXG4gICAgICBtZW1vcnlTaXplOiAyMDQ4LFxuICAgICAgZmlsZXN5c3RlbTogRmlsZVN5c3RlbS5mcm9tRWZzQWNjZXNzUG9pbnQoXG4gICAgICAgIHRoaXMucHJvcHMuYWNjZXNzUG9pbnQsXG4gICAgICAgIHRoaXMucHJvcHMuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgKSxcbiAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRvY2tlckltYWdlRnVuY3Rpb25Qcm9wcyxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5wcm9wcy5kZWJ1ZyAhPT0gZmFsc2UpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KFwiREVCVUdcIiwgXCIxXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQpIHtcbiAgICAgIHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZFdyaXRlKGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDdXN0b21SZXNvdXJjZSgpIHtcbiAgICBjb25zdCByb290ID0gXCIvYXBwXCI7XG4gICAgY29uc3QgYWN0aW9uczogQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1wiYWN0aW9uc1wiXSA9IFtdO1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldD8uYnVja2V0TmFtZSkge1xuICAgICAgLy8gUHJlcGFyZSB0aGUgZGVzdGluYXRpb24ga2V5IHByZWZpeCB3aXRoIGJhc2VQYXRoIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjb25zdCBzdGF0aWNLZXlQcmVmaXggPSB0aGlzLnByb3BzLmJhc2VQYXRoXG4gICAgICAgID8gYCR7dGhpcy5wcm9wcy5iYXNlUGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIil9L19uZXh0L3N0YXRpY2BcbiAgICAgICAgOiBcIl9uZXh0L3N0YXRpY1wiO1xuXG4gICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgIC8vIHN0YXRpYyBmaWxlc1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSxcbiAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IHN0YXRpY0tleVByZWZpeCxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gcHVibGljIGRpcmVjdG9yeSB0byBzMyBmb3IgQ2xvdWRGcm9udCAtPiBTM1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCJwdWJsaWNcIiksXG4gICAgICAgICAgZGVzdGluYXRpb25CdWNrZXROYW1lOiB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKFxuICAgICAgLy8gZGF0YSBjYWNoZSAtIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZGF0YS1jYWNoZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCIubmV4dFwiLCBcImNhY2hlXCIsIFwiZmV0Y2gtY2FjaGVcIiksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihcbiAgICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgICBEQVRBX0NBQ0hFX0RJUixcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICAvLyBmdWxsIHJvdXRlIGNhY2hlIC0gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vY2FjaGluZyNmdWxsLXJvdXRlLWNhY2hlXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFwiZnMtdG8tZnNcIixcbiAgICAgICAgc291cmNlUGF0aDogam9pbihcbiAgICAgICAgICByb290LFxuICAgICAgICAgIFwiLm5leHRcIixcbiAgICAgICAgICBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgICB0aGlzLnByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlIHx8IFwiXCIsXG4gICAgICAgICAgXCIubmV4dFwiLFxuICAgICAgICAgIFwic2VydmVyXCIsXG4gICAgICAgICAgXCJhcHBcIixcbiAgICAgICAgKSxcbiAgICAgICAgZGVzdGluYXRpb25QYXRoOiBqb2luKFxuICAgICAgICAgIHRoaXMucHJvcHMuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgICAgIEZVTExfUk9VVEVfQ0FDSEVfRElSLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIC8vIHB1YmxpYyBkaXJlY3RvcnkgdG8gRUZTIGZvciBuZWVkZWQgb3B0aW1pemluZyBpbWFnZXMgaW4gcHVibGljIGRpcmVjdG9yeVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgXCJwdWJsaWNcIiksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbih0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcywgUFVCTElDX0RJUiksXG4gICAgICB9LFxuICAgICAgLy8gaW1hZ2VzIGFyZSBvcHRpbWl6ZWQgYXQgcnVudGltZSBzbyBub3RoaW5nIHRvIGRlcGxveVxuICAgICk7XG4gICAgY29uc3QgcHJvcGVydGllczogQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzID0ge1xuICAgICAgYWN0aW9ucyxcbiAgICAgIGJ1aWxkSW1hZ2VEaWdlc3Q6IHRoaXMucHJvcHMuYnVpbGRJbWFnZURpZ2VzdCxcbiAgICAgIGltYWdlQ2FjaGVQYXRoOiBqb2luKFxuICAgICAgICB0aGlzLnByb3BzLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgICAgSU1BR0VfQ0FDSEVfRElSLFxuICAgICAgKSxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMucHJvcHMubmV4dGpzVHlwZSxcbiAgICAgIHByZXJlbmRlck1hbmlmZXN0UGF0aDogam9pbihyb290LCBcIi5uZXh0XCIsIFwicHJlcmVuZGVyLW1hbmlmZXN0Lmpzb25cIiksXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgcHJvcGVydGllcyxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok5leHRqc0Fzc2V0c0RlcGxveW1lbnRcIixcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5kb2NrZXJJbWFnZUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgIH0pO1xuICB9XG59XG4iXX0=