7787b897adea9bc66c7330fa6aecfa45c7c5077d
[webi-installers/.git] / node / install.bash
1 #!/bin/bash
2
3 # title: Node.js
4 # homepage: https://nodejs.org
5 # tagline: JavaScript V8 runtime
6 # description: |
7 #   Node.jsĀ® is a JavaScript runtime built on Chrome's V8 JavaScript engine
8 # examples: |
9 #
10 #   ### Hello World
11 #
12 #   ```bash
13 #   node -e 'console.log("Hello, World!")'
14 #   > Hello, World!
15 #   ```
16 #
17 #   <br/>
18 #
19 #   ### A Simple Web Server
20 #
21 #   `server.js`:
22 #
23 #   ```bash
24 #   var http = require('http');
25 #   var app = function (req, res) {
26 #     res.end('Hello, World!');
27 #   };
28 #   http.createServer(app).listen(8080, function () {
29 #     console.info('Listening on', this.address());
30 #   });
31 #   ```
32 #
33 #   <br/>
34 #
35 #   ```bash
36 #   node server.js
37 #   ```
38 #
39 #   ### An Express App
40 #
41 #   ```bash
42 #   mkdir my-server
43 #   pushd my-server
44 #   npm init
45 #   npm install --save express
46 #   ```
47 #
48 #   <br/>
49 #
50 #   `app.js`:
51 #
52 #   ```js
53 #   'use strict';
54 #
55 #   var express = require('express');
56 #   var app = express();
57 #
58 #   app.use('/', function (req, res, next) {
59 #     res.end("Hello, World!");
60 #   });
61 #
62 #   module.exports = app;</code></pre>
63 #   ```
64 #
65 #   <br/>
66 #
67 #   `server.js`:
68 #
69 #   ```js
70 #   'use strict';
71 #
72 #   var http = require('http');
73 #   var app = require('./app.js');
74 #
75 #   http.createServer(app).listen(8080, function () {
76 #     console.info('Listening on', this.address());
77 #   });
78 #   ```
79 #
80 #   <br/>
81 #
82 #   ```bash
83 #   npm start
84 #   ```
85 #
86
87 set -e
88 set -u
89
90 ##################
91 #  Install node  #
92 ##################
93
94 common_node_home="${HOME}/.local/opt/node"
95 new_node_home="${HOME}/.local/opt/node-v${WEBI_VERSION}"
96 new_node="${HOME}/.local/opt/node-v${WEBI_VERSION}/bin/node"
97
98 update_node_home() {
99     rm -rf "$common_node_home"
100     ln -s "$new_node_home" "$common_node_home"
101
102     # TODO get better output from pathman / output the path to add as return to webi bootstrap
103     webi_path_add "$common_node_home/bin"
104 }
105
106 if [ -x "$new_node" ]; then
107   update_node_home
108   echo "switched to node v${WEBI_VERSION} at $new_node_home"
109   exit 0
110 fi
111
112 # Test for existing version
113 set +e
114 cur_node="$(command -v node)"
115 set -e
116 cur_node_version=""
117 if [ -n "$cur_node" ]; then
118   cur_node_version="$("$cur_node" -v 2>/dev/null)"
119   if [ "$cur_node_version" == "v${WEBI_VERSION}" ]; then
120     echo "node v${WEBI_VERSION} already installed at $cur_node"
121     exit 0
122   else
123     if [ "$cur_node" != "$common_node_home/bin/node" ]; then
124       echo "WARN: possible conflict between node v${WEBI_VERSION} and ${cur_node_version} at ${cur_node}"
125     fi
126     if [ -x "$new_node" ]; then
127       update_node_home
128       echo "switched to node v${WEBI_VERSION} at $new_node_home"
129       exit 0
130     fi
131   fi
132 fi
133
134
135 # Note: this file is `source`d by the true installer and hence will have the webi functions
136
137 # because we created releases.js we can use webi_download()
138 # downloads node to ~/Downloads
139 webi_download
140
141 # because this is tar or zip, we can webi_extract()
142 # extracts to the WEBI_TMP directory, raw (no --strip-prefix)
143 webi_extract
144
145 pushd "$WEBI_TMP" 2>&1 >/dev/null
146     echo Installing node v${WEBI_VERSION} as "$new_node"
147
148     # simpler for single-binary commands
149     #mv ./example*/bin/example "$HOME/.local/bin"
150
151     # best for packages and toolchains
152     rm -rf "$new_node_home"
153     if [ -n "$(command -v rsync 2>/dev/null | grep rsync)" ]; then
154       rsync -Krl ./node*/ "$new_node_home/" 2>/dev/null
155     else
156       cp -Hr ./node*/* "$new_node_home/" 2>/dev/null
157       cp -Hr ./node*/.* "$new_node_home/" 2>/dev/null
158     fi
159     rm -rf ./node*
160 popd 2>&1 >/dev/null
161
162 ###################
163 #   Update PATH   #
164 ###################
165
166 update_node_home
167
168 echo "Installed 'node' and 'npm'"
169 echo ""