Skip to content

Commit ac31f01

Browse files
author
Ramon Brullo
authored
refactor: global cli options (#399)
Extract options to own object and files. This way they can be easily reused. Also do global option handing inside cli index. This has the nice effect that we can get rid of global options and env, which were always kinda bothersome to begin with.
1 parent b4ba2db commit ac31f01

15 files changed

Lines changed: 137 additions & 425 deletions

src/cli/cmd-add.ts

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import type { GetRegistryPackument } from "../io/registry";
1313
import type { CheckUrlExists } from "../io/www";
1414
import { eachValue } from "./cli-parsing";
1515
import { withErrorLogger } from "./error-logging";
16-
import type { GlobalOptions } from "./options";
17-
import { parseEnvUsing } from "./parse-env";
16+
import { primaryRegistryUrlOpt } from "./opt-registry";
17+
import { systemUserOpt } from "./opt-system-user";
18+
import { upstreamOpt } from "./opt-upstream";
19+
import { workDirOpt } from "./opt-wd";
1820
import { mustBePackageReference } from "./validators";
1921

2022
const pkgArg = new Argument(
@@ -61,29 +63,25 @@ export function makeAddCmd(
6163
.addArgument(otherPkgsArg)
6264
.addOption(addTestableOpt)
6365
.addOption(forceOpt)
66+
.addOption(primaryRegistryUrlOpt)
67+
.addOption(workDirOpt)
68+
.addOption(systemUserOpt)
69+
.addOption(upstreamOpt)
6470
.description(
6571
`add package to manifest json
6672
openupm add <pkg> [otherPkgs...]
6773
openupm add <pkg>@<version> [otherPkgs...]`
6874
)
6975
.action(
70-
withErrorLogger(log, async function (pkg, otherPkgs, addOptions, cmd) {
71-
const globalOptions = cmd.optsWithGlobals<GlobalOptions>();
72-
76+
withErrorLogger(log, async function (pkg, otherPkgs, options) {
7377
const pkgs = [pkg].concat(otherPkgs);
7478

75-
// parse env
76-
const env = await parseEnvUsing(
77-
log,
78-
process.env,
79-
process.cwd(),
80-
globalOptions
81-
);
79+
const projectDirectory = options.chdir;
8280

8381
const editorVersion = await determineEditorVersionUsing(
8482
readTextFile,
8583
debugLog,
86-
env.cwd
84+
projectDirectory
8785
);
8886

8987
if (typeof editorVersion === "string")
@@ -92,20 +90,18 @@ openupm add <pkg>@<version> [otherPkgs...]`
9290
`${editorVersion} is unknown, the editor version check is disabled`
9391
);
9492

95-
const projectDirectory = env.cwd;
96-
9793
const homePath = getHomePathFromEnv(process.env);
9894
const upmConfigPath = getUserUpmConfigPathFor(
9995
process.env,
10096
homePath,
101-
env.systemUser
97+
options.systemUser
10298
);
10399

104100
const primaryRegistry = await loadRegistryAuthUsing(
105101
readTextFile,
106102
debugLog,
107103
upmConfigPath,
108-
env.primaryRegistryUrl
104+
options.registry
109105
);
110106

111107
const addResults = await addDependenciesUsing(
@@ -117,9 +113,9 @@ openupm add <pkg>@<version> [otherPkgs...]`
117113
projectDirectory,
118114
typeof editorVersion === "string" ? null : editorVersion,
119115
primaryRegistry,
120-
env.upstream,
121-
addOptions.force,
122-
addOptions.test,
116+
options.upstream,
117+
options.force,
118+
options.test,
123119
pkgs
124120
);
125121

src/cli/cmd-deps.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ import type { GetRegistryPackument } from "../io/registry";
2323
import type { CheckUrlExists } from "../io/www";
2424
import { stringifyDependencyGraph } from "./dependency-logging";
2525
import { withErrorLogger } from "./error-logging";
26-
import { GlobalOptions } from "./options";
27-
import { parseEnvUsing } from "./parse-env";
26+
import { primaryRegistryUrlOpt } from "./opt-registry";
27+
import { systemUserOpt } from "./opt-system-user";
2828
import { ResultCodes } from "./result-codes";
2929
import { mustBePackageReference } from "./validators";
3030

@@ -56,34 +56,26 @@ export function makeDepsCmd(
5656
.alias("dep")
5757
.addArgument(pkgArg)
5858
.addOption(deepOpt)
59+
.addOption(primaryRegistryUrlOpt)
60+
.addOption(systemUserOpt)
5961
.description(
6062
`view package dependencies
6163
openupm deps <pkg>
6264
openupm deps <pkg>@<version>`
6365
)
6466
.action(
65-
withErrorLogger(log, async function (pkg, depsOptions, cmd) {
66-
const globalOptions = cmd.optsWithGlobals<GlobalOptions>();
67-
68-
// parse env
69-
const env = await parseEnvUsing(
70-
log,
71-
process.env,
72-
process.cwd(),
73-
globalOptions
74-
);
75-
67+
withErrorLogger(log, async function (pkg, options) {
7668
const homePath = getHomePathFromEnv(process.env);
7769
const upmConfigPath = getUserUpmConfigPathFor(
7870
process.env,
7971
homePath,
80-
env.systemUser
72+
options.systemUser
8173
);
8274
const primaryRegistry = await loadRegistryAuthUsing(
8375
readTextFile,
8476
debugLog,
8577
upmConfigPath,
86-
env.primaryRegistryUrl
78+
options.registry
8779
);
8880
const sources = [primaryRegistry, unityRegistry];
8981

@@ -116,7 +108,7 @@ openupm deps <pkg>@<version>`
116108

117109
await debugLog(
118110
`fetch: ${makePackageReference(packageName, latestVersion)}, deep=${
119-
depsOptions.deep
111+
options.deep
120112
}`
121113
);
122114
const dependencyGraph = await resolveDependenciesUsing(
@@ -125,7 +117,7 @@ openupm deps <pkg>@<version>`
125117
sources,
126118
packageName,
127119
latestVersion,
128-
depsOptions.deep
120+
options.deep
129121
);
130122

131123
const output = stringifyDependencyGraph(

src/cli/cmd-login.ts

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@ import { Logger } from "npmlog";
33
import { loginUsing } from "../app/login";
44
import { partialApply } from "../domain/fp-utils";
55
import type { DebugLog } from "../domain/logging";
6-
import { coerceRegistryUrl } from "../domain/registry-url";
76
import { getHomePathFromEnv } from "../domain/special-paths";
87
import { getUserUpmConfigPathFor } from "../domain/upm-config";
98
import type { ReadTextFile, WriteTextFile } from "../io/fs";
109
import type { GetAuthToken } from "../io/registry";
1110
import { withErrorLogger } from "./error-logging";
12-
import { GlobalOptions } from "./options";
13-
import { parseEnvUsing } from "./parse-env";
11+
import { systemUserOpt } from "./opt-system-user";
1412
import {
1513
promptEmail,
1614
promptPassword,
1715
promptRegistryUrl,
1816
promptUsername,
1917
} from "./prompts";
18+
import { mustBeRegistryUrl } from "./validators";
2019

2120
const usernameOpt = new Option("-u, --username <username>", "username").default(
2221
null
@@ -30,6 +29,13 @@ const emailOpt = new Option("-e, --email <email>", "email address").default(
3029
null
3130
);
3231

32+
const registryOpt = new Option(
33+
"-r, --registry <url>",
34+
"url of registry into which to login"
35+
)
36+
.argParser(mustBeRegistryUrl)
37+
.default(null);
38+
3339
const basicAuthOpt = new Option(
3440
"--basic-auth",
3541
"use basic authentication instead of token"
@@ -67,44 +73,32 @@ export function makeLoginCmd(
6773
.addOption(emailOpt)
6874
.addOption(basicAuthOpt)
6975
.addOption(alwaysAuthOpt)
76+
.addOption(registryOpt)
77+
.addOption(systemUserOpt)
7078
.description("authenticate with a scoped registry")
7179
.action(
72-
withErrorLogger(log, async function (loginOptions, cmd) {
73-
const globalOptions = cmd.optsWithGlobals<GlobalOptions>();
74-
75-
// parse env
76-
const env = await parseEnvUsing(
77-
log,
78-
process.env,
79-
process.cwd(),
80-
globalOptions
81-
);
82-
80+
withErrorLogger(log, async function (options) {
8381
const homePath = getHomePathFromEnv(process.env);
8482
const upmConfigPath = getUserUpmConfigPathFor(
8583
process.env,
8684
homePath,
87-
env.systemUser
85+
options.systemUser
8886
);
8987

9088
// query parameters
91-
const username = loginOptions.username ?? (await promptUsername());
92-
const password = loginOptions.password ?? (await promptPassword());
93-
const email = loginOptions.email ?? (await promptEmail());
94-
95-
const loginRegistry =
96-
globalOptions.registry !== undefined
97-
? coerceRegistryUrl(globalOptions.registry)
98-
: await promptRegistryUrl();
89+
const username = options.username ?? (await promptUsername());
90+
const password = options.password ?? (await promptPassword());
91+
const email = options.email ?? (await promptEmail());
92+
const loginRegistry = options.registry ?? (await promptRegistryUrl());
9993

10094
await login(
10195
username,
10296
password,
10397
email,
104-
loginOptions.alwaysAuth,
98+
options.alwaysAuth,
10599
loginRegistry,
106100
upmConfigPath,
107-
loginOptions.basicAuth ? "basic" : "token"
101+
options.basicAuth ? "basic" : "token"
108102
);
109103

110104
log.notice("auth", `you are authenticated as '${username}'`);

src/cli/cmd-remove.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import { makePackageReference } from "../domain/package-reference";
77
import type { ReadTextFile, WriteTextFile } from "../io/fs";
88
import { eachValue } from "./cli-parsing";
99
import { logError, withErrorLogger } from "./error-logging";
10-
import { GlobalOptions } from "./options";
11-
import { parseEnvUsing } from "./parse-env";
10+
import { workDirOpt } from "./opt-wd";
1211
import { ResultCodes } from "./result-codes";
1312
import { mustBeDomainName } from "./validators";
1413

@@ -46,23 +45,18 @@ export function makeRemoveCmd(
4645
.aliases(["rm", "uninstall"])
4746
.addArgument(pkgArg)
4847
.addArgument(otherPkgsArg)
48+
.addOption(workDirOpt)
4949
.description("remove package from manifest json")
5050
.action(
5151
withErrorLogger(
5252
log,
53-
async function (packageName, otherPackageNames, _, cmd) {
54-
const globalOptions = cmd.optsWithGlobals<GlobalOptions>();
53+
async function (packageName, otherPackageNames, options) {
5554
const pkgs = [packageName, ...otherPackageNames];
5655

57-
// parse env
58-
const env = await parseEnvUsing(
59-
log,
60-
process.env,
61-
process.cwd(),
62-
globalOptions
63-
);
56+
const projectDir = options.chdir;
6457

65-
const removeResult = await removeDependencies(env.cwd, pkgs).promise;
58+
const removeResult = await removeDependencies(projectDir, pkgs)
59+
.promise;
6660
if (removeResult.isErr()) {
6761
logError(log, removeResult.error);
6862
return process.exit(ResultCodes.Error);

src/cli/cmd-search.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import { getUserUpmConfigPathFor } from "../domain/upm-config";
1010
import type { ReadTextFile } from "../io/fs";
1111
import type { GetAllRegistryPackuments, SearchRegistry } from "../io/registry";
1212
import { withErrorLogger } from "./error-logging";
13-
import { GlobalOptions } from "./options";
13+
import { primaryRegistryUrlOpt } from "./opt-registry";
14+
import { systemUserOpt } from "./opt-system-user";
1415
import { formatAsTable } from "./output-formatting";
15-
import { parseEnvUsing } from "./parse-env";
1616
import { ResultCodes } from "./result-codes";
1717

1818
/**
@@ -41,31 +41,24 @@ export function makeSearchCmd(
4141
);
4242
return new Command("search")
4343
.argument("<keyword>", "The keyword to search")
44+
.addOption(primaryRegistryUrlOpt)
45+
.addOption(systemUserOpt)
4446
.aliases(["s", "se", "find"])
4547
.description("Search package by keyword")
4648
.action(
47-
withErrorLogger(log, async function (keyword, _, cmd) {
48-
const globalOptions = cmd.optsWithGlobals<GlobalOptions>();
49-
50-
// parse env
51-
const env = await parseEnvUsing(
52-
log,
53-
process.env,
54-
process.cwd(),
55-
globalOptions
56-
);
49+
withErrorLogger(log, async function (keyword, options) {
5750
const homePath = getHomePathFromEnv(process.env);
5851
const upmConfigPath = getUserUpmConfigPathFor(
5952
process.env,
6053
homePath,
61-
env.systemUser
54+
options.systemUser
6255
);
6356

6457
const primaryRegistry = await loadRegistryAuthUsing(
6558
readTextFile,
6659
debugLog,
6760
upmConfigPath,
68-
env.primaryRegistryUrl
61+
options.registry
6962
);
7063

7164
let usedEndpoint = "npmsearch";

src/cli/cmd-view.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ import { getUserUpmConfigPathFor } from "../domain/upm-config";
1212
import type { ReadTextFile } from "../io/fs";
1313
import type { GetRegistryPackument } from "../io/registry";
1414
import { withErrorLogger } from "./error-logging";
15-
import { GlobalOptions } from "./options";
15+
import { primaryRegistryUrlOpt } from "./opt-registry";
16+
import { systemUserOpt } from "./opt-system-user";
17+
import { upstreamOpt } from "./opt-upstream";
1618
import { formatPackumentInfo } from "./output-formatting";
17-
import { parseEnvUsing } from "./parse-env";
1819
import { ResultCodes } from "./result-codes";
1920
import { mustBePackageReference } from "./validators";
2021

@@ -34,31 +35,25 @@ export function makeViewCmd(
3435
) {
3536
return new Command("view")
3637
.argument("<pkg>", "Reference to a package", mustBePackageReference)
38+
.addOption(primaryRegistryUrlOpt)
39+
.addOption(systemUserOpt)
40+
.addOption(upstreamOpt)
3741
.aliases(["v", "info", "show"])
3842
.description("view package information")
3943
.action(
40-
withErrorLogger(log, async function (pkg, _, cmd) {
41-
const globalOptions = cmd.optsWithGlobals<GlobalOptions>();
42-
43-
// parse env
44-
const env = await parseEnvUsing(
45-
log,
46-
process.env,
47-
process.cwd(),
48-
globalOptions
49-
);
44+
withErrorLogger(log, async function (pkg, options) {
5045
const homePath = getHomePathFromEnv(process.env);
5146
const upmConfigPath = getUserUpmConfigPathFor(
5247
process.env,
5348
homePath,
54-
env.systemUser
49+
options.systemUser
5550
);
5651

5752
const primaryRegistry = await loadRegistryAuthUsing(
5853
readTextFile,
5954
debugLog,
6055
upmConfigPath,
61-
env.primaryRegistryUrl
56+
options.registry
6257
);
6358

6459
// parse name
@@ -74,7 +69,7 @@ export function makeViewCmd(
7469
// verify name
7570
const sources = [
7671
primaryRegistry,
77-
...(env.upstream ? [unityRegistry] : []),
72+
...(options.upstream ? [unityRegistry] : []),
7873
];
7974
const packumentFromRegistry = await queryAllRegistriesLazy(
8075
sources,

0 commit comments

Comments
 (0)