@mikeyt23/node-cli-utils 2.0.19 → 2.0.21
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/dist/cjs/DependencyChecker.d.ts +3 -0
- package/dist/cjs/DependencyChecker.d.ts.map +1 -1
- package/dist/cjs/DependencyChecker.js +5 -2
- package/dist/cjs/DotnetSdkUtility.d.ts +18 -0
- package/dist/cjs/DotnetSdkUtility.d.ts.map +1 -0
- package/dist/cjs/DotnetSdkUtility.js +56 -0
- package/dist/cjs/DotnetVersion.d.ts +14 -0
- package/dist/cjs/DotnetVersion.d.ts.map +1 -0
- package/dist/cjs/DotnetVersion.js +40 -0
- package/dist/cjs/GitUtility.js +1 -1
- package/dist/cjs/NixUtil.js +1 -1
- package/dist/cjs/NugetUtility.d.ts +39 -12
- package/dist/cjs/NugetUtility.d.ts.map +1 -1
- package/dist/cjs/NugetUtility.js +111 -57
- package/dist/cjs/TarballUtility.d.ts +1 -0
- package/dist/cjs/TarballUtility.d.ts.map +1 -1
- package/dist/cjs/TarballUtility.js +1 -1
- package/dist/cjs/certUtils.js +1 -1
- package/dist/cjs/dockerUtils.js +2 -2
- package/dist/cjs/dotnetUtils.d.ts +99 -7
- package/dist/cjs/dotnetUtils.d.ts.map +1 -1
- package/dist/cjs/dotnetUtils.js +328 -23
- package/dist/cjs/generalUtils.d.ts +19 -5
- package/dist/cjs/generalUtils.d.ts.map +1 -1
- package/dist/cjs/generalUtils.js +22 -10
- package/dist/cjs/generalUtilsInternal.d.ts +2 -2
- package/dist/cjs/generalUtilsInternal.d.ts.map +1 -1
- package/dist/cjs/generalUtilsInternal.js +10 -8
- package/dist/cjs/hostFileUtils.js +1 -1
- package/dist/cjs/parallel.js +2 -2
- package/dist/cjs/runWhileParentAlive.js +1 -1
- package/dist/cjs/testUtils.d.ts +1 -0
- package/dist/cjs/testUtils.d.ts.map +1 -1
- package/dist/cjs/testUtils.js +8 -2
- package/dist/esm/DependencyChecker.d.ts +3 -0
- package/dist/esm/DependencyChecker.d.ts.map +1 -1
- package/dist/esm/DependencyChecker.js +5 -2
- package/dist/esm/DotnetSdkUtility.d.ts +18 -0
- package/dist/esm/DotnetSdkUtility.d.ts.map +1 -0
- package/dist/esm/DotnetSdkUtility.js +53 -0
- package/dist/esm/DotnetVersion.d.ts +14 -0
- package/dist/esm/DotnetVersion.d.ts.map +1 -0
- package/dist/esm/DotnetVersion.js +41 -0
- package/dist/esm/GitUtility.js +1 -1
- package/dist/esm/NixUtil.js +1 -1
- package/dist/esm/NugetUtility.d.ts +39 -12
- package/dist/esm/NugetUtility.d.ts.map +1 -1
- package/dist/esm/NugetUtility.js +112 -58
- package/dist/esm/TarballUtility.d.ts +1 -0
- package/dist/esm/TarballUtility.d.ts.map +1 -1
- package/dist/esm/TarballUtility.js +1 -1
- package/dist/esm/certUtils.js +1 -1
- package/dist/esm/dockerUtils.js +2 -2
- package/dist/esm/dotnetUtils.d.ts +99 -7
- package/dist/esm/dotnetUtils.d.ts.map +1 -1
- package/dist/esm/dotnetUtils.js +311 -19
- package/dist/esm/generalUtils.d.ts +19 -5
- package/dist/esm/generalUtils.d.ts.map +1 -1
- package/dist/esm/generalUtils.js +22 -10
- package/dist/esm/generalUtilsInternal.d.ts +2 -2
- package/dist/esm/generalUtilsInternal.d.ts.map +1 -1
- package/dist/esm/generalUtilsInternal.js +10 -8
- package/dist/esm/hostFileUtils.js +1 -1
- package/dist/esm/parallel.js +2 -2
- package/dist/esm/runWhileParentAlive.js +1 -1
- package/dist/esm/testUtils.d.ts +1 -0
- package/dist/esm/testUtils.d.ts.map +1 -1
- package/dist/esm/testUtils.js +6 -1
- package/package.json +14 -10
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { getInstalledSdkVersions, isSdkMajorVersionInstalled, isSdkMajorVersionOrGreaterInstalled } from './DotnetSdkUtility.js';
|
|
2
|
+
export { getLatestNugetPackageVersion, getLatestMajorNugetPackageVersion } from './NugetUtility.js';
|
|
2
3
|
/**
|
|
3
4
|
* Runs dotnet build on the specified project.
|
|
4
5
|
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
@@ -13,20 +14,111 @@ export declare function dotnetBuild(projectPath: string): Promise<void>;
|
|
|
13
14
|
* @param cwd Optionally run the command from another current working directory
|
|
14
15
|
*/
|
|
15
16
|
export declare function dotnetPublish(projectPath?: string, configuration?: string, outputDir?: string, cwd?: string): Promise<void>;
|
|
17
|
+
export interface EnsureDotnetToolOptions {
|
|
18
|
+
/** Defaults to `false`. */
|
|
19
|
+
global: boolean;
|
|
20
|
+
/** Optionally specify a dotnet version instead of using the latest installed version. */
|
|
21
|
+
dotnetMajorVersion?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Current working directory to run the commands. Defaults to process current working directory.
|
|
24
|
+
*
|
|
25
|
+
* **Note:** this option is only relevant if the `global` option is `false`.
|
|
26
|
+
* */
|
|
27
|
+
cwd: string;
|
|
28
|
+
}
|
|
16
29
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
30
|
+
* Installs or updates a dotnet CLI tool. Only supports dotnet 5+. Runs a combination of `dotnet --list-sdks`, `dotnet new tool-manifest`,
|
|
31
|
+
* `dotnet tool uninstall` and `dotnet tool install`. Nuget.org will be queried to determine the latest compatible version of the tool for your
|
|
32
|
+
* latest installed dotnet SDK version, or the dotnet SDK version specified in options (the version passed in options must also be installed).
|
|
33
|
+
*
|
|
34
|
+
* Defaults that can be overridden with options ({@link EnsureDotnetToolOptions}):
|
|
35
|
+
* - Local install
|
|
36
|
+
* - Uses latest installed dotnet SDK version
|
|
37
|
+
* - Runs in the current working directory
|
|
38
|
+
*
|
|
39
|
+
* For local installs, a new tool manifest will be created with the command `dotnet new tool-manifest` if it doesn't already exist. Note that dotnet
|
|
40
|
+
* searches up the directory tree until it finds a tool manifest.
|
|
41
|
+
*
|
|
42
|
+
* If the tool is already installed and the version installed is newer (because an older dotnet version was specified in the options), the installed
|
|
43
|
+
* version will be overwritten with the latest compatible version for the dotnet version specified in the options rather than trying to simply run the
|
|
44
|
+
* `dotnet tool update` command, which would throw an error in this scenario.
|
|
45
|
+
*
|
|
46
|
+
* Docs for dotnet tools: https://learn.microsoft.com/en-us/dotnet/core/tools/global-tools
|
|
47
|
+
*
|
|
48
|
+
* Docs for `dotnet tool install`: https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-tool-install
|
|
19
49
|
*/
|
|
20
|
-
export declare function
|
|
50
|
+
export declare function ensureDotnetTool(toolName: string, options?: Partial<EnsureDotnetToolOptions>): Promise<void>;
|
|
21
51
|
/**
|
|
22
|
-
*
|
|
52
|
+
* Runs `dotnet new tool-manifest` if `./.config/dotnet-tools.json` does not exist. Uses the current working directory.
|
|
53
|
+
*
|
|
54
|
+
* The tool manifest is required when installing local dotnet tools. Note that dotnet searches up the directory tree
|
|
55
|
+
* for a tool manifest, so tools can be installed in a solution root directory and be picked up by dotnet when run
|
|
56
|
+
* in subdirectories.
|
|
23
57
|
*/
|
|
24
|
-
export declare function
|
|
25
|
-
|
|
58
|
+
export declare function ensureDotnetToolManifest(cwd?: string): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Ensures the latest version of `dotnet-reportgenerator-globaltool` is installed as a "dotnet local tool" in the current
|
|
61
|
+
* working directory with the latest version that is compatible with the latest dotnet SDK version currently installed.
|
|
62
|
+
*
|
|
63
|
+
* This package is used to convert code coverage data into a human-readable report: https://github.com/danielpalme/ReportGenerator
|
|
64
|
+
*
|
|
65
|
+
* Unsure why the name of the tool has "global" in it - it is neither local nor global (can be installed as either).
|
|
66
|
+
*
|
|
67
|
+
* Use {@link ensureDotnetTool} directly for different options.
|
|
68
|
+
*/
|
|
69
|
+
export declare function ensureReportGeneratorTool(): Promise<void>;
|
|
26
70
|
/**
|
|
27
71
|
* Spawns a process that runs the following commands to clean and re-install the dotnet dev certs:
|
|
28
72
|
* - dotnet dev-certs https --clean
|
|
29
73
|
* - dotnet dev-certs https -t
|
|
30
74
|
*/
|
|
31
75
|
export declare function configureDotnetDevCerts(): Promise<void>;
|
|
76
|
+
declare const targetFrameworkMonikersImmutable: readonly ["netcoreapp1.0", "netcoreapp1.1", "netcoreapp2.0", "netcoreapp2.1", "netcoreapp2.2", "netcoreapp3.0", "netcoreapp3.1", "net5.0", "net6.0", "net7.0", "net8.0", "netstandard1.0", "netstandard1.1", "netstandard1.2", "netstandard1.3", "netstandard1.4", "netstandard1.5", "netstandard1.6", "netstandard2.0", "netstandard2.1", "net11", "net20", "net35", "net40", "net403", "net45", "net451", "net452", "net46", "net461", "net462", "net47", "net471", "net472", "net48", "netcore", "netcore45", "netcore451", "netmf", "sl4", "sl5", "wp", "wp7", "wp75", "wp8", "wp81", "wpa81", "uap", "uap10.0", "net5.0-windows", "net6.0-android", "net6.0-ios", "net6.0-maccatalyst", "net6.0-macos", "net6.0-tvos", "net6.0-windows", "net7.0-android", "net7.0-ios", "net7.0-maccatalyst", "net7.0-macos", "net7.0-tvos", "net7.0-windows", "net8.0", "net8.0-android", "net8.0-browser", "net8.0-ios", "net8.0-maccatalyst", "net8.0-macos", "net8.0-tvos", "net8.0-windows"];
|
|
77
|
+
/**
|
|
78
|
+
* Type guard for valid .net framework TFMs (target framework moniker).
|
|
79
|
+
*
|
|
80
|
+
* See https://learn.microsoft.com/en-us/dotnet/standard/frameworks
|
|
81
|
+
*/
|
|
82
|
+
export type TargetFrameworkMoniker = typeof targetFrameworkMonikersImmutable[number];
|
|
83
|
+
/**
|
|
84
|
+
* Scraped from https://learn.microsoft.com/en-us/dotnet/standard/frameworks.
|
|
85
|
+
* No intention to actually support operations for all of these, but having a list allows checking if a string
|
|
86
|
+
* is a valid TFM (target framework moniker) - see type guard: {@link TargetFrameworkMoniker}.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```
|
|
90
|
+
* const isValidTfm = targetFrameworkMonikers.includes(someStringVar)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare const targetFrameworkMonikers: string[];
|
|
94
|
+
export declare function isValidTargetFrameworkMoniker(targetFrameworkMoniker: string): boolean;
|
|
95
|
+
declare const dotnetCoreTargetFrameworkMonikersImmutable: readonly ["net5.0", "net6.0", "net7.0", "net8.0"];
|
|
96
|
+
/**
|
|
97
|
+
* Type guard for {@link dotnetCoreTargetFrameworkMonikers}.
|
|
98
|
+
*/
|
|
99
|
+
export type DotnetCoreTargetFrameworkMoniker = typeof dotnetCoreTargetFrameworkMonikersImmutable[number];
|
|
100
|
+
/**
|
|
101
|
+
* Subset of {@link targetFrameworkMonikers} with modern dotnet core versions.
|
|
102
|
+
*
|
|
103
|
+
* Most of my scripting will only support modern versions of dotnet core, so this will often be used for checks instead of the full list.
|
|
104
|
+
*/
|
|
105
|
+
export declare const dotnetCoreTargetFrameworkMonikers: string[];
|
|
106
|
+
/**
|
|
107
|
+
* Check if a string is a valid TFM (Target Framework Moniker) in the form "netX.Y" where X is a number >= 5 and Y is any number.
|
|
108
|
+
* @param targetFrameworkMoniker The dotnet target framework moniker to check.
|
|
109
|
+
* @returns `true` if the string is a properly formatted "netX.Y" TFM, `false` otherwise
|
|
110
|
+
*/
|
|
111
|
+
export declare function isTfmNet5Plus(targetFrameworkMoniker: string): boolean;
|
|
112
|
+
/**
|
|
113
|
+
* Simple helper method to convert one of the newer dotnet core TFM's to the major SDK version number in a safe way.
|
|
114
|
+
*/
|
|
115
|
+
export declare function netCoreTfmToSdkMajorVersion(tfm: TargetFrameworkMoniker): number;
|
|
116
|
+
/**
|
|
117
|
+
* Get sorted SDK version numbers for dotnet core 5+ (from {@link dotnetCoreTargetFrameworkMonikers}).
|
|
118
|
+
*/
|
|
119
|
+
export declare function getDotnetCoreSdkVersions(): number[];
|
|
120
|
+
/**
|
|
121
|
+
* Simple helper method to convert an SDK version to the TFM (target framework moniker). Only supporting new dotnet core versions.
|
|
122
|
+
*/
|
|
123
|
+
export declare function sdkVersionToTfm(sdkVersion: number): TargetFrameworkMoniker;
|
|
32
124
|
//# sourceMappingURL=dotnetUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dotnetUtils.d.ts","sourceRoot":"","sources":["../../src/dotnetUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dotnetUtils.d.ts","sourceRoot":"","sources":["../../src/dotnetUtils.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,mCAAmC,EAAE,MAAM,uBAAuB,CAAA;AAChI,OAAO,EAAE,4BAA4B,EAAE,iCAAiC,EAAE,MAAM,mBAAmB,CAAA;AAEnG;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,iBAGpD;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,WAAW,GAAE,MAAa,EAAE,aAAa,GAAE,MAAkB,EAAE,SAAS,GAAE,MAAkB,EAAE,GAAG,CAAC,EAAE,MAAM,iBAY7I;AAED,MAAM,WAAW,uBAAuB;IACtC,2BAA2B;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;SAIK;IACL,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,iBA8ElG;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,GAAE,MAAsB,iBAYzE;AA6DD;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,kBAE9C;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,kBAG5C;AAID,QAAA,MAAM,gCAAgC,y7BAuE5B,CAAA;AAEV;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,gCAAgC,CAAC,MAAM,CAAC,CAAA;AAEpF;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAA0C,CAAA;AAEtF,wBAAgB,6BAA6B,CAAC,sBAAsB,EAAE,MAAM,WAE3E;AAED,QAAA,MAAM,0CAA0C,mDAKtC,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG,OAAO,0CAA0C,CAAC,MAAM,CAAC,CAAA;AAExG;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,EAAoD,CAAA;AAE1G;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,sBAAsB,EAAE,MAAM,WAI3D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,sBAAsB,UAQtE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,aAWvC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAK1E"}
|
package/dist/cjs/dotnetUtils.js
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.configureDotnetDevCerts = exports.
|
|
6
|
+
exports.sdkVersionToTfm = exports.getDotnetCoreSdkVersions = exports.netCoreTfmToSdkMajorVersion = exports.isTfmNet5Plus = exports.dotnetCoreTargetFrameworkMonikers = exports.isValidTargetFrameworkMoniker = exports.targetFrameworkMonikers = exports.configureDotnetDevCerts = exports.ensureReportGeneratorTool = exports.ensureDotnetToolManifest = exports.ensureDotnetTool = exports.dotnetPublish = exports.dotnetBuild = exports.getLatestMajorNugetPackageVersion = exports.getLatestNugetPackageVersion = exports.isSdkMajorVersionOrGreaterInstalled = exports.isSdkMajorVersionInstalled = exports.getInstalledSdkVersions = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const DotnetSdkUtility_js_1 = require("./DotnetSdkUtility.js");
|
|
10
|
+
const NugetUtility_js_1 = require("./NugetUtility.js");
|
|
4
11
|
const generalUtils_js_1 = require("./generalUtils.js");
|
|
5
|
-
|
|
6
|
-
|
|
12
|
+
const toolManifestPartialPath = '.config/dotnet-tools.json';
|
|
13
|
+
var DotnetSdkUtility_js_2 = require("./DotnetSdkUtility.js");
|
|
14
|
+
Object.defineProperty(exports, "getInstalledSdkVersions", { enumerable: true, get: function () { return DotnetSdkUtility_js_2.getInstalledSdkVersions; } });
|
|
15
|
+
Object.defineProperty(exports, "isSdkMajorVersionInstalled", { enumerable: true, get: function () { return DotnetSdkUtility_js_2.isSdkMajorVersionInstalled; } });
|
|
16
|
+
Object.defineProperty(exports, "isSdkMajorVersionOrGreaterInstalled", { enumerable: true, get: function () { return DotnetSdkUtility_js_2.isSdkMajorVersionOrGreaterInstalled; } });
|
|
17
|
+
var NugetUtility_js_2 = require("./NugetUtility.js");
|
|
18
|
+
Object.defineProperty(exports, "getLatestNugetPackageVersion", { enumerable: true, get: function () { return NugetUtility_js_2.getLatestNugetPackageVersion; } });
|
|
19
|
+
Object.defineProperty(exports, "getLatestMajorNugetPackageVersion", { enumerable: true, get: function () { return NugetUtility_js_2.getLatestMajorNugetPackageVersion; } });
|
|
7
20
|
/**
|
|
8
21
|
* Runs dotnet build on the specified project.
|
|
9
22
|
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
@@ -36,35 +49,176 @@ async function dotnetPublish(projectPath = './', configuration = 'Release', outp
|
|
|
36
49
|
}
|
|
37
50
|
exports.dotnetPublish = dotnetPublish;
|
|
38
51
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
52
|
+
* Installs or updates a dotnet CLI tool. Only supports dotnet 5+. Runs a combination of `dotnet --list-sdks`, `dotnet new tool-manifest`,
|
|
53
|
+
* `dotnet tool uninstall` and `dotnet tool install`. Nuget.org will be queried to determine the latest compatible version of the tool for your
|
|
54
|
+
* latest installed dotnet SDK version, or the dotnet SDK version specified in options (the version passed in options must also be installed).
|
|
55
|
+
*
|
|
56
|
+
* Defaults that can be overridden with options ({@link EnsureDotnetToolOptions}):
|
|
57
|
+
* - Local install
|
|
58
|
+
* - Uses latest installed dotnet SDK version
|
|
59
|
+
* - Runs in the current working directory
|
|
60
|
+
*
|
|
61
|
+
* For local installs, a new tool manifest will be created with the command `dotnet new tool-manifest` if it doesn't already exist. Note that dotnet
|
|
62
|
+
* searches up the directory tree until it finds a tool manifest.
|
|
63
|
+
*
|
|
64
|
+
* If the tool is already installed and the version installed is newer (because an older dotnet version was specified in the options), the installed
|
|
65
|
+
* version will be overwritten with the latest compatible version for the dotnet version specified in the options rather than trying to simply run the
|
|
66
|
+
* `dotnet tool update` command, which would throw an error in this scenario.
|
|
67
|
+
*
|
|
68
|
+
* Docs for dotnet tools: https://learn.microsoft.com/en-us/dotnet/core/tools/global-tools
|
|
69
|
+
*
|
|
70
|
+
* Docs for `dotnet tool install`: https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-tool-install
|
|
41
71
|
*/
|
|
42
|
-
async function
|
|
43
|
-
|
|
44
|
-
|
|
72
|
+
async function ensureDotnetTool(toolName, options) {
|
|
73
|
+
var _a;
|
|
74
|
+
(0, NugetUtility_js_1.validatePackageName)(toolName);
|
|
75
|
+
const globalInstall = (_a = options === null || options === void 0 ? void 0 : options.global) !== null && _a !== void 0 ? _a : false;
|
|
76
|
+
let cwd;
|
|
77
|
+
if (options === null || options === void 0 ? void 0 : options.cwd) {
|
|
78
|
+
cwd = options.cwd;
|
|
79
|
+
(0, generalUtils_js_1.requireValidPath)('options.cwd', cwd);
|
|
45
80
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
81
|
+
else {
|
|
82
|
+
cwd = process.cwd();
|
|
83
|
+
}
|
|
84
|
+
const dotnetVersions = await (0, DotnetSdkUtility_js_1.getInstalledSdkVersions)();
|
|
85
|
+
if (dotnetVersions.length === 0) {
|
|
86
|
+
throw new Error('dotnet is not installed');
|
|
87
|
+
}
|
|
88
|
+
let dotnetVersion;
|
|
89
|
+
if (options === null || options === void 0 ? void 0 : options.dotnetMajorVersion) {
|
|
90
|
+
// Use dotnet version specified in options
|
|
91
|
+
dotnetVersion = options.dotnetMajorVersion;
|
|
92
|
+
if (!dotnetVersions.some(v => v.major === dotnetVersion)) {
|
|
93
|
+
throw new Error(`Cannot install tool with options specified - dotnet version ${dotnetVersion} is not installed`);
|
|
94
|
+
}
|
|
49
95
|
}
|
|
50
96
|
else {
|
|
51
|
-
|
|
97
|
+
// Or, latest installed version
|
|
98
|
+
dotnetVersion = [...dotnetVersions].sort((a, b) => b.major - a.major)[0].major;
|
|
99
|
+
}
|
|
100
|
+
if (dotnetVersion < 5) {
|
|
101
|
+
throw new Error('Only dotnet 5 and above is supported for this utility method');
|
|
102
|
+
}
|
|
103
|
+
const tfm = sdkVersionToTfm(dotnetVersion);
|
|
104
|
+
(0, generalUtils_js_1.log)(`using dotnet version ${dotnetVersion} (TFM: ${tfm})`);
|
|
105
|
+
(0, generalUtils_js_1.log)(`ensuring dotnet tool "${toolName}" is installed ${globalInstall ? 'global' : 'local'}ly with the latest compatible version for dotnet ${dotnetVersion}`);
|
|
106
|
+
(0, generalUtils_js_1.log)(`looking up latest compatible version in Nuget repository for tool "${toolName}"`);
|
|
107
|
+
const latestToolVersion = await (0, NugetUtility_js_1.getLatestNugetPackageVersion)(toolName, tfm);
|
|
108
|
+
if (latestToolVersion === null) {
|
|
109
|
+
throw new Error(`No compatible version of ${toolName} was found for TFM ${tfm}`);
|
|
110
|
+
}
|
|
111
|
+
(0, generalUtils_js_1.log)(`found compatible tool version: ${latestToolVersion}`);
|
|
112
|
+
(0, generalUtils_js_1.log)(`checking if ${globalInstall ? 'global' : 'local'} dotnet tool is installed`);
|
|
113
|
+
const installedVersion = await getDotnetToolInstalledVersion(toolName, globalInstall, cwd);
|
|
114
|
+
const commandLocalitySwitch = globalInstall ? '--global' : '--local';
|
|
115
|
+
if (installedVersion === null) {
|
|
116
|
+
(0, generalUtils_js_1.log)(`dotnet tool is not installed, attempting to install`);
|
|
117
|
+
if (!globalInstall) {
|
|
118
|
+
await ensureDotnetToolManifest(cwd);
|
|
119
|
+
}
|
|
120
|
+
const command = `dotnet tool install ${toolName} ${commandLocalitySwitch} --version ${latestToolVersion}`;
|
|
121
|
+
(0, generalUtils_js_1.log)(`installing with command: ${command}`);
|
|
122
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', command.split(' '), { throwOnNonZero: true, cwd: cwd });
|
|
123
|
+
(0, generalUtils_js_1.log)(`finished tool install`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
(0, generalUtils_js_1.log)(`found installed dotnet tool "${toolName}" version ${installedVersion}`);
|
|
127
|
+
if (installedVersion === latestToolVersion) {
|
|
128
|
+
(0, generalUtils_js_1.log)(`the most recent version of the tool is already installed - finished`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
(0, generalUtils_js_1.log)(`latest version and installed version do not match - uninstalling the existing version before re-installing`);
|
|
132
|
+
if (!globalInstall) {
|
|
133
|
+
await ensureDotnetToolManifest();
|
|
134
|
+
}
|
|
135
|
+
const uninstallCommand = `dotnet tool uninstall ${toolName} ${commandLocalitySwitch}`;
|
|
136
|
+
(0, generalUtils_js_1.log)(`uninstalling with command: ${uninstallCommand}`);
|
|
137
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', uninstallCommand.split(' '), { throwOnNonZero: true, cwd: cwd });
|
|
138
|
+
const command = `dotnet tool install ${toolName} ${commandLocalitySwitch} --version ${latestToolVersion}`;
|
|
139
|
+
(0, generalUtils_js_1.log)(`installing with command: ${command}`);
|
|
140
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', command.split(' '), { throwOnNonZero: true, cwd: cwd });
|
|
141
|
+
(0, generalUtils_js_1.log)(`finished tool install`);
|
|
52
142
|
}
|
|
53
|
-
const args = ['tool', installed ? 'update' : 'install', '--global', toolName];
|
|
54
|
-
await (0, generalUtils_js_1.spawnAsync)('dotnet', args);
|
|
55
143
|
}
|
|
56
|
-
exports.
|
|
144
|
+
exports.ensureDotnetTool = ensureDotnetTool;
|
|
57
145
|
/**
|
|
58
|
-
*
|
|
146
|
+
* Runs `dotnet new tool-manifest` if `./.config/dotnet-tools.json` does not exist. Uses the current working directory.
|
|
147
|
+
*
|
|
148
|
+
* The tool manifest is required when installing local dotnet tools. Note that dotnet searches up the directory tree
|
|
149
|
+
* for a tool manifest, so tools can be installed in a solution root directory and be picked up by dotnet when run
|
|
150
|
+
* in subdirectories.
|
|
59
151
|
*/
|
|
60
|
-
async function
|
|
61
|
-
|
|
152
|
+
async function ensureDotnetToolManifest(cwd = process.cwd()) {
|
|
153
|
+
(0, generalUtils_js_1.requireValidPath)('cwd', cwd);
|
|
154
|
+
const toolsManifestPath = node_path_1.default.join(cwd, toolManifestPartialPath);
|
|
155
|
+
(0, generalUtils_js_1.log)(`checking if tool manifest exists at ${toolsManifestPath}`);
|
|
156
|
+
const toolManifestExists = fs_1.default.existsSync(toolsManifestPath);
|
|
157
|
+
if (toolManifestExists) {
|
|
158
|
+
(0, generalUtils_js_1.log)(`tool manifest already exists`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
(0, generalUtils_js_1.log)(`tool manifest does not exist, attempting to create with command: dotnet new tool-manifest`);
|
|
162
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', ['new', 'tool-manifest'], { throwOnNonZero: true, cwd });
|
|
163
|
+
(0, generalUtils_js_1.log)(`created tool manifest at ${toolsManifestPath}`);
|
|
164
|
+
}
|
|
62
165
|
}
|
|
63
|
-
exports.
|
|
64
|
-
async function
|
|
65
|
-
|
|
166
|
+
exports.ensureDotnetToolManifest = ensureDotnetToolManifest;
|
|
167
|
+
async function getDotnetToolInstalledVersion(toolName, globalInstall, cwd) {
|
|
168
|
+
(0, NugetUtility_js_1.validatePackageName)(toolName);
|
|
169
|
+
(0, generalUtils_js_1.requireValidPath)('cwd', cwd);
|
|
170
|
+
const result = await (0, generalUtils_js_1.simpleSpawnAsync)('dotnet', ['tool', 'list', globalInstall ? '--global' : '--local'], { cwd: cwd });
|
|
171
|
+
const lines = result.stdoutLines;
|
|
172
|
+
if (!lines[0].startsWith('Package Id') || !lines[1].startsWith('-')) {
|
|
173
|
+
throw new Error(`Unexpected output for command "dotnet tool list": ${JSON.stringify(lines)}`);
|
|
174
|
+
}
|
|
175
|
+
if (lines.length < 3) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const versionColumnIndex = lines[0].indexOf('Version');
|
|
179
|
+
const commandsColumnIndex = lines[0].indexOf('Commands');
|
|
180
|
+
const manifestColumnIndex = lines[0].indexOf('Manifest');
|
|
181
|
+
if (versionColumnIndex === -1) {
|
|
182
|
+
throw new Error(`Unexpectedly missing "Version" header in "dotnet tool list" output: ${JSON.stringify(lines)}`);
|
|
183
|
+
}
|
|
184
|
+
const tools = [];
|
|
185
|
+
for (let i = 2; i < lines.length; i++) {
|
|
186
|
+
const packageId = lines[i].substring(0, versionColumnIndex).trim();
|
|
187
|
+
const version = lines[i].substring(versionColumnIndex, commandsColumnIndex !== -1 ? commandsColumnIndex : lines[i].length - 1).trim();
|
|
188
|
+
const commands = commandsColumnIndex !== -1 ? lines[i].substring(commandsColumnIndex, manifestColumnIndex !== -1 ? manifestColumnIndex : lines[i].length - 1).trim() : undefined;
|
|
189
|
+
const manifest = manifestColumnIndex !== -1 ? lines[i].substring(manifestColumnIndex).trim() : undefined;
|
|
190
|
+
tools.push({
|
|
191
|
+
packageId,
|
|
192
|
+
version,
|
|
193
|
+
commands,
|
|
194
|
+
manifest
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
const match = tools.find(t => t.packageId === toolName);
|
|
198
|
+
if (match === undefined) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
// For a local install, dotnet will search up in the directory tree until it finds a ".config" directory with a tool manifest, but
|
|
202
|
+
// that might not be obvious to the caller, so log a warning with the path to the manifest that was used if it's not int the cwd.
|
|
203
|
+
if (!globalInstall && !fs_1.default.existsSync(node_path_1.default.join(cwd, toolManifestPartialPath))) {
|
|
204
|
+
(0, generalUtils_js_1.log)(`${generalUtils_js_1.Emoji.Warning} local tool install is not in the current working directory - it is listed as ${match.manifest}`);
|
|
205
|
+
}
|
|
206
|
+
return match.version;
|
|
66
207
|
}
|
|
67
|
-
|
|
208
|
+
/**
|
|
209
|
+
* Ensures the latest version of `dotnet-reportgenerator-globaltool` is installed as a "dotnet local tool" in the current
|
|
210
|
+
* working directory with the latest version that is compatible with the latest dotnet SDK version currently installed.
|
|
211
|
+
*
|
|
212
|
+
* This package is used to convert code coverage data into a human-readable report: https://github.com/danielpalme/ReportGenerator
|
|
213
|
+
*
|
|
214
|
+
* Unsure why the name of the tool has "global" in it - it is neither local nor global (can be installed as either).
|
|
215
|
+
*
|
|
216
|
+
* Use {@link ensureDotnetTool} directly for different options.
|
|
217
|
+
*/
|
|
218
|
+
async function ensureReportGeneratorTool() {
|
|
219
|
+
await ensureDotnetTool('dotnet-reportgenerator-globaltool');
|
|
220
|
+
}
|
|
221
|
+
exports.ensureReportGeneratorTool = ensureReportGeneratorTool;
|
|
68
222
|
/**
|
|
69
223
|
* Spawns a process that runs the following commands to clean and re-install the dotnet dev certs:
|
|
70
224
|
* - dotnet dev-certs https --clean
|
|
@@ -75,4 +229,155 @@ async function configureDotnetDevCerts() {
|
|
|
75
229
|
await (0, generalUtils_js_1.spawnAsync)('dotnet', ['dev-certs', 'https', '-t']);
|
|
76
230
|
}
|
|
77
231
|
exports.configureDotnetDevCerts = configureDotnetDevCerts;
|
|
78
|
-
|
|
232
|
+
// This immutable const is used for the type guard.
|
|
233
|
+
// There is also a non-immutable array to allow something like: const isValidTfm = targetFrameworkMonikers.includes(someStringVar)
|
|
234
|
+
const targetFrameworkMonikersImmutable = [
|
|
235
|
+
'netcoreapp1.0',
|
|
236
|
+
'netcoreapp1.1',
|
|
237
|
+
'netcoreapp2.0',
|
|
238
|
+
'netcoreapp2.1',
|
|
239
|
+
'netcoreapp2.2',
|
|
240
|
+
'netcoreapp3.0',
|
|
241
|
+
'netcoreapp3.1',
|
|
242
|
+
'net5.0',
|
|
243
|
+
'net6.0',
|
|
244
|
+
'net7.0',
|
|
245
|
+
'net8.0',
|
|
246
|
+
'netstandard1.0',
|
|
247
|
+
'netstandard1.1',
|
|
248
|
+
'netstandard1.2',
|
|
249
|
+
'netstandard1.3',
|
|
250
|
+
'netstandard1.4',
|
|
251
|
+
'netstandard1.5',
|
|
252
|
+
'netstandard1.6',
|
|
253
|
+
'netstandard2.0',
|
|
254
|
+
'netstandard2.1',
|
|
255
|
+
'net11',
|
|
256
|
+
'net20',
|
|
257
|
+
'net35',
|
|
258
|
+
'net40',
|
|
259
|
+
'net403',
|
|
260
|
+
'net45',
|
|
261
|
+
'net451',
|
|
262
|
+
'net452',
|
|
263
|
+
'net46',
|
|
264
|
+
'net461',
|
|
265
|
+
'net462',
|
|
266
|
+
'net47',
|
|
267
|
+
'net471',
|
|
268
|
+
'net472',
|
|
269
|
+
'net48',
|
|
270
|
+
'netcore',
|
|
271
|
+
'netcore45',
|
|
272
|
+
'netcore451',
|
|
273
|
+
'netmf',
|
|
274
|
+
'sl4',
|
|
275
|
+
'sl5',
|
|
276
|
+
'wp',
|
|
277
|
+
'wp7',
|
|
278
|
+
'wp75',
|
|
279
|
+
'wp8',
|
|
280
|
+
'wp81',
|
|
281
|
+
'wpa81',
|
|
282
|
+
'uap',
|
|
283
|
+
'uap10.0',
|
|
284
|
+
'net5.0-windows',
|
|
285
|
+
'net6.0-android',
|
|
286
|
+
'net6.0-ios',
|
|
287
|
+
'net6.0-maccatalyst',
|
|
288
|
+
'net6.0-macos',
|
|
289
|
+
'net6.0-tvos',
|
|
290
|
+
'net6.0-windows',
|
|
291
|
+
'net7.0-android',
|
|
292
|
+
'net7.0-ios',
|
|
293
|
+
'net7.0-maccatalyst',
|
|
294
|
+
'net7.0-macos',
|
|
295
|
+
'net7.0-tvos',
|
|
296
|
+
'net7.0-windows',
|
|
297
|
+
'net8.0',
|
|
298
|
+
'net8.0-android',
|
|
299
|
+
'net8.0-browser',
|
|
300
|
+
'net8.0-ios',
|
|
301
|
+
'net8.0-maccatalyst',
|
|
302
|
+
'net8.0-macos',
|
|
303
|
+
'net8.0-tvos',
|
|
304
|
+
'net8.0-windows'
|
|
305
|
+
];
|
|
306
|
+
/**
|
|
307
|
+
* Scraped from https://learn.microsoft.com/en-us/dotnet/standard/frameworks.
|
|
308
|
+
* No intention to actually support operations for all of these, but having a list allows checking if a string
|
|
309
|
+
* is a valid TFM (target framework moniker) - see type guard: {@link TargetFrameworkMoniker}.
|
|
310
|
+
*
|
|
311
|
+
* @example
|
|
312
|
+
* ```
|
|
313
|
+
* const isValidTfm = targetFrameworkMonikers.includes(someStringVar)
|
|
314
|
+
* ```
|
|
315
|
+
*/
|
|
316
|
+
exports.targetFrameworkMonikers = [...targetFrameworkMonikersImmutable];
|
|
317
|
+
function isValidTargetFrameworkMoniker(targetFrameworkMoniker) {
|
|
318
|
+
return exports.targetFrameworkMonikers.includes(targetFrameworkMoniker);
|
|
319
|
+
}
|
|
320
|
+
exports.isValidTargetFrameworkMoniker = isValidTargetFrameworkMoniker;
|
|
321
|
+
const dotnetCoreTargetFrameworkMonikersImmutable = [
|
|
322
|
+
'net5.0',
|
|
323
|
+
'net6.0',
|
|
324
|
+
'net7.0',
|
|
325
|
+
'net8.0'
|
|
326
|
+
];
|
|
327
|
+
/**
|
|
328
|
+
* Subset of {@link targetFrameworkMonikers} with modern dotnet core versions.
|
|
329
|
+
*
|
|
330
|
+
* Most of my scripting will only support modern versions of dotnet core, so this will often be used for checks instead of the full list.
|
|
331
|
+
*/
|
|
332
|
+
exports.dotnetCoreTargetFrameworkMonikers = [...dotnetCoreTargetFrameworkMonikersImmutable];
|
|
333
|
+
/**
|
|
334
|
+
* Check if a string is a valid TFM (Target Framework Moniker) in the form "netX.Y" where X is a number >= 5 and Y is any number.
|
|
335
|
+
* @param targetFrameworkMoniker The dotnet target framework moniker to check.
|
|
336
|
+
* @returns `true` if the string is a properly formatted "netX.Y" TFM, `false` otherwise
|
|
337
|
+
*/
|
|
338
|
+
function isTfmNet5Plus(targetFrameworkMoniker) {
|
|
339
|
+
(0, generalUtils_js_1.requireString)('targetFrameworkMoniker', targetFrameworkMoniker);
|
|
340
|
+
const netFormatPattern = /^net([5-9]|\d{2,})\.\d+$/;
|
|
341
|
+
return netFormatPattern.test(targetFrameworkMoniker);
|
|
342
|
+
}
|
|
343
|
+
exports.isTfmNet5Plus = isTfmNet5Plus;
|
|
344
|
+
/**
|
|
345
|
+
* Simple helper method to convert one of the newer dotnet core TFM's to the major SDK version number in a safe way.
|
|
346
|
+
*/
|
|
347
|
+
function netCoreTfmToSdkMajorVersion(tfm) {
|
|
348
|
+
if (!exports.targetFrameworkMonikers.includes(tfm)) {
|
|
349
|
+
throw new Error(`Invalid TFM: ${tfm}`);
|
|
350
|
+
}
|
|
351
|
+
if (!exports.dotnetCoreTargetFrameworkMonikers.includes(tfm)) {
|
|
352
|
+
throw new Error(`TFM "${tfm}" is not supported - this method only allows newer dotnet core versions: ${exports.dotnetCoreTargetFrameworkMonikers.join(', ')}`);
|
|
353
|
+
}
|
|
354
|
+
return parseInt(tfm[3], 10);
|
|
355
|
+
}
|
|
356
|
+
exports.netCoreTfmToSdkMajorVersion = netCoreTfmToSdkMajorVersion;
|
|
357
|
+
/**
|
|
358
|
+
* Get sorted SDK version numbers for dotnet core 5+ (from {@link dotnetCoreTargetFrameworkMonikers}).
|
|
359
|
+
*/
|
|
360
|
+
function getDotnetCoreSdkVersions() {
|
|
361
|
+
const versions = [];
|
|
362
|
+
for (const tfm of exports.dotnetCoreTargetFrameworkMonikers) {
|
|
363
|
+
const dotIndex = tfm.indexOf('.');
|
|
364
|
+
if (dotIndex === -1 || !tfm.startsWith('net')) {
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
const numString = tfm.substring(3, dotIndex);
|
|
368
|
+
versions.push(parseInt(numString, 10));
|
|
369
|
+
}
|
|
370
|
+
return [...versions].sort((a, b) => a - b);
|
|
371
|
+
}
|
|
372
|
+
exports.getDotnetCoreSdkVersions = getDotnetCoreSdkVersions;
|
|
373
|
+
/**
|
|
374
|
+
* Simple helper method to convert an SDK version to the TFM (target framework moniker). Only supporting new dotnet core versions.
|
|
375
|
+
*/
|
|
376
|
+
function sdkVersionToTfm(sdkVersion) {
|
|
377
|
+
if (typeof sdkVersion !== 'number' || sdkVersion < 5 || sdkVersion > 8) {
|
|
378
|
+
throw new Error(`Invalid SDK version: ${sdkVersion} (only supports version >= 5 and <= 8)`);
|
|
379
|
+
}
|
|
380
|
+
return `net${sdkVersion}.0`;
|
|
381
|
+
}
|
|
382
|
+
exports.sdkVersionToTfm = sdkVersionToTfm;
|
|
383
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG90bmV0VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW1CO0FBQ25CLDBEQUE0QjtBQUM1QiwrREFBK0Q7QUFDL0QsdURBQXFGO0FBQ3JGLHVEQUFvSDtBQUVwSCxNQUFNLHVCQUF1QixHQUFHLDJCQUEyQixDQUFBO0FBTTNELDZEQUFnSTtBQUF2SCw4SEFBQSx1QkFBdUIsT0FBQTtBQUFFLGlJQUFBLDBCQUEwQixPQUFBO0FBQUUsMElBQUEsbUNBQW1DLE9BQUE7QUFDakcscURBQW1HO0FBQTFGLCtIQUFBLDRCQUE0QixPQUFBO0FBQUUsb0lBQUEsaUNBQWlDLE9BQUE7QUFFeEU7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxXQUFXLENBQUMsV0FBbUI7SUFDbkQsSUFBQSxrQ0FBZ0IsRUFBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDNUMsTUFBTSxJQUFBLDRCQUFVLEVBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDOUUsQ0FBQztBQUhELGtDQUdDO0FBRUQ7Ozs7OztHQU1HO0FBQ0ksS0FBSyxVQUFVLGFBQWEsQ0FBQyxjQUFzQixJQUFJLEVBQUUsZ0JBQXdCLFNBQVMsRUFBRSxZQUFvQixTQUFTLEVBQUUsR0FBWTtJQUM1SSxJQUFBLGtDQUFnQixFQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUM1QyxJQUFBLCtCQUFhLEVBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ3JDLElBQUEsK0JBQWEsRUFBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDN0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNSLElBQUEsa0NBQWdCLEVBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQzlCLENBQUM7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
|
|
@@ -92,11 +92,21 @@ export interface WhichResult {
|
|
|
92
92
|
export declare function sleep(ms: number): Promise<void>;
|
|
93
93
|
/**
|
|
94
94
|
* An extension of the built-in SpawnOptions with an extra option to specify whether a non-zero exit code should throw an error.
|
|
95
|
+
* Used with method {@link spawnAsync}.
|
|
95
96
|
*/
|
|
96
97
|
export interface SpawnOptionsWithThrow extends SpawnOptions {
|
|
97
98
|
throwOnNonZero: boolean;
|
|
98
99
|
simpleErrorMsg?: string;
|
|
99
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Options interface for methods {@link simpleSpawnSync}, {@link simpleSpawnAsync}, {@link simpleCmdSync} and {@link simpleCmdAsync}.
|
|
103
|
+
*/
|
|
104
|
+
export interface SimpleSpawnOptions {
|
|
105
|
+
/** Defaults to `true`. Note that this is the opposite of the default for {@link spawnAsync}. */
|
|
106
|
+
throwOnNonZero: boolean;
|
|
107
|
+
/** Optional current working directory. Defaults to `process.cwd()`. */
|
|
108
|
+
cwd: string;
|
|
109
|
+
}
|
|
100
110
|
/**
|
|
101
111
|
* This is a wrapper function for NodeJS spawn. Defaults stdio to inherit so that output is visible in the console,
|
|
102
112
|
* but note that this means stdout and stderr will not be available in the returned SpawnResult. To hide the output
|
|
@@ -199,10 +209,11 @@ export declare function stringToLines(str: string): string[];
|
|
|
199
209
|
* See {@link winInstallCert} and {@link winUninstallCert} for examples of taking user input and inserting it safely into known commands.
|
|
200
210
|
* @param command Command to run
|
|
201
211
|
* @param args Arguments to pass to the command
|
|
212
|
+
* @param options Optional {@link SimpleSpawnOptions} options
|
|
202
213
|
* @returns An object with the status code, stdout, stderr, and error (if any)
|
|
203
214
|
* @throws {@link SimpleSpawnError} if the command fails and throwOnNonZero is true
|
|
204
215
|
*/
|
|
205
|
-
export declare function simpleCmdSync(command: string, args?: string[],
|
|
216
|
+
export declare function simpleCmdSync(command: string, args?: string[], options?: Partial<SimpleSpawnOptions>): SimpleSpawnResult;
|
|
206
217
|
/**
|
|
207
218
|
* Runs the requested command using {@link spawnAsync} wrapped in an outer Windows CMD.exe command and returns the result with stdout split into lines.
|
|
208
219
|
*
|
|
@@ -215,10 +226,11 @@ export declare function simpleCmdSync(command: string, args?: string[], throwOnN
|
|
|
215
226
|
* See {@link winInstallCert} and {@link winUninstallCert} for examples of taking user input and inserting it safely into known commands.
|
|
216
227
|
* @param command Command to run
|
|
217
228
|
* @param args Arguments to pass to the command
|
|
229
|
+
* @param options Optional {@link SimpleSpawnOptions} options
|
|
218
230
|
* @returns An object with the status code, stdout, stderr, and error (if any)
|
|
219
231
|
* @throws {@link SimpleSpawnError} if the command fails and throwOnNonZero is true
|
|
220
232
|
*/
|
|
221
|
-
export declare function simpleCmdAsync(command: string, args?: string[],
|
|
233
|
+
export declare function simpleCmdAsync(command: string, args?: string[], options?: Partial<SimpleSpawnOptions>): Promise<SimpleSpawnResult>;
|
|
222
234
|
/**
|
|
223
235
|
* Runs the requested command using NodeJS spawnSync and returns the result with stdout split into lines.
|
|
224
236
|
*
|
|
@@ -231,12 +243,13 @@ export declare function simpleCmdAsync(command: string, args?: string[], throwOn
|
|
|
231
243
|
* See {@link winInstallCert} and {@link winUninstallCert} for examples of taking user input and inserting it safely into known commands.
|
|
232
244
|
* @param command Command to run
|
|
233
245
|
* @param args Arguments to pass to the command
|
|
246
|
+
* @param options Optional {@link SimpleSpawnOptions} options
|
|
234
247
|
* @returns An object with the status code, stdout, stderr, and error (if any)
|
|
235
248
|
* @throws {@link SimpleSpawnError} if the command fails and throwOnNonZero is true
|
|
236
249
|
*/
|
|
237
|
-
export declare function simpleSpawnSync(command: string, args?: string[],
|
|
250
|
+
export declare function simpleSpawnSync(command: string, args?: string[], options?: Partial<SimpleSpawnOptions>): SimpleSpawnResult;
|
|
238
251
|
/**
|
|
239
|
-
* Runs the requested command using {@link spawnAsync} and returns the result with stdout split into lines.
|
|
252
|
+
* Runs the requested command using {@link spawnAsync} and returns the result with stdout split into non-empty lines.
|
|
240
253
|
*
|
|
241
254
|
* Use this for simple quick commands that don't require a lot of control.
|
|
242
255
|
*
|
|
@@ -247,10 +260,11 @@ export declare function simpleSpawnSync(command: string, args?: string[], throwO
|
|
|
247
260
|
* See {@link winInstallCert} and {@link winUninstallCert} for examples of taking user input and inserting it safely into known commands.
|
|
248
261
|
* @param command Command to run
|
|
249
262
|
* @param args Arguments to pass to the command
|
|
263
|
+
* @param options Optional {@link SimpleSpawnOptions} options
|
|
250
264
|
* @returns An object with the status code, stdout, stderr, and error (if any)
|
|
251
265
|
* @throws {@link SimpleSpawnError} if the command fails and throwOnNonZero is true
|
|
252
266
|
*/
|
|
253
|
-
export declare function simpleSpawnAsync(command: string, args?: string[],
|
|
267
|
+
export declare function simpleSpawnAsync(command: string, args?: string[], options?: Partial<SimpleSpawnOptions>): Promise<SimpleSpawnResult>;
|
|
254
268
|
/**
|
|
255
269
|
* @returns `true` if platform() is 'win32', `false` otherwise
|
|
256
270
|
*/
|