Skip to content

Commit

Permalink
fix: use x64 version for mac for old nodejs (#11065) (#11070)
Browse files Browse the repository at this point in the history
Use the x64 package for mac if the installed node version is < 16.0.0 as ARM package is not available before this.

Fixes #11060

Co-authored-by: caalador <mikael.grankvist@vaadin.com>
  • Loading branch information
vaadin-bot and caalador committed May 25, 2021
1 parent dc5c4d5 commit 4755ee4
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,8 @@ private class InstallData {
.resolve(getNodeDownloadFilename(nodeVersion));
tmpDirectory = getTempDirectory();
archive = resolveArchive("node", nodeVersion,
platform.getNodeClassifier(),
platform.getNodeClassifier(
new FrontendVersion(nodeVersion)),
platform.getArchiveExtension());
nodeExecutable = platform.isWindows() ? "node.exe" : "node";
}
Expand Down Expand Up @@ -539,7 +540,8 @@ private String getNodeDownloadFilename(String nodeVersion) {
}

private String getLongNodeFilename(String nodeVersion) {
return "node-" + nodeVersion + "-" + platform.getNodeClassifier();
return "node-" + nodeVersion + "-" + platform
.getNodeClassifier(new FrontendVersion(nodeVersion));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package com.vaadin.flow.server.frontend.installer;

import com.vaadin.flow.server.frontend.FrontendVersion;

/**
* Platform contains information about system architecture and OS.
* <p>
Expand Down Expand Up @@ -112,6 +114,9 @@ public String getCodename() {
private final OS os;
private final Architecture architecture;

// Node.js supports Apple silicon from v16.0.0
private static final int NODE_VERSION_THRESHOLD_MAC_ARM64 = 16;

/**
* Construct a new Platform.
*
Expand Down Expand Up @@ -193,9 +198,23 @@ public OS getOs() {
/**
* Get the node classifier for current platform.
*
* @param nodeVersion
* node version to get classifier for
* @return platform node classifier
*/
public String getNodeClassifier() {
return getCodename() + "-" + getArchitecture().getName();
public String getNodeClassifier(FrontendVersion nodeVersion) {
return getCodename() + "-" + resolveArchitecture(nodeVersion).getName();
}

private Architecture resolveArchitecture(FrontendVersion nodeVersion) {
if (isMac() && architecture == Architecture.ARM64) {
Integer nodeMajorVersion = nodeVersion.getMajorVersion();
if (nodeMajorVersion == null
|| nodeMajorVersion < NODE_VERSION_THRESHOLD_MAC_ARM64) {
return Architecture.X64;
}
}

return architecture;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,9 @@ public void installNode_NodeIsInstalledToTargetDirectory()
nodeVersionCommand.add("--version");
FrontendVersion node = FrontendUtils.getVersion("node",
nodeVersionCommand);
Assert.assertEquals(FrontendTools.DEFAULT_NODE_VERSION,
Assert.assertEquals(
new FrontendVersion(FrontendTools.DEFAULT_NODE_VERSION)
.getFullVersion(),
node.getFullVersion());

FrontendTools newTools = new FrontendTools(vaadinHomeDir, null);
Expand All @@ -103,14 +105,15 @@ public void installNode_NodeIsInstalledToTargetDirectory()
npmVersionCommand.add("--version");
FrontendVersion npm = FrontendUtils.getVersion("npm",
npmVersionCommand);
Assert.assertEquals("6.14.6", npm.getFullVersion());
Assert.assertEquals("7.10.0", npm.getFullVersion());

}

private void prepareNodeDownloadableZipAt(String baseDir, String version) throws IOException {
Platform platform = Platform.guess();
String nodeExec = platform.isWindows() ? "node.exe" : "node";
String prefix = "node-" + version + "-" + platform.getNodeClassifier();
String prefix = "node-" + version + "-"
+ platform.getNodeClassifier(new FrontendVersion(version));

File downloadDir = new File(baseDir, version);
FileUtils.forceMkdir(downloadDir);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.junit.rules.TemporaryFolder;

import com.vaadin.flow.server.frontend.FrontendTools;
import com.vaadin.flow.server.frontend.FrontendVersion;

public class NodeInstallerTest {

Expand All @@ -39,7 +40,8 @@ public void installNodeFromFileSystem_NodeIsInstalledToTargetDirectory()
String nodeExec = platform.isWindows() ? "node.exe" : "node";
String prefix = String.format("node-%s-%s",
FrontendTools.DEFAULT_NODE_VERSION,
platform.getNodeClassifier());
platform.getNodeClassifier(new FrontendVersion(
FrontendTools.DEFAULT_NODE_VERSION)));

File targetDir = new File(baseDir + "/installation");

Expand Down

0 comments on commit 4755ee4

Please sign in to comment.