Skip to content

refactor: move packument fetch #326

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/cli/cmd-add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ import { Logger } from "npmlog";
import { logValidDependency } from "./dependency-logging";
import { unityRegistryUrl } from "../domain/registry-url";
import { tryGetTargetEditorVersionFor } from "../domain/package-manifest";
import { FetchPackumentError } from "../services/fetch-packument";
import { VersionNotFoundError } from "../domain/packument";
import {FetchPackumentError} from "../io/packument-io";

export class InvalidPackumentDataError extends CustomError {
private readonly _class = "InvalidPackumentDataError";
Expand Down
5 changes: 3 additions & 2 deletions src/cli/cmd-view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import {
PackumentNotFoundError,
} from "../common-errors";
import { Logger } from "npmlog";
import { FetchPackumentService } from "../services/fetch-packument";

import {FetchPackument} from "../io/packument-io";

export type ViewOptions = CmdOptions;

Expand Down Expand Up @@ -105,7 +106,7 @@ const printInfo = function (packument: UnityPackument) {
*/
export function makeViewCmd(
parseEnv: ParseEnvService,
fetchPackument: FetchPackumentService,
fetchPackument: FetchPackument,
log: Logger
): ViewCmd {
return async (pkg, options) => {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { makeDepsCmd } from "./cmd-deps";
import { makeLoginCmd } from "./cmd-login";
import { eachValue } from "./cli-parsing";
import { CmdOptions } from "./options";
import { makeFetchPackumentService } from "../services/fetch-packument";
import { makeAddCmd } from "./cmd-add";
import { makeAuthNpmrcService } from "../services/npmrc-auth";
import { makeNpmLoginService } from "../services/npm-login";
Expand Down Expand Up @@ -43,6 +42,7 @@ import {
import { makeCwdGetter, makeHomePathGetter } from "../io/special-paths";
import { makeProjectVersionLoader } from "../io/project-version-io";
import { makeSaveAuthToUpmConfigService } from "../services/upm-auth";
import {makePackumentFetcher} from "../io/packument-io";

// Composition root

Expand All @@ -68,7 +68,7 @@ const parseEnv = makeParseEnvService(
getCwd,
loadProjectVersion
);
const fetchPackument = makeFetchPackumentService(regClient);
const fetchPackument = makePackumentFetcher(regClient);
const authNpmrc = makeAuthNpmrcService(findNpmrcPath, loadNpmrc, saveNpmrc);
const npmLogin = makeNpmLoginService(regClient);
const searchRegistry = makeSearchRegistryService();
Expand Down
16 changes: 8 additions & 8 deletions src/services/fetch-packument.ts → src/io/packument-io.ts
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
import RegClient from "another-npm-registry-client";
import { AsyncResult, Err, Ok } from "ts-results-es";
import { assertIsHttpError } from "../utils/error-type-guards";
import { Registry } from "../domain/registry";
import { DomainName } from "../domain/domain-name";
import { UnityPackument } from "../domain/packument";
import { HttpErrorBase } from "npm-registry-fetch/lib/errors";
import { DomainName } from "../domain/domain-name";
import { Registry } from "../domain/registry";

/**
* Error which may occur when fetching a packument from a remote registry.
*/
export type FetchPackumentError = HttpErrorBase;

/**
* Service function for fetching a packument from a registry.
* Function for fetching a packument from a registry.
* @param registry The registry to fetch from.
* @param name The name of the packument to fetch.
* @returns The packument or null of not found.
*/

export type FetchPackumentService = (
export type FetchPackument = (
registry: Registry,
name: DomainName
) => AsyncResult<UnityPackument | null, FetchPackumentError>;

/**
* Makes a {@link FetchPackumentService} function.
* Makes a {@link FetchPackument} function.
*/
export function makeFetchPackumentService(
export function makePackumentFetcher(
registryClient: RegClient.Instance
): FetchPackumentService {
): FetchPackument {
return (registry, name) => {
const url = `${registry.url}/${name}`;
return new AsyncResult(
Expand Down
2 changes: 1 addition & 1 deletion src/services/dependency-resolving.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ import {
ResolveLatestVersionService,
} from "./resolve-latest-version";
import { Err, Ok, Result } from "ts-results-es";
import { FetchPackumentError } from "./fetch-packument";
import { PackumentNotFoundError } from "../common-errors";
import { HttpErrorBase } from "npm-registry-fetch/lib/errors";
import {FetchPackumentError} from "../io/packument-io";

export type DependencyBase = {
/**
Expand Down
4 changes: 2 additions & 2 deletions src/services/resolve-latest-version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import { DomainName } from "../domain/domain-name";
import { AsyncResult, Err, Ok } from "ts-results-es";
import { SemanticVersion } from "../domain/semantic-version";
import { PackumentNotFoundError } from "../common-errors";
import { FetchPackumentError, FetchPackumentService } from "./fetch-packument";
import { NoVersionsError, tryGetLatestVersion } from "../domain/packument";
import { recordKeys } from "../utils/record-utils";
import {FetchPackumentError, FetchPackument} from "../io/packument-io";

/**
* Error which may occur when resolving the latest version for a package.
Expand All @@ -26,7 +26,7 @@ export type ResolveLatestVersionService = (
) => AsyncResult<SemanticVersion, ResolveLatestVersionError>;

export function makeResolveLatestVersionService(
fetchPackument: FetchPackumentService
fetchPackument: FetchPackument
): ResolveLatestVersionService {
const resolveLatestVersion: ResolveLatestVersionService = (
sources,
Expand Down
4 changes: 2 additions & 2 deletions src/services/resolve-remote-packument.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import {
ResolvedPackument,
} from "../packument-resolving";
import { PackumentNotFoundError } from "../common-errors";
import { FetchPackumentError, FetchPackumentService } from "./fetch-packument";
import { tryResolvePackumentVersion } from "../domain/packument";
import {FetchPackumentError, FetchPackument} from "../io/packument-io";

/**
* Service function for resolving remove packuments.
Expand All @@ -29,7 +29,7 @@ export type ResolveRemotePackumentService = (
* Makes a {@link ResolveRemotePackumentService} function.
*/
export function makeResolveRemotePackumentService(
fetchPackument: FetchPackumentService
fetchPackument: FetchPackument
): ResolveRemotePackumentService {
return (packageName, requestedVersion, source) =>
fetchPackument(source, packageName)
Expand Down
5 changes: 3 additions & 2 deletions test/cli/cmd-view.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ import {
import { makeMockLogger } from "./log.mock";
import { buildPackument } from "../domain/data-packument";
import { mockService } from "../services/service.mock";
import { FetchPackumentService } from "../../src/services/fetch-packument";

import {FetchPackument} from "../../src/io/packument-io";

const somePackage = makeDomainName("com.some.package");
const somePackument = buildPackument(somePackage, (packument) =>
Expand Down Expand Up @@ -57,7 +58,7 @@ function makeDependencies() {
const parseEnv = mockService<ParseEnvService>();
parseEnv.mockResolvedValue(Ok(defaultEnv));

const fetchPackument = mockService<FetchPackumentService>();
const fetchPackument = mockService<FetchPackument>();
fetchPackument.mockReturnValue(Ok(somePackument).toAsyncResult());

const log = makeMockLogger();
Expand Down
72 changes: 72 additions & 0 deletions test/io/packument-io.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { buildPackument } from "../domain/data-packument";
import { HttpErrorBase } from "npm-registry-fetch/lib/errors";
import { makeDomainName } from "../../src/domain/domain-name";
import RegClient from "another-npm-registry-client";
import { Registry } from "../../src/domain/registry";
import { exampleRegistryUrl } from "../domain/data-registry";
import { mockRegClientGetResult } from "../services/registry-client.mock";
import { makePackumentFetcher } from "../../src/io/packument-io";

describe("packument io", () => {
describe("fetch", () => {
const packageA = makeDomainName("package-a");
const exampleRegistry: Registry = {
url: exampleRegistryUrl,
auth: null,
};

function makeDependencies() {
const regClient: jest.Mocked<RegClient.Instance> = {
adduser: jest.fn(),
get: jest.fn(),
};

const fetchPackument = makePackumentFetcher(regClient);
return { fetchPackument, regClient } as const;
}
it("should get existing packument", async () => {
// TODO: Use prop test
const packument = buildPackument(packageA);
const { fetchPackument, regClient } = makeDependencies();
mockRegClientGetResult(regClient, null, packument);

const result = await fetchPackument(exampleRegistry, packageA).promise;

expect(result).toBeOk((actual) => expect(actual).toEqual(packument));
});

it("should not find unknown packument", async () => {
const { fetchPackument, regClient } = makeDependencies();
mockRegClientGetResult(
regClient,
{
message: "not found",
name: "FakeError",
statusCode: 404,
} as HttpErrorBase,
null
);

const result = await fetchPackument(exampleRegistry, packageA).promise;

expect(result).toBeOk((actual) => expect(actual).toBeNull());
});

it("should fail for errors", async () => {
const { fetchPackument, regClient } = makeDependencies();
mockRegClientGetResult(
regClient,
{
message: "Unauthorized",
name: "FakeError",
statusCode: 401,
} as HttpErrorBase,
null
);

const result = await fetchPackument(exampleRegistry, packageA).promise;

expect(result).toBeError();
});
});
});
71 changes: 0 additions & 71 deletions test/services/fetch-packument.test.ts

This file was deleted.

4 changes: 2 additions & 2 deletions test/services/resolve-latest-version.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { mockService } from "./service.mock";
import { FetchPackumentService } from "../../src/services/fetch-packument";
import { makeResolveLatestVersionService } from "../../src/services/resolve-latest-version";
import { makeDomainName } from "../../src/domain/domain-name";
import { PackumentNotFoundError } from "../../src/common-errors";
Expand All @@ -8,6 +7,7 @@ import { NoVersionsError, UnityPackument } from "../../src/domain/packument";
import { Registry } from "../../src/domain/registry";
import { exampleRegistryUrl } from "../domain/data-registry";
import { unityRegistryUrl } from "../../src/domain/registry-url";
import {FetchPackument} from "../../src/io/packument-io";

describe("resolve latest version service", () => {
const somePackage = makeDomainName("com.some.package");
Expand All @@ -16,7 +16,7 @@ describe("resolve latest version service", () => {
const upstreamRegistry: Registry = { url: unityRegistryUrl, auth: null };

function makeDependencies() {
const fetchPackument = mockService<FetchPackumentService>();
const fetchPackument = mockService<FetchPackument>();

const resolveLatestVersion =
makeResolveLatestVersionService(fetchPackument);
Expand Down
4 changes: 2 additions & 2 deletions test/services/resolve-remote-packument.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { mockService } from "./service.mock";
import { FetchPackumentService } from "../../src/services/fetch-packument";
import { makeResolveRemotePackumentService } from "../../src/services/resolve-remote-packument";
import { Ok } from "ts-results-es";
import { makeDomainName } from "../../src/domain/domain-name";
Expand All @@ -8,6 +7,7 @@ import { Registry } from "../../src/domain/registry";
import { exampleRegistryUrl } from "../domain/data-registry";
import { PackumentNotFoundError } from "../../src/common-errors";
import { buildPackument } from "../domain/data-packument";
import {FetchPackument} from "../../src/io/packument-io";

describe("resolve remote packument service", () => {
const somePackage = makeDomainName("com.some.package");
Expand All @@ -17,7 +17,7 @@ describe("resolve remote packument service", () => {
const someRegistry: Registry = { url: exampleRegistryUrl, auth: null };

function makeDependencies() {
const fetchPackument = mockService<FetchPackumentService>();
const fetchPackument = mockService<FetchPackument>();

const resolveRemotePackument =
makeResolveRemotePackumentService(fetchPackument);
Expand Down
Loading