mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
chore: Simplify code by not reinventing existing fs-extra operation
Co-authored-by: Janne Savolainen <janne.savolainen@live.fi> Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
parent
fb6bf2143c
commit
4429a24e59
@ -4,17 +4,17 @@ import { map } from "lodash/fp";
|
|||||||
import type { PackageJsonAndPath } from "./package-json-and-path";
|
import type { PackageJsonAndPath } from "./package-json-and-path";
|
||||||
|
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { ensureDirectoryInjectable } from "./fs/ensure-directory.injectable";
|
import { ensureEmptyDirectoryInjectable } from "./fs/ensure-empty-directory.injectable";
|
||||||
import { getLensLinkDirectoryInjectable } from "./get-lens-link-directory.injectable";
|
import { getLensLinkDirectoryInjectable } from "./get-lens-link-directory.injectable";
|
||||||
|
|
||||||
export type CreateLensLinkDirectories = (packageJsons: PackageJsonAndPath[]) => Promise<void>;
|
export type CreateLensLinkDirectories = (packageJsons: PackageJsonAndPath[]) => Promise<void>;
|
||||||
|
|
||||||
export const createLensLinkDirectoriesInjectable = getInjectable({
|
export const ensureEmptyLensLinkDirectoriesInjectable = getInjectable({
|
||||||
id: "create-lens-link-directories",
|
id: "ensure-empty-lens-link-directories",
|
||||||
|
|
||||||
instantiate: (di): CreateLensLinkDirectories => {
|
instantiate: (di): CreateLensLinkDirectories => {
|
||||||
const getLensLinkDirectory = di.inject(getLensLinkDirectoryInjectable);
|
const getLensLinkDirectory = di.inject(getLensLinkDirectoryInjectable);
|
||||||
const ensureDirectory = di.inject(ensureDirectoryInjectable);
|
const ensureDirectory = di.inject(ensureEmptyDirectoryInjectable);
|
||||||
|
|
||||||
return async (packageJsons: PackageJsonAndPath[]) => {
|
return async (packageJsons: PackageJsonAndPath[]) => {
|
||||||
await pipeline(
|
await pipeline(
|
||||||
@ -1,9 +0,0 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
|
||||||
import fse from "fs-extra";
|
|
||||||
|
|
||||||
export type EnsureDirectory = (path: string) => Promise<void>;
|
|
||||||
|
|
||||||
export const ensureDirectoryInjectable = getInjectable({
|
|
||||||
id: "ensure-directory",
|
|
||||||
instantiate: (): EnsureDirectory => fse.ensureDir,
|
|
||||||
});
|
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import fse from "fs-extra";
|
||||||
|
|
||||||
|
export type EnsureEmptyDirectory = (path: string) => Promise<void>;
|
||||||
|
|
||||||
|
export const ensureEmptyDirectoryInjectable = getInjectable({
|
||||||
|
id: "ensure-empty-directory",
|
||||||
|
instantiate: (): EnsureEmptyDirectory => fse.emptyDir,
|
||||||
|
});
|
||||||
@ -1,9 +0,0 @@
|
|||||||
import { getInjectable } from "@ogre-tools/injectable";
|
|
||||||
import fse from "fs-extra";
|
|
||||||
|
|
||||||
export type RemoveDirectory = (path: string) => Promise<void>;
|
|
||||||
|
|
||||||
export const removeDirectoryInjectable = getInjectable({
|
|
||||||
id: "remove-directory",
|
|
||||||
instantiate: (): RemoveDirectory => fse.remove,
|
|
||||||
});
|
|
||||||
@ -1,5 +1,4 @@
|
|||||||
import { removeExistingLensLinkDirectoriesInjectable } from "./remove-existing-lens-link-directories.injectable";
|
import { ensureEmptyLensLinkDirectoriesInjectable } from "./ensure-empty-lens-link-directories.injectable";
|
||||||
import { createLensLinkDirectoriesInjectable } from "./create-lens-link-directories.injectable";
|
|
||||||
import { getPackageJsonsInjectable } from "./get-package-jsons.injectable";
|
import { getPackageJsonsInjectable } from "./get-package-jsons.injectable";
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { createSymlinksInjectable } from "./create-symlinks.injectable";
|
import { createSymlinksInjectable } from "./create-symlinks.injectable";
|
||||||
@ -13,8 +12,7 @@ const lensLinkInjectable = getInjectable({
|
|||||||
|
|
||||||
instantiate: (di): LensLink => {
|
instantiate: (di): LensLink => {
|
||||||
const getPackageJsons = di.inject(getPackageJsonsInjectable);
|
const getPackageJsons = di.inject(getPackageJsonsInjectable);
|
||||||
const removeExistingLensLinkDirectories = di.inject(removeExistingLensLinkDirectoriesInjectable);
|
const ensureEmptyLensLinkDirectories = di.inject(ensureEmptyLensLinkDirectoriesInjectable);
|
||||||
const createLensLinkDirectories = di.inject(createLensLinkDirectoriesInjectable);
|
|
||||||
const createSymlinks = di.inject(createSymlinksInjectable);
|
const createSymlinks = di.inject(createSymlinksInjectable);
|
||||||
const getConfig = di.inject(getConfigInjectable);
|
const getConfig = di.inject(getConfigInjectable);
|
||||||
const createEmptyConfig = di.inject(createEmptyConfigInjectable);
|
const createEmptyConfig = di.inject(createEmptyConfigInjectable);
|
||||||
@ -30,8 +28,7 @@ const lensLinkInjectable = getInjectable({
|
|||||||
|
|
||||||
const packageJsons = await getPackageJsons(config);
|
const packageJsons = await getPackageJsons(config);
|
||||||
|
|
||||||
await removeExistingLensLinkDirectories(packageJsons);
|
await ensureEmptyLensLinkDirectories(packageJsons);
|
||||||
await createLensLinkDirectories(packageJsons);
|
|
||||||
await createSymlinks(packageJsons);
|
await createSymlinks(packageJsons);
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|||||||
@ -8,16 +8,14 @@ import type { Exists } from "./fs/exists.injectable";
|
|||||||
import type { ReadJsonFile } from "./fs/read-json-file.injectable";
|
import type { ReadJsonFile } from "./fs/read-json-file.injectable";
|
||||||
import type { WriteJsonFile } from "./fs/write-json-file.injectable";
|
import type { WriteJsonFile } from "./fs/write-json-file.injectable";
|
||||||
import type { CreateSymlink } from "./fs/create-symlink.injectable";
|
import type { CreateSymlink } from "./fs/create-symlink.injectable";
|
||||||
import type { EnsureDirectory } from "./fs/ensure-directory.injectable";
|
import type { EnsureEmptyDirectory } from "./fs/ensure-empty-directory.injectable";
|
||||||
import type { RemoveDirectory } from "./fs/remove-directory.injectable";
|
|
||||||
import { workingDirectoryInjectable } from "./working-directory.injectable";
|
import { workingDirectoryInjectable } from "./working-directory.injectable";
|
||||||
import { resolvePathInjectable } from "./path/resolve-path.injectable";
|
import { resolvePathInjectable } from "./path/resolve-path.injectable";
|
||||||
import { existsInjectable } from "./fs/exists.injectable";
|
import { existsInjectable } from "./fs/exists.injectable";
|
||||||
import { readJsonFileWithoutErrorHandlingInjectable } from "./fs/read-json-file.injectable";
|
import { readJsonFileWithoutErrorHandlingInjectable } from "./fs/read-json-file.injectable";
|
||||||
import { writeJsonFileInjectable } from "./fs/write-json-file.injectable";
|
import { writeJsonFileInjectable } from "./fs/write-json-file.injectable";
|
||||||
import { createSymlinkInjectable } from "./fs/create-symlink.injectable";
|
import { createSymlinkInjectable } from "./fs/create-symlink.injectable";
|
||||||
import { ensureDirectoryInjectable } from "./fs/ensure-directory.injectable";
|
import { ensureEmptyDirectoryInjectable } from "./fs/ensure-empty-directory.injectable";
|
||||||
import { removeDirectoryInjectable } from "./fs/remove-directory.injectable";
|
|
||||||
import { getDi } from "./get-di";
|
import { getDi } from "./get-di";
|
||||||
import type { Glob } from "./fs/glob.injectable";
|
import type { Glob } from "./fs/glob.injectable";
|
||||||
import { globInjectable } from "./fs/glob.injectable";
|
import { globInjectable } from "./fs/glob.injectable";
|
||||||
@ -30,8 +28,7 @@ describe("lens-link", () => {
|
|||||||
let readJsonFileMock: AsyncFnMock<ReadJsonFile>;
|
let readJsonFileMock: AsyncFnMock<ReadJsonFile>;
|
||||||
let writeJsonFileMock: AsyncFnMock<WriteJsonFile>;
|
let writeJsonFileMock: AsyncFnMock<WriteJsonFile>;
|
||||||
let createSymlinkMock: AsyncFnMock<CreateSymlink>;
|
let createSymlinkMock: AsyncFnMock<CreateSymlink>;
|
||||||
let ensureDirectoryMock: AsyncFnMock<EnsureDirectory>;
|
let ensureEmptyDirectoryMock: AsyncFnMock<EnsureEmptyDirectory>;
|
||||||
let removeDirectoryMock: AsyncFnMock<RemoveDirectory>;
|
|
||||||
let globMock: AsyncFnMock<Glob>;
|
let globMock: AsyncFnMock<Glob>;
|
||||||
let isFileOrDirectoryMock: AsyncFnMock<IsFileOrDirectory>;
|
let isFileOrDirectoryMock: AsyncFnMock<IsFileOrDirectory>;
|
||||||
|
|
||||||
@ -40,8 +37,7 @@ describe("lens-link", () => {
|
|||||||
readJsonFileMock = asyncFn();
|
readJsonFileMock = asyncFn();
|
||||||
writeJsonFileMock = asyncFn();
|
writeJsonFileMock = asyncFn();
|
||||||
createSymlinkMock = asyncFn();
|
createSymlinkMock = asyncFn();
|
||||||
ensureDirectoryMock = asyncFn();
|
ensureEmptyDirectoryMock = asyncFn();
|
||||||
removeDirectoryMock = asyncFn();
|
|
||||||
isFileOrDirectoryMock = asyncFn();
|
isFileOrDirectoryMock = asyncFn();
|
||||||
globMock = asyncFn();
|
globMock = asyncFn();
|
||||||
|
|
||||||
@ -53,8 +49,7 @@ describe("lens-link", () => {
|
|||||||
di.override(readJsonFileWithoutErrorHandlingInjectable, () => readJsonFileMock);
|
di.override(readJsonFileWithoutErrorHandlingInjectable, () => readJsonFileMock);
|
||||||
di.override(writeJsonFileInjectable, () => writeJsonFileMock);
|
di.override(writeJsonFileInjectable, () => writeJsonFileMock);
|
||||||
di.override(createSymlinkInjectable, () => createSymlinkMock);
|
di.override(createSymlinkInjectable, () => createSymlinkMock);
|
||||||
di.override(ensureDirectoryInjectable, () => ensureDirectoryMock);
|
di.override(ensureEmptyDirectoryInjectable, () => ensureEmptyDirectoryMock);
|
||||||
di.override(removeDirectoryInjectable, () => removeDirectoryMock);
|
|
||||||
di.override(globInjectable, () => globMock);
|
di.override(globInjectable, () => globMock);
|
||||||
di.override(isFileOrDirectoryInjectable, () => isFileOrDirectoryMock);
|
di.override(isFileOrDirectoryInjectable, () => isFileOrDirectoryMock);
|
||||||
|
|
||||||
@ -191,50 +186,8 @@ describe("lens-link", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
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", () => {
|
it("creates the Lens link directories to scoped directories", () => {
|
||||||
expect(ensureDirectoryMock.mock.calls).toEqual([
|
expect(ensureEmptyDirectoryMock.mock.calls).toEqual([
|
||||||
["/some-directory/some-project/node_modules/@some-scope/some-module"],
|
["/some-directory/some-project/node_modules/@some-scope/some-module"],
|
||||||
["/some-directory/some-project/node_modules/@some-scope/some-other-module"],
|
["/some-directory/some-project/node_modules/@some-scope/some-other-module"],
|
||||||
]);
|
]);
|
||||||
@ -242,8 +195,8 @@ describe("lens-link", () => {
|
|||||||
|
|
||||||
describe("when creation of Lens link directories and files or directories are identified is resolve", () => {
|
describe("when creation of Lens link directories and files or directories are identified is resolve", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await ensureDirectoryMock.resolve();
|
await ensureEmptyDirectoryMock.resolve();
|
||||||
await ensureDirectoryMock.resolve();
|
await ensureEmptyDirectoryMock.resolve();
|
||||||
|
|
||||||
await isFileOrDirectoryMock.resolve("dir");
|
await isFileOrDirectoryMock.resolve("dir");
|
||||||
await isFileOrDirectoryMock.resolve("dir");
|
await isFileOrDirectoryMock.resolve("dir");
|
||||||
@ -275,7 +228,6 @@ describe("lens-link", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe("given some of the packages have globs as files, when all contents resolve", () => {
|
describe("given some of the packages have globs as files, when all contents resolve", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
@ -306,11 +258,8 @@ describe("lens-link", () => {
|
|||||||
|
|
||||||
describe("given Lens link directories are handled", () => {
|
describe("given Lens link directories are handled", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await existsMock.resolve(false);
|
await ensureEmptyDirectoryMock.resolve();
|
||||||
await existsMock.resolve(false);
|
await ensureEmptyDirectoryMock.resolve();
|
||||||
|
|
||||||
await ensureDirectoryMock.resolve();
|
|
||||||
await ensureDirectoryMock.resolve();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not create symlinks yet", () => {
|
it("does not create symlinks yet", () => {
|
||||||
@ -407,58 +356,8 @@ describe("lens-link", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("checks for existing Lens link directories", () => {
|
|
||||||
expect(existsMock.mock.calls).toEqual([
|
|
||||||
["/some-directory/some-project/node_modules/some-module"],
|
|
||||||
["/some-directory/some-project/node_modules/some-other-module"],
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not create the Lens link directories yet", () => {
|
|
||||||
expect(ensureDirectoryMock).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given some Lens link directories exist", () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await existsMock.resolveSpecific(
|
|
||||||
([path]) => path === "/some-directory/some-project/node_modules/some-module",
|
|
||||||
false,
|
|
||||||
);
|
|
||||||
|
|
||||||
await existsMock.resolveSpecific(
|
|
||||||
([path]) => path === "/some-directory/some-project/node_modules/some-other-module",
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not create the Lens link directories yet", () => {
|
|
||||||
expect(ensureDirectoryMock).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("removes the existing Lens link directories", () => {
|
|
||||||
expect(removeDirectoryMock.mock.calls).toEqual([
|
|
||||||
["/some-directory/some-project/node_modules/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-module"],
|
|
||||||
["/some-directory/some-project/node_modules/some-other-module"],
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("given Lens link directories do not exist", () => {
|
|
||||||
beforeEach(async () => {
|
|
||||||
await existsMock.resolve(false);
|
|
||||||
await existsMock.resolve(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("creates the Lens link directories", () => {
|
it("creates the Lens link directories", () => {
|
||||||
expect(ensureDirectoryMock.mock.calls).toEqual([
|
expect(ensureEmptyDirectoryMock.mock.calls).toEqual([
|
||||||
["/some-directory/some-project/node_modules/some-module"],
|
["/some-directory/some-project/node_modules/some-module"],
|
||||||
["/some-directory/some-project/node_modules/some-other-module"],
|
["/some-directory/some-project/node_modules/some-other-module"],
|
||||||
]);
|
]);
|
||||||
@ -470,8 +369,8 @@ describe("lens-link", () => {
|
|||||||
|
|
||||||
describe("when creation of Lens link directories resolve", () => {
|
describe("when creation of Lens link directories resolve", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await ensureDirectoryMock.resolve();
|
await ensureEmptyDirectoryMock.resolve();
|
||||||
await ensureDirectoryMock.resolve();
|
await ensureEmptyDirectoryMock.resolve();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("doesn't create symlinks yet", () => {
|
it("doesn't create symlinks yet", () => {
|
||||||
@ -564,5 +463,4 @@ describe("lens-link", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,43 +0,0 @@
|
|||||||
import { pipeline } from "@ogre-tools/fp";
|
|
||||||
import { map, filter } from "lodash/fp";
|
|
||||||
import { awaitAll } from "./await-all";
|
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
|
||||||
import { getLensLinkDirectoryInjectable } from "./get-lens-link-directory.injectable";
|
|
||||||
import { existsInjectable } from "./fs/exists.injectable";
|
|
||||||
import { removeDirectoryInjectable } from "./fs/remove-directory.injectable";
|
|
||||||
import type { PackageJsonAndPath } from "./package-json-and-path";
|
|
||||||
|
|
||||||
export type RemoveExistingLensLinkDirectories = (packageJsons: PackageJsonAndPath[]) => Promise<void>;
|
|
||||||
|
|
||||||
export const removeExistingLensLinkDirectoriesInjectable = getInjectable({
|
|
||||||
id: "remove-existing-lens-link-directories",
|
|
||||||
|
|
||||||
instantiate: (di): RemoveExistingLensLinkDirectories => {
|
|
||||||
const getLensLinkDirectory = di.inject(getLensLinkDirectoryInjectable);
|
|
||||||
const exists = di.inject(existsInjectable);
|
|
||||||
const removeDirectory = di.inject(removeDirectoryInjectable);
|
|
||||||
|
|
||||||
return async (packageJsons) => {
|
|
||||||
await pipeline(
|
|
||||||
packageJsons,
|
|
||||||
|
|
||||||
map(async ({ content }) => {
|
|
||||||
const lensLinkDirectory = getLensLinkDirectory(content.name);
|
|
||||||
|
|
||||||
return {
|
|
||||||
directory: lensLinkDirectory,
|
|
||||||
exists: await exists(lensLinkDirectory),
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
|
|
||||||
awaitAll,
|
|
||||||
|
|
||||||
filter(({ exists }) => exists),
|
|
||||||
|
|
||||||
map(({ directory }) => removeDirectory(directory)),
|
|
||||||
|
|
||||||
awaitAll,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
Loading…
Reference in New Issue
Block a user