|
1 | 1 | #!/usr/bin/env node
|
2 |
| -import 'main-dir'; |
3 |
| -import SourceMapSupport = require('source-map-support'); |
| 2 | + |
4 | 3 | import { satisfies } from 'semver';
|
5 | 4 | import * as chalk from 'chalk';
|
6 | 5 | import * as path from 'path';
|
7 | 6 | import * as fs from 'fs';
|
8 | 7 | import * as NestedError from 'nested-error-stacks';
|
9 | 8 | import * as resolve from 'resolve';
|
10 |
| -import findup = require('findup-sync'); |
| 9 | +import { sync as readPkgUp } from 'read-pkg-up'; |
| 10 | +import * as pkgDir from 'pkg-dir'; |
11 | 11 |
|
12 | 12 | /* tslint:disable:no-console */
|
13 | 13 |
|
14 |
| -SourceMapSupport.install(); |
15 |
| - |
16 | 14 | process.title = 'denali';
|
17 | 15 |
|
18 | 16 | let version = process.version;
|
19 | 17 |
|
20 | 18 | if (!satisfies(process.version, '>=7.6')) {
|
21 |
| - console.error(chalk.red('`denali` requires node version >= 7.6, you used ' + version)); |
22 |
| - process.exit(1); |
| 19 | + throw new Error(`Denali requires node version >= 7.6, you used ${ version }`); |
23 | 20 | }
|
24 | 21 |
|
25 |
| -let pkgPath = findup('package.json'); |
| 22 | +let projectPkg: any = null; |
| 23 | +let cliPkg: any; |
| 24 | +let cliBootstrapPath: string; |
| 25 | +let source: string; |
26 | 26 |
|
27 |
| -/** |
28 |
| - * Load the globally installed version of the CLI and kick it off from there. Commands will be |
29 |
| - * loaded from the global package namespace. |
30 |
| - */ |
31 |
| -function loadGlobalCli() { |
32 |
| - let pkg = require('../../package.json'); |
33 |
| - process.stdout.write(`cli v${ pkg.version } [global] `); |
| 27 | +try { |
34 | 28 | try {
|
35 |
| - require('../lib/bootstrap').default(); |
36 |
| - } catch (error) { |
37 |
| - throw new NestedError('Globally installed CLI failed to load', error); |
| 29 | + projectPkg = readPkgUp().pkg; |
| 30 | + let projectDir = pkgDir(); |
| 31 | + let localCliMain = resolve.sync('denali-cli', { basedir: projectDir }); |
| 32 | + let localCliDir = pkgDir(localCliMain); |
| 33 | + cliPkg = readPkgUp({ cwd: localCliMain }); |
| 34 | + process.chdir(projectDir); |
| 35 | + source = fs.lstatSync(localCliDir).isSymbolicLink() ? 'linked' : 'local'; |
| 36 | + cliBootstrapPath = path.join(localCliDir, 'dist/lib/bootstrap'); |
| 37 | + } catch (e) { |
| 38 | + cliPkg = readPkgUp({ cwd: __dirname }).pkg; |
| 39 | + cliBootstrapPath = path.join(__dirname, '../lib/bootstrap'); |
| 40 | + source = 'global'; |
38 | 41 | }
|
39 |
| -} |
40 | 42 |
|
41 |
| -// No package.json found, revert to global install |
42 |
| -if (!pkgPath) { |
43 |
| - loadGlobalCli(); |
44 |
| -// Package.json found |
45 |
| -} else { |
46 |
| - let pkg = require(pkgPath); |
47 |
| - let pkgDir = path.dirname(path.resolve(pkgPath)); |
48 |
| - // If a local copy of denali exists, use that, unless we are actually running |
49 |
| - // this in the denali repo itself |
| 43 | + process.stdout.write(`cli v${ cliPkg.version } [${ source }]`); |
| 44 | + |
50 | 45 | try {
|
51 |
| - let localCliMain = resolve.sync('denali-cli', { basedir: pkgDir }); |
52 |
| - let localCliDir = path.dirname(findup('package.json', { cwd: localCliMain })); |
53 |
| - let cliPkgType = fs.lstatSync(localCliDir).isSymbolicLink() ? 'linked' : 'local'; |
54 |
| - let localCliPkg = require(path.join(localCliDir, 'package.json')); |
55 |
| - process.stdout.write(`cli v${ localCliPkg.version } [${ cliPkgType }] `); |
56 |
| - try { |
57 |
| - process.chdir(pkgDir); |
58 |
| - require(path.join(localCliDir, 'dist', 'lib', 'bootstrap')).default(pkg); |
59 |
| - } catch (error) { |
60 |
| - throw new NestedError('Error encountered while starting up denali-cli', error); |
61 |
| - } |
62 |
| - } catch (e) { |
63 |
| - loadGlobalCli(); |
| 46 | + require(cliBootstrapPath).default(projectPkg); |
| 47 | + } catch (error) { |
| 48 | + throw new NestedError('\nError encountered while starting up denali-cli', error); |
64 | 49 | }
|
| 50 | +} catch (e) { |
| 51 | + console.error(chalk.red(e.stack || e.message || e)); |
| 52 | + process.exit(1); |
65 | 53 | }
|
0 commit comments