isolate-package 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/index.mjs +1 -1
  2. package/dist/index.mjs.map +1 -1
  3. package/dist/{isolate-DyRD5Zd_.mjs → isolate-DI3eUTci.mjs} +862 -263
  4. package/dist/isolate-DI3eUTci.mjs.map +1 -0
  5. package/dist/isolate-bin.mjs +5 -6
  6. package/dist/isolate-bin.mjs.map +1 -1
  7. package/package.json +23 -19
  8. package/src/get-internal-package-names.test.ts +1 -1
  9. package/src/get-internal-package-names.ts +2 -2
  10. package/src/isolate-bin.ts +5 -5
  11. package/src/isolate.ts +22 -17
  12. package/src/lib/config.test.ts +1 -1
  13. package/src/lib/config.ts +3 -3
  14. package/src/lib/lockfile/helpers/bun-lockfile.ts +153 -0
  15. package/src/lib/lockfile/helpers/generate-bun-lockfile.test.ts +3 -3
  16. package/src/lib/lockfile/helpers/generate-bun-lockfile.ts +14 -146
  17. package/src/lib/lockfile/helpers/generate-npm-lockfile.integration.test.ts +1 -5
  18. package/src/lib/lockfile/helpers/generate-npm-lockfile.test.ts +311 -16
  19. package/src/lib/lockfile/helpers/generate-npm-lockfile.ts +193 -22
  20. package/src/lib/lockfile/helpers/generate-pnpm-lockfile.test.ts +2 -2
  21. package/src/lib/lockfile/helpers/generate-pnpm-lockfile.ts +6 -6
  22. package/src/lib/lockfile/helpers/generate-yarn-lockfile.ts +5 -5
  23. package/src/lib/lockfile/process-lockfile.test.ts +2 -2
  24. package/src/lib/manifest/helpers/adapt-internal-package-manifests.test.ts +3 -3
  25. package/src/lib/manifest/helpers/adapt-internal-package-manifests.ts +2 -2
  26. package/src/lib/manifest/helpers/adapt-manifest-internal-deps.ts +1 -1
  27. package/src/lib/manifest/helpers/adopt-pnpm-fields-from-root.test.ts +4 -4
  28. package/src/lib/manifest/helpers/adopt-pnpm-fields-from-root.ts +7 -7
  29. package/src/lib/manifest/helpers/resolve-catalog-dependencies.test.ts +410 -0
  30. package/src/lib/manifest/helpers/resolve-catalog-dependencies.ts +115 -27
  31. package/src/lib/manifest/io.ts +6 -2
  32. package/src/lib/manifest/validate-manifest.ts +2 -2
  33. package/src/lib/output/get-build-output-dir.ts +1 -1
  34. package/src/lib/output/pack-dependencies.ts +1 -1
  35. package/src/lib/output/process-build-output-files.ts +6 -17
  36. package/src/lib/package-manager/helpers/infer-from-files.ts +5 -5
  37. package/src/lib/package-manager/helpers/infer-from-manifest.ts +7 -8
  38. package/src/lib/package-manager/index.ts +1 -1
  39. package/src/lib/package-manager/names.ts +8 -10
  40. package/src/lib/patches/collect-installed-names-bun.test.ts +154 -0
  41. package/src/lib/patches/collect-installed-names-bun.ts +87 -0
  42. package/src/lib/patches/collect-installed-names-pnpm.test.ts +316 -0
  43. package/src/lib/patches/collect-installed-names-pnpm.ts +365 -0
  44. package/src/lib/patches/copy-patches.test.ts +130 -13
  45. package/src/lib/patches/copy-patches.ts +47 -10
  46. package/src/lib/patches/write-isolate-pnpm-workspace.test.ts +83 -3
  47. package/src/lib/patches/write-isolate-pnpm-workspace.ts +4 -4
  48. package/src/lib/registry/collect-reachable-package-names.test.ts +1 -1
  49. package/src/lib/registry/create-packages-registry.ts +34 -31
  50. package/src/lib/registry/helpers/find-packages-globs.ts +23 -19
  51. package/src/lib/registry/list-internal-packages.test.ts +2 -2
  52. package/src/lib/types.ts +2 -2
  53. package/src/lib/utils/filter-patched-dependencies.test.ts +1 -1
  54. package/src/lib/utils/filter-patched-dependencies.ts +2 -2
  55. package/src/lib/utils/get-dirname.ts +1 -1
  56. package/src/lib/utils/index.ts +1 -1
  57. package/src/lib/utils/json.ts +12 -14
  58. package/src/lib/utils/pack.ts +32 -22
  59. package/src/lib/utils/reset-isolate-dir.test.ts +165 -0
  60. package/src/lib/utils/reset-isolate-dir.ts +147 -0
  61. package/src/lib/utils/unpack.test.ts +76 -0
  62. package/src/lib/utils/unpack.ts +16 -10
  63. package/src/lib/utils/wait-for-complete-file.test.ts +105 -0
  64. package/src/lib/utils/wait-for-complete-file.ts +44 -0
  65. package/src/lib/utils/yaml.ts +8 -9
  66. package/src/testing/setup.ts +1 -1
  67. package/dist/isolate-DyRD5Zd_.mjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import fs from "fs-extra";
