From a965a811b8672ed6a139d7833d98f83de728b214 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Fri, 15 Sep 2023 10:07:10 -0700 Subject: [PATCH 01/10] Add npm version check for --install-links usage --- .../workflows/nodejs_npm/exceptions.py | 30 +++++++++ .../workflows/nodejs_npm/npm.py | 17 +---- .../workflows/nodejs_npm/workflow.py | 44 ++++++++++++- .../workflows/nodejs_npm/test_workflow.py | 62 +++++++++++++++++-- 4 files changed, 132 insertions(+), 21 deletions(-) create mode 100644 aws_lambda_builders/workflows/nodejs_npm/exceptions.py diff --git a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py new file mode 100644 index 000000000..6399de99d --- /dev/null +++ b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py @@ -0,0 +1,30 @@ +""" +Description +""" + + +from aws_lambda_builders.exceptions import LambdaBuilderError + + +class NpmExecutionError(Exception): + """ + Exception raised in case NPM execution fails. + It will pass on the standard error output from the NPM console. + """ + + MESSAGE = "NPM Failed: {message}" + + def __init__(self, **kwargs): + Exception.__init__(self, self.MESSAGE.format(**kwargs)) + + +class OldNpmVersionError(LambdaBuilderError): + """ + Exception raised when trying to build in source using --install-links + with an older version of npm that does not support the option. + """ + + MESSAGE = "NPM Failed: {message}" + + def __init__(self, **kwargs): + Exception.__init__(self, self.MESSAGE.format(**kwargs)) diff --git a/aws_lambda_builders/workflows/nodejs_npm/npm.py b/aws_lambda_builders/workflows/nodejs_npm/npm.py index 674b6bd9c..950ae5324 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/npm.py +++ b/aws_lambda_builders/workflows/nodejs_npm/npm.py @@ -4,20 +4,9 @@ import logging -LOG = logging.getLogger(__name__) - - -class NpmExecutionError(Exception): - - """ - Exception raised in case NPM execution fails. - It will pass on the standard error output from the NPM console. - """ +from .exceptions import NpmExecutionError - MESSAGE = "NPM Failed: {message}" - - def __init__(self, **kwargs): - Exception.__init__(self, self.MESSAGE.format(**kwargs)) +LOG = logging.getLogger(__name__) class SubprocessNpm(object): @@ -59,7 +48,7 @@ def run(self, args, cwd=None): :rtype: str :return: text of the standard output from the command - :raises aws_lambda_builders.workflows.nodejs_npm.npm.NpmExecutionError: + :raises aws_lambda_builders.workflows.nodejs_npm.exceptions.NpmExecutionError: when the command executes with a non-zero return code. The exception will contain the text of the standard error output from the command. diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index 2a2edebed..d7f4edf6e 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -24,11 +24,15 @@ NodejsNpmrcAndLockfileCopyAction, NodejsNpmrcCleanUpAction, ) +from .exceptions import OldNpmVersionError from .npm import SubprocessNpm from .utils import OSUtils LOG = logging.getLogger(__name__) +# npm>=8.8.0 supports --install-links +MINIMUM_NPM_VERSION_INSTALL_LINKS = (8, 8) + class NodejsNpmWorkflow(BaseWorkflow): @@ -64,6 +68,13 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim subprocess_npm = SubprocessNpm(osutils) + is_building_in_source = self.build_dir == self.source_dir + + if is_building_in_source and not self._can_use_install_links(subprocess_npm): + raise OldNpmVersionError( + message="Building in source uses npm --install-links, which requires npm version of at least 8.8.0." + ) + tar_dest_dir = osutils.joinpath(scratch_dir, "unpacked") tar_package_dir = osutils.joinpath(tar_dest_dir, "package") # TODO: we should probably unpack straight into artifacts dir, rather than unpacking into tar_dest_dir and @@ -75,7 +86,6 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim npm_copy_npmrc_and_lockfile = NodejsNpmrcAndLockfileCopyAction(tar_package_dir, source_dir, osutils=osutils) self.manifest_dir = self.osutils.dirname(self.manifest_path) - is_building_in_source = self.build_dir == self.source_dir is_external_manifest = self.manifest_dir != self.source_dir self.actions = [ npm_pack, @@ -235,3 +245,35 @@ def get_install_action( return NodejsNpmInstallAction( install_dir=install_dir, subprocess_npm=subprocess_npm, install_links=install_links ) + + def _can_use_install_links(self, npm_process: SubprocessNpm) -> bool: + """ + Checks the version of npm that is currently installed to determine + whether or not --install-links can be used + + Parameters + ---------- + npm_process: SubprocessNpm + Object containing helper methods to call the npm process + + Returns + ------- + bool + True if the current npm version meets the minimum for --install-links + """ + try: + current_version = npm_process.run(["--version"]).split(".", 2) + + major_version = int(current_version[0]) + minor_version = int(current_version[1]) + except (ValueError, IndexError): + LOG.debug(f"Failed to parse {current_version} output from npm for --install-links validation") + return False + + is_older_major_version = major_version < MINIMUM_NPM_VERSION_INSTALL_LINKS[0] + is_older_patch_version = ( + major_version == MINIMUM_NPM_VERSION_INSTALL_LINKS[0] + and minor_version < MINIMUM_NPM_VERSION_INSTALL_LINKS[1] + ) + + return not (is_older_major_version or is_older_patch_version) diff --git a/tests/unit/workflows/nodejs_npm/test_workflow.py b/tests/unit/workflows/nodejs_npm/test_workflow.py index 222cd7876..617151290 100644 --- a/tests/unit/workflows/nodejs_npm/test_workflow.py +++ b/tests/unit/workflows/nodejs_npm/test_workflow.py @@ -1,6 +1,8 @@ import os from unittest import TestCase -from unittest.mock import patch, call +from unittest.mock import patch, call, Mock + +from parameterized import parameterized from aws_lambda_builders.actions import ( CopySourceAction, @@ -10,6 +12,7 @@ MoveDependenciesAction, ) from aws_lambda_builders.architecture import ARM64 +from aws_lambda_builders.workflows.nodejs_npm.exceptions import OldNpmVersionError from aws_lambda_builders.workflows.nodejs_npm.workflow import NodejsNpmWorkflow from aws_lambda_builders.workflows.nodejs_npm.actions import ( NodejsNpmPackAction, @@ -83,9 +86,12 @@ def test_workflow_sets_up_npm_actions_with_download_dependencies_without_depende self.assertIsInstance(workflow.actions[5], NodejsNpmrcCleanUpAction) self.assertIsInstance(workflow.actions[6], NodejsNpmLockFileCleanUpAction) + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") def test_workflow_sets_up_npm_actions_with_download_dependencies_without_dependencies_dir_external_manifest_and_build_in_source( - self, + self, can_use_links_mock ): + can_use_links_mock.return_value = True + self.osutils.dirname.return_value = "not_source" self.osutils.file_exists.return_value = True @@ -285,7 +291,10 @@ def test_workflow_uses_npm_ci_if_lockfile_exists_and_npm_ci_enabled(self): self.assertIsInstance(workflow.actions[5], NodejsNpmLockFileCleanUpAction) self.osutils.file_exists.assert_has_calls([call("source/package-lock.json")]) - def test_build_in_source_without_download_dependencies_and_without_dependencies_dir(self): + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + def test_build_in_source_without_download_dependencies_and_without_dependencies_dir(self, can_use_links_mock): + can_use_links_mock.return_value = True + source_dir = "source" artifacts_dir = "artifacts" workflow = NodejsNpmWorkflow( @@ -304,7 +313,10 @@ def test_build_in_source_without_download_dependencies_and_without_dependencies_ self.assertIsInstance(workflow.actions[2], CopySourceAction) self.assertIsInstance(workflow.actions[3], NodejsNpmrcCleanUpAction) - def test_build_in_source_with_download_dependencies(self): + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + def test_build_in_source_with_download_dependencies(self, can_use_links_mock): + can_use_links_mock.return_value = True + source_dir = "source" artifacts_dir = "artifacts" workflow = NodejsNpmWorkflow( @@ -327,7 +339,10 @@ def test_build_in_source_with_download_dependencies(self): self.assertEqual(workflow.actions[4]._dest, os.path.join(artifacts_dir, "node_modules")) self.assertIsInstance(workflow.actions[5], NodejsNpmrcCleanUpAction) - def test_build_in_source_with_download_dependencies_and_dependencies_dir(self): + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + def test_build_in_source_with_download_dependencies_and_dependencies_dir(self, can_use_links_mock): + can_use_links_mock.return_value = True + source_dir = "source" artifacts_dir = "artifacts" workflow = NodejsNpmWorkflow( @@ -353,7 +368,10 @@ def test_build_in_source_with_download_dependencies_and_dependencies_dir(self): self.assertIsInstance(workflow.actions[6], CopyDependenciesAction) self.assertIsInstance(workflow.actions[7], NodejsNpmrcCleanUpAction) - def test_build_in_source_with_dependencies_dir(self): + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + def test_build_in_source_with_dependencies_dir(self, can_use_links_mock): + can_use_links_mock.return_value = True + source_dir = "source" artifacts_dir = "artifacts" workflow = NodejsNpmWorkflow( @@ -373,3 +391,35 @@ def test_build_in_source_with_dependencies_dir(self): self.assertIsInstance(workflow.actions[2], CopySourceAction) self.assertIsInstance(workflow.actions[3], CopySourceAction) self.assertIsInstance(workflow.actions[4], NodejsNpmrcCleanUpAction) + + @parameterized.expand( + [ + ("8.8.0", True), + ("8.9.0", True), + ("8.7.0", False), + ("7.9.0", False), + ("9.9.0", True), + ("1.2", False), + ("8.8", False), + ("foo", False), + ("", False), + ] + ) + def test_npm_version_validation(self, returned_npm_version, expected_result): + workflow = NodejsNpmWorkflow("source", "artifacts", "scratch_dir", "source/manifest") + + npm_subprocess = Mock() + npm_subprocess.run = Mock(return_value=returned_npm_version) + + result = workflow._can_use_install_links(npm_subprocess) + + self.assertEqual(result, expected_result) + + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + def test_build_in_source_old_npm_raises_exception(self, install_links_mock): + install_links_mock.return_value = False + + with self.assertRaises(OldNpmVersionError): + NodejsNpmWorkflow( + "source", "artifacts", "scratch_dir", "source/manifest", osutils=self.osutils, build_in_source=True + ) From b317870fd3db0b91032a7d4c86d92dd9872af428 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Mon, 18 Sep 2023 15:05:00 -0700 Subject: [PATCH 02/10] Update string splitting and added another test case --- aws_lambda_builders/workflows/nodejs_npm/workflow.py | 2 +- tests/unit/workflows/nodejs_npm/test_workflow.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index d7f4edf6e..f8de9ae7e 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -262,7 +262,7 @@ def _can_use_install_links(self, npm_process: SubprocessNpm) -> bool: True if the current npm version meets the minimum for --install-links """ try: - current_version = npm_process.run(["--version"]).split(".", 2) + current_version = npm_process.run(["--version"]).split(".") major_version = int(current_version[0]) minor_version = int(current_version[1]) diff --git a/tests/unit/workflows/nodejs_npm/test_workflow.py b/tests/unit/workflows/nodejs_npm/test_workflow.py index 617151290..85c609387 100644 --- a/tests/unit/workflows/nodejs_npm/test_workflow.py +++ b/tests/unit/workflows/nodejs_npm/test_workflow.py @@ -400,8 +400,9 @@ def test_build_in_source_with_dependencies_dir(self, can_use_links_mock): ("7.9.0", False), ("9.9.0", True), ("1.2", False), - ("8.8", False), + ("8.8", True), ("foo", False), + ("foo.bar", False), ("", False), ] ) From cc123fd25950a7042a2a44ca865b7afae4336ecd Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Mon, 18 Sep 2023 15:06:22 -0700 Subject: [PATCH 03/10] Added module description for nodejs exceptions --- aws_lambda_builders/workflows/nodejs_npm/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py index 6399de99d..85da76b79 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py +++ b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py @@ -1,5 +1,5 @@ """ -Description +Exceptions for the Node.js workflow """ From bf28e138b7f1de03d71257b890bcdbe7ae1276a0 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Tue, 19 Sep 2023 15:35:56 -0700 Subject: [PATCH 04/10] Move validation to install action getter to support esbuild --- .../workflows/nodejs_npm/workflow.py | 16 +- .../testdata/esbuild-binary/package-lock.json | 362 +----------------- .../workflows/nodejs_npm/test_workflow.py | 14 +- .../nodejs_npm_esbuild/test_workflow.py | 10 +- 4 files changed, 24 insertions(+), 378 deletions(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index f8de9ae7e..ed548cccd 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -68,13 +68,6 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim subprocess_npm = SubprocessNpm(osutils) - is_building_in_source = self.build_dir == self.source_dir - - if is_building_in_source and not self._can_use_install_links(subprocess_npm): - raise OldNpmVersionError( - message="Building in source uses npm --install-links, which requires npm version of at least 8.8.0." - ) - tar_dest_dir = osutils.joinpath(scratch_dir, "unpacked") tar_package_dir = osutils.joinpath(tar_dest_dir, "package") # TODO: we should probably unpack straight into artifacts dir, rather than unpacking into tar_dest_dir and @@ -86,6 +79,7 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim npm_copy_npmrc_and_lockfile = NodejsNpmrcAndLockfileCopyAction(tar_package_dir, source_dir, osutils=osutils) self.manifest_dir = self.osutils.dirname(self.manifest_path) + is_building_in_source = self.build_dir == self.source_dir is_external_manifest = self.manifest_dir != self.source_dir self.actions = [ npm_pack, @@ -230,6 +224,11 @@ def get_install_action( BaseAction Install action to use """ + if install_links and not NodejsNpmWorkflow.can_use_install_links(subprocess_npm): + raise OldNpmVersionError( + message="Building in source uses npm --install-links, which requires npm version of at least 8.8.0." + ) + lockfile_path = osutils.joinpath(source_dir, "package-lock.json") shrinkwrap_path = osutils.joinpath(source_dir, "npm-shrinkwrap.json") @@ -246,7 +245,8 @@ def get_install_action( install_dir=install_dir, subprocess_npm=subprocess_npm, install_links=install_links ) - def _can_use_install_links(self, npm_process: SubprocessNpm) -> bool: + @staticmethod + def can_use_install_links(npm_process: SubprocessNpm) -> bool: """ Checks the version of npm that is currently installed to determine whether or not --install-links can be used diff --git a/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json b/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json index 9a03e1592..2daa78632 100644 --- a/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json +++ b/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json @@ -1,368 +1,8 @@ { "name": "esbuild-binary", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "esbuild-binary", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "esbuild": "^0.14.13" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - } - }, "dependencies": { "@esbuild/linux-loong64": { "version": "0.14.54", diff --git a/tests/unit/workflows/nodejs_npm/test_workflow.py b/tests/unit/workflows/nodejs_npm/test_workflow.py index 85c609387..94ef66ed7 100644 --- a/tests/unit/workflows/nodejs_npm/test_workflow.py +++ b/tests/unit/workflows/nodejs_npm/test_workflow.py @@ -86,7 +86,7 @@ def test_workflow_sets_up_npm_actions_with_download_dependencies_without_depende self.assertIsInstance(workflow.actions[5], NodejsNpmrcCleanUpAction) self.assertIsInstance(workflow.actions[6], NodejsNpmLockFileCleanUpAction) - @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_workflow_sets_up_npm_actions_with_download_dependencies_without_dependencies_dir_external_manifest_and_build_in_source( self, can_use_links_mock ): @@ -291,7 +291,7 @@ def test_workflow_uses_npm_ci_if_lockfile_exists_and_npm_ci_enabled(self): self.assertIsInstance(workflow.actions[5], NodejsNpmLockFileCleanUpAction) self.osutils.file_exists.assert_has_calls([call("source/package-lock.json")]) - @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_build_in_source_without_download_dependencies_and_without_dependencies_dir(self, can_use_links_mock): can_use_links_mock.return_value = True @@ -313,7 +313,7 @@ def test_build_in_source_without_download_dependencies_and_without_dependencies_ self.assertIsInstance(workflow.actions[2], CopySourceAction) self.assertIsInstance(workflow.actions[3], NodejsNpmrcCleanUpAction) - @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_build_in_source_with_download_dependencies(self, can_use_links_mock): can_use_links_mock.return_value = True @@ -339,7 +339,7 @@ def test_build_in_source_with_download_dependencies(self, can_use_links_mock): self.assertEqual(workflow.actions[4]._dest, os.path.join(artifacts_dir, "node_modules")) self.assertIsInstance(workflow.actions[5], NodejsNpmrcCleanUpAction) - @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_build_in_source_with_download_dependencies_and_dependencies_dir(self, can_use_links_mock): can_use_links_mock.return_value = True @@ -368,7 +368,7 @@ def test_build_in_source_with_download_dependencies_and_dependencies_dir(self, c self.assertIsInstance(workflow.actions[6], CopyDependenciesAction) self.assertIsInstance(workflow.actions[7], NodejsNpmrcCleanUpAction) - @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_build_in_source_with_dependencies_dir(self, can_use_links_mock): can_use_links_mock.return_value = True @@ -412,11 +412,11 @@ def test_npm_version_validation(self, returned_npm_version, expected_result): npm_subprocess = Mock() npm_subprocess.run = Mock(return_value=returned_npm_version) - result = workflow._can_use_install_links(npm_subprocess) + result = workflow.can_use_install_links(npm_subprocess) self.assertEqual(result, expected_result) - @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow._can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_build_in_source_old_npm_raises_exception(self, install_links_mock): install_links_mock.return_value = False diff --git a/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py b/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py index de4cfed15..497df30a4 100644 --- a/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py +++ b/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py @@ -343,7 +343,10 @@ def test_no_download_dependencies_and_no_dependencies_dir_fails(self): download_dependencies=False, ) - def test_build_in_source(self): + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") + def test_build_in_source(self, install_links_mock): + install_links_mock.return_value = True + source_dir = "source" workflow = NodejsNpmEsbuildWorkflow( source_dir=source_dir, @@ -382,9 +385,12 @@ def test_workflow_sets_up_npm_actions_with_download_dependencies_without_depende self.assertEquals(workflow.actions[2].install_dir, "scratch_dir") self.assertIsInstance(workflow.actions[3], EsbuildBundleAction) + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") def test_workflow_sets_up_npm_actions_with_download_dependencies_without_dependencies_dir_external_manifest_and_build_in_source( - self, + self, install_links_mock ): + install_links_mock.return_value = True + self.osutils.dirname.return_value = "not_source" workflow = NodejsNpmEsbuildWorkflow( From 51b697033d7fa133fa1f8a37c9a8b3614b0a6634 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Mon, 25 Sep 2023 14:48:45 -0700 Subject: [PATCH 05/10] Revert package lock file change --- .../testdata/esbuild-binary/package-lock.json | 362 +++++++++++++++++- 1 file changed, 361 insertions(+), 1 deletion(-) diff --git a/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json b/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json index 2daa78632..9a03e1592 100644 --- a/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json +++ b/tests/integration/workflows/nodejs_npm_esbuild/testdata/esbuild-binary/package-lock.json @@ -1,8 +1,368 @@ { "name": "esbuild-binary", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "esbuild-binary", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "esbuild": "^0.14.13" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + } + }, "dependencies": { "@esbuild/linux-loong64": { "version": "0.14.54", From 4394e2fc276ea588475c93ec83e9098520a4765a Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Mon, 25 Sep 2023 14:51:37 -0700 Subject: [PATCH 06/10] Added additional debug log --- aws_lambda_builders/workflows/nodejs_npm/workflow.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index ed548cccd..1e538126f 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -262,7 +262,11 @@ def can_use_install_links(npm_process: SubprocessNpm) -> bool: True if the current npm version meets the minimum for --install-links """ try: - current_version = npm_process.run(["--version"]).split(".") + current_version = npm_process.run(["--version"]) + + LOG.debug(f"Currently installed version of npm is: {current_version}") + + current_version = current_version.split(".") major_version = int(current_version[0]) minor_version = int(current_version[1]) From 9bc5a83bbe144a6a8663bcaa8066a4c3f06bc3f9 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Tue, 26 Sep 2023 16:40:26 -0700 Subject: [PATCH 07/10] Moved message to parent exception and change relative imports to absolute --- aws_lambda_builders/workflows/nodejs_npm/actions.py | 3 +-- aws_lambda_builders/workflows/nodejs_npm/exceptions.py | 9 ++------- aws_lambda_builders/workflows/nodejs_npm/npm.py | 2 +- aws_lambda_builders/workflows/nodejs_npm/workflow.py | 9 ++++----- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/actions.py b/aws_lambda_builders/workflows/nodejs_npm/actions.py index f0b1fb90b..ffabac3b5 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/actions.py +++ b/aws_lambda_builders/workflows/nodejs_npm/actions.py @@ -7,8 +7,7 @@ from aws_lambda_builders.actions import ActionFailedError, BaseAction, Purpose from aws_lambda_builders.utils import extract_tarfile - -from .npm import NpmExecutionError, SubprocessNpm +from aws_lambda_builders.workflows.nodejs_npm.npm import NpmExecutionError, SubprocessNpm LOG = logging.getLogger(__name__) diff --git a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py index 85da76b79..b5b53559a 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py +++ b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py @@ -6,7 +6,7 @@ from aws_lambda_builders.exceptions import LambdaBuilderError -class NpmExecutionError(Exception): +class NpmExecutionError(LambdaBuilderError): """ Exception raised in case NPM execution fails. It will pass on the standard error output from the NPM console. @@ -18,13 +18,8 @@ def __init__(self, **kwargs): Exception.__init__(self, self.MESSAGE.format(**kwargs)) -class OldNpmVersionError(LambdaBuilderError): +class OldNpmVersionError(NpmExecutionError): """ Exception raised when trying to build in source using --install-links with an older version of npm that does not support the option. """ - - MESSAGE = "NPM Failed: {message}" - - def __init__(self, **kwargs): - Exception.__init__(self, self.MESSAGE.format(**kwargs)) diff --git a/aws_lambda_builders/workflows/nodejs_npm/npm.py b/aws_lambda_builders/workflows/nodejs_npm/npm.py index 950ae5324..33b2598ef 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/npm.py +++ b/aws_lambda_builders/workflows/nodejs_npm/npm.py @@ -4,7 +4,7 @@ import logging -from .exceptions import NpmExecutionError +from aws_lambda_builders.workflows.nodejs_npm.exceptions import NpmExecutionError LOG = logging.getLogger(__name__) diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index 1e538126f..2fcc8ebd6 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -15,8 +15,7 @@ ) from aws_lambda_builders.path_resolver import PathResolver from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability - -from .actions import ( +from aws_lambda_builders.workflows.nodejs_npm.actions import ( NodejsNpmCIAction, NodejsNpmInstallAction, NodejsNpmLockFileCleanUpAction, @@ -24,9 +23,9 @@ NodejsNpmrcAndLockfileCopyAction, NodejsNpmrcCleanUpAction, ) -from .exceptions import OldNpmVersionError -from .npm import SubprocessNpm -from .utils import OSUtils +from aws_lambda_builders.workflows.nodejs_npm.exceptions import OldNpmVersionError +from aws_lambda_builders.workflows.nodejs_npm.npm import SubprocessNpm +from aws_lambda_builders.workflows.nodejs_npm.utils import OSUtils LOG = logging.getLogger(__name__) From c851953d3a04168920ae99a635c22041c0c6f530 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Thu, 28 Sep 2023 13:58:15 -0700 Subject: [PATCH 08/10] Moved check to workflow and revert to default behaviour if npm unsupported --- .../workflows/nodejs_npm/exceptions.py | 7 ---- .../workflows/nodejs_npm/workflow.py | 18 ++++++---- .../workflows/nodejs_npm_esbuild/workflow.py | 12 +++++++ .../workflows/nodejs_npm/test_workflow.py | 34 +++++++++++++++---- .../nodejs_npm_esbuild/test_workflow.py | 30 ++++++++++++++++ 5 files changed, 81 insertions(+), 20 deletions(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py index b5b53559a..ebce8621c 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/exceptions.py +++ b/aws_lambda_builders/workflows/nodejs_npm/exceptions.py @@ -16,10 +16,3 @@ class NpmExecutionError(LambdaBuilderError): def __init__(self, **kwargs): Exception.__init__(self, self.MESSAGE.format(**kwargs)) - - -class OldNpmVersionError(NpmExecutionError): - """ - Exception raised when trying to build in source using --install-links - with an older version of npm that does not support the option. - """ diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index 2fcc8ebd6..c172cb54a 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -23,7 +23,6 @@ NodejsNpmrcAndLockfileCopyAction, NodejsNpmrcCleanUpAction, ) -from aws_lambda_builders.workflows.nodejs_npm.exceptions import OldNpmVersionError from aws_lambda_builders.workflows.nodejs_npm.npm import SubprocessNpm from aws_lambda_builders.workflows.nodejs_npm.utils import OSUtils @@ -92,6 +91,18 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim self.actions.append(CopySourceAction(self.source_dir, artifacts_dir, excludes=self.EXCLUDED_FILES)) if self.download_dependencies: + if is_building_in_source and not self.can_use_install_links(subprocess_npm): + LOG.warning( + "Building in source was enabled, however the " + "currently installed npm version does not support " + "--install-links. Please ensure that the npm " + "version is at least 8.8.0. Switching to build " + "in a scratch directory." + ) + + is_building_in_source = False + self.build_dir = self._select_build_dir(build_in_source=False) + self.actions.append( NodejsNpmWorkflow.get_install_action( source_dir=source_dir, @@ -223,11 +234,6 @@ def get_install_action( BaseAction Install action to use """ - if install_links and not NodejsNpmWorkflow.can_use_install_links(subprocess_npm): - raise OldNpmVersionError( - message="Building in source uses npm --install-links, which requires npm version of at least 8.8.0." - ) - lockfile_path = osutils.joinpath(source_dir, "package-lock.json") shrinkwrap_path = osutils.joinpath(source_dir, "npm-shrinkwrap.json") diff --git a/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py b/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py index fdb07ce54..48ff3d751 100644 --- a/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py @@ -98,6 +98,18 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim ) if self.download_dependencies: + if is_building_in_source and not NodejsNpmWorkflow.can_use_install_links(self.subprocess_npm): + LOG.warning( + "Building in source was enabled, however the " + "currently installed npm version does not support " + "--install-links. Please ensure that the npm " + "version is at least 8.8.0. Switching to build " + "in a scratch directory." + ) + + is_building_in_source = False + self.build_dir = self._select_build_dir(build_in_source=False) + self.actions.append( NodejsNpmWorkflow.get_install_action( source_dir=source_dir, diff --git a/tests/unit/workflows/nodejs_npm/test_workflow.py b/tests/unit/workflows/nodejs_npm/test_workflow.py index 94ef66ed7..b95b2bfc2 100644 --- a/tests/unit/workflows/nodejs_npm/test_workflow.py +++ b/tests/unit/workflows/nodejs_npm/test_workflow.py @@ -1,6 +1,6 @@ import os from unittest import TestCase -from unittest.mock import patch, call, Mock +from unittest.mock import ANY, patch, call, Mock from parameterized import parameterized @@ -12,7 +12,6 @@ MoveDependenciesAction, ) from aws_lambda_builders.architecture import ARM64 -from aws_lambda_builders.workflows.nodejs_npm.exceptions import OldNpmVersionError from aws_lambda_builders.workflows.nodejs_npm.workflow import NodejsNpmWorkflow from aws_lambda_builders.workflows.nodejs_npm.actions import ( NodejsNpmPackAction, @@ -417,10 +416,31 @@ def test_npm_version_validation(self, returned_npm_version, expected_result): self.assertEqual(result, expected_result) @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") - def test_build_in_source_old_npm_raises_exception(self, install_links_mock): + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.get_install_action") + def test_workflow_revert_build_in_source(self, install_action_mock, install_links_mock): + # fake having bad npm version install_links_mock.return_value = False - with self.assertRaises(OldNpmVersionError): - NodejsNpmWorkflow( - "source", "artifacts", "scratch_dir", "source/manifest", osutils=self.osutils, build_in_source=True - ) + source_dir = "source" + artifacts_dir = "artifacts" + scratch_dir = "scratch_dir" + NodejsNpmWorkflow( + source_dir=source_dir, + artifacts_dir=artifacts_dir, + scratch_dir=scratch_dir, + manifest_path="source/manifest", + osutils=self.osutils, + build_in_source=True, + dependencies_dir="dep", + ) + + # expect no build in source and install dir is + # artifacts, not the source + install_action_mock.assert_called_with( + source_dir=source_dir, + install_dir=artifacts_dir, + subprocess_npm=ANY, + osutils=ANY, + build_options=ANY, + install_links=False, + ) diff --git a/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py b/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py index 497df30a4..d528072c4 100644 --- a/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py +++ b/tests/unit/workflows/nodejs_npm_esbuild/test_workflow.py @@ -410,3 +410,33 @@ def test_workflow_sets_up_npm_actions_with_download_dependencies_without_depende self.assertEquals(workflow.actions[1]._source, os.path.join("not_source", "node_modules")) self.assertEquals(workflow.actions[1]._dest, os.path.join("source", "node_modules")) self.assertIsInstance(workflow.actions[2], EsbuildBundleAction) + + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.can_use_install_links") + @patch("aws_lambda_builders.workflows.nodejs_npm.workflow.NodejsNpmWorkflow.get_install_action") + def test_workflow_revert_build_in_source(self, install_action_mock, install_links_mock): + # fake having bad npm version + install_links_mock.return_value = False + + source_dir = "source" + artifacts_dir = "artifacts" + scratch_dir = "scratch_dir" + NodejsNpmEsbuildWorkflow( + source_dir=source_dir, + artifacts_dir=artifacts_dir, + scratch_dir=scratch_dir, + manifest_path="source/manifest", + osutils=self.osutils, + build_in_source=True, + dependencies_dir="dep", + ) + + # expect no build in source and install dir is + # scratch, not the source + install_action_mock.assert_called_with( + source_dir=source_dir, + install_dir=scratch_dir, + subprocess_npm=ANY, + osutils=ANY, + build_options=ANY, + install_links=False, + ) From 4f5185e2009fb8c51b7b31b7808d9bde6f661956 Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Thu, 28 Sep 2023 14:03:50 -0700 Subject: [PATCH 09/10] Cleaned imports and moved message to constant --- .../workflows/nodejs_npm/workflow.py | 15 +++++++------ .../workflows/nodejs_npm_esbuild/workflow.py | 22 +++++++------------ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index c172cb54a..ecf4011f9 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -30,6 +30,13 @@ # npm>=8.8.0 supports --install-links MINIMUM_NPM_VERSION_INSTALL_LINKS = (8, 8) +UNSUPPORTED_NPM_VERSION_MESSAGE = ( + "Building in source was enabled, however the " + "currently installed npm version does not support " + "--install-links. Please ensure that the npm " + "version is at least 8.8.0. Switching to build " + "in a scratch directory." +) class NodejsNpmWorkflow(BaseWorkflow): @@ -92,13 +99,7 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim if self.download_dependencies: if is_building_in_source and not self.can_use_install_links(subprocess_npm): - LOG.warning( - "Building in source was enabled, however the " - "currently installed npm version does not support " - "--install-links. Please ensure that the npm " - "version is at least 8.8.0. Switching to build " - "in a scratch directory." - ) + LOG.warning(UNSUPPORTED_NPM_VERSION_MESSAGE) is_building_in_source = False self.build_dir = self._select_build_dir(build_in_source=False) diff --git a/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py b/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py index 48ff3d751..478b5dfc4 100644 --- a/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm_esbuild/workflow.py @@ -14,17 +14,17 @@ LinkSourceAction, MoveDependenciesAction, ) +from aws_lambda_builders.path_resolver import PathResolver from aws_lambda_builders.utils import which from aws_lambda_builders.workflow import BaseWorkflow, BuildDirectory, BuildInSourceSupport, Capability - -from ...path_resolver import PathResolver -from ..nodejs_npm import NodejsNpmWorkflow -from ..nodejs_npm.npm import SubprocessNpm -from ..nodejs_npm.utils import OSUtils -from .actions import ( +from aws_lambda_builders.workflows.nodejs_npm import NodejsNpmWorkflow +from aws_lambda_builders.workflows.nodejs_npm.npm import SubprocessNpm +from aws_lambda_builders.workflows.nodejs_npm.utils import OSUtils +from aws_lambda_builders.workflows.nodejs_npm.workflow import UNSUPPORTED_NPM_VERSION_MESSAGE +from aws_lambda_builders.workflows.nodejs_npm_esbuild.actions import ( EsbuildBundleAction, ) -from .esbuild import EsbuildExecutionError, SubprocessEsbuild +from aws_lambda_builders.workflows.nodejs_npm_esbuild.esbuild import EsbuildExecutionError, SubprocessEsbuild LOG = logging.getLogger(__name__) @@ -99,13 +99,7 @@ def __init__(self, source_dir, artifacts_dir, scratch_dir, manifest_path, runtim if self.download_dependencies: if is_building_in_source and not NodejsNpmWorkflow.can_use_install_links(self.subprocess_npm): - LOG.warning( - "Building in source was enabled, however the " - "currently installed npm version does not support " - "--install-links. Please ensure that the npm " - "version is at least 8.8.0. Switching to build " - "in a scratch directory." - ) + LOG.warning(UNSUPPORTED_NPM_VERSION_MESSAGE) is_building_in_source = False self.build_dir = self._select_build_dir(build_in_source=False) From 26ab777695719f9a9aaceaca7542814665ef1c0e Mon Sep 17 00:00:00 2001 From: Lucas <12496191+lucashuy@users.noreply.github.com> Date: Thu, 28 Sep 2023 15:04:53 -0700 Subject: [PATCH 10/10] Updated message --- aws_lambda_builders/workflows/nodejs_npm/workflow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aws_lambda_builders/workflows/nodejs_npm/workflow.py b/aws_lambda_builders/workflows/nodejs_npm/workflow.py index ecf4011f9..2f1fa1273 100644 --- a/aws_lambda_builders/workflows/nodejs_npm/workflow.py +++ b/aws_lambda_builders/workflows/nodejs_npm/workflow.py @@ -35,7 +35,8 @@ "currently installed npm version does not support " "--install-links. Please ensure that the npm " "version is at least 8.8.0. Switching to build " - "in a scratch directory." + f"in outside of the source directory.{os.linesep}" + "https://docs.npmjs.com/cli/v8/using-npm/changelog#v880-2022-04-27" )