Skip to content

Commit

Permalink
refacor: clean up logging
Browse files Browse the repository at this point in the history
  • Loading branch information
ComradeVanti committed Jul 5, 2024
1 parent b083429 commit 57de6f9
Show file tree
Hide file tree
Showing 58 changed files with 666 additions and 1,363 deletions.
163 changes: 52 additions & 111 deletions src/cli/cmd-add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ import {
WriteProjectManifest,
} from "../io/project-manifest-io";
import { ParseEnv } from "../services/parse-env";
import {
compareEditorVersion,
stringifyEditorVersion,
} from "../domain/editor-version";
import { compareEditorVersion, EditorVersion } from "../domain/editor-version";
import { DomainName } from "../domain/domain-name";
import {
makePackageReference,
Expand All @@ -26,49 +23,39 @@ import {
UnityProjectManifest,
} from "../domain/project-manifest";
import { CmdOptions } from "./options";
import {
pickMostFixable,
ResolvePackumentVersionError,
} from "../packument-version-resolving";
import { pickMostFixable } from "../packument-version-resolving";
import { SemanticVersion } from "../domain/semantic-version";
import { areArraysEqual } from "../utils/array-utils";
import { Err, Ok, Result } from "ts-results-es";
import { CustomError } from "ts-custom-error";
import {
DependencyResolveError,
ResolveDependencies,
} from "../services/dependency-resolving";
import { ResolveDependencies } from "../services/dependency-resolving";
import { ResolveRemotePackumentVersion } from "../services/resolve-remote-packument-version";
import { Logger } from "npmlog";
import { logValidDependency } from "./dependency-logging";
import { unityRegistryUrl } from "../domain/registry-url";
import { tryGetTargetEditorVersionFor } from "../domain/package-manifest";
import { VersionNotFoundError } from "../domain/packument";
import { DebugLog } from "../logging";
import { DetermineEditorVersion } from "../services/determine-editor-version";
import { ResultCodes } from "./result-codes";
import { notifyPackumentVersionResolvingFailed } from "./error-logging";
import { logError } from "./error-logging";

export class InvalidPackumentDataError extends CustomError {
private readonly _class = "InvalidPackumentDataError";
constructor(readonly issue: string) {
super("A packument object was malformed.");
export class PackageIncompatibleError extends CustomError {
constructor(
public readonly packageRef: PackageReference,
public readonly editorVersion: EditorVersion
) {
super();
}
}

export class EditorIncompatibleError extends CustomError {
private readonly _class = "EditorIncompatibleError";
constructor() {
super(
"A packuments target editor-version was not compatible with the installed editor-version."
);
export class UnresolvedDependenciesError extends CustomError {
constructor(public readonly packageRef: PackageReference) {
super();
}
}

export class UnresolvedDependencyError extends CustomError {
private readonly _class = "UnresolvedDependencyError";
constructor() {
super("A packuments dependency could not be resolved.");
export class CompatibilityCheckFailedError extends CustomError {
constructor(public readonly packageRef: PackageReference) {
super();
}
}

Expand All @@ -77,11 +64,6 @@ export type AddOptions = CmdOptions<{
force?: boolean;
}>;

type AddError =
| ResolvePackumentVersionError
| EditorIncompatibleError
| DependencyResolveError;

/**
* The different command result codes for the add command.
*/
Expand Down Expand Up @@ -127,7 +109,7 @@ export function makeAddCmd(
const tryAddToManifest = async function (
manifest: UnityProjectManifest,
pkg: PackageReference
): Promise<Result<[UnityProjectManifest, boolean], AddError>> {
): Promise<[UnityProjectManifest, boolean]> {
// is upstream package flag
let isUpstreamPackage = false;
// parse name
Expand Down Expand Up @@ -156,71 +138,48 @@ export function makeAddCmd(
}
}

if (resolveResult.isErr()) {
notifyPackumentVersionResolvingFailed(log, name, resolveResult.error);
return resolveResult;
}
if (resolveResult.isErr()) throw resolveResult.error;

const packumentVersion = resolveResult.value.packumentVersion;
versionToAdd = packumentVersion.version;

const targetEditorVersionResult =
tryGetTargetEditorVersionFor(packumentVersion);
if (targetEditorVersionResult.isErr()) {
log.warn(
"package.unity",
`${targetEditorVersionResult.error.versionString} is not valid`
);
if (!options.force) {
log.notice(
"suggest",
"contact the package author to fix the issue, or run with option -f to ignore the warning"
);
throw new InvalidPackumentDataError("Editor-version not valid.");
}
} else {
const targetEditorVersion = targetEditorVersionResult.value;

// verify editor version
if (
targetEditorVersion !== null &&
typeof editorVersion !== "string" &&
compareEditorVersion(editorVersion, targetEditorVersion) < 0
) {
log.warn(
"editor.version",
`requires ${targetEditorVersion} but found ${stringifyEditorVersion(
editorVersion
)}`
);
// Only do compatibility check when we have a valid editor version
if (typeof editorVersion !== "string") {
let targetEditorVersion: EditorVersion | null;
try {
targetEditorVersion =
tryGetTargetEditorVersionFor(packumentVersion);
} catch (error) {
if (!options.force) {
log.notice(
"suggest",
`upgrade the editor to ${targetEditorVersion}, or run with option -f to ignore the warning`
const packageRef = makePackageReference(name, versionToAdd);
debugLog(
`"${packageRef}" is malformed. Target editor version could not be determined.`
);
return Err(new EditorIncompatibleError());
throw new CompatibilityCheckFailedError(packageRef);
}
targetEditorVersion = null;
}

// verify editor version
const isCompatible =
targetEditorVersion === null ||
compareEditorVersion(editorVersion, targetEditorVersion) >= 0;
if (!isCompatible && !options.force)
throw new PackageIncompatibleError(
makePackageReference(name, versionToAdd),
targetEditorVersion!
);
}

// pkgsInScope
if (!isUpstreamPackage) {
debugLog(`fetch: ${makePackageReference(name, requestedVersion)}`);
const resolveResult = await resolveDependencies(
const [depsValid, depsInvalid] = await resolveDependencies(
[env.registry, env.upstreamRegistry],
name,
requestedVersion,
true
);
if (resolveResult.isErr()) {
notifyPackumentVersionResolvingFailed(
log,
name,
resolveResult.error
);
return resolveResult;
}
const [depsValid, depsInvalid] = resolveResult.value;

// add depsValid to pkgsInScope.
depsValid.forEach((dependency) =>
Expand All @@ -237,35 +196,17 @@ export function makeAddCmd(
// print suggestion for depsInvalid
let isAnyDependencyUnresolved = false;
depsInvalid.forEach((depObj) => {
notifyPackumentVersionResolvingFailed(
log,
depObj.name,
depObj.reason
);
logError(log, depObj.reason);

// If the manifest already has the dependency than it does not
// really matter that it was not resolved.
if (!hasDependency(manifest, depObj.name)) {
if (!hasDependency(manifest, depObj.name))
isAnyDependencyUnresolved = true;
if (depObj.reason instanceof VersionNotFoundError)
log.notice(
"suggest",
`to install ${makePackageReference(
depObj.name,
depObj.reason.requestedVersion
)} or a replaceable version manually`
);
}
});
if (isAnyDependencyUnresolved) {
if (!options.force) {
log.error(
"missing dependencies",
"please resolve the issue or run with option -f to ignore the warning"
);
throw new UnresolvedDependencyError();
}
}
if (isAnyDependencyUnresolved && !options.force)
throw new UnresolvedDependenciesError(
makePackageReference(name, versionToAdd)
);
} else pkgsInScope.push(name);
}
// add to dependencies
Expand Down Expand Up @@ -312,7 +253,7 @@ export function makeAddCmd(
}
if (options.test) manifest = addTestable(manifest, name);

return Ok([manifest, dirty]);
return [manifest, dirty];
};

// load manifest
Expand All @@ -321,10 +262,10 @@ export function makeAddCmd(
// add
let dirty = false;
for (const pkg of pkgs) {
const result = await tryAddToManifest(manifest, pkg);
if (result.isErr()) return ResultCodes.Error;

const [newManifest, manifestChanged] = result.value;
const [newManifest, manifestChanged] = await tryAddToManifest(
manifest,
pkg
);
if (manifestChanged) {
manifest = newManifest;
dirty = true;
Expand Down
9 changes: 1 addition & 8 deletions src/cli/cmd-deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { logValidDependency } from "./dependency-logging";
import { VersionNotFoundError } from "../domain/packument";
import { DebugLog } from "../logging";
import { ResultCodes } from "./result-codes";
import { notifyPackumentVersionResolvingFailed } from "./error-logging";

export type DepsOptions = CmdOptions<{
deep?: boolean;
Expand Down Expand Up @@ -64,18 +63,12 @@ export function makeDepsCmd(

const deep = options.deep || false;
debugLog(`fetch: ${makePackageReference(name, version)}, deep=${deep}`);
const resolveResult = await resolveDependencies(
const [depsValid, depsInvalid] = await resolveDependencies(
[env.registry, env.upstreamRegistry],
name,
version,
deep
);
if (resolveResult.isErr()) {
notifyPackumentVersionResolvingFailed(log, name, resolveResult.error);
return ResultCodes.Error;
}

const [depsValid, depsInvalid] = resolveResult.value;

depsValid.forEach((dependency) => logValidDependency(debugLog, dependency));
depsValid
Expand Down
14 changes: 2 additions & 12 deletions src/cli/cmd-login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import { CmdOptions } from "./options";
import { Logger } from "npmlog";
import { Login } from "../services/login";
import { ResultCodes } from "./result-codes";
import { RegistryAuthenticationError } from "../io/common-errors";

/**
* Options for logging in a user. These come from the CLI.
Expand Down Expand Up @@ -64,24 +63,15 @@ export function makeLoginCmd(

const configPath = await getUpmConfigPath(env.wsl, env.systemUser);

const loginResult = await login(
await login(
username,
password,
email,
alwaysAuth,
loginRegistry,
configPath,
options.basicAuth ? "basic" : "token"
).promise;

if (loginResult.isErr()) {
const loginError = loginResult.error;
if (loginError instanceof RegistryAuthenticationError)
log.warn("401", "Incorrect username or password");

// TODO: Log all errors
return ResultCodes.Error;
}
);

log.notice("auth", `you are authenticated as '${username}'`);
log.notice("config", "saved unity config at " + configPath);
Expand Down
4 changes: 2 additions & 2 deletions src/cli/cmd-remove.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { makePackageReference } from "../domain/package-reference";
import { CmdOptions } from "./options";
import { Logger } from "npmlog";
import { ResultCodes } from "./result-codes";
import { notifyPackumentNotFoundInManifest } from "./error-logging";
import { DomainName } from "../domain/domain-name";
import { RemovePackages } from "../services/remove-packages";
import { logError } from "./error-logging";

/**
* The possible result codes with which the remove command can exit.
Expand Down Expand Up @@ -38,7 +38,7 @@ export function makeRemoveCmd(

const removeResult = await removePackages(env.cwd, pkgs).promise;
if (removeResult.isErr()) {
notifyPackumentNotFoundInManifest(log, removeResult.error.packageName);
logError(log, removeResult.error);
return ResultCodes.Error;
}
const removedPackages = removeResult.value;
Expand Down
6 changes: 2 additions & 4 deletions src/cli/cmd-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { Logger } from "npmlog";
import { ResultCodes } from "./result-codes";
import { FetchPackument } from "../io/packument-io";
import { queryAllRegistriesLazy } from "../utils/sources";
import { PackumentNotFoundError } from "../common-errors";

export type ViewOptions = CmdOptions;

Expand Down Expand Up @@ -129,10 +130,7 @@ export function makeViewCmd(
(source) => fetchPackument(source, pkg)
);
const packument = packumentFromRegistry?.value ?? null;
if (packument === null) {
log.error("404", `package not found: ${pkg}`);
return ResultCodes.Error;
}
if (packument === null) throw new PackumentNotFoundError(pkg);

printInfo(packument);
return ResultCodes.Ok;
Expand Down
Loading

0 comments on commit 57de6f9

Please sign in to comment.