UNPKG

isolate-package

Version:

Isolate monorepo packages to form a self-contained deployable unit

399 lines (338 loc) 11.2 kB
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; import type { PackageManifest } from "~/lib/types"; import { copyPatches } from "./copy-patches"; /** Mock fs-extra */ vi.mock("fs-extra", () => ({ default: { ensureDir: vi.fn(), existsSync: vi.fn(), copy: vi.fn(), }, })); /** Mock the utils */ vi.mock("~/lib/utils", () => ({ filterPatchedDependencies: vi.fn(), getIsolateRelativeLogPath: vi.fn((p: string) => p), getRootRelativeLogPath: vi.fn((p: string) => p), isRushWorkspace: vi.fn(() => false), readTypedJson: vi.fn(), })); /** Mock the package manager */ vi.mock("~/lib/package-manager", () => ({ usePackageManager: vi.fn(() => ({ majorVersion: 9 })), })); /** Mock the pnpm lockfile readers */ vi.mock("pnpm_lockfile_file_v8", () => ({ readWantedLockfile: vi.fn(() => Promise.resolve(null)), })); vi.mock("pnpm_lockfile_file_v9", () => ({ readWantedLockfile: vi.fn(() => Promise.resolve(null)), })); /** Mock the logger */ vi.mock("~/lib/logger", () => ({ useLogger: () => ({ debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }), })); const fs = vi.mocked((await import("fs-extra")).default); const { filterPatchedDependencies, readTypedJson } = vi.mocked( await import("~/lib/utils"), ); describe("copyPatches", () => { beforeEach(() => { vi.clearAllMocks(); }); afterEach(() => { vi.restoreAllMocks(); }); it("should return empty object when workspace root package.json cannot be read", async () => { readTypedJson.mockRejectedValue(new Error("File not found")); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: { name: "test", version: "1.0.0" }, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({}); }); it("should return empty object when no patchedDependencies in workspace root", async () => { readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", } as PackageManifest); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: { name: "test", version: "1.0.0" }, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({}); }); it("should return empty object when all patches are filtered out", async () => { readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "lodash@4.17.21": "patches/lodash.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue(undefined); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: { name: "test", version: "1.0.0" }, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({}); }); it("should copy patches for production dependencies", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", dependencies: { lodash: "^4.0.0" }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "lodash@4.17.21": "patches/lodash.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "lodash@4.17.21": "patches/lodash.patch", }); fs.existsSync.mockReturnValue(true); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({ "lodash@4.17.21": { path: "patches/lodash.patch", hash: "" }, }); /** Should preserve original folder structure */ expect(fs.ensureDir).toHaveBeenCalledWith("/workspace/isolate/patches"); expect(fs.copy).toHaveBeenCalledWith( "/workspace/patches/lodash.patch", "/workspace/isolate/patches/lodash.patch", ); }); it("should include dev dependency patches when includeDevDependencies is true", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", devDependencies: { vitest: "^1.0.0" }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "vitest@1.0.0": "patches/vitest.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "vitest@1.0.0": "patches/vitest.patch", }); fs.existsSync.mockReturnValue(true); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: true, }); expect(result).toEqual({ "vitest@1.0.0": { path: "patches/vitest.patch", hash: "" }, }); expect(filterPatchedDependencies).toHaveBeenCalledWith({ patchedDependencies: { "vitest@1.0.0": "patches/vitest.patch" }, targetPackageManifest: targetManifest, includeDevDependencies: true, }); expect(fs.copy).toHaveBeenCalledWith( "/workspace/patches/vitest.patch", "/workspace/isolate/patches/vitest.patch", ); }); it("should skip missing patch files and log a warning", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", dependencies: { lodash: "^4.0.0" }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "lodash@4.17.21": "patches/lodash.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "lodash@4.17.21": "patches/lodash.patch", }); fs.existsSync.mockReturnValue(false); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({}); expect(fs.copy).not.toHaveBeenCalled(); }); it("should handle scoped package names correctly", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", dependencies: { "@firebase/app": "^1.0.0" }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "@firebase/app@1.2.3": "patches/firebase-app.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "@firebase/app@1.2.3": "patches/firebase-app.patch", }); fs.existsSync.mockReturnValue(true); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({ "@firebase/app@1.2.3": { path: "patches/firebase-app.patch", hash: "" }, }); }); it("should preserve nested folder structure when copying patches", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", dependencies: { "pkg-a": "^1.0.0", "pkg-b": "^1.0.0" }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "pkg-a@1.0.0": "patches/v1/fix.patch", "pkg-b@1.0.0": "patches/v2/fix.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "pkg-a@1.0.0": "patches/v1/fix.patch", "pkg-b@1.0.0": "patches/v2/fix.patch", }); fs.existsSync.mockReturnValue(true); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); /** Should preserve original paths without renaming */ expect(result).toEqual({ "pkg-a@1.0.0": { path: "patches/v1/fix.patch", hash: "" }, "pkg-b@1.0.0": { path: "patches/v2/fix.patch", hash: "" }, }); expect(fs.copy).toHaveBeenCalledTimes(2); expect(fs.copy).toHaveBeenCalledWith( "/workspace/patches/v1/fix.patch", "/workspace/isolate/patches/v1/fix.patch", ); expect(fs.copy).toHaveBeenCalledWith( "/workspace/patches/v2/fix.patch", "/workspace/isolate/patches/v2/fix.patch", ); }); it("should preserve deeply nested patch paths", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", dependencies: { lodash: "^4.0.0" }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "lodash@4.17.21": "some/nested/path/lodash.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "lodash@4.17.21": "some/nested/path/lodash.patch", }); fs.existsSync.mockReturnValue(true); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); /** The path should preserve the original directory structure */ expect(result).toEqual({ "lodash@4.17.21": { path: "some/nested/path/lodash.patch", hash: "" }, }); expect(fs.ensureDir).toHaveBeenCalledWith( "/workspace/isolate/some/nested/path", ); expect(fs.copy).toHaveBeenCalledWith( "/workspace/some/nested/path/lodash.patch", "/workspace/isolate/some/nested/path/lodash.patch", ); }); it("should copy multiple patches correctly", async () => { const targetManifest: PackageManifest = { name: "test", version: "1.0.0", dependencies: { lodash: "^4.0.0", "@firebase/app": "^1.0.0", }, }; readTypedJson.mockResolvedValue({ name: "root", version: "1.0.0", pnpm: { patchedDependencies: { "lodash@4.17.21": "patches/lodash.patch", "@firebase/app@1.2.3": "patches/firebase-app.patch", }, }, } as PackageManifest); filterPatchedDependencies.mockReturnValue({ "lodash@4.17.21": "patches/lodash.patch", "@firebase/app@1.2.3": "patches/firebase-app.patch", }); fs.existsSync.mockReturnValue(true); const result = await copyPatches({ workspaceRootDir: "/workspace", targetPackageManifest: targetManifest, isolateDir: "/workspace/isolate", includeDevDependencies: false, }); expect(result).toEqual({ "lodash@4.17.21": { path: "patches/lodash.patch", hash: "" }, "@firebase/app@1.2.3": { path: "patches/firebase-app.patch", hash: "" }, }); expect(fs.copy).toHaveBeenCalledTimes(2); }); });