@oclif/core 3.0.0-beta.12 → 3.0.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/lib/args.d.ts +1 -1
- package/lib/args.js +13 -15
- package/lib/cli-ux/action/base.d.ts +1 -1
- package/lib/cli-ux/action/base.js +20 -15
- package/lib/cli-ux/action/simple.js +10 -8
- package/lib/cli-ux/action/spinner.js +11 -10
- package/lib/cli-ux/config.js +8 -7
- package/lib/cli-ux/flush.js +2 -3
- package/lib/cli-ux/index.d.ts +10 -28
- package/lib/cli-ux/index.js +26 -45
- package/lib/cli-ux/list.js +1 -1
- package/lib/cli-ux/prompt.js +24 -19
- package/lib/cli-ux/styled/index.d.ts +5 -6
- package/lib/cli-ux/styled/index.js +11 -11
- package/lib/cli-ux/styled/json.js +3 -2
- package/lib/cli-ux/styled/object.js +6 -8
- package/lib/cli-ux/styled/table.js +36 -45
- package/lib/cli-ux/wait.js +3 -5
- package/lib/command.d.ts +7 -5
- package/lib/command.js +35 -28
- package/lib/config/config.d.ts +2 -2
- package/lib/config/config.js +57 -43
- package/lib/config/plugin-loader.js +25 -11
- package/lib/config/plugin.d.ts +1 -1
- package/lib/config/plugin.js +66 -56
- package/lib/config/ts-node.d.ts +2 -1
- package/lib/config/ts-node.js +42 -46
- package/lib/config/util.d.ts +1 -5
- package/lib/config/util.js +5 -46
- package/lib/errors/config.js +1 -1
- package/lib/errors/errors/cli.d.ts +1 -1
- package/lib/errors/errors/cli.js +14 -13
- package/lib/errors/errors/exit.d.ts +0 -3
- package/lib/errors/errors/module-load.d.ts +0 -3
- package/lib/errors/errors/pretty-print.js +9 -8
- package/lib/errors/handle.d.ts +12 -2
- package/lib/errors/handle.js +23 -14
- package/lib/errors/index.d.ts +2 -2
- package/lib/errors/index.js +20 -19
- package/lib/errors/logger.js +4 -4
- package/lib/execute.d.ts +5 -5
- package/lib/execute.js +6 -5
- package/lib/flags.d.ts +102 -31
- package/lib/flags.js +75 -42
- package/lib/help/command.d.ts +2 -0
- package/lib/help/command.js +32 -32
- package/lib/help/docopts.js +2 -9
- package/lib/help/formatter.d.ts +1 -1
- package/lib/help/formatter.js +17 -17
- package/lib/help/index.d.ts +2 -2
- package/lib/help/index.js +22 -21
- package/lib/help/root.js +2 -2
- package/lib/help/util.d.ts +1 -1
- package/lib/help/util.js +9 -9
- package/lib/index.d.ts +19 -20
- package/lib/index.js +38 -42
- package/lib/interfaces/config.d.ts +5 -4
- package/lib/interfaces/errors.d.ts +1 -1
- package/lib/interfaces/parser.d.ts +168 -45
- package/lib/interfaces/plugin.d.ts +1 -0
- package/lib/main.d.ts +1 -1
- package/lib/main.js +16 -16
- package/lib/module-loader.d.ts +67 -77
- package/lib/module-loader.js +179 -149
- package/lib/parser/errors.d.ts +2 -2
- package/lib/parser/errors.js +4 -3
- package/lib/parser/help.js +3 -2
- package/lib/parser/parse.d.ts +3 -0
- package/lib/parser/parse.js +56 -52
- package/lib/parser/validate.js +9 -5
- package/lib/performance.d.ts +6 -2
- package/lib/performance.js +23 -12
- package/lib/util.d.ts +25 -1
- package/lib/util.js +93 -29
- package/package.json +10 -15
package/lib/config/ts-node.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Plugin } from '../interfaces';
|
|
1
|
+
import { Plugin, TSConfig } from '../interfaces';
|
|
2
|
+
export declare const TS_CONFIGS: Record<string, TSConfig>;
|
|
2
3
|
/**
|
|
3
4
|
* Convert a path from the compiled ./lib files to the ./src typescript source
|
|
4
5
|
* this is for developing typescript plugins/CLIs
|
package/lib/config/ts-node.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.tsPath = void 0;
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const path = require("path");
|
|
6
|
-
const settings_1 = require("../settings");
|
|
3
|
+
exports.tsPath = exports.TS_CONFIGS = void 0;
|
|
7
4
|
const util_1 = require("../util");
|
|
8
|
-
const
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
9
6
|
const config_1 = require("./config");
|
|
7
|
+
const util_2 = require("./util");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
10
9
|
const errors_1 = require("../errors");
|
|
10
|
+
const settings_1 = require("../settings");
|
|
11
11
|
// eslint-disable-next-line new-cap
|
|
12
12
|
const debug = (0, util_2.Debug)('ts-node');
|
|
13
|
-
|
|
13
|
+
exports.TS_CONFIGS = {};
|
|
14
14
|
const REGISTERED = new Set();
|
|
15
15
|
function loadTSConfig(root) {
|
|
16
|
-
if (TS_CONFIGS[root])
|
|
17
|
-
return TS_CONFIGS[root];
|
|
18
|
-
const tsconfigPath =
|
|
16
|
+
if (exports.TS_CONFIGS[root])
|
|
17
|
+
return exports.TS_CONFIGS[root];
|
|
18
|
+
const tsconfigPath = (0, node_path_1.join)(root, 'tsconfig.json');
|
|
19
19
|
let typescript;
|
|
20
20
|
try {
|
|
21
21
|
typescript = require('typescript');
|
|
22
22
|
}
|
|
23
23
|
catch {
|
|
24
24
|
try {
|
|
25
|
-
typescript = require(
|
|
25
|
+
typescript = require((0, node_path_1.join)(root, 'node_modules', 'typescript'));
|
|
26
26
|
}
|
|
27
27
|
catch { }
|
|
28
28
|
}
|
|
29
|
-
if (
|
|
30
|
-
const tsconfig = typescript.parseConfigFileTextToJson(tsconfigPath,
|
|
29
|
+
if ((0, node_fs_1.existsSync)(tsconfigPath) && typescript) {
|
|
30
|
+
const tsconfig = typescript.parseConfigFileTextToJson(tsconfigPath, (0, util_1.readJsonSync)(tsconfigPath, false)).config;
|
|
31
31
|
if (!tsconfig || !tsconfig.compilerOptions) {
|
|
32
|
-
throw new Error(`Could not read and parse tsconfig.json at ${tsconfigPath}, or it `
|
|
33
|
-
'did not contain a "compilerOptions" section.');
|
|
32
|
+
throw new Error(`Could not read and parse tsconfig.json at ${tsconfigPath}, or it `
|
|
33
|
+
+ 'did not contain a "compilerOptions" section.');
|
|
34
34
|
}
|
|
35
|
-
TS_CONFIGS[root] = tsconfig;
|
|
35
|
+
exports.TS_CONFIGS[root] = tsconfig;
|
|
36
36
|
return tsconfig;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
@@ -47,19 +47,19 @@ function registerTSNode(root) {
|
|
|
47
47
|
debug('ts-node path:', tsNodePath);
|
|
48
48
|
const tsNode = require(tsNodePath);
|
|
49
49
|
const typeRoots = [
|
|
50
|
-
|
|
50
|
+
(0, node_path_1.join)(root, 'node_modules', '@types'),
|
|
51
51
|
];
|
|
52
52
|
const rootDirs = [];
|
|
53
53
|
if (tsconfig.compilerOptions.rootDirs) {
|
|
54
54
|
for (const r of tsconfig.compilerOptions.rootDirs) {
|
|
55
|
-
rootDirs.push(
|
|
55
|
+
rootDirs.push((0, node_path_1.join)(root, r));
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
else if (tsconfig.compilerOptions.rootDir) {
|
|
59
|
-
rootDirs.push(
|
|
59
|
+
rootDirs.push((0, node_path_1.join)(root, tsconfig.compilerOptions.rootDir));
|
|
60
60
|
}
|
|
61
61
|
else {
|
|
62
|
-
rootDirs.push(
|
|
62
|
+
rootDirs.push((0, node_path_1.join)(root, 'src'));
|
|
63
63
|
}
|
|
64
64
|
const conf = {
|
|
65
65
|
compilerOptions: {
|
|
@@ -92,39 +92,35 @@ function registerTSNode(root) {
|
|
|
92
92
|
REGISTERED.add(root);
|
|
93
93
|
return tsconfig;
|
|
94
94
|
}
|
|
95
|
-
// eslint-disable-next-line complexity
|
|
96
95
|
function tsPath(root, orig, plugin) {
|
|
97
96
|
if (!orig)
|
|
98
97
|
return orig;
|
|
99
|
-
orig = orig.startsWith(root) ? orig :
|
|
98
|
+
orig = orig.startsWith(root) ? orig : (0, node_path_1.join)(root, orig);
|
|
100
99
|
// NOTE: The order of these checks matter!
|
|
101
100
|
if (settings_1.settings.tsnodeEnabled === false) {
|
|
102
101
|
debug(`Skipping ts-node registration for ${root} because tsNodeEnabled is explicitly set to false`);
|
|
103
102
|
return orig;
|
|
104
103
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
const isProduction = (0, util_1.isProd)();
|
|
105
|
+
/**
|
|
106
|
+
* Skip ts-node registration for ESM plugins.
|
|
107
|
+
* The node ecosystem is not mature enough to support auto-transpiling ESM modules at this time.
|
|
108
|
+
* See the following:
|
|
109
|
+
* - https://github.com/TypeStrong/ts-node/issues/1791#issuecomment-1149754228
|
|
110
|
+
* - https://github.com/nodejs/node/issues/49432
|
|
111
|
+
* - https://github.com/nodejs/node/pull/49407
|
|
112
|
+
* - https://github.com/nodejs/node/issues/34049
|
|
113
|
+
*
|
|
114
|
+
* We still register ts-node for ESM plugins when NODE_ENV is "test" or "development" and root plugin is also ESM.
|
|
115
|
+
* In other words, this allows plugins to be auto-transpiled when developing locally using `bin/dev.js`.
|
|
116
|
+
*/
|
|
117
|
+
if ((isProduction || config_1.Config.rootPlugin?.moduleType === 'commonjs') && plugin?.moduleType === 'module') {
|
|
118
|
+
debug(`Skipping ts-node registration for ${root} because it's an ESM module (NODE_ENV: ${process.env.NODE_ENV}, root plugin module type: ${config_1.Config.rootPlugin?.moduleType})))`);
|
|
108
119
|
if (plugin.type === 'link')
|
|
109
|
-
(0, errors_1.memoizedWarn)(`${plugin.name} is a linked ESM module and cannot be auto-
|
|
120
|
+
(0, errors_1.memoizedWarn)(`${plugin.name} is a linked ESM module and cannot be auto-transpiled. Existing compiled source will be used instead.`);
|
|
110
121
|
return orig;
|
|
111
122
|
}
|
|
112
|
-
|
|
113
|
-
// either in the NODE_OPTIONS env var or from the exec args. If the ts-node/esm loader has NOT been loaded then we want
|
|
114
|
-
// to skip ts-node registration so that it falls back on the compiled source.
|
|
115
|
-
if (plugin?.moduleType === 'module') {
|
|
116
|
-
const tsNodeEsmLoaderInExecArgv = process.execArgv.includes('--loader') && process.execArgv.includes('ts-node/esm');
|
|
117
|
-
const tsNodeEsmLoaderInNodeOptions = process.env.NODE_OPTIONS?.includes('--loader=ts-node/esm') ?? false;
|
|
118
|
-
if (!tsNodeEsmLoaderInExecArgv && !tsNodeEsmLoaderInNodeOptions) {
|
|
119
|
-
debug(`Skipping ts-node registration for ${root} because it's an ESM module but the ts-node/esm loader hasn't been run`);
|
|
120
|
-
debug('try setting NODE_OPTIONS="--loader ts-node/esm" in your environment.');
|
|
121
|
-
if (plugin.type === 'link') {
|
|
122
|
-
(0, errors_1.memoizedWarn)(`${plugin.name} is a linked ESM module and cannot be auto-compiled without setting NODE_OPTIONS="--loader=ts-node/esm" in the environment. Existing compiled source will be used instead.`);
|
|
123
|
-
}
|
|
124
|
-
return orig;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
if (settings_1.settings.tsnodeEnabled === undefined && (0, util_1.isProd)() && plugin?.type !== 'link') {
|
|
123
|
+
if (settings_1.settings.tsnodeEnabled === undefined && isProduction && plugin?.type !== 'link') {
|
|
128
124
|
debug(`Skipping ts-node registration for ${root} because NODE_ENV is NOT "test" or "development"`);
|
|
129
125
|
return orig;
|
|
130
126
|
}
|
|
@@ -137,17 +133,17 @@ function tsPath(root, orig, plugin) {
|
|
|
137
133
|
if (!rootDirPath || !outDir)
|
|
138
134
|
return orig;
|
|
139
135
|
// rewrite path from ./lib/foo to ./src/foo
|
|
140
|
-
const lib =
|
|
141
|
-
const src =
|
|
142
|
-
const relative =
|
|
136
|
+
const lib = (0, node_path_1.join)(root, outDir); // ./lib
|
|
137
|
+
const src = (0, node_path_1.join)(root, rootDirPath); // ./src
|
|
138
|
+
const relative = (0, node_path_1.relative)(lib, orig); // ./commands
|
|
143
139
|
// For hooks, it might point to a js file, not a module. Something like "./hooks/myhook.js" which doesn't need the js.
|
|
144
|
-
const out =
|
|
140
|
+
const out = (0, node_path_1.join)(src, relative).replace(/\.js$/, ''); // ./src/commands
|
|
145
141
|
// this can be a directory of commands or point to a hook file
|
|
146
142
|
// if it's a directory, we check if the path exists. If so, return the path to the directory.
|
|
147
143
|
// For hooks, it might point to a module, not a file. Something like "./hooks/myhook"
|
|
148
144
|
// That file doesn't exist, and the real file is "./hooks/myhook.ts"
|
|
149
145
|
// In that case we attempt to resolve to the filename. If it fails it will revert back to the lib path
|
|
150
|
-
if (
|
|
146
|
+
if ((0, node_fs_1.existsSync)(out) || (0, node_fs_1.existsSync)(out + '.ts'))
|
|
151
147
|
return out;
|
|
152
148
|
return orig;
|
|
153
149
|
}
|
package/lib/config/util.d.ts
CHANGED
|
@@ -4,13 +4,9 @@ export declare function mapValues<T extends Record<string, any>, TResult>(obj: {
|
|
|
4
4
|
}, fn: (i: T[keyof T], k: keyof T) => TResult): {
|
|
5
5
|
[P in keyof T]: TResult;
|
|
6
6
|
};
|
|
7
|
-
export declare function exists(path: string): Promise<boolean>;
|
|
8
7
|
export declare function resolvePackage(id: string, paths: {
|
|
9
8
|
paths: string[];
|
|
10
9
|
}): string;
|
|
11
|
-
export declare function loadJSON(path: string): Promise<any>;
|
|
12
|
-
export declare function compact<T>(a: (T | undefined)[]): T[];
|
|
13
|
-
export declare function uniq<T>(arr: T[]): T[];
|
|
14
10
|
export declare function Debug(...scope: string[]): (..._: any) => void;
|
|
15
11
|
export declare function getPermutations(arr: string[]): Array<string[]>;
|
|
16
12
|
export declare function getCommandIdPermutations(commandId: string): string[];
|
|
@@ -33,4 +29,4 @@ export declare function getCommandIdPermutations(commandId: string): string[];
|
|
|
33
29
|
* @param commandIds string[]
|
|
34
30
|
* @returns string[]
|
|
35
31
|
*/
|
|
36
|
-
export declare
|
|
32
|
+
export declare const collectUsableIds: (commandIds: string[]) => Set<string>;
|
package/lib/config/util.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.collectUsableIds = exports.getCommandIdPermutations = exports.getPermutations = exports.Debug = exports.
|
|
4
|
-
const fs = require("fs");
|
|
3
|
+
exports.collectUsableIds = exports.getCommandIdPermutations = exports.getPermutations = exports.Debug = exports.resolvePackage = exports.mapValues = exports.flatMap = void 0;
|
|
5
4
|
const debug = require('debug');
|
|
6
5
|
function flatMap(arr, fn) {
|
|
7
6
|
return arr.reduce((arr, i) => [...arr, ...fn(i)], []);
|
|
@@ -15,40 +14,10 @@ function mapValues(obj, fn) {
|
|
|
15
14
|
}, {});
|
|
16
15
|
}
|
|
17
16
|
exports.mapValues = mapValues;
|
|
18
|
-
function exists(path) {
|
|
19
|
-
// eslint-disable-next-line no-promise-executor-return
|
|
20
|
-
return new Promise(resolve => resolve(fs.existsSync(path)));
|
|
21
|
-
}
|
|
22
|
-
exports.exists = exists;
|
|
23
17
|
function resolvePackage(id, paths) {
|
|
24
18
|
return require.resolve(id, paths);
|
|
25
19
|
}
|
|
26
20
|
exports.resolvePackage = resolvePackage;
|
|
27
|
-
function loadJSON(path) {
|
|
28
|
-
debug('config')('loadJSON %s', path);
|
|
29
|
-
return new Promise((resolve, reject) => {
|
|
30
|
-
fs.readFile(path, 'utf8', (err, d) => {
|
|
31
|
-
try {
|
|
32
|
-
if (err)
|
|
33
|
-
reject(err);
|
|
34
|
-
else
|
|
35
|
-
resolve(JSON.parse(d));
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
reject(error);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
exports.loadJSON = loadJSON;
|
|
44
|
-
function compact(a) {
|
|
45
|
-
return a.filter((a) => Boolean(a));
|
|
46
|
-
}
|
|
47
|
-
exports.compact = compact;
|
|
48
|
-
function uniq(arr) {
|
|
49
|
-
return [...new Set(arr)].sort();
|
|
50
|
-
}
|
|
51
|
-
exports.uniq = uniq;
|
|
52
21
|
function displayWarnings() {
|
|
53
22
|
if (process.listenerCount('warning') > 1)
|
|
54
23
|
return;
|
|
@@ -60,7 +29,9 @@ function displayWarnings() {
|
|
|
60
29
|
}
|
|
61
30
|
function Debug(...scope) {
|
|
62
31
|
if (!debug)
|
|
63
|
-
return (..._) => {
|
|
32
|
+
return (..._) => {
|
|
33
|
+
// noop
|
|
34
|
+
};
|
|
64
35
|
const d = debug(['config', ...scope].join(':'));
|
|
65
36
|
if (d.enabled)
|
|
66
37
|
displayWarnings();
|
|
@@ -111,17 +82,5 @@ exports.getCommandIdPermutations = getCommandIdPermutations;
|
|
|
111
82
|
* @param commandIds string[]
|
|
112
83
|
* @returns string[]
|
|
113
84
|
*/
|
|
114
|
-
|
|
115
|
-
const usuableIds = [];
|
|
116
|
-
for (const id of commandIds) {
|
|
117
|
-
const parts = id.split(':');
|
|
118
|
-
while (parts.length > 0) {
|
|
119
|
-
const name = parts.join(':');
|
|
120
|
-
if (name)
|
|
121
|
-
usuableIds.push(name);
|
|
122
|
-
parts.pop();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return new Set(usuableIds);
|
|
126
|
-
}
|
|
85
|
+
const collectUsableIds = (commandIds) => new Set(commandIds.flatMap(id => id.split(':').map((_, i, a) => a.slice(0, i + 1).join(':'))));
|
|
127
86
|
exports.collectUsableIds = collectUsableIds;
|
package/lib/errors/config.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
|
-
const settings_1 = require("../settings");
|
|
5
4
|
const logger_1 = require("./logger");
|
|
5
|
+
const settings_1 = require("../settings");
|
|
6
6
|
function displayWarnings() {
|
|
7
7
|
if (process.listenerCount('warning') > 1)
|
|
8
8
|
return;
|
package/lib/errors/errors/cli.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CLIError = exports.addOclifExitCode = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const cs = require("clean-stack");
|
|
7
|
-
const wrap = require("wrap-ansi");
|
|
8
|
-
const screen = require("../../screen");
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
9
6
|
const config_1 = require("../config");
|
|
7
|
+
const clean_stack_1 = tslib_1.__importDefault(require("clean-stack"));
|
|
8
|
+
const screen_1 = require("../../screen");
|
|
9
|
+
const indent_string_1 = tslib_1.__importDefault(require("indent-string"));
|
|
10
|
+
const wrap_ansi_1 = tslib_1.__importDefault(require("wrap-ansi"));
|
|
10
11
|
/**
|
|
11
12
|
* properties specific to internal oclif error handling
|
|
12
13
|
*/
|
|
@@ -27,7 +28,7 @@ class CLIError extends Error {
|
|
|
27
28
|
this.suggestions = options.suggestions;
|
|
28
29
|
}
|
|
29
30
|
get stack() {
|
|
30
|
-
return
|
|
31
|
+
return (0, clean_stack_1.default)(super.stack, { pretty: true });
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* @deprecated `render` Errors display should be handled by display function, like pretty-print
|
|
@@ -38,15 +39,15 @@ class CLIError extends Error {
|
|
|
38
39
|
return this.stack;
|
|
39
40
|
}
|
|
40
41
|
let output = `${this.name}: ${this.message}`;
|
|
41
|
-
output =
|
|
42
|
-
output =
|
|
43
|
-
output =
|
|
44
|
-
output =
|
|
42
|
+
output = (0, wrap_ansi_1.default)(output, screen_1.errtermwidth - 6, { trim: false, hard: true });
|
|
43
|
+
output = (0, indent_string_1.default)(output, 3);
|
|
44
|
+
output = (0, indent_string_1.default)(output, 1, { indent: this.bang, includeEmptyLines: true });
|
|
45
|
+
output = (0, indent_string_1.default)(output, 1);
|
|
45
46
|
return output;
|
|
46
47
|
}
|
|
47
48
|
get bang() {
|
|
48
49
|
try {
|
|
49
|
-
return
|
|
50
|
+
return chalk_1.default.red(process.platform === 'win32' ? '»' : '›');
|
|
50
51
|
}
|
|
51
52
|
catch { }
|
|
52
53
|
}
|
|
@@ -60,10 +61,10 @@ exports.CLIError = CLIError;
|
|
|
60
61
|
}
|
|
61
62
|
get bang() {
|
|
62
63
|
try {
|
|
63
|
-
return
|
|
64
|
+
return chalk_1.default.yellow(process.platform === 'win32' ? '»' : '›');
|
|
64
65
|
}
|
|
65
66
|
catch { }
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
CLIError.Warn = Warn;
|
|
69
|
-
})(CLIError
|
|
70
|
+
})(CLIError || (exports.CLIError = CLIError = {}));
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.applyPrettyPrintOptions = void 0;
|
|
4
|
-
const
|
|
5
|
-
const indent = require("indent-string");
|
|
6
|
-
const screen = require("../../screen");
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
7
5
|
const config_1 = require("../config");
|
|
6
|
+
const screen_1 = require("../../screen");
|
|
7
|
+
const indent_string_1 = tslib_1.__importDefault(require("indent-string"));
|
|
8
|
+
const wrap_ansi_1 = tslib_1.__importDefault(require("wrap-ansi"));
|
|
8
9
|
function applyPrettyPrintOptions(error, options) {
|
|
9
10
|
const prettyErrorKeys = ['message', 'code', 'ref', 'suggestions'];
|
|
10
11
|
for (const key of prettyErrorKeys) {
|
|
@@ -23,7 +24,7 @@ const formatSuggestions = (suggestions) => {
|
|
|
23
24
|
if (suggestions.length === 1)
|
|
24
25
|
return `${label} ${suggestions[0]}`;
|
|
25
26
|
const multiple = suggestions.map(suggestion => `* ${suggestion}`).join('\n');
|
|
26
|
-
return `${label}\n${
|
|
27
|
+
return `${label}\n${(0, indent_string_1.default)(multiple, 2)}`;
|
|
27
28
|
};
|
|
28
29
|
function prettyPrint(error) {
|
|
29
30
|
if (config_1.config.debug) {
|
|
@@ -39,10 +40,10 @@ function prettyPrint(error) {
|
|
|
39
40
|
const formatted = [formattedHeader, formattedCode, formattedSuggestions, formattedReference]
|
|
40
41
|
.filter(Boolean)
|
|
41
42
|
.join('\n');
|
|
42
|
-
let output =
|
|
43
|
-
output =
|
|
44
|
-
output =
|
|
45
|
-
output =
|
|
43
|
+
let output = (0, wrap_ansi_1.default)(formatted, screen_1.errtermwidth - 6, { trim: false, hard: true });
|
|
44
|
+
output = (0, indent_string_1.default)(output, 3);
|
|
45
|
+
output = (0, indent_string_1.default)(output, 1, { indent: bang || '', includeEmptyLines: true });
|
|
46
|
+
output = (0, indent_string_1.default)(output, 1);
|
|
46
47
|
return output;
|
|
47
48
|
}
|
|
48
49
|
exports.default = prettyPrint;
|
package/lib/errors/handle.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { OclifError, PrettyPrintableError } from '../interfaces';
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* This is an odd abstraction for process.exit, but it allows us to stub it in tests.
|
|
4
|
+
*
|
|
5
|
+
* https://github.com/sinonjs/sinon/issues/562
|
|
6
|
+
*/
|
|
7
|
+
export declare const Exit: {
|
|
8
|
+
exit(code?: number): never;
|
|
9
|
+
};
|
|
10
|
+
type ErrorToHandle = Error & Partial<PrettyPrintableError> & Partial<OclifError> & {
|
|
3
11
|
skipOclifErrorHandling?: boolean;
|
|
4
|
-
}
|
|
12
|
+
};
|
|
13
|
+
export declare function handle(err: ErrorToHandle): Promise<void>;
|
|
14
|
+
export {};
|
package/lib/errors/handle.js
CHANGED
|
@@ -1,41 +1,50 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handle = void 0;
|
|
4
|
-
|
|
5
|
-
/* eslint-disable unicorn/no-process-exit */
|
|
6
|
-
const config_1 = require("./config");
|
|
7
|
-
const pretty_print_1 = require("./errors/pretty-print");
|
|
8
|
-
const _1 = require(".");
|
|
9
|
-
const clean = require("clean-stack");
|
|
3
|
+
exports.handle = exports.Exit = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
10
5
|
const cli_1 = require("./errors/cli");
|
|
6
|
+
const _1 = require(".");
|
|
7
|
+
const clean_stack_1 = tslib_1.__importDefault(require("clean-stack"));
|
|
8
|
+
const config_1 = require("./config");
|
|
9
|
+
const pretty_print_1 = tslib_1.__importDefault(require("./errors/pretty-print"));
|
|
10
|
+
/**
|
|
11
|
+
* This is an odd abstraction for process.exit, but it allows us to stub it in tests.
|
|
12
|
+
*
|
|
13
|
+
* https://github.com/sinonjs/sinon/issues/562
|
|
14
|
+
*/
|
|
15
|
+
exports.Exit = {
|
|
16
|
+
exit(code = 0) {
|
|
17
|
+
process.exit(code);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
11
20
|
async function handle(err) {
|
|
12
21
|
try {
|
|
13
22
|
if (!err)
|
|
14
23
|
err = new cli_1.CLIError('no error?');
|
|
15
24
|
if (err.message === 'SIGINT')
|
|
16
|
-
|
|
25
|
+
exports.Exit.exit(1);
|
|
17
26
|
const shouldPrint = !(err instanceof _1.ExitError) && !err.skipOclifErrorHandling;
|
|
18
27
|
const pretty = (0, pretty_print_1.default)(err);
|
|
19
|
-
const stack =
|
|
28
|
+
const stack = (0, clean_stack_1.default)(err.stack || '', { pretty: true });
|
|
20
29
|
if (shouldPrint) {
|
|
21
|
-
console.error(pretty
|
|
30
|
+
console.error(pretty ?? stack);
|
|
22
31
|
}
|
|
23
|
-
const exitCode = err.oclif?.exit
|
|
32
|
+
const exitCode = err.oclif?.exit ?? 1;
|
|
24
33
|
if (config_1.config.errorLogger && err.code !== 'EEXIT') {
|
|
25
34
|
if (stack) {
|
|
26
35
|
config_1.config.errorLogger.log(stack);
|
|
27
36
|
}
|
|
28
37
|
await config_1.config.errorLogger.flush()
|
|
29
|
-
.then(() =>
|
|
38
|
+
.then(() => exports.Exit.exit(exitCode))
|
|
30
39
|
.catch(console.error);
|
|
31
40
|
}
|
|
32
41
|
else
|
|
33
|
-
|
|
42
|
+
exports.Exit.exit(exitCode);
|
|
34
43
|
}
|
|
35
44
|
catch (error) {
|
|
36
45
|
console.error(err.stack);
|
|
37
46
|
console.error(error.stack);
|
|
38
|
-
|
|
47
|
+
exports.Exit.exit(1);
|
|
39
48
|
}
|
|
40
49
|
}
|
|
41
50
|
exports.handle = handle;
|
package/lib/errors/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import { PrettyPrintableError } from '../interfaces';
|
|
1
2
|
export { handle } from './handle';
|
|
2
3
|
export { ExitError } from './errors/exit';
|
|
3
4
|
export { ModuleLoadError } from './errors/module-load';
|
|
4
5
|
export { CLIError } from './errors/cli';
|
|
5
6
|
export { Logger } from './logger';
|
|
6
7
|
export { config } from './config';
|
|
7
|
-
import { PrettyPrintableError } from '../interfaces';
|
|
8
|
-
export { PrettyPrintableError };
|
|
9
8
|
export declare function exit(code?: number): never;
|
|
10
9
|
export declare function error(input: string | Error, options: {
|
|
11
10
|
exit: false;
|
|
@@ -15,3 +14,4 @@ export declare function error(input: string | Error, options?: {
|
|
|
15
14
|
} & PrettyPrintableError): never;
|
|
16
15
|
export declare function warn(input: string | Error): void;
|
|
17
16
|
export declare function memoizedWarn(input: string | Error): void;
|
|
17
|
+
export { PrettyPrintableError } from '../interfaces';
|
package/lib/errors/index.js
CHANGED
|
@@ -1,33 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.memoizedWarn = exports.warn = exports.error = exports.exit = exports.config = exports.Logger = exports.CLIError = exports.ModuleLoadError = exports.ExitError = exports.handle = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const cli_1 = require("./errors/cli");
|
|
6
|
+
const pretty_print_1 = tslib_1.__importStar(require("./errors/pretty-print"));
|
|
7
|
+
const exit_1 = require("./errors/exit");
|
|
8
|
+
const config_1 = require("./config");
|
|
4
9
|
var handle_1 = require("./handle");
|
|
5
10
|
Object.defineProperty(exports, "handle", { enumerable: true, get: function () { return handle_1.handle; } });
|
|
6
|
-
var
|
|
7
|
-
Object.defineProperty(exports, "ExitError", { enumerable: true, get: function () { return
|
|
11
|
+
var exit_2 = require("./errors/exit");
|
|
12
|
+
Object.defineProperty(exports, "ExitError", { enumerable: true, get: function () { return exit_2.ExitError; } });
|
|
8
13
|
var module_load_1 = require("./errors/module-load");
|
|
9
14
|
Object.defineProperty(exports, "ModuleLoadError", { enumerable: true, get: function () { return module_load_1.ModuleLoadError; } });
|
|
10
|
-
var
|
|
11
|
-
Object.defineProperty(exports, "CLIError", { enumerable: true, get: function () { return
|
|
15
|
+
var cli_2 = require("./errors/cli");
|
|
16
|
+
Object.defineProperty(exports, "CLIError", { enumerable: true, get: function () { return cli_2.CLIError; } });
|
|
12
17
|
var logger_1 = require("./logger");
|
|
13
18
|
Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
|
|
14
|
-
var
|
|
15
|
-
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return
|
|
16
|
-
const config_2 = require("./config");
|
|
17
|
-
const cli_2 = require("./errors/cli");
|
|
18
|
-
const exit_2 = require("./errors/exit");
|
|
19
|
-
const pretty_print_1 = require("./errors/pretty-print");
|
|
19
|
+
var config_2 = require("./config");
|
|
20
|
+
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return config_2.config; } });
|
|
20
21
|
function exit(code = 0) {
|
|
21
|
-
throw new
|
|
22
|
+
throw new exit_1.ExitError(code);
|
|
22
23
|
}
|
|
23
24
|
exports.exit = exit;
|
|
24
25
|
function error(input, options = {}) {
|
|
25
26
|
let err;
|
|
26
27
|
if (typeof input === 'string') {
|
|
27
|
-
err = new
|
|
28
|
+
err = new cli_1.CLIError(input, options);
|
|
28
29
|
}
|
|
29
30
|
else if (input instanceof Error) {
|
|
30
|
-
err = (0,
|
|
31
|
+
err = (0, cli_1.addOclifExitCode)(input, options);
|
|
31
32
|
}
|
|
32
33
|
else {
|
|
33
34
|
throw new TypeError('first argument must be a string or instance of Error');
|
|
@@ -36,8 +37,8 @@ function error(input, options = {}) {
|
|
|
36
37
|
if (options.exit === false) {
|
|
37
38
|
const message = (0, pretty_print_1.default)(err);
|
|
38
39
|
console.error(message);
|
|
39
|
-
if (
|
|
40
|
-
|
|
40
|
+
if (config_1.config.errorLogger)
|
|
41
|
+
config_1.config.errorLogger.log(err?.stack ?? '');
|
|
41
42
|
}
|
|
42
43
|
else
|
|
43
44
|
throw err;
|
|
@@ -46,18 +47,18 @@ exports.error = error;
|
|
|
46
47
|
function warn(input) {
|
|
47
48
|
let err;
|
|
48
49
|
if (typeof input === 'string') {
|
|
49
|
-
err = new
|
|
50
|
+
err = new cli_1.CLIError.Warn(input);
|
|
50
51
|
}
|
|
51
52
|
else if (input instanceof Error) {
|
|
52
|
-
err = (0,
|
|
53
|
+
err = (0, cli_1.addOclifExitCode)(input);
|
|
53
54
|
}
|
|
54
55
|
else {
|
|
55
56
|
throw new TypeError('first argument must be a string or instance of Error');
|
|
56
57
|
}
|
|
57
58
|
const message = (0, pretty_print_1.default)(err);
|
|
58
59
|
console.error(message);
|
|
59
|
-
if (
|
|
60
|
-
|
|
60
|
+
if (config_1.config.errorLogger)
|
|
61
|
+
config_1.config.errorLogger.log(err?.stack ?? '');
|
|
61
62
|
}
|
|
62
63
|
exports.warn = warn;
|
|
63
64
|
const WARNINGS = new Set();
|
package/lib/errors/logger.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Logger = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
6
|
const stripAnsi = require("strip-ansi");
|
|
7
7
|
const timestamp = () => new Date().toISOString();
|
|
8
8
|
let timer;
|
|
@@ -35,8 +35,8 @@ class Logger {
|
|
|
35
35
|
return;
|
|
36
36
|
const mylines = this.buffer;
|
|
37
37
|
this.buffer = [];
|
|
38
|
-
await
|
|
39
|
-
await
|
|
38
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)(this.file), { recursive: true });
|
|
39
|
+
await (0, promises_1.appendFile)(this.file, mylines.join('\n') + '\n');
|
|
40
40
|
});
|
|
41
41
|
await this.flushing;
|
|
42
42
|
}
|
package/lib/execute.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { LoadOptions } from './interfaces';
|
|
2
2
|
/**
|
|
3
3
|
* Load and run oclif CLI
|
|
4
4
|
*
|
|
@@ -7,7 +7,7 @@ import * as Interfaces from './interfaces';
|
|
|
7
7
|
*
|
|
8
8
|
* @example For ESM dev.js
|
|
9
9
|
* ```
|
|
10
|
-
* #!/usr/bin/env node
|
|
10
|
+
* #!/usr/bin/env ts-node
|
|
11
11
|
* void (async () => {
|
|
12
12
|
* const oclif = await import('@oclif/core')
|
|
13
13
|
* await oclif.execute({development: true, dir: import.meta.url})
|
|
@@ -25,7 +25,7 @@ import * as Interfaces from './interfaces';
|
|
|
25
25
|
*
|
|
26
26
|
* @example For CJS dev.js
|
|
27
27
|
* ```
|
|
28
|
-
* #!/usr/bin/env node
|
|
28
|
+
* #!/usr/bin/env ts-node
|
|
29
29
|
* void (async () => {
|
|
30
30
|
* const oclif = await import('@oclif/core')
|
|
31
31
|
* await oclif.execute({development: true, dir: __dirname})
|
|
@@ -41,9 +41,9 @@ import * as Interfaces from './interfaces';
|
|
|
41
41
|
* })()
|
|
42
42
|
* ```
|
|
43
43
|
*/
|
|
44
|
-
export
|
|
44
|
+
export declare function execute(options: {
|
|
45
45
|
dir: string;
|
|
46
46
|
args?: string[];
|
|
47
|
-
loadOptions?:
|
|
47
|
+
loadOptions?: LoadOptions;
|
|
48
48
|
development?: boolean;
|
|
49
49
|
}): Promise<unknown>;
|