From 3cf2948c7aaf2e196533be8c37a228694dfdb5eb Mon Sep 17 00:00:00 2001 From: Iku-turso Date: Fri, 21 Apr 2023 15:24:31 +0300 Subject: [PATCH] feat: Support duplicate files in linking Co-authored-by: Janne Savolainen Signed-off-by: Iku-turso --- .../lens-link/src/get-symlink-paths.injectable.ts | 6 +++++- .../infrastructure/lens-link/src/lens-link.test.ts | 11 ++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/infrastructure/lens-link/src/get-symlink-paths.injectable.ts b/packages/infrastructure/lens-link/src/get-symlink-paths.injectable.ts index 083e452969..8cc0de4339 100644 --- a/packages/infrastructure/lens-link/src/get-symlink-paths.injectable.ts +++ b/packages/infrastructure/lens-link/src/get-symlink-paths.injectable.ts @@ -1,8 +1,8 @@ +import { flatten, map, partition, uniq, uniqBy } from "lodash/fp"; import type { PackageJsonAndPath } from "./package-json-and-path"; import { globInjectable } from "./fs/glob.injectable"; import { resolvePathInjectable } from "./path/resolve-path.injectable"; import { awaitAll } from "./await-all"; -import { flatten, map, partition } from "lodash/fp"; import { getInjectable } from "@ogre-tools/injectable"; import { pipeline } from "@ogre-tools/fp"; import { getLensLinkDirectoryInjectable } from "./get-lens-link-directory.injectable"; @@ -44,6 +44,8 @@ export const getSymlinkPathsInjectable = getInjectable({ const notGlobbedFilesOrDirectories = await pipeline( toNotBeGlobbed, + uniq, + map(async (fileOrDirectory) => { const target = resolvePath(moduleDirectory, fileOrDirectory); @@ -77,6 +79,8 @@ export const getSymlinkPathsInjectable = getInjectable({ awaitAll, flatten, + + uniqBy((x) => x.source), ); }; }, diff --git a/packages/infrastructure/lens-link/src/lens-link.test.ts b/packages/infrastructure/lens-link/src/lens-link.test.ts index ea9afb33bc..0179dfb236 100644 --- a/packages/infrastructure/lens-link/src/lens-link.test.ts +++ b/packages/infrastructure/lens-link/src/lens-link.test.ts @@ -236,6 +236,8 @@ describe("lens-link", () => { await readJsonFileMock.resolveSpecific(([path]) => path === "/some-directory/some-module/package.json", { name: "@some-scope/some-module", files: [ + "some-duplicate-file", + "some-duplicate-file", "some-build-directory-with-asterisk/*", "some-build-directory-with-wild-card/**", "some-build-directory-with-wild-card-before-asterisk/**/*", @@ -286,8 +288,9 @@ describe("lens-link", () => { describe("when globbing resolves and files or directories are identified", () => { beforeEach(async () => { - await globMock.resolve(["some-directory-from-glob/some-file-from-glob.txt"]); + await globMock.resolve(["some-directory-from-glob/some-file-from-glob.txt", "some-duplicate-file"]); + await isFileOrDirectoryMock.resolve("file"); await isFileOrDirectoryMock.resolve("dir"); await isFileOrDirectoryMock.resolve("dir"); await isFileOrDirectoryMock.resolve("dir"); @@ -307,6 +310,12 @@ describe("lens-link", () => { "file", ], + [ + "/some-directory/some-module/some-duplicate-file", + "/some-directory/some-project/node_modules/@some-scope/some-module/some-duplicate-file", + "file", + ], + [ "/some-directory/some-module/some-build-directory-with-asterisk", "/some-directory/some-project/node_modules/@some-scope/some-module/some-build-directory-with-asterisk",