diff --git a/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py b/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py index 345580fe0..209727720 100644 --- a/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py +++ b/aws_lambda_builders/workflows/nodejs_npm_esbuild/esbuild.py @@ -102,6 +102,7 @@ def run(self, args, cwd=None): # The esbuild API flags are broken up into three forms (https://esbuild.github.io/api/): +# Multi-word arguments are expected to be passed down using snake case e.g. entry_points # Boolean types (--minify) SUPPORTED_ESBUILD_APIS_BOOLEAN = [ "minify", @@ -112,7 +113,7 @@ def run(self, args, cwd=None): SUPPORTED_ESBUILD_APIS_SINGLE_VALUE = [ "target", "format", - "main-fields", + "main_fields", ] # Multi-value types (--external:axios --external:aws-sdk) @@ -236,7 +237,7 @@ def _get_boolean_args(self) -> List[str]: args = [] for param in SUPPORTED_ESBUILD_APIS_BOOLEAN: if param in self._bundler_config and self._bundler_config[param] is True: - args.append(f"--{param}") + args.append(f"--{self._convert_snake_to_kebab_case(param)}") return args def _get_single_value_args(self) -> List[str]: @@ -250,7 +251,7 @@ def _get_single_value_args(self) -> List[str]: for param in SUPPORTED_ESBUILD_APIS_SINGLE_VALUE: if param in self._bundler_config: value = self._bundler_config.get(param) - args.append(f"--{param}={value}") + args.append(f"--{self._convert_snake_to_kebab_case(param)}={value}") return args def _get_multi_value_args(self) -> List[str]: @@ -267,7 +268,7 @@ def _get_multi_value_args(self) -> List[str]: if not isinstance(values, list): raise EsbuildCommandError(f"Invalid type for property {param}, must be a dict.") for param_item in values: - args.append(f"--{param}:{param_item}") + args.append(f"--{self._convert_snake_to_kebab_case(param)}:{param_item}") return args def _get_explicit_file_type(self, entry_point, entry_path): @@ -296,3 +297,14 @@ def _get_explicit_file_type(self, entry_point, entry_path): return entry_point + ext raise ActionFailedError("entry point {} does not exist".format(entry_path)) + + @staticmethod + def _convert_snake_to_kebab_case(arg: str) -> str: + """ + The configuration properties passed down to Lambda Builders are done so using snake case + e.g. "main_fields" but esbuild expects them using kebab-case "main-fields" + + :rtype: str + :return: mutated string to match the esbuild argument format + """ + return arg.replace("_", "-") diff --git a/tests/unit/workflows/nodejs_npm_esbuild/test_esbuild.py b/tests/unit/workflows/nodejs_npm_esbuild/test_esbuild.py index 22b2ef43d..f38b81b8f 100644 --- a/tests/unit/workflows/nodejs_npm_esbuild/test_esbuild.py +++ b/tests/unit/workflows/nodejs_npm_esbuild/test_esbuild.py @@ -200,7 +200,7 @@ def test_builds_args_from_config(self, osutils_mock): "target": "node14", "loader": [".proto=text", ".json=js"], "external": ["aws-sdk", "axios"], - "main-fields": "module,main", + "main_fields": "module,main", } args = ( @@ -246,3 +246,14 @@ def test_combined_builder_with_dependencies(self, osutils_mock): "--loader:.json=js", ], ) + + @parameterized.expand( + [ + ("main_fields", "main-fields"), + ("entry_points", "entry-points"), + ("main-fields", "main-fields"), + ("bundle", "bundle"), + ] + ) + def test_convert_snake_case_to_kebab_case(self, field, expected): + self.assertEqual(EsbuildCommandBuilder._convert_snake_to_kebab_case(field), expected)