]> git.wincent.com - wincent.git/blob - aspects/node/index.ts
40c036ad77886d3284419dca994acdc0f22e1cae
[wincent.git] / aspects / node / index.ts
1 import {attributes, command, file, path, skip, task} from 'fig';
2
3 const NODE_VERSION = '16.13.0';
4
5 const n = path.root.join('vendor/n/bin/n');
6 const bin = path.home.join(`n/bin`);
7 const npm = bin.join('npm');
8
9 task('make ~/n', async () => {
10   await file({path: '~/n', state: 'directory'});
11 });
12
13 task('hide ~/n', async () => {
14   if (attributes.platform === 'darwin') {
15     await command('chflags', ['hidden', '~/n']);
16   }
17 });
18
19 task(`install Node.js v${NODE_VERSION}`, async () => {
20   const env = {
21     ...process.env,
22     N_PREFIX: path.home.join('n'),
23   };
24
25   await command(n, [NODE_VERSION], {
26     creates: `~/n/n/versions/node/${NODE_VERSION}/bin/node`,
27     env,
28   });
29 });
30
31 task('install global packages', async () => {
32   const env = {
33     ...process.env,
34     N_PREFIX: path.home.join('n'),
35     PATH: `${bin}:${process.env.PATH}`,
36   };
37
38   const packages = [
39     'bs-platform',
40     'flow-bin',
41     'flow-typed',
42     'gatsby-cli',
43     'typescript-language-server',
44     'neovim',
45     'ocaml-language-server',
46     'reason-cli',
47     'source-map-explorer',
48     'typescript',
49     'vim-language-server',
50     'yarn@1.22.15',
51   ];
52
53   for (const name of packages) {
54     const result = await command(npm, ['ls', '-g', '--parseable', name], {
55       env,
56       failedWhen: () => false,
57     });
58
59     if (result && result.status === 0) {
60       skip(`package ${name} (already installed)`);
61     } else {
62       await command(npm, ['install', '-g', name], {env});
63     }
64   }
65 });