2
2
  import { execSync } from "node:child_process";
3
3
  import path from "node:path";
4
- import { useLogger } from "~/lib/logger";
5
- import { getErrorMessage, isRushWorkspace } from "~/lib/utils";
4
+ import { useLogger } from "#/lib/logger";
5
+ import { getErrorMessage, isRushWorkspace } from "#/lib/utils";
6
6
 
7
7
  /**
8
8
  * Generate an isolated / pruned lockfile, based on the existing lockfile from
@@ -43,8 +43,8 @@ export async function generateYarnLockfile({
43
43
  execSync(`yarn install --cwd ${isolateDir}`);
44
44
 
45
45
  log.debug("Generated lockfile at", newLockfilePath);
46
- } catch (err) {
47
- log.error(`Failed to generate lockfile: ${getErrorMessage(err)}`);
48
- throw err;
46
+ } catch (error) {
47
+ log.error(`Failed to generate lockfile: ${getErrorMessage(error)}`);
48
+ throw error;
49
49
  }
50
50
  }
@@ -3,7 +3,7 @@ import { processLockfile } from "./process-lockfile";
3
3
  import type { IsolateConfigResolved } from "../config";
4
4
 
5
5
  /** Mock the package manager detection */
6
- vi.mock("~/lib/package-manager", () => ({
6
+ vi.mock("#/lib/package-manager", () => ({
7
7
  usePackageManager: vi.fn(),
8
8
  }));
9
9
 
@@ -15,7 +15,7 @@ vi.mock("./helpers", () => ({
15
15
  generateYarnLockfile: vi.fn(),
16
16
  }));
17
17
 
18
- const { usePackageManager } = vi.mocked(await import("~/lib/package-manager"));
18
+ const { usePackageManager } = vi.mocked(await import("#/lib/package-manager"));
19
19
  const {
20
20
  generateBunLockfile,
21
21
  generateNpmLockfile,
@@ -1,8 +1,8 @@
1
1
  import { describe, it, expect, beforeEach, vi } from "vitest";
2
- import type { PackageManifest, PackagesRegistry } from "~/lib/types";
2
+ import type { PackageManifest, PackagesRegistry } from "#/lib/types";
3
3
 
4
4
  /** Mock dependencies */
5
- vi.mock("~/lib/package-manager", () => ({
5
+ vi.mock("#/lib/package-manager", () => ({
6
6
  usePackageManager: vi.fn(),
7
7
  }));
8
8
 
@@ -18,7 +18,7 @@ vi.mock("./resolve-catalog-dependencies", () => ({
18
18
  resolveCatalogDependencies: vi.fn((deps) => Promise.resolve(deps)),
19
19
  }));
20
20
 
21
- const { usePackageManager } = vi.mocked(await import("~/lib/package-manager"));
21
+ const { usePackageManager } = vi.mocked(await import("#/lib/package-manager"));
22
22
 
23
23
  const { writeManifest } = vi.mocked(await import("../io"));
24
24
 
@@ -1,8 +1,8 @@
1
1
  import { got } from "get-or-throw";
2
2
  import path from "node:path";
3
3
  import { omit } from "remeda";
4
- import { usePackageManager } from "~/lib/package-manager";
5
- import type { PackagesRegistry } from "~/lib/types";
4
+ import { usePackageManager } from "#/lib/package-manager";
5
+ import type { PackagesRegistry } from "#/lib/types";
6
6
  import { writeManifest } from "../io";
7
7
  import { adaptManifestInternalDeps } from "./adapt-manifest-internal-deps";
8
8
  import { resolveCatalogDependencies } from "./resolve-catalog-dependencies";
@@ -1,4 +1,4 @@
1
- import type { PackageManifest, PackagesRegistry } from "~/lib/types";
1
+ import type { PackageManifest, PackagesRegistry } from "#/lib/types";
2
2
  import { patchInternalEntries } from "./patch-internal-entries";
3
3
 
4
4
  /**
@@ -7,20 +7,20 @@ import type {
7
7
  import { adoptPnpmFieldsFromRoot } from "./adopt-pnpm-fields-from-root";
8
8
 
9
9
  /** Mock the dependencies */
10
- vi.mock("~/lib/utils", () => ({
10
+ vi.mock("#/lib/utils", () => ({
11
11
  isRushWorkspace: vi.fn(),
12
12
  readTypedJson: vi.fn(),
13
13
  }));
14
14
 
15
- vi.mock("~/lib/package-manager", () => ({
15
+ vi.mock("#/lib/package-manager", () => ({
16
16
  usePackageManager: vi.fn(() => ({ name: "pnpm", majorVersion: 9 })),
17
17
  }));
18
18
 
19
19
  const { isRushWorkspace, readTypedJson } = vi.mocked(
20
- await import("~/lib/utils"),
20
+ await import("#/lib/utils"),
21
21
  );
22
22
 
23
- const { usePackageManager } = vi.mocked(await import("~/lib/package-manager"));
23
+ const { usePackageManager } = vi.mocked(await import("#/lib/package-manager"));
24
24
 
25
25
  describe("adoptPnpmFieldsFromRoot", () => {
26
26
  beforeEach(() => {
@@ -1,8 +1,8 @@
1
1
  import type { ProjectManifest, PnpmSettings } from "@pnpm/types";
2
- import path from "path";
3
- import { usePackageManager } from "~/lib/package-manager";
4
- import type { PackageManifest } from "~/lib/types";
5
- import { isRushWorkspace, readTypedJson } from "~/lib/utils";
2
+ import path from "node:path";
3
+ import { usePackageManager } from "#/lib/package-manager";
4
+ import type { PackageManifest } from "#/lib/types";
5
+ import { isRushWorkspace, readTypedJson } from "#/lib/utils";
6
6
 
7
7
  /**
8
8
  * Adopts workspace-level fields from the root package manifest. For pnpm this
@@ -17,9 +17,9 @@ export async function adoptPnpmFieldsFromRoot(
17
17
  return targetPackageManifest;
18
18
  }
19
19
 
20
- const rootPackageManifest = await readTypedJson<ProjectManifest>(
20
+ const rootPackageManifest = (await readTypedJson(
21
21
  path.join(workspaceRootDir, "package.json"),
22
- );
22
+ )) as ProjectManifest;
23
23
 
24
24
  const packageManager = usePackageManager();
25
25
 
@@ -60,7 +60,7 @@ function adoptPnpmFieldsOnly(
60
60
  rootPackageManifest: ProjectManifest,
61
61
  ): PackageManifest {
62
62
  const { overrides, onlyBuiltDependencies, ignoredBuiltDependencies } =
63
- rootPackageManifest.pnpm || {};
63
+ rootPackageManifest.pnpm ?? {};
64
64
 
65
65
  /** If no pnpm fields are present, return the original manifest */
66
66
  if (!overrides && !onlyBuiltDependencies && !ignoredBuiltDependencies) {
@@ -0,0 +1,410 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import fs from "fs-extra";
4
+ import yaml from "yaml";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+
7
+ const mockLogger = {
8
+ debug: vi.fn(),
9
+ warn: vi.fn(),
10
+ };
11
+
12
+ vi.mock("#/lib/logger", () => ({
13
+ useLogger: vi.fn(() => mockLogger),
14
+ }));
15
+
16
+ const { resolveCatalogDependencies } =
17
+ await import("./resolve-catalog-dependencies");
18
+
19
+ /**
20
+ * Creates a temporary directory with optional pnpm-workspace.yaml and
21
+ * package.json for testing catalog resolution.
22
+ */
23
+ async function createTempWorkspace({
24
+ workspaceYaml,
25
+ workspaceYamlRaw,
26
+ packageJson,
27
+ }: {
28
+ workspaceYaml?: object;
29
+ workspaceYamlRaw?: string;
30
+ packageJson?: object;
31
+ }): Promise<string> {
32
+ const dir = await fs.mkdtemp(path.join(os.tmpdir(), "isolate-test-"));
33
+
34
+ if (workspaceYaml !== undefined) {
35
+ await fs.writeFile(
36
+ path.join(dir, "pnpm-workspace.yaml"),
37
+ yaml.stringify(workspaceYaml),
38
+ "utf-8",
39
+ );
40
+ } else if (workspaceYamlRaw !== undefined) {
41
+ await fs.writeFile(
42
+ path.join(dir, "pnpm-workspace.yaml"),
43
+ workspaceYamlRaw,
44
+ "utf-8",
45
+ );
46
+ }
47
+
48
+ /** Always write a minimal package.json so the fallback doesn't throw. */
49
+ const manifest = packageJson ?? { name: "root", version: "0.0.0" };
50
+ await fs.writeJson(path.join(dir, "package.json"), manifest);
51
+
52
+ return dir;
53
+ }
54
+
55
+ describe("resolveCatalogDependencies", () => {
56
+ let tmpDir: string;
57
+
58
+ beforeEach(() => {
59
+ vi.clearAllMocks();
60
+ });
61
+
62
+ afterEach(async () => {
63
+ if (tmpDir) {
64
+ await fs.remove(tmpDir);
65
+ }
66
+ });
67
+
68
+ describe("with no dependencies", () => {
69
+ it("returns undefined when dependencies is undefined", async () => {
70
+ tmpDir = await createTempWorkspace({});
71
+ const result = await resolveCatalogDependencies(undefined, tmpDir);
72
+ expect(result).toBeUndefined();
73
+ });
74
+ });
75
+
76
+ describe("pnpm-workspace.yaml: default catalog (catalog:)", () => {
77
+ it("resolves catalog: specifiers from pnpm-workspace.yaml", async () => {
78
+ tmpDir = await createTempWorkspace({
79
+ workspaceYaml: {
80
+ packages: ["packages/*"],
81
+ catalog: {
82
+ react: "^18.3.1",
83
+ typescript: "^5.0.0",
84
+ },
85
+ },
86
+ });
87
+
88
+ const result = await resolveCatalogDependencies(
89
+ { react: "catalog:", typescript: "catalog:", lodash: "^4.0.0" },
90
+ tmpDir,
91
+ );
92
+
93
+ expect(result).toEqual({
94
+ react: "^18.3.1",
95
+ typescript: "^5.0.0",
96
+ lodash: "^4.0.0",
97
+ });
98
+ });
99
+
100
+ it("also handles catalog:default as the default catalog name", async () => {
101
+ tmpDir = await createTempWorkspace({
102
+ workspaceYaml: {
103
+ packages: ["packages/*"],
104
+ catalogs: {
105
+ default: {
106
+ react: "^18.3.1",
107
+ },
108
+ },
109
+ },
110
+ });
111
+
112
+ const result = await resolveCatalogDependencies(
113
+ { react: "catalog:default" },
114
+ tmpDir,
115
+ );
116
+
117
+ expect(result).toEqual({ react: "^18.3.1" });
118
+ });
119
+
120
+ it("resolves catalog:default from the top-level catalog field", async () => {
121
+ tmpDir = await createTempWorkspace({
122
+ workspaceYaml: {
123
+ packages: ["packages/*"],
124
+ catalog: {
125
+ react: "^18.3.1",
126
+ },
127
+ },
128
+ });
129
+
130
+ const result = await resolveCatalogDependencies(
131
+ { react: "catalog:default" },
132
+ tmpDir,
133
+ );
134
+
135
+ expect(result).toEqual({ react: "^18.3.1" });
136
+ });
137
+ });
138
+
139
+ describe("pnpm-workspace.yaml: named catalogs (catalog:<name>)", () => {
140
+ it("resolves named catalog specifiers from pnpm-workspace.yaml", async () => {
141
+ tmpDir = await createTempWorkspace({
142
+ workspaceYaml: {
143
+ packages: ["packages/*"],
144
+ catalogs: {
145
+ react18: {
146
+ react: "^18.3.1",
147
+ "react-dom": "^18.3.1",
148
+ },
149
+ react19: {
150
+ react: "^19.0.0",
151
+ },
152
+ },
153
+ },
154
+ });
155
+
156
+ const result = await resolveCatalogDependencies(
157
+ {
158
+ react: "catalog:react18",
159
+ "react-dom": "catalog:react18",
160
+ },
161
+ tmpDir,
162
+ );
163
+
164
+ expect(result).toEqual({
165
+ react: "^18.3.1",
166
+ "react-dom": "^18.3.1",
167
+ });
168
+ });
169
+ });
170
+
171
+ describe("pnpm-workspace.yaml: missing package in catalog", () => {
172
+ it("keeps original specifier and warns when package not found in catalog", async () => {
173
+ tmpDir = await createTempWorkspace({
174
+ workspaceYaml: {
175
+ packages: ["packages/*"],
176
+ catalog: { react: "^18.0.0" },
177
+ },
178
+ });
179
+
180
+ const result = await resolveCatalogDependencies(
181
+ { react: "catalog:", "missing-pkg": "catalog:" },
182
+ tmpDir,
183
+ );
184
+
185
+ expect(result).toEqual({
186
+ react: "^18.0.0",
187
+ "missing-pkg": "catalog:", // kept as-is with a warning
188
+ });
189
+ });
190
+ });
191
+
192
+ describe("package.json fallback (Bun format)", () => {
193
+ it("resolves catalog: from root-level catalog field in package.json", async () => {
194
+ tmpDir = await createTempWorkspace({
195
+ packageJson: {
196
+ name: "root",
197
+ version: "0.0.0",
198
+ catalog: {
199
+ react: "^18.3.1",
200
+ },
201
+ },
202
+ });
203
+
204
+ const result = await resolveCatalogDependencies(
205
+ { react: "catalog:" },
206
+ tmpDir,
207
+ );
208
+
209
+ expect(result).toEqual({ react: "^18.3.1" });
210
+ });
211
+
212
+ it("resolves catalog: from workspaces.catalog in package.json", async () => {
213
+ tmpDir = await createTempWorkspace({
214
+ packageJson: {
215
+ name: "root",
216
+ version: "0.0.0",
217
+ workspaces: {
218
+ packages: ["packages/*"],
219
+ catalog: {
220
+ typescript: "^5.4.0",
221
+ },
222
+ },
223
+ },
224
+ });
225
+
226
+ const result = await resolveCatalogDependencies(
227
+ { typescript: "catalog:" },
228
+ tmpDir,
229
+ );
230
+
231
+ expect(result).toEqual({ typescript: "^5.4.0" });
232
+ });
233
+
234
+ it("resolves named catalog: from root-level catalogs field in package.json", async () => {
235
+ tmpDir = await createTempWorkspace({
236
+ packageJson: {
237
+ name: "root",
238
+ version: "0.0.0",
239
+ catalogs: {
240
+ react18: {
241
+ react: "^18.3.1",
242
+ "react-dom": "^18.3.1",
243
+ },
244
+ },
245
+ },
246
+ });
247
+
248
+ const result = await resolveCatalogDependencies(
249
+ {
250
+ react: "catalog:react18",
251
+ "react-dom": "catalog:react18",
252
+ },
253
+ tmpDir,
254
+ );
255
+
256
+ expect(result).toEqual({
257
+ react: "^18.3.1",
258
+ "react-dom": "^18.3.1",
259
+ });
260
+ });
261
+
262
+ it("resolves named catalog: from workspaces.catalogs in package.json", async () => {
263
+ tmpDir = await createTempWorkspace({
264
+ packageJson: {
265
+ name: "root",
266
+ version: "0.0.0",
267
+ workspaces: {
268
+ packages: ["packages/*"],
269
+ catalogs: {
270
+ tools: {
271
+ typescript: "^5.4.0",
272
+ eslint: "^8.0.0",
273
+ },
274
+ },
275
+ },
276
+ },
277
+ });
278
+
279
+ const result = await resolveCatalogDependencies(
280
+ { typescript: "catalog:tools", eslint: "catalog:tools" },
281
+ tmpDir,
282
+ );
283
+
284
+ expect(result).toEqual({
285
+ typescript: "^5.4.0",
286
+ eslint: "^8.0.0",
287
+ });
288
+ });
289
+ });
290
+
291
+ describe("precedence", () => {
292
+ it("prefers pnpm-workspace.yaml over package.json when both define the same catalog dependency", async () => {
293
+ tmpDir = await createTempWorkspace({
294
+ workspaceYaml: {
295
+ packages: ["packages/*"],
296
+ catalog: {
297
+ react: "^18.3.1",
298
+ },
299
+ },
300
+ packageJson: {
301
+ name: "root",
302
+ version: "0.0.0",
303
+ catalog: {
304
+ react: "^18.2.0",
305
+ },
306
+ },
307
+ });
308
+
309
+ const result = await resolveCatalogDependencies(
310
+ { react: "catalog:" },
311
+ tmpDir,
312
+ );
313
+
314
+ expect(result).toEqual({ react: "^18.3.1" });
315
+ });
316
+ });
317
+
318
+ describe("pnpm-workspace.yaml with invalid YAML", () => {
319
+ it("warns about invalid YAML and falls back to package.json", async () => {
320
+ tmpDir = await createTempWorkspace({
321
+ workspaceYamlRaw: "catalog:\n react: ^18.3.1\n - invalid format",
322
+ packageJson: {
323
+ name: "root",
324
+ version: "0.0.0",
325
+ catalog: { react: "^18.0.0" },
326
+ },
327
+ });
328
+
329
+ const result = await resolveCatalogDependencies(
330
+ { react: "catalog:" },
331
+ tmpDir,
332
+ );
333
+
334
+ /** Verify it fell back to package.json correctly. */
335
+ expect(result).toEqual({ react: "^18.0.0" });
336
+
337
+ /** Verify a warning was logged. */
338
+ expect(mockLogger.warn).toHaveBeenCalledWith(
339
+ expect.stringContaining(
340
+ `Failed to parse ${path.join(tmpDir, "pnpm-workspace.yaml")}:`,
341
+ ),
342
+ );
343
+ });
344
+ });
345
+
346
+ describe("pnpm-workspace.yaml without catalog fields", () => {
347
+ it("falls back to package.json when pnpm-workspace.yaml has no catalog", async () => {
348
+ tmpDir = await createTempWorkspace({
349
+ workspaceYaml: {
350
+ /** No catalog or catalogs field - just packages. */
351
+ packages: ["packages/*"],
352
+ },
353
+ packageJson: {
354
+ name: "root",
355
+ version: "0.0.0",
356
+ catalog: { react: "^18.0.0" },
357
+ },
358
+ });
359
+
360
+ const result = await resolveCatalogDependencies(
361
+ { react: "catalog:" },
362
+ tmpDir,
363
+ );
364
+
365
+ expect(result).toEqual({ react: "^18.0.0" });
366
+ });
367
+ });
368
+
369
+ describe("no catalog defined anywhere", () => {
370
+ it("returns dependencies as-is when no catalog is found", async () => {
371
+ tmpDir = await createTempWorkspace({});
372
+
373
+ const result = await resolveCatalogDependencies(
374
+ { react: "^18.0.0", typescript: "^5.0.0" },
375
+ tmpDir,
376
+ );
377
+
378
+ expect(result).toEqual({
379
+ react: "^18.0.0",
380
+ typescript: "^5.0.0",
381
+ });
382
+ });
383
+ });
384
+
385
+ describe("non-catalog specifiers", () => {
386
+ it("leaves non-catalog specifiers unchanged", async () => {
387
+ tmpDir = await createTempWorkspace({
388
+ workspaceYaml: {
389
+ packages: ["packages/*"],
390
+ catalog: { react: "^18.0.0" },
391
+ },
392
+ });
393
+
394
+ const result = await resolveCatalogDependencies(
395
+ {
396
+ react: "catalog:",
397
+ lodash: "^4.0.0",
398
+ typescript: "workspace:*",
399
+ },
400
+ tmpDir,
401
+ );
402
+
403
+ expect(result).toEqual({
404
+ react: "^18.0.0",
405
+ lodash: "^4.0.0",
406
+ typescript: "workspace:*",
407
+ });
408
+ });
409
+ });
410
+ });