1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

feat: Implement custom error message and support for NPM-scopes

Co-authored-by: Janne Savolainen <janne.savolainen@live.fi>
Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
Iku-turso 2023-04-21 09:06:59 +03:00
parent 21e46cd4b2
commit c0c714db71
2 changed files with 130 additions and 7 deletions

View File

@ -4,7 +4,23 @@ import type { JsonValue } from "type-fest";
export type ReadJsonFile = (path: string) => Promise<JsonValue>;
export const readJsonFileInjectable = getInjectable({
id: "read-json-file",
export const readJsonFileWithoutErrorHandlingInjectable = getInjectable({
id: "read-json-file-without-error-handling",
instantiate: (): ReadJsonFile => fse.readJson,
});
export const readJsonFileInjectable = getInjectable({
id: "read-json-file",
instantiate:
(di): ReadJsonFile =>
async (path) => {
const readJsonFileLol = di.inject(readJsonFileWithoutErrorHandlingInjectable);
try {
return await readJsonFileLol(path);
} catch ({ message }) {
throw new Error(`Tried to read file "${path}", but error was thrown: "${message}"`);
}
},
});

View File

@ -13,7 +13,7 @@ import type { RemoveDirectory } from "./fs/remove-directory.injectable";
import { workingDirectoryInjectable } from "./working-directory.injectable";
import { resolvePathInjectable } from "./path/resolve-path.injectable";
import { existsInjectable } from "./fs/exists.injectable";
import { readJsonFileInjectable } from "./fs/read-json-file.injectable";
import { readJsonFileWithoutErrorHandlingInjectable } from "./fs/read-json-file.injectable";
import { writeJsonFileInjectable } from "./fs/write-json-file.injectable";
import { createSymlinkInjectable } from "./fs/create-symlink.injectable";
import { ensureDirectoryInjectable } from "./fs/ensure-directory.injectable";
@ -42,7 +42,7 @@ describe("lens-link", () => {
di.override(workingDirectoryInjectable, () => "/some-directory/some-project");
di.override(resolvePathInjectable, () => path.posix.resolve);
di.override(existsInjectable, () => existsMock);
di.override(readJsonFileInjectable, () => readJsonFileMock);
di.override(readJsonFileWithoutErrorHandlingInjectable, () => readJsonFileMock);
di.override(writeJsonFileInjectable, () => writeJsonFileMock);
di.override(createSymlinkInjectable, () => createSymlinkMock);
di.override(ensureDirectoryInjectable, () => ensureDirectoryMock);
@ -153,13 +153,120 @@ describe("lens-link", () => {
]);
});
xit("when any of the reading fails, throws", () => {});
it("when any of the reading fails, throws", () => {
readJsonFileMock.reject(new Error("some-error"));
xit("given some of the package is scoped, when all contents resolve", () => {});
return expect(actualPromise).rejects.toThrow(
'Tried to read file "/some-directory/some-module/package.json", but error was thrown: "some-error"',
);
});
describe("given some of the packages are NPM-scoped, when all contents resolve", () => {
beforeEach(async () => {
existsMock.mockClear();
await readJsonFileMock.resolveSpecific(([path]) => path === "/some-directory/some-module/package.json", {
name: "@some-scope/some-module",
files: ["some-build-directory"],
main: "some-build-directory/index.js",
});
await readJsonFileMock.resolveSpecific(
([path]) => path === "/some-other-directory/some-other-module/package.json",
{
name: "@some-scope/some-other-module",
files: ["some-other-build-directory"],
main: "some-other-build-directory/index.js",
},
);
});
it("checks for existing Lens link directories using scope as directory", () => {
expect(existsMock.mock.calls).toEqual([
["/some-directory/some-project/node_modules/@some-scope/some-module"],
["/some-directory/some-project/node_modules/@some-scope/some-other-module"],
]);
});
describe("given some Lens link directories exist", () => {
beforeEach(async () => {
await existsMock.resolveSpecific(
([path]) => path === "/some-directory/some-project/node_modules/@some-scope/some-module",
false,
);
await existsMock.resolveSpecific(
([path]) => path === "/some-directory/some-project/node_modules/@some-scope/some-other-module",
true,
);
});
it("removes the existing Lens link directories", () => {
expect(removeDirectoryMock.mock.calls).toEqual([
["/some-directory/some-project/node_modules/@some-scope/some-other-module"],
]);
});
it("when removing resolves, creates the Lens link directories", async () => {
await removeDirectoryMock.resolve();
expect(ensureDirectoryMock.mock.calls).toEqual([
["/some-directory/some-project/node_modules/@some-scope/some-module"],
["/some-directory/some-project/node_modules/@some-scope/some-other-module"],
]);
});
});
describe("given Lens link directories does not exist", () => {
beforeEach(async () => {
await existsMock.resolve(false);
await existsMock.resolve(false);
});
it("creates the Lens link directories to scoped directories", () => {
expect(ensureDirectoryMock.mock.calls).toEqual([
["/some-directory/some-project/node_modules/@some-scope/some-module"],
["/some-directory/some-project/node_modules/@some-scope/some-other-module"],
]);
});
describe("when creation of Lens link directories resolve", () => {
beforeEach(async () => {
await ensureDirectoryMock.resolve();
await ensureDirectoryMock.resolve();
});
it("creates the symlinks to scoped directories", () => {
expect(createSymlinkMock.mock.calls).toEqual([
[
"/some-directory/some-module/package.json",
"/some-directory/some-project/node_modules/@some-scope/some-module/package.json",
"file",
],
[
"/some-directory/some-module/some-build-directory",
"/some-directory/some-project/node_modules/@some-scope/some-module/some-build-directory",
"dir",
],
[
"/some-other-directory/some-other-module/package.json",
"/some-directory/some-project/node_modules/@some-scope/some-other-module/package.json",
"file",
],
[
"/some-other-directory/some-other-module/some-other-build-directory",
"/some-directory/some-project/node_modules/@some-scope/some-other-module/some-other-build-directory",
"dir",
],
]);
});
});
});
});
describe("when all contents resolve", () => {
beforeEach(async () => {
await existsMock.mockClear();
existsMock.mockClear();
await readJsonFileMock.resolveSpecific(([path]) => path === "/some-directory/some-module/package.json", {
name: "some-module",