diff --git a/packages/@aws-cdk/aws-lambda-nodejs/README.md b/packages/@aws-cdk/aws-lambda-nodejs/README.md index 42257f7df5225..57da4b190cca6 100644 --- a/packages/@aws-cdk/aws-lambda-nodejs/README.md +++ b/packages/@aws-cdk/aws-lambda-nodejs/README.md @@ -139,6 +139,8 @@ new lambda.NodejsFunction(this, 'my-handler', { }, define: { // Replace strings during build time 'process.env.API_KEY': JSON.stringify('xxx-xxxx-xxx'), + 'process.env.PRODUCTION': JSON.stringify(true), + 'process.env.NUMBER': JSON.stringify(123), }, logLevel: LogLevel.SILENT, // defaults to LogLevel.WARNING keepNames: true, // defaults to false diff --git a/packages/@aws-cdk/aws-lambda-nodejs/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-nodejs/lib/bundling.ts index 8d4ce3e7261d6..8624dce8c1359 100644 --- a/packages/@aws-cdk/aws-lambda-nodejs/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-nodejs/lib/bundling.ts @@ -148,7 +148,7 @@ export class Bundling implements cdk.BundlingOptions { ...this.props.sourceMap ? ['--sourcemap'] : [], ...this.externals.map(external => `--external:${external}`), ...loaders.map(([ext, name]) => `--loader:${ext}=${name}`), - ...defines.map(([key, value]) => `--define:${key}=${value}`), + ...defines.map(([key, value]) => `--define:${key}=${JSON.stringify(value)}`), ...this.props.logLevel ? [`--log-level=${this.props.logLevel}`] : [], ...this.props.keepNames ? ['--keep-names'] : [], ...this.relativeTsconfigPath ? [`--tsconfig=${pathJoin(inputDir, this.relativeTsconfigPath)}`] : [], diff --git a/packages/@aws-cdk/aws-lambda-nodejs/test/__snapshots__/bundling.test.js.snap b/packages/@aws-cdk/aws-lambda-nodejs/test/__snapshots__/bundling.test.js.snap new file mode 100644 index 0000000000000..13ae6a72da036 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-nodejs/test/__snapshots__/bundling.test.js.snap @@ -0,0 +1,16 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`esbuild bundling with esbuild options 1`] = ` +"(() => { + // test/integ-handlers/define.ts + function handler() { + return [ + \\"VALUE\\", + true, + 7777, + 'this is a \\"test\\"' + ]; + } +})(); +" +`; diff --git a/packages/@aws-cdk/aws-lambda-nodejs/test/bundling.test.ts b/packages/@aws-cdk/aws-lambda-nodejs/test/bundling.test.ts index f6c373831526c..064c8458dbf97 100644 --- a/packages/@aws-cdk/aws-lambda-nodejs/test/bundling.test.ts +++ b/packages/@aws-cdk/aws-lambda-nodejs/test/bundling.test.ts @@ -169,12 +169,15 @@ test('esbuild bundling with esbuild options', () => { footer: '/* comments */', forceDockerBundling: true, define: { - 'DEBUG': 'true', 'process.env.KEY': JSON.stringify('VALUE'), + 'process.env.BOOL': 'true', + 'process.env.NUMBER': '7777', + 'process.env.STRING': JSON.stringify('this is a "test"'), }, }); // Correctly bundles with esbuild + const defineInstructions = '--define:process.env.KEY="\\"VALUE\\"" --define:process.env.BOOL="true" --define:process.env.NUMBER="7777" --define:process.env.STRING="\\"this is a \\\\\\"test\\\\\\"\\""'; expect(Code.fromAsset).toHaveBeenCalledWith(path.dirname(depsLockFilePath), { assetHashType: AssetHashType.OUTPUT, bundling: expect.objectContaining({ @@ -184,13 +187,17 @@ test('esbuild bundling with esbuild options', () => { 'npx esbuild --bundle "/asset-input/lib/handler.ts"', '--target=es2020 --platform=node --outfile="/asset-output/index.js"', '--minify --sourcemap --external:aws-sdk --loader:.png=dataurl', - '--define:DEBUG=true --define:process.env.KEY="VALUE"', + defineInstructions, '--log-level=silent --keep-names --tsconfig=/asset-input/lib/custom-tsconfig.ts', '--metafile=/asset-output/index.meta.json --banner=\'/* comments */\' --footer=\'/* comments */\'', ].join(' '), ], }), }); + + // Make sure that the define instructions are working as expected with the esbuild CLI + const bundleProcess = util.exec('bash', ['-c', `npx esbuild --bundle ${`${__dirname}/integ-handlers/define.ts`} ${defineInstructions}`]); + expect(bundleProcess.stdout.toString()).toMatchSnapshot(); }); test('Detects yarn.lock', () => { diff --git a/packages/@aws-cdk/aws-lambda-nodejs/test/integ-handlers/define.ts b/packages/@aws-cdk/aws-lambda-nodejs/test/integ-handlers/define.ts new file mode 100644 index 0000000000000..bd66dd3920bab --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-nodejs/test/integ-handlers/define.ts @@ -0,0 +1,8 @@ +export function handler() { + return [ + process.env.KEY, + process.env.BOOL, + process.env.NUMBER, + process.env.STRING, + ]; +}