diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.feature/.gitignore
new file mode 100644
index 0000000000..809cc8f282
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/.gitignore
@@ -0,0 +1,2 @@
+target/
+bin/
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/.project b/org.eclipse.wildwebdeveloper.embedder.node.feature/.project
new file mode 100644
index 0000000000..c4ff525f82
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/.project
@@ -0,0 +1,23 @@
+
+
+ org.eclipse.wildwebdeveloper.embedder.node.feature
+
+
+
+
+
+ org.eclipse.pde.FeatureBuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.pde.FeatureNature
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.feature/build.properties
new file mode 100644
index 0000000000..b3a611b5c9
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/build.properties
@@ -0,0 +1,2 @@
+bin.includes = feature.xml,\
+ feature.properties
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.properties b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.properties
new file mode 100644
index 0000000000..50046f3c9a
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.properties
@@ -0,0 +1,4 @@
+name=Node.js embedder from Wild Web Developer
+description=Includes node.js and some code to manage and consume it from other bundles
+copyright=Copyright (c) 2020 Red Hat Inc. and others.\
+ This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at https://www.eclipse.org/legal/epl-2.0/
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.xml b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.xml
new file mode 100644
index 0000000000..5774dae89d
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.xml
@@ -0,0 +1,58 @@
+
+
+
+
+ %description
+
+
+
+ %copyright
+
+
+
+ %license
+
+
+
+
+
+
+
+
+
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.feature/pom.xml
new file mode 100644
index 0000000000..d9b447ea07
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/pom.xml
@@ -0,0 +1,49 @@
+
+ 4.0.0
+ org.eclipse.wildwebdeveloper.embedder.node.feature
+
+ org.eclipse.wildwebdeveloper
+ parent
+ 0.5.0-SNAPSHOT
+
+ eclipse-feature
+ 0.1.0-SNAPSHOT
+
+
+
+ org.eclipse.tycho.extras
+ tycho-source-feature-plugin
+ ${tycho-version}
+
+
+ source-feature
+ package
+
+ source-feature
+
+
+
+
+
+
+
+
+
+
+
+
+ org.eclipse.tycho
+ tycho-p2-plugin
+
+
+ attach-p2-metadata
+ package
+
+ p2-metadata
+
+
+
+
+
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.gitignore
new file mode 100644
index 0000000000..d4e86fbce1
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.gitignore
@@ -0,0 +1,2 @@
+target/
+resources/*.tar.*
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.project b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.project
new file mode 100644
index 0000000000..d106f53b85
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.project
@@ -0,0 +1,22 @@
+
+
+ org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64
+
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..2849be7389
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Node.js for Linux x64
+Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64
+Bundle-Version: 0.1.0.qualifier
+Bundle-Vendor: Eclipse Wild Web Developer
+Fragment-Host: org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0"
+Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node.linux
+Eclipse-PlatformFilter: (& (osgi.ws=gtk) (osgi.os=linux) (osgi.arch=x86_64))
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/build.properties
new file mode 100644
index 0000000000..186c7dccfd
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/build.properties
@@ -0,0 +1,4 @@
+bin.includes = META-INF/,\
+ .,\
+ resources/,\
+ nodejs-info.properties
\ No newline at end of file
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/nodejs-info.properties b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/nodejs-info.properties
new file mode 100644
index 0000000000..7a09c146cf
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/nodejs-info.properties
@@ -0,0 +1,3 @@
+archiveURL=https://nodejs.org/download/release/v12.16.1/node-v12.16.1-linux-x64.tar.gz
+archiveFile=resources/node-v12.16.1-linux-x64.tar.gz
+nodePath=node-v12.16.1-linux-x64/bin/node
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/pom.xml
new file mode 100644
index 0000000000..720b9f7662
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/pom.xml
@@ -0,0 +1,76 @@
+
+ 4.0.0
+ org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64
+
+ org.eclipse.wildwebdeveloper
+ parent
+ 0.5.0-SNAPSHOT
+
+ eclipse-plugin
+ 0.1.0-SNAPSHOT
+
+
+
+
+ org.codehaus.mojo
+ properties-maven-plugin
+ 1.0.0
+
+
+ initialize
+
+ read-project-properties
+
+
+
+ ${project.basedir}/nodejs-info.properties
+
+
+
+
+
+
+ com.googlecode.maven-download-plugin
+ download-maven-plugin
+ 1.3.0
+
+
+ fetch-node.js
+ generate-resources
+
+ wget
+
+
+ ${archiveURL}
+ false
+ ${project.basedir}/resources
+
+
+
+
+
+ org.eclipse.tycho
+ tycho-packaging-plugin
+
+
+ resources/*.tar.xz
+
+
+
+
+ org.eclipse.tycho
+ target-platform-configuration
+ true
+
+
+
+ linux
+ gtk
+ x86_64
+
+
+
+
+
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.gitignore
new file mode 100644
index 0000000000..d4e86fbce1
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.gitignore
@@ -0,0 +1,2 @@
+target/
+resources/*.tar.*
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.project b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.project
new file mode 100644
index 0000000000..df9b82f778
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.project
@@ -0,0 +1,22 @@
+
+
+ org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64
+
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..9dd92c75d6
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Node.js for MacOS x64
+Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64
+Bundle-Version: 0.1.0.qualifier
+Bundle-Vendor: Eclipse Wild Web Developer
+Fragment-Host: org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0"
+Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node.macos
+Eclipse-PlatformFilter: (& (osgi.ws=cocoa) (osgi.os=macosx) (|(osgi.arch=x86_64)(osgi.arch=ppc)))
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/build.properties
new file mode 100644
index 0000000000..186c7dccfd
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/build.properties
@@ -0,0 +1,4 @@
+bin.includes = META-INF/,\
+ .,\
+ resources/,\
+ nodejs-info.properties
\ No newline at end of file
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/nodejs-info.properties b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/nodejs-info.properties
new file mode 100644
index 0000000000..99737614c0
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/nodejs-info.properties
@@ -0,0 +1,3 @@
+archiveURL=https://nodejs.org/download/release/v12.16.1/node-v12.16.1-darwin-x64.tar.gz
+archiveFile=resources/node-v12.16.1-darwin-x64.tar.gz
+nodePath=node-v12.16.1-darwin-x64/bin/node
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/pom.xml
new file mode 100644
index 0000000000..b9db9eb289
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/pom.xml
@@ -0,0 +1,76 @@
+
+ 4.0.0
+ org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64
+
+ org.eclipse.wildwebdeveloper
+ parent
+ 0.5.0-SNAPSHOT
+
+ eclipse-plugin
+ 0.1.0-SNAPSHOT
+
+
+
+
+ org.codehaus.mojo
+ properties-maven-plugin
+ 1.0.0
+
+
+ initialize
+
+ read-project-properties
+
+
+
+ ${project.basedir}/nodejs-info.properties
+
+
+
+
+
+
+ com.googlecode.maven-download-plugin
+ download-maven-plugin
+ 1.3.0
+
+
+ fetch-node.js
+ generate-resources
+
+ wget
+
+
+ ${archiveURL}
+ false
+ ${project.basedir}/resources
+
+
+
+
+
+ org.eclipse.tycho
+ tycho-packaging-plugin
+
+
+ resources/*.tar.xz
+
+
+
+
+ org.eclipse.tycho
+ target-platform-configuration
+ true
+
+
+
+ macosx
+ cocoa
+ x86_64
+
+
+
+
+
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.gitignore
new file mode 100644
index 0000000000..f6787d06b7
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.gitignore
@@ -0,0 +1,2 @@
+target/
+resources/*.zip
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.project b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.project
new file mode 100644
index 0000000000..44fb6d853e
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.project
@@ -0,0 +1,22 @@
+
+
+ org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64
+
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..c1d6fe5c01
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Node.js for Windows x86_64
+Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64
+Bundle-Version: 0.1.0.qualifier
+Bundle-Vendor: Eclipse Wild Web Developer
+Fragment-Host: org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0"
+Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64
+Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.ws=win32) (osgi.arch=x86_64))
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/build.properties
new file mode 100644
index 0000000000..186c7dccfd
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/build.properties
@@ -0,0 +1,4 @@
+bin.includes = META-INF/,\
+ .,\
+ resources/,\
+ nodejs-info.properties
\ No newline at end of file
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/nodejs-info.properties b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/nodejs-info.properties
new file mode 100644
index 0000000000..24acd8804d
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/nodejs-info.properties
@@ -0,0 +1,3 @@
+archiveURL=https://nodejs.org/download/release/v12.16.1/node-v12.16.1-win-x64.zip
+archiveFile = resources/node-v12.16.1-win-x64.zip
+nodePath = node-v12.16.1-win-x64/node.exe
diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/pom.xml
new file mode 100644
index 0000000000..67c70ec5b5
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/pom.xml
@@ -0,0 +1,76 @@
+
+ 4.0.0
+ org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64
+
+ org.eclipse.wildwebdeveloper
+ parent
+ 0.5.0-SNAPSHOT
+
+ eclipse-plugin
+ 0.1.0-SNAPSHOT
+
+
+
+
+ org.codehaus.mojo
+ properties-maven-plugin
+ 1.0.0
+
+
+ initialize
+
+ read-project-properties
+
+
+
+ ${project.basedir}/nodejs-info.properties
+
+
+
+
+
+
+ com.googlecode.maven-download-plugin
+ download-maven-plugin
+ 1.3.0
+
+
+ fetch-node.js
+ generate-resources
+
+ wget
+
+
+ ${archiveURL}
+ false
+ ${project.basedir}/resources
+
+
+
+
+
+ org.eclipse.tycho
+ tycho-packaging-plugin
+
+
+ resources/*.zip
+
+
+
+
+ org.eclipse.tycho
+ target-platform-configuration
+ true
+
+
+
+ win32
+ win32
+ x86_64
+
+
+
+
+
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/.classpath b/org.eclipse.wildwebdeveloper.embedder.node/.classpath
new file mode 100644
index 0000000000..eca7bdba8f
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node/.gitignore
new file mode 100644
index 0000000000..9cd502b1e2
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/.gitignore
@@ -0,0 +1,3 @@
+target/
+bin/
+.settings/
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/.project b/org.eclipse.wildwebdeveloper.embedder.node/.project
new file mode 100644
index 0000000000..f1e67fae10
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/.project
@@ -0,0 +1,28 @@
+
+
+ org.eclipse.wildwebdeveloper.embedder.node
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..53dd015045
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Manager for embedded Node.js
+Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node
+Bundle-Version: 0.1.0.qualifier
+Bundle-Vendor: Eclipse Wild Web Developer
+Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.ui.workbench,
+ org.eclipse.swt,
+ org.eclipse.core.runtime;bundle-version="3.18.0",
+ org.eclipse.jface;bundle-version="3.20.0",
+ org.apache.commons.compress;bundle-version="1.19.0"
+Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.wildwebdeveloper.embedder.node.Activator
+Export-Package: org.eclipse.wildwebdeveloper.embedder.node
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/build.properties b/org.eclipse.wildwebdeveloper.embedder.node/build.properties
new file mode 100644
index 0000000000..34d2e4d2da
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node/pom.xml
new file mode 100644
index 0000000000..e9cfbc566d
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/pom.xml
@@ -0,0 +1,11 @@
+
+ 4.0.0
+ org.eclipse.wildwebdeveloper.embedder.node
+
+ org.eclipse.wildwebdeveloper
+ parent
+ 0.5.0-SNAPSHOT
+
+ eclipse-plugin
+ 0.1.0-SNAPSHOT
+
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/Activator.java b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/Activator.java
new file mode 100644
index 0000000000..39f2855514
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/Activator.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.eclipse.wildwebdeveloper.embedder.node;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.wildwebdeveloper.embedder.node"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/CompressUtils.java b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/CompressUtils.java
new file mode 100644
index 0000000000..19ea49a80c
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/CompressUtils.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Victor Rubezhny (Red Hat Inc.) - initial implementation
+ *******************************************************************************/
+package org.eclipse.wildwebdeveloper.embedder.node;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.nio.file.Files;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.ArchiveInputStream;
+import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
+import org.apache.commons.compress.utils.IOUtils;
+
+public class CompressUtils {
+ public static final String ZIP_EXTENSION = ".zip";
+ public static final String TAR_GZ_EXTENSION = ".tar.gz";
+ public static final String TAR_XZ_EXTENSION = ".tar.xz";
+
+ public static void unarchive(URL find, File baseDir) throws IOException {
+ String archive = find != null ? find.getFile() : "";
+ if (archive.endsWith(TAR_GZ_EXTENSION) || archive.endsWith(TAR_XZ_EXTENSION)) {
+ try (InputStream fi = find.openStream();
+ InputStream bi = new BufferedInputStream(fi);
+ InputStream gzi = archive.endsWith(TAR_XZ_EXTENSION) ?
+ new XZCompressorInputStream(bi) : new GzipCompressorInputStream(bi);
+ TarArchiveInputStream in = new TarArchiveInputStream(gzi)) {
+ extractArchive(in, baseDir);
+ }
+ } else if (archive.endsWith(ZIP_EXTENSION)) {
+ try (InputStream fi = find.openStream();
+ ZipArchiveInputStream in = new ZipArchiveInputStream(fi)) {
+ extractArchive(in, baseDir);
+ }
+ } else {
+ throw new UnsupportedCompressionAlgorithmException("Unsupported archive file extension: " + archive);
+ }
+
+ }
+
+ /**
+ * Extract zip/tar.gz/tar.xz file to destination folder.
+ * Sets up 'executable' permission for TarAchiveEntry representing an
+ * executable file.
+ *
+ * @param in
+ * Zip/Tar Archive Input Stream to extract
+ * @param destination
+ * destination folder
+ */
+ public static void extractArchive(ArchiveInputStream in, File destination) throws IOException {
+ ArchiveEntry entry = null;
+ while ((entry = in.getNextEntry()) != null) {
+ if (!in.canReadEntryData(entry)) {
+ // log something?
+ continue;
+ }
+ File f = new File(destination, entry.getName());
+ if (entry.isDirectory()) {
+ if (!f.isDirectory() && !f.mkdirs()) {
+ throw new IOException("failed to create directory " + f);
+ }
+ } else {
+ File parent = f.getParentFile();
+ if (!parent.isDirectory() && !parent.mkdirs()) {
+ throw new IOException("failed to create directory " + parent);
+ }
+ try (OutputStream o = Files.newOutputStream(f.toPath())) {
+ IOUtils.copy(in, o);
+ }
+ if (entry instanceof TarArchiveEntry) {
+ f.setExecutable((((TarArchiveEntry)entry).getMode() & 256) != 0);
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/InitializeLaunchConfigurations.java b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/NodeJSManager.java
similarity index 56%
rename from org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/InitializeLaunchConfigurations.java
rename to org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/NodeJSManager.java
index b73c40a6a2..3ac35435d6 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/InitializeLaunchConfigurations.java
+++ b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/NodeJSManager.java
@@ -14,28 +14,34 @@
* Pierre-Yves B. - Issue #238 Why does wildweb do "/bin/bash -c which node" ?
* Pierre-Yves B. - Issue #268 Incorrect default Node.js location for macOS
*******************************************************************************/
-package org.eclipse.wildwebdeveloper;
+package org.eclipse.wildwebdeveloper.embedder.node;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
-import java.nio.file.Files;
-import java.nio.file.Paths;
+import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
+import org.eclipse.core.internal.runtime.InternalPlatform;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.osgi.framework.Version;
-public class InitializeLaunchConfigurations {
+@SuppressWarnings("restriction")
+public class NodeJSManager {
private static final String MACOS_DSCL_SHELL_PREFIX = "UserShell: ";
@@ -43,25 +49,49 @@ public class InitializeLaunchConfigurations {
.unmodifiableSet(new HashSet<>(Arrays.asList(10, 11, 12, 13, 14)));
private static boolean alreadyWarned;
- public static String getNodeJsLocation() {
+ private static Properties cachedNodeJsInfoProperties;
+
+ public static File getNodeJsLocation() {
{
String nodeJsLocation = System.getProperty("org.eclipse.wildwebdeveloper.nodeJSLocation");
- if (nodeJsLocation != null && Files.exists(Paths.get(nodeJsLocation))) {
- validateNodeVersion(nodeJsLocation);
- return nodeJsLocation;
+ if (nodeJsLocation != null) {
+ File nodejs = new File(nodeJsLocation);
+ if (nodejs.exists()) {
+ validateNodeVersion(nodejs);
+ return new File(nodeJsLocation);
+ }
}
}
- String res = which("node");
- if (res == null) {
- if (Files.exists(Paths.get(getDefaultNodePath()))) {
- res = getDefaultNodePath();
+ Properties properties = getNodeJsInfoProperties();
+ if (properties != null) {
+ try {
+ IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform
+ .getBundle(Activator.PLUGIN_ID));
+ if (stateLocationPath != null) {
+ File installationPath = stateLocationPath.toFile();
+ File nodePath = new File(installationPath, properties.getProperty("nodePath"));
+ if (nodePath.exists() && nodePath.canRead() && nodePath.canExecute()) {
+ return nodePath;
+ }
+
+ CompressUtils.unarchive(FileLocator.find(Activator.getDefault().getBundle(),
+ new Path(properties.getProperty("archiveFile"))),
+ installationPath);
+ return nodePath;
+ }
+ } catch (IOException e) {
+ Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
}
}
+ File res = which("node");
+ if (res == null && getDefaultNodePath().exists()) {
+ res = getDefaultNodePath();
+ }
+
if (res != null) {
validateNodeVersion(res);
-
return res;
} else if (!alreadyWarned) {
warnNodeJSMissing();
@@ -69,14 +99,28 @@ public static String getNodeJsLocation() {
}
return null;
}
-
- public static String which(String program) {
-
+
+ public static File which(String program) {
+ Properties properties = getNodeJsInfoProperties();
+ if (properties != null) {
+ IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform
+ .getBundle(Activator.PLUGIN_ID));
+ if (stateLocationPath != null) {
+ File installationPath = stateLocationPath.toFile();
+ File nodePath = new File(installationPath, properties.getProperty("nodePath"));
+ if (nodePath.exists() && nodePath.canRead() && nodePath.canExecute()) {
+ File exe = new File(nodePath.getParent(), program);
+ if (exe.canExecute())
+ return exe;
+ }
+ }
+ }
+
String[] paths = System.getenv("PATH").split(System.getProperty("path.separator"));
for (String path : paths) {
File exe = new File(path, program);
if (exe.canExecute())
- return exe.getAbsolutePath();
+ return exe;
}
String res = null;
@@ -93,44 +137,59 @@ public static String which(String program) {
Activator.getDefault().getLog().log(
new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), e.getMessage(), e));
}
+ return new File(res);
+ }
+
+ private static Properties getNodeJsInfoProperties() {
+ if (cachedNodeJsInfoProperties == null) {
+ URL nodeJsInfo = FileLocator.find(Activator.getDefault().getBundle(), new Path("nodejs-info.properties"));
+ if (nodeJsInfo != null) {
+ try (InputStream infoStream = nodeJsInfo.openStream()) {
+ Properties properties = new Properties();
+ properties.load(infoStream);
+ cachedNodeJsInfoProperties = properties;
+ } catch (IOException e) {
+ Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e));
+ }
+ }
+ }
+ return cachedNodeJsInfoProperties;
+ }
+
+ private static String getDefaultShellMacOS() {
+ String res = null;
+ String[] command = new String[] { "/bin/bash", "-c", "-l", "dscl . -read ~/ UserShell" };
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(Runtime.getRuntime().exec(command).getInputStream()));) {
+ res = reader.readLine();
+ if (!res.startsWith(MACOS_DSCL_SHELL_PREFIX)) {
+ Activator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(),
+ "Cannot find default shell. Use '/bin/zsh' instead."));
+ return "/bin/zsh"; // Default shell since macOS 10.15
+ }
+ res = res.substring(MACOS_DSCL_SHELL_PREFIX.length());
+ } catch (IOException e) {
+ Activator.getDefault().getLog().log(
+ new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), e.getMessage(), e));
+ }
return res;
}
- private static String getDefaultShellMacOS() {
- String res = null;
- String[] command = new String[] {"/bin/bash", "-c", "-l", "dscl . -read ~/ UserShell"};
- try (BufferedReader reader = new BufferedReader(
- new InputStreamReader(Runtime.getRuntime().exec(command).getInputStream()));) {
- res = reader.readLine();
- if ( ! res.startsWith(MACOS_DSCL_SHELL_PREFIX)) {
- Activator.getDefault().getLog().log(
- new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(),
- "Cannot find default shell. Use '/bin/zsh' instead."));
- return "/bin/zsh"; // Default shell since macOS 10.15
- }
- res = res.substring(MACOS_DSCL_SHELL_PREFIX.length());
- } catch (IOException e) {
- Activator.getDefault().getLog().log(
- new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), e.getMessage(), e));
- }
- return res;
- }
-
- private static String getDefaultNodePath() {
+ private static File getDefaultNodePath() {
switch (Platform.getOS()) {
case Platform.OS_MACOSX:
- return "/usr/local/bin/node";
+ return new File("/usr/local/bin/node");
case Platform.OS_WIN32:
- return "C:\\Program Files\\nodejs\\node.exe";
+ return new File("C:\\Program Files\\nodejs\\node.exe");
default:
- return "/usr/bin/node";
+ return new File("/usr/bin/node");
}
}
- private static void validateNodeVersion(String nodeJsLocation) {
-
+ private static void validateNodeVersion(File nodeJsLocation) {
String nodeVersion = null;
- String[] nodeVersionCommand = new String[] { nodeJsLocation, "-v" };
+ String[] nodeVersionCommand = new String[] { nodeJsLocation.getAbsolutePath(), "-v" };
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(Runtime.getRuntime().exec(nodeVersionCommand).getInputStream()));) {
diff --git a/org.eclipse.wildwebdeveloper.feature/feature.xml b/org.eclipse.wildwebdeveloper.feature/feature.xml
index ea11525453..31f5e3fdbf 100644
--- a/org.eclipse.wildwebdeveloper.feature/feature.xml
+++ b/org.eclipse.wildwebdeveloper.feature/feature.xml
@@ -22,6 +22,9 @@
+
javax.annotation
0.0.0
+
+ eclipse-feature
+ org.eclipse.wildwebdeveloper.embedder.node.feature
+ 0.0.0
+
diff --git a/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestNodeJsEmbedder.java b/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestNodeJsEmbedder.java
new file mode 100644
index 0000000000..b2d0f205d0
--- /dev/null
+++ b/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestNodeJsEmbedder.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Red Hat Inc. and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Victor Rubezhny (Red Hat Inc.) - Initial implementation
+ *******************************************************************************/
+package org.eclipse.wildwebdeveloper.tests;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Properties;
+
+import org.eclipse.core.internal.runtime.InternalPlatform;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wildwebdeveloper.embedder.node.Activator;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
+import org.junit.Rule;
+import org.junit.Test;
+
+@SuppressWarnings("restriction")
+public class TestNodeJsEmbedder {
+ @Rule public AllCleanRule allClean = new AllCleanRule();
+
+ @Test
+ public void testNodeJsEmbedder() throws Exception {
+ URL nodeJsInfo = FileLocator.find(Activator.getDefault().getBundle(), new Path("nodejs-info.properties"));
+ assertNotNull("NodeJs descriptor \"nodejs-info.properties\" not found!", nodeJsInfo);
+
+ Properties properties = new Properties();
+ try (InputStream infoStream = nodeJsInfo.openStream()) {
+ properties.load(infoStream);
+ }
+
+ assertTrue("Property \"archiveURL\" is not defined", properties.getProperty("archiveURL") != null &&
+ !properties.getProperty("archiveURL").isEmpty());
+ assertTrue("Property \"archiveFile\" is not defined", properties.getProperty("archiveFile") != null &&
+ !properties.getProperty("archiveFile").isEmpty());
+ assertTrue("Property \"nodePath\" is not defined", properties.getProperty("nodePath") != null &&
+ !properties.getProperty("nodePath").isEmpty());
+
+ File nodePath = NodeJSManager.getNodeJsLocation();
+ assertNotNull("Node.Js location cannot be found", nodePath);
+
+ IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform
+ .getBundle(Activator.PLUGIN_ID));
+ assertNotNull("State location cannot be found for plugin \"" + Activator.PLUGIN_ID + "\"",
+ stateLocationPath);
+
+ File installationPath = stateLocationPath.toFile();
+ File embeddedNodePath = new File(installationPath, properties.getProperty("nodePath"));
+ assertTrue("Embedded NodeJs is not extracted", nodePath.exists() && nodePath.canRead() && nodePath.canExecute());
+ assertEquals("Embedded NodeJs installation is not used", nodePath, embeddedNodePath);
+ }
+
+ @Test
+ public void testNodeJsEmbedderWhich() throws Exception {
+ URL nodeJsInfo = FileLocator.find(Activator.getDefault().getBundle(), new Path("nodejs-info.properties"));
+ assertNotNull("NodeJs descriptor \"nodejs-info.properties\" not found!", nodeJsInfo);
+
+ Properties properties = new Properties();
+ try (InputStream infoStream = nodeJsInfo.openStream()) {
+ properties.load(infoStream);
+ }
+
+ assertTrue("Property \"archiveURL\" is not defined", properties.getProperty("archiveURL") != null &&
+ !properties.getProperty("archiveURL").isEmpty());
+ assertTrue("Property \"archiveFile\" is not defined", properties.getProperty("archiveFile") != null &&
+ !properties.getProperty("archiveFile").isEmpty());
+ assertTrue("Property \"nodePath\" is not defined", properties.getProperty("nodePath") != null &&
+ !properties.getProperty("nodePath").isEmpty());
+
+ File nodePath = NodeJSManager.getNodeJsLocation();
+ assertNotNull("Node.Js location cannot be found", nodePath);
+
+ IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform
+ .getBundle(Activator.PLUGIN_ID));
+ assertNotNull("State location cannot be found for plugin \"" + Activator.PLUGIN_ID + "\"",
+ stateLocationPath);
+
+ File installationPath = stateLocationPath.toFile();
+ File embeddedNodePath = new File(installationPath, properties.getProperty("nodePath"));
+ assertTrue("Embedded NodeJs is not extracted", nodePath.exists() && nodePath.canRead() && nodePath.canExecute());
+
+ File whichNode = NodeJSManager.which("node");
+ assertTrue("NodeJSManager.which(\"node\") didn't return an embedded NodeJs",
+ whichNode.exists() && whichNode.canRead() && whichNode.canExecute() &&
+ embeddedNodePath.getParent().equals(whichNode.getParent()));
+
+ File whichNpm = NodeJSManager.which("npm");
+ assertTrue("NodeJSManager.which(\"npm\") didn't return an embedded NodeJs\'s NPM",
+ whichNpm.exists() && whichNpm.canRead() && whichNpm.canExecute() &&
+ embeddedNodePath.getParent().equals(whichNpm.getParent()));
+
+ File whichNpx = NodeJSManager.which("npx");
+ assertTrue("NodeJSManager.which(\"npx\") didn't return an embedded NodeJs\\'s NPX",
+ whichNpx.exists() && whichNpx.canRead() && whichNpx.canExecute() &&
+ embeddedNodePath.getParent().equals(whichNpx.getParent()));
+ }
+}
diff --git a/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF
index c67b97feeb..47ab163c52 100644
--- a/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF
+++ b/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF
@@ -26,7 +26,8 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.tm4e.languageconfiguration,
org.eclipse.compare;resolution:=optional,
org.eclipse.ui.console;bundle-version="3.9.0",
- org.eclipse.ui.browser;bundle-version="3.6.0"
+ org.eclipse.ui.browser;bundle-version="3.6.0",
+ org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-ActivationPolicy: lazy
Eclipse-BundleShape: dir
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java
index 02e4b0d7db..5e620a0d80 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java
@@ -23,7 +23,7 @@
import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class AngularLanguageServer extends ProcessStreamConnectionProvider {
@@ -40,7 +40,7 @@ public AngularLanguageServer() {
this.isLoggingToConsoleEnabled = scopedPreferenceStore.getBoolean(LOG_TO_CONSOLE_ANGULAR_LS_PREFERENCE);
List commands = new ArrayList<>();
- commands.add(InitializeLaunchConfigurations.getNodeJsLocation());
+ commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
try {
URL url = FileLocator.toFileURL(getClass().getResource("/node_modules/@angular/language-server/index.js"));
commands.add(new java.io.File(url.getPath()).getAbsolutePath());
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java
index 28d69804ad..0c7dfc3f76 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java
@@ -31,13 +31,13 @@
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class CSSLanguageServer extends ProcessStreamConnectionProvider {
public CSSLanguageServer() {
List commands = new ArrayList<>();
- commands.add(InitializeLaunchConfigurations.getNodeJsLocation());
+ commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
try {
URL url = FileLocator.toFileURL(getClass().getResource("/node_modules/vscode-css-languageserver/dist/cssServerMain.js"));
commands.add(new java.io.File(url.getPath()).getAbsolutePath());
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java
index 6f87be64a3..06add365c4 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java
@@ -27,7 +27,7 @@
import org.eclipse.lsp4e.debug.launcher.DSPLaunchDelegate;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class AbstractHTMLDebugDelegate extends DSPLaunchDelegate {
public static final String PROGRAM = "program"; //$NON-NLS-1$
@@ -51,7 +51,7 @@ public void launchWithParameters(ILaunchConfiguration configuration, String mode
DSPLaunchDelegateLaunchBuilder builder = new DSPLaunchDelegateLaunchBuilder(configuration, mode, launch,
monitor);
- builder.setLaunchDebugAdapter(InitializeLaunchConfigurations.getNodeJsLocation(), debugCmdArgs);
+ builder.setLaunchDebugAdapter(NodeJSManager.getNodeJsLocation().getAbsolutePath(), debugCmdArgs);
builder.setMonitorDebugAdapter(configuration.getAttribute(DSPPlugin.ATTR_DSP_MONITOR_DEBUG_ADAPTER, false));
builder.setDspParameters(param);
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java
index 156c6842b2..bc3078b441 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java
@@ -32,8 +32,8 @@
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
import org.eclipse.wildwebdeveloper.debug.AbstractHTMLDebugDelegate;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
import com.google.gson.JsonObject;
@@ -128,15 +128,15 @@ static String findChromeLocation(ILaunchConfiguration configuration) {
res = "chromium-browser"; //$NON-NLS-1$
}
// Failsafe, in case user doesn't have their preferred browser
- res = InitializeLaunchConfigurations.which(res);
+ res = NodeJSManager.which(res).getAbsolutePath();
if (res != null) {
return res;
}
- res = InitializeLaunchConfigurations.which("chromium-browser");
+ res = NodeJSManager.which("chromium-browser").getAbsolutePath();
if (res != null) {
return res;
}
- res = InitializeLaunchConfigurations.which("google-chrome-stable");
+ res = NodeJSManager.which("google-chrome-stable").getAbsolutePath();
if (res != null) {
return res;
}
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java
index c1e45d40cc..26a202f9da 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java
@@ -30,9 +30,9 @@
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
import org.eclipse.wildwebdeveloper.debug.AbstractHTMLDebugDelegate;
import org.eclipse.wildwebdeveloper.debug.chrome.ChromeRunDAPDebugDelegate;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class FirefoxRunDABDebugDelegate extends AbstractHTMLDebugDelegate {
@@ -98,7 +98,7 @@ static File findDebugAdapter() {
}
static String findFirefoxLocation() {
- String res = InitializeLaunchConfigurations.which("firefox");
+ String res = NodeJSManager.which("firefox").getAbsolutePath();
if (res == null) {
res = "/path/to/firefox";
}
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java
index d2c1d8e641..76d432b490 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java
@@ -33,7 +33,7 @@
import org.eclipse.lsp4e.debug.launcher.DSPLaunchDelegate;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class NodeAttachDebugDelegate extends DSPLaunchDelegate {
@@ -66,7 +66,7 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun
DSPLaunchDelegateLaunchBuilder builder = new DSPLaunchDelegateLaunchBuilder(configuration, mode, launch,
monitor);
- builder.setLaunchDebugAdapter(InitializeLaunchConfigurations.getNodeJsLocation(), debugCmdArgs);
+ builder.setLaunchDebugAdapter(NodeJSManager.getNodeJsLocation().getAbsolutePath(), debugCmdArgs);
builder.setMonitorDebugAdapter(configuration.getAttribute(DSPPlugin.ATTR_DSP_MONITOR_DEBUG_ADAPTER, false));
builder.setDspParameters(param);
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java
index ad6f4c211c..2f20ea3826 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java
@@ -56,8 +56,8 @@
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
import org.eclipse.wildwebdeveloper.debug.Messages;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
@@ -73,6 +73,7 @@ public class NodeRunDAPDebugDelegate extends DSPLaunchDelegate {
public static final String ARGUMENTS = "args"; //$NON-NLS-1$
private static final String CWD = "cwd"; //$NON-NLS-1$
private static final String ENV = "env"; //$NON-NLS-1$
+ private static final String RUNTIME_EXECUTABLE = "runtimeExecutable"; //$NON-NLS-1$
@Override
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor)
@@ -99,6 +100,10 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun
if (!cwd.isEmpty()) {
param.put(CWD, cwd);
}
+ File runtimeExecutable = NodeJSManager.which("node");
+ if (runtimeExecutable != null) {
+ param.put(RUNTIME_EXECUTABLE, runtimeExecutable.getAbsolutePath());
+ }
if (!configureAdditionalParameters(param)) {
return;
@@ -112,7 +117,7 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun
DSPLaunchDelegateLaunchBuilder builder = new DSPLaunchDelegateLaunchBuilder(configuration, mode, launch,
monitor);
- builder.setLaunchDebugAdapter(InitializeLaunchConfigurations.getNodeJsLocation(), debugCmdArgs);
+ builder.setLaunchDebugAdapter(NodeJSManager.getNodeJsLocation().getAbsolutePath(), debugCmdArgs);
builder.setMonitorDebugAdapter(configuration.getAttribute(DSPPlugin.ATTR_DSP_MONITOR_DEBUG_ADAPTER, false));
builder.setDspParameters(param);
super.launch(builder);
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java
index b729c3af27..2e95e7091a 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java
@@ -34,8 +34,8 @@
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
import org.eclipse.wildwebdeveloper.debug.AbstractHTMLDebugDelegate;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class NpmLaunchDelegate implements ILaunchConfigurationDelegate {
@@ -97,7 +97,7 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun
}
private static String findNPMLocation() {
- return InitializeLaunchConfigurations.which("npm"); //$NON-NLS-1$
+ return NodeJSManager.which("npm").getAbsolutePath(); //$NON-NLS-1$
}
}
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java
index f383de5994..43446a4f77 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java
@@ -31,13 +31,13 @@
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class HTMLLanguageServer extends ProcessStreamConnectionProvider {
public HTMLLanguageServer() {
List commands = new ArrayList<>();
- commands.add(InitializeLaunchConfigurations.getNodeJsLocation());
+ commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
try {
URL url = FileLocator.toFileURL(getClass()
.getResource("/node_modules/vscode-html-languageserver/dist/htmlServerMain.js"));
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java
index 037f5ced73..6137b148e2 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java
@@ -35,7 +35,7 @@
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class JSonLanguageServer extends ProcessStreamConnectionProvider {
@@ -44,7 +44,7 @@ public class JSonLanguageServer extends ProcessStreamConnectionProvider {
private final static String URL_ATTR = "url"; //$NON-NLS-1$
public JSonLanguageServer() {
List commands = new ArrayList<>();
- commands.add(InitializeLaunchConfigurations.getNodeJsLocation());
+ commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
try {
URL url = FileLocator.toFileURL(getClass()
.getResource("/node_modules/vscode-json-languageserver/dist/jsonServerMain.js"));
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java
index a488a403dd..ac86f22ad2 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java
@@ -27,13 +27,13 @@
import org.eclipse.core.runtime.Status;
import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
public class JSTSLanguageServer extends ProcessStreamConnectionProvider {
public JSTSLanguageServer() {
List commands = new ArrayList<>();
- commands.add(InitializeLaunchConfigurations.getNodeJsLocation());
+ commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
try {
URL url = FileLocator.toFileURL(getClass().getResource("/node_modules/typescript-language-server/lib/cli.js"));
URL tsServer = FileLocator.toFileURL(getClass().getResource("/node_modules/typescript/lib/tsserver.js"));
diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java
index 2bcc3c3009..5183a78817 100644
--- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java
+++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java
@@ -26,7 +26,7 @@
import org.eclipse.lsp4j.jsonrpc.messages.Message;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.wildwebdeveloper.Activator;
-import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations;
+import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
@@ -37,7 +37,7 @@ public class YAMLLanguageServer extends ProcessStreamConnectionProvider {
public YAMLLanguageServer() {
List commands = new ArrayList<>();
- commands.add(InitializeLaunchConfigurations.getNodeJsLocation());
+ commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath());
try {
URL url = FileLocator.toFileURL(getClass()
.getResource("/node_modules/yaml-language-server/out/server/src/server.js"));
diff --git a/pom.xml b/pom.xml
index 7e7f139056..4d70c8bac7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,13 +20,19 @@
target-platform
+ org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64
+ org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64
+ org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64
+ org.eclipse.wildwebdeveloper.embedder.node
org.eclipse.wildwebdeveloper
org.eclipse.wildwebdeveloper.xml
org.eclipse.wildwebdeveloper.tests
+ org.eclipse.wildwebdeveloper.embedder.node.feature
org.eclipse.wildwebdeveloper.xml.feature
org.eclipse.wildwebdeveloper.feature
repository
+
@@ -157,6 +163,31 @@
download-maven-plugin
1.5.0
+
+ org.eclipse.tycho
+ target-platform-configuration
+ ${tycho-version}
+
+ p2
+
+
+ win32
+ win32
+ x86_64
+
+
+ linux
+ gtk
+ x86_64
+
+
+ macosx
+ cocoa
+ x86_64
+
+
+
+
diff --git a/target-platform/target-platform.target b/target-platform/target-platform.target
index afaf2d17d2..ffd4fb29b1 100644
--- a/target-platform/target-platform.target
+++ b/target-platform/target-platform.target
@@ -17,6 +17,7 @@
+
@@ -36,4 +37,4 @@
-
+
\ No newline at end of file