mirror of
https://github.com/oven-sh/bun
synced 2026-02-14 12:51:54 +00:00
implement "nodeLinker": "isolated" in bun install (#20440)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
This commit is contained in:
committed by
Meghan Denny
parent
6eb0a4980a
commit
2a2bf27df1
@@ -12,7 +12,7 @@ beforeEach(() => {
|
||||
packageDir = tmpdirSync();
|
||||
});
|
||||
|
||||
async function packExpectError(cwd: string, env: NodeJS.ProcessEnv, ...args: string[]) {
|
||||
async function packExpectError(cwd: string, env: NodeJS.Dict<string>, ...args: string[]) {
|
||||
const { stdout, stderr, exited } = spawn({
|
||||
cmd: [bunExe(), "pm", "pack", ...args],
|
||||
cwd,
|
||||
|
||||
433
test/cli/install/isolated-install.test.ts
Normal file
433
test/cli/install/isolated-install.test.ts
Normal file
@@ -0,0 +1,433 @@
|
||||
import { file, write } from "bun";
|
||||
import { afterAll, beforeAll, describe, expect, setDefaultTimeout, test } from "bun:test";
|
||||
import { existsSync, readlinkSync } from "fs";
|
||||
import { VerdaccioRegistry, bunEnv, readdirSorted, runBunInstall } from "harness";
|
||||
import { join } from "path";
|
||||
|
||||
const registry = new VerdaccioRegistry();
|
||||
|
||||
beforeAll(async () => {
|
||||
setDefaultTimeout(10 * 60 * 1000);
|
||||
await registry.start();
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
registry.stop();
|
||||
});
|
||||
|
||||
describe("basic", () => {
|
||||
test("single dependency", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-1",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
},
|
||||
dependencies: {
|
||||
"no-deps": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "no-deps"))).toBe(
|
||||
join(".bun", "no-deps@1.0.0", "node_modules", "no-deps"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "no-deps"))).toBe(
|
||||
join("..", "no-deps@1.0.0", "node_modules", "no-deps"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "no-deps@1.0.0", "node_modules", "no-deps", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "no-deps",
|
||||
version: "1.0.0",
|
||||
});
|
||||
});
|
||||
|
||||
test("scope package", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-2",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
},
|
||||
dependencies: {
|
||||
"@types/is-number": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "@types", "is-number"))).toBe(
|
||||
join("..", ".bun", "@types+is-number@1.0.0", "node_modules", "@types", "is-number"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "@types", "is-number"))).toBe(
|
||||
join("..", "..", "@types+is-number@1.0.0", "node_modules", "@types", "is-number"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(
|
||||
packageDir,
|
||||
"node_modules",
|
||||
".bun",
|
||||
"@types+is-number@1.0.0",
|
||||
"node_modules",
|
||||
"@types",
|
||||
"is-number",
|
||||
"package.json",
|
||||
),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "@types/is-number",
|
||||
version: "1.0.0",
|
||||
});
|
||||
});
|
||||
|
||||
test("transitive dependencies", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-3",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
},
|
||||
dependencies: {
|
||||
"two-range-deps": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(await readdirSorted(join(packageDir, "node_modules"))).toEqual([".bun", "two-range-deps"]);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "two-range-deps"))).toBe(
|
||||
join(".bun", "two-range-deps@1.0.0", "node_modules", "two-range-deps"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "two-range-deps"))).toBe(
|
||||
join("..", "two-range-deps@1.0.0", "node_modules", "two-range-deps"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "no-deps"))).toBe(
|
||||
join("..", "no-deps@1.1.0", "node_modules", "no-deps"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "@types", "is-number"))).toBe(
|
||||
join("..", "..", "@types+is-number@2.0.0", "node_modules", "@types", "is-number"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(
|
||||
packageDir,
|
||||
"node_modules",
|
||||
".bun",
|
||||
"two-range-deps@1.0.0",
|
||||
"node_modules",
|
||||
"two-range-deps",
|
||||
"package.json",
|
||||
),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "two-range-deps",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"no-deps": "^1.0.0",
|
||||
"@types/is-number": ">=1.0.0",
|
||||
},
|
||||
});
|
||||
expect(
|
||||
await readdirSorted(join(packageDir, "node_modules", ".bun", "two-range-deps@1.0.0", "node_modules")),
|
||||
).toEqual(["@types", "no-deps", "two-range-deps"]);
|
||||
expect(
|
||||
readlinkSync(
|
||||
join(packageDir, "node_modules", ".bun", "two-range-deps@1.0.0", "node_modules", "@types", "is-number"),
|
||||
),
|
||||
).toBe(join("..", "..", "..", "@types+is-number@2.0.0", "node_modules", "@types", "is-number"));
|
||||
expect(
|
||||
readlinkSync(join(packageDir, "node_modules", ".bun", "two-range-deps@1.0.0", "node_modules", "no-deps")),
|
||||
).toBe(join("..", "..", "no-deps@1.1.0", "node_modules", "no-deps"));
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "no-deps@1.1.0", "node_modules", "no-deps", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "no-deps",
|
||||
version: "1.1.0",
|
||||
});
|
||||
expect(
|
||||
await file(
|
||||
join(
|
||||
packageDir,
|
||||
"node_modules",
|
||||
".bun",
|
||||
"@types+is-number@2.0.0",
|
||||
"node_modules",
|
||||
"@types",
|
||||
"is-number",
|
||||
"package.json",
|
||||
),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "@types/is-number",
|
||||
version: "2.0.0",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test("handles cyclic dependencies", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-cyclic",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
},
|
||||
dependencies: {
|
||||
"a-dep-b": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "a-dep-b"))).toBe(
|
||||
join(".bun", "a-dep-b@1.0.0", "node_modules", "a-dep-b"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "a-dep-b"))).toBe(
|
||||
join("..", "a-dep-b@1.0.0", "node_modules", "a-dep-b"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "b-dep-a"))).toBe(
|
||||
join("..", "b-dep-a@1.0.0", "node_modules", "b-dep-a"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "a-dep-b@1.0.0", "node_modules", "a-dep-b", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "a-dep-b",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"b-dep-a": "1.0.0",
|
||||
},
|
||||
});
|
||||
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "a-dep-b@1.0.0", "node_modules", "b-dep-a"))).toBe(
|
||||
join("..", "..", "b-dep-a@1.0.0", "node_modules", "b-dep-a"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "a-dep-b@1.0.0", "node_modules", "b-dep-a", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "b-dep-a",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"a-dep-b": "1.0.0",
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test("can install folder dependencies", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-folder-deps",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
},
|
||||
dependencies: {
|
||||
"folder-dep": "file:./pkg-1",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
await write(join(packageDir, "pkg-1", "package.json"), JSON.stringify({ name: "folder-dep", version: "1.0.0" }));
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "folder-dep"))).toBe(
|
||||
join(".bun", "folder-dep@file+pkg-1", "node_modules", "folder-dep"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "folder-dep@file+pkg-1", "node_modules", "folder-dep", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "folder-dep",
|
||||
version: "1.0.0",
|
||||
});
|
||||
|
||||
await write(join(packageDir, "pkg-1", "index.js"), "module.exports = 'hello from pkg-1';");
|
||||
|
||||
await runBunInstall(bunEnv, packageDir, { savesLockfile: false });
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "folder-dep"))).toBe(
|
||||
join(".bun", "folder-dep@file+pkg-1", "node_modules", "folder-dep"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "folder-dep@file+pkg-1", "node_modules", "folder-dep", "index.js"),
|
||||
).text(),
|
||||
).toBe("module.exports = 'hello from pkg-1';");
|
||||
});
|
||||
|
||||
describe("isolated workspaces", () => {
|
||||
test("basic", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await Promise.all([
|
||||
write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-workspaces",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
packages: ["pkg-1", "pkg-2"],
|
||||
},
|
||||
dependencies: {
|
||||
"no-deps": "1.0.0",
|
||||
},
|
||||
}),
|
||||
),
|
||||
write(
|
||||
join(packageDir, "pkg-1", "package.json"),
|
||||
JSON.stringify({
|
||||
name: "pkg-1",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"a-dep": "1.0.1",
|
||||
"pkg-2": "workspace:",
|
||||
"@types/is-number": "1.0.0",
|
||||
},
|
||||
}),
|
||||
),
|
||||
write(
|
||||
join(packageDir, "pkg-2", "package.json"),
|
||||
JSON.stringify({
|
||||
name: "pkg-2",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"b-dep-a": "1.0.0",
|
||||
},
|
||||
}),
|
||||
),
|
||||
]);
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(existsSync(join(packageDir, "node_modules", "pkg-1"))).toBeFalse();
|
||||
expect(readlinkSync(join(packageDir, "pkg-1", "node_modules", "pkg-2"))).toBe(join("..", "..", "pkg-2"));
|
||||
expect(await readdirSorted(join(packageDir, "node_modules"))).toEqual([".bun", "no-deps"]);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "no-deps"))).toBe(
|
||||
join(".bun", "no-deps@1.0.0", "node_modules", "no-deps"),
|
||||
);
|
||||
|
||||
expect(await readdirSorted(join(packageDir, "pkg-1", "node_modules"))).toEqual(["@types", "a-dep", "pkg-2"]);
|
||||
expect(await readdirSorted(join(packageDir, "pkg-2", "node_modules"))).toEqual(["b-dep-a"]);
|
||||
expect(await readdirSorted(join(packageDir, "node_modules", ".bun"))).toEqual([
|
||||
"@types+is-number@1.0.0",
|
||||
"a-dep-b@1.0.0",
|
||||
"a-dep@1.0.1",
|
||||
"b-dep-a@1.0.0",
|
||||
"no-deps@1.0.0",
|
||||
"node_modules",
|
||||
]);
|
||||
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "no-deps"))).toBe(
|
||||
join("..", "no-deps@1.0.0", "node_modules", "no-deps"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "no-deps@1.0.0", "node_modules", "no-deps", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "no-deps",
|
||||
version: "1.0.0",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test("many transitive dependencies", async () => {
|
||||
const { packageJson, packageDir } = await registry.createTestDir();
|
||||
|
||||
await write(
|
||||
packageJson,
|
||||
JSON.stringify({
|
||||
name: "test-pkg-many-transitive-deps",
|
||||
workspaces: {
|
||||
nodeLinker: "isolated",
|
||||
},
|
||||
dependencies: {
|
||||
"alias-loop-1": "1.0.0",
|
||||
"alias-loop-2": "1.0.0",
|
||||
"1-peer-dep-a": "1.0.0",
|
||||
"basic-1": "1.0.0",
|
||||
"is-number": "1.0.0",
|
||||
},
|
||||
}),
|
||||
);
|
||||
|
||||
await runBunInstall(bunEnv, packageDir);
|
||||
|
||||
expect(await readdirSorted(join(packageDir, "node_modules"))).toEqual([
|
||||
".bun",
|
||||
"1-peer-dep-a",
|
||||
"alias-loop-1",
|
||||
"alias-loop-2",
|
||||
"basic-1",
|
||||
"is-number",
|
||||
]);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", "alias-loop-1"))).toBe(
|
||||
join(".bun", "alias-loop-1@1.0.0", "node_modules", "alias-loop-1"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "alias-loop-1"))).toBe(
|
||||
join("..", "alias-loop-1@1.0.0", "node_modules", "alias-loop-1"),
|
||||
);
|
||||
expect(readlinkSync(join(packageDir, "node_modules", ".bun", "node_modules", "alias-loop-2"))).toBe(
|
||||
join("..", "alias-loop-2@1.0.0", "node_modules", "alias-loop-2"),
|
||||
);
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "alias-loop-1@1.0.0", "node_modules", "alias-loop-1", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "alias-loop-1",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"alias1": "npm:alias-loop-2@*",
|
||||
},
|
||||
});
|
||||
expect(
|
||||
await file(
|
||||
join(packageDir, "node_modules", ".bun", "alias-loop-2@1.0.0", "node_modules", "alias-loop-2", "package.json"),
|
||||
).json(),
|
||||
).toEqual({
|
||||
name: "alias-loop-2",
|
||||
version: "1.0.0",
|
||||
dependencies: {
|
||||
"alias2": "npm:alias-loop-1@*",
|
||||
},
|
||||
});
|
||||
// expect(await readdirSorted(join(packageDir, "node_modules", ".bun", "alias-loop-1@1.0.0", "node_modules"))).toEqual([
|
||||
// "alias1",
|
||||
// "alias-loop-1",
|
||||
// ]);
|
||||
// expect(readlinkSync(join(packageDir, "node_modules", ".bun", "alias-loop-1@1.0.0", "node_modules", "alias1"))).toBe(
|
||||
// join("..", "..", "alias-loop-2@1.0.0", "node_modules", "alias-loop-2"),
|
||||
// );
|
||||
// expect(readlinkSync(join(packageDir, "node_modules", ".bun", "alias-loop-2@1.0.0", "node_modules", "alias2"))).toBe(
|
||||
// join("..", "..", "alias-loop-1@1.0.0", "node_modules", "alias-loop-1"),
|
||||
// );
|
||||
});
|
||||
BIN
test/cli/install/registry/packages/a-dep-b/a-dep-b-1.0.0.tgz
Normal file
BIN
test/cli/install/registry/packages/a-dep-b/a-dep-b-1.0.0.tgz
Normal file
Binary file not shown.
44
test/cli/install/registry/packages/a-dep-b/package.json
Normal file
44
test/cli/install/registry/packages/a-dep-b/package.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "a-dep-b",
|
||||
"versions": {
|
||||
"1.0.0": {
|
||||
"name": "a-dep-b",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"b-dep-a": "1.0.0"
|
||||
},
|
||||
"_id": "a-dep-b@1.0.0",
|
||||
"_integrity": "sha512-PW1l4ruYaxcIw4rMkOVzb9zcR2srZhTPv2H2aH7QFc7vVxkD7EEMGHg1GPT8ycLFb8vriydUXEPwOy1FcbodaQ==",
|
||||
"_nodeVersion": "22.6.0",
|
||||
"_npmVersion": "10.8.3",
|
||||
"integrity": "sha512-PW1l4ruYaxcIw4rMkOVzb9zcR2srZhTPv2H2aH7QFc7vVxkD7EEMGHg1GPT8ycLFb8vriydUXEPwOy1FcbodaQ==",
|
||||
"shasum": "ed69ada9bf7341ed905c41f1282bd87713cc315f",
|
||||
"dist": {
|
||||
"integrity": "sha512-PW1l4ruYaxcIw4rMkOVzb9zcR2srZhTPv2H2aH7QFc7vVxkD7EEMGHg1GPT8ycLFb8vriydUXEPwOy1FcbodaQ==",
|
||||
"shasum": "ed69ada9bf7341ed905c41f1282bd87713cc315f",
|
||||
"tarball": "http://http://localhost:4873/a-dep-b/-/a-dep-b-1.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"modified": "2025-06-01T20:45:08.728Z",
|
||||
"created": "2025-06-01T20:45:08.728Z",
|
||||
"1.0.0": "2025-06-01T20:45:08.728Z"
|
||||
},
|
||||
"users": {},
|
||||
"dist-tags": {
|
||||
"latest": "1.0.0"
|
||||
},
|
||||
"_uplinks": {},
|
||||
"_distfiles": {},
|
||||
"_attachments": {
|
||||
"a-dep-b-1.0.0.tgz": {
|
||||
"shasum": "ed69ada9bf7341ed905c41f1282bd87713cc315f",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"_rev": "",
|
||||
"_id": "a-dep-b",
|
||||
"readme": ""
|
||||
}
|
||||
BIN
test/cli/install/registry/packages/b-dep-a/b-dep-a-1.0.0.tgz
Normal file
BIN
test/cli/install/registry/packages/b-dep-a/b-dep-a-1.0.0.tgz
Normal file
Binary file not shown.
44
test/cli/install/registry/packages/b-dep-a/package.json
Normal file
44
test/cli/install/registry/packages/b-dep-a/package.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "b-dep-a",
|
||||
"versions": {
|
||||
"1.0.0": {
|
||||
"name": "b-dep-a",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"a-dep-b": "1.0.0"
|
||||
},
|
||||
"_id": "b-dep-a@1.0.0",
|
||||
"_integrity": "sha512-1owp4Wy5QE893BGgjDQGZm9Oayk38MA++fXmPTQA1WY/NFQv7CcCVpK2Ht/4mU4KejDeHOxaAj7qbzv1dSQA2w==",
|
||||
"_nodeVersion": "22.6.0",
|
||||
"_npmVersion": "10.8.3",
|
||||
"integrity": "sha512-1owp4Wy5QE893BGgjDQGZm9Oayk38MA++fXmPTQA1WY/NFQv7CcCVpK2Ht/4mU4KejDeHOxaAj7qbzv1dSQA2w==",
|
||||
"shasum": "3d94682ad5231596f47745e03ef3d59af5945e1d",
|
||||
"dist": {
|
||||
"integrity": "sha512-1owp4Wy5QE893BGgjDQGZm9Oayk38MA++fXmPTQA1WY/NFQv7CcCVpK2Ht/4mU4KejDeHOxaAj7qbzv1dSQA2w==",
|
||||
"shasum": "3d94682ad5231596f47745e03ef3d59af5945e1d",
|
||||
"tarball": "http://http://localhost:4873/b-dep-a/-/b-dep-a-1.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"modified": "2025-06-01T20:45:23.481Z",
|
||||
"created": "2025-06-01T20:45:23.481Z",
|
||||
"1.0.0": "2025-06-01T20:45:23.481Z"
|
||||
},
|
||||
"users": {},
|
||||
"dist-tags": {
|
||||
"latest": "1.0.0"
|
||||
},
|
||||
"_uplinks": {},
|
||||
"_distfiles": {},
|
||||
"_attachments": {
|
||||
"b-dep-a-1.0.0.tgz": {
|
||||
"shasum": "3d94682ad5231596f47745e03ef3d59af5945e1d",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"_rev": "",
|
||||
"_id": "b-dep-a",
|
||||
"readme": ""
|
||||
}
|
||||
Binary file not shown.
42
test/cli/install/registry/packages/diff-peer-1/package.json
Normal file
42
test/cli/install/registry/packages/diff-peer-1/package.json
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "diff-peer-1",
|
||||
"versions": {
|
||||
"1.0.0": {
|
||||
"name": "diff-peer-1",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"has-peer": "1.0.0",
|
||||
"peer-no-deps": "1.0.0"
|
||||
},
|
||||
"_id": "diff-peer-1@1.0.0",
|
||||
"_nodeVersion": "23.10.0",
|
||||
"_npmVersion": "10.9.2",
|
||||
"dist": {
|
||||
"integrity": "sha512-a9nTh3aUOE6VDmn23Q9v6JUqBGnsnSBGcZ7P5Qff+5YuJ3KhWd0rbY/+DLDpwO7zAsTzKP1Bs9KtWDwQHzocVA==",
|
||||
"shasum": "2a72f1f0e12b5a7790c26cce6b0e018b47e06c90",
|
||||
"tarball": "http://localhost:4873/diff-peer-1/-/diff-peer-1-1.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"modified": "2025-06-08T19:48:23.111Z",
|
||||
"created": "2025-06-08T19:48:23.111Z",
|
||||
"1.0.0": "2025-06-08T19:48:23.111Z"
|
||||
},
|
||||
"users": {},
|
||||
"dist-tags": {
|
||||
"latest": "1.0.0"
|
||||
},
|
||||
"_uplinks": {},
|
||||
"_distfiles": {},
|
||||
"_attachments": {
|
||||
"diff-peer-1-1.0.0.tgz": {
|
||||
"shasum": "2a72f1f0e12b5a7790c26cce6b0e018b47e06c90",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"_rev": "",
|
||||
"_id": "diff-peer-1",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
Binary file not shown.
42
test/cli/install/registry/packages/diff-peer-2/package.json
Normal file
42
test/cli/install/registry/packages/diff-peer-2/package.json
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "diff-peer-2",
|
||||
"versions": {
|
||||
"1.0.0": {
|
||||
"name": "diff-peer-2",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"has-peer": "1.0.0",
|
||||
"peer-no-deps": "1.0.1"
|
||||
},
|
||||
"_id": "diff-peer-2@1.0.0",
|
||||
"_nodeVersion": "23.10.0",
|
||||
"_npmVersion": "10.9.2",
|
||||
"dist": {
|
||||
"integrity": "sha512-SPuo1oUuIxLXS9SJa35qU74g3rhBuK5mbdI1HGdRKQJXByDrF+msNAitd0v1g+tDknVHP9otSZllp7XelLQorQ==",
|
||||
"shasum": "4d0819fe19cb838ed81b346c1f07b823158a541f",
|
||||
"tarball": "http://localhost:4873/diff-peer-2/-/diff-peer-2-1.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"modified": "2025-06-08T19:48:32.766Z",
|
||||
"created": "2025-06-08T19:48:32.766Z",
|
||||
"1.0.0": "2025-06-08T19:48:32.766Z"
|
||||
},
|
||||
"users": {},
|
||||
"dist-tags": {
|
||||
"latest": "1.0.0"
|
||||
},
|
||||
"_uplinks": {},
|
||||
"_distfiles": {},
|
||||
"_attachments": {
|
||||
"diff-peer-2-1.0.0.tgz": {
|
||||
"shasum": "4d0819fe19cb838ed81b346c1f07b823158a541f",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"_rev": "",
|
||||
"_id": "diff-peer-2",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
BIN
test/cli/install/registry/packages/has-peer/has-peer-1.0.0.tgz
Normal file
BIN
test/cli/install/registry/packages/has-peer/has-peer-1.0.0.tgz
Normal file
Binary file not shown.
41
test/cli/install/registry/packages/has-peer/package.json
Normal file
41
test/cli/install/registry/packages/has-peer/package.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "has-peer",
|
||||
"versions": {
|
||||
"1.0.0": {
|
||||
"name": "has-peer",
|
||||
"version": "1.0.0",
|
||||
"peerDependencies": {
|
||||
"peer-no-deps": "^1.0.0"
|
||||
},
|
||||
"_id": "has-peer@1.0.0",
|
||||
"_nodeVersion": "23.10.0",
|
||||
"_npmVersion": "10.9.2",
|
||||
"dist": {
|
||||
"integrity": "sha512-Q7Sg8KeLCUYEurarnoM/c31svn1IvmwYtkZ7DQdzJg4qzONeXs5u/q32iguDmzGS330ch/GnTiwnUVdhIuB8cQ==",
|
||||
"shasum": "e0a4f8b2812eec8eada2aef68b71cdf572236702",
|
||||
"tarball": "http://localhost:4873/has-peer/-/has-peer-1.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"modified": "2025-06-08T19:49:59.426Z",
|
||||
"created": "2025-06-08T19:49:59.426Z",
|
||||
"1.0.0": "2025-06-08T19:49:59.426Z"
|
||||
},
|
||||
"users": {},
|
||||
"dist-tags": {
|
||||
"latest": "1.0.0"
|
||||
},
|
||||
"_uplinks": {},
|
||||
"_distfiles": {},
|
||||
"_attachments": {
|
||||
"has-peer-1.0.0.tgz": {
|
||||
"shasum": "e0a4f8b2812eec8eada2aef68b71cdf572236702",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"_rev": "",
|
||||
"_id": "has-peer",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
74
test/cli/install/registry/packages/peer-no-deps/package.json
Normal file
74
test/cli/install/registry/packages/peer-no-deps/package.json
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"name": "peer-no-deps",
|
||||
"versions": {
|
||||
"1.0.0": {
|
||||
"name": "peer-no-deps",
|
||||
"version": "1.0.0",
|
||||
"_id": "peer-no-deps@1.0.0",
|
||||
"_nodeVersion": "23.10.0",
|
||||
"_npmVersion": "10.9.2",
|
||||
"dist": {
|
||||
"integrity": "sha512-SfaNgbuAdCAj30SPPmdUNQLMFYoQcBD2dS7cxyv+dutkDyCY/ZzxGwK2syEkzN7QuZNdXouiNRx43mdxC/YpfA==",
|
||||
"shasum": "508a718b20f2e452919a86fc2add84c008f120d2",
|
||||
"tarball": "http://localhost:4873/peer-no-deps/-/peer-no-deps-1.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
},
|
||||
"1.0.1": {
|
||||
"name": "peer-no-deps",
|
||||
"version": "1.0.1",
|
||||
"_id": "peer-no-deps@1.0.1",
|
||||
"_nodeVersion": "23.10.0",
|
||||
"_npmVersion": "10.9.2",
|
||||
"dist": {
|
||||
"integrity": "sha512-V/R/oUJEjX8GWwGs6Ayye+6alHjRj0eKkpDJPzywgUjTt0iQIaTDSRCgieMfHLgB1JSFs2ogyppAXX5cwQ7lWw==",
|
||||
"shasum": "7f21c80e4f2ec05c453a73aa78f995e21d8008d1",
|
||||
"tarball": "http://localhost:4873/peer-no-deps/-/peer-no-deps-1.0.1.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
},
|
||||
"2.0.0": {
|
||||
"name": "peer-no-deps",
|
||||
"version": "2.0.0",
|
||||
"_id": "peer-no-deps@2.0.0",
|
||||
"_nodeVersion": "23.10.0",
|
||||
"_npmVersion": "10.9.2",
|
||||
"dist": {
|
||||
"integrity": "sha512-CR+AY66qH9+QUbKt7dxuH4iw36/mFIkpk1I8Lf+2DfucwGRcc0qwYswXQy+70jtz7ylHkmUMbhhgcMsIdsfK+w==",
|
||||
"shasum": "5ae71b940adc2f9a1b346897183e7042591735c0",
|
||||
"tarball": "http://localhost:4873/peer-no-deps/-/peer-no-deps-2.0.0.tgz"
|
||||
},
|
||||
"contributors": []
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"modified": "2025-06-08T22:04:06.599Z",
|
||||
"created": "2025-06-08T19:50:19.891Z",
|
||||
"1.0.0": "2025-06-08T19:50:19.891Z",
|
||||
"1.0.1": "2025-06-08T19:50:23.698Z",
|
||||
"2.0.0": "2025-06-08T22:04:06.599Z"
|
||||
},
|
||||
"users": {},
|
||||
"dist-tags": {
|
||||
"latest": "2.0.0"
|
||||
},
|
||||
"_uplinks": {},
|
||||
"_distfiles": {},
|
||||
"_attachments": {
|
||||
"peer-no-deps-1.0.0.tgz": {
|
||||
"shasum": "508a718b20f2e452919a86fc2add84c008f120d2",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"peer-no-deps-1.0.1.tgz": {
|
||||
"shasum": "7f21c80e4f2ec05c453a73aa78f995e21d8008d1",
|
||||
"version": "1.0.1"
|
||||
},
|
||||
"peer-no-deps-2.0.0.tgz": {
|
||||
"shasum": "5ae71b940adc2f9a1b346897183e7042591735c0",
|
||||
"version": "2.0.0"
|
||||
}
|
||||
},
|
||||
"_rev": "",
|
||||
"_id": "peer-no-deps",
|
||||
"readme": "ERROR: No README data found!"
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user