





























@@ -0,0 +1,134 @@
1+import { describe, expect, it } from "vitest";
2+import { describePluginInstallSource } from "./install-source-info.js";
3+4+describe("describePluginInstallSource", () => {
5+it("marks exact npm specs with integrity as fully pinned", () => {
6+expect(
7+describePluginInstallSource({
8+npmSpec: "@vendor/demo@1.2.3",
9+expectedIntegrity: " sha512-demo ",
10+defaultChoice: "npm",
11+}),
12+).toEqual({
13+defaultChoice: "npm",
14+npm: {
15+spec: "@vendor/demo@1.2.3",
16+packageName: "@vendor/demo",
17+selector: "1.2.3",
18+selectorKind: "exact-version",
19+exactVersion: true,
20+expectedIntegrity: "sha512-demo",
21+pinState: "exact-with-integrity",
22+},
23+warnings: [],
24+});
25+});
26+27+it("marks exact npm specs without integrity as version-pinned only", () => {
28+expect(
29+describePluginInstallSource({
30+npmSpec: "@vendor/demo@1.2.3",
31+}),
32+).toEqual({
33+npm: {
34+spec: "@vendor/demo@1.2.3",
35+packageName: "@vendor/demo",
36+selector: "1.2.3",
37+selectorKind: "exact-version",
38+exactVersion: true,
39+pinState: "exact-without-integrity",
40+},
41+warnings: ["npm-spec-missing-integrity"],
42+});
43+});
44+45+it("omits whitespace-only integrity from npm source facts", () => {
46+expect(
47+describePluginInstallSource({
48+npmSpec: "@vendor/demo@1.2.3",
49+expectedIntegrity: " ",
50+}),
51+).toEqual({
52+npm: {
53+spec: "@vendor/demo@1.2.3",
54+packageName: "@vendor/demo",
55+selector: "1.2.3",
56+selectorKind: "exact-version",
57+exactVersion: true,
58+pinState: "exact-without-integrity",
59+},
60+warnings: ["npm-spec-missing-integrity"],
61+});
62+});
63+64+it("treats non-string integrity metadata as missing", () => {
65+expect(
66+describePluginInstallSource({
67+npmSpec: "@vendor/demo@1.2.3",
68+expectedIntegrity: 123,
69+} as never),
70+).toEqual({
71+npm: {
72+spec: "@vendor/demo@1.2.3",
73+packageName: "@vendor/demo",
74+selector: "1.2.3",
75+selectorKind: "exact-version",
76+exactVersion: true,
77+pinState: "exact-without-integrity",
78+},
79+warnings: ["npm-spec-missing-integrity"],
80+});
81+});
82+83+it("surfaces floating specs with integrity without rejecting them", () => {
84+expect(
85+describePluginInstallSource({
86+npmSpec: "@vendor/demo@beta",
87+expectedIntegrity: "sha512-demo",
88+}),
89+).toEqual({
90+npm: {
91+spec: "@vendor/demo@beta",
92+packageName: "@vendor/demo",
93+selector: "beta",
94+selectorKind: "tag",
95+exactVersion: false,
96+expectedIntegrity: "sha512-demo",
97+pinState: "floating-with-integrity",
98+},
99+warnings: ["npm-spec-floating"],
100+});
101+});
102+103+it("surfaces floating specs without integrity without rejecting them", () => {
104+expect(
105+describePluginInstallSource({
106+npmSpec: "@vendor/demo@beta",
107+}),
108+).toEqual({
109+npm: {
110+spec: "@vendor/demo@beta",
111+packageName: "@vendor/demo",
112+selector: "beta",
113+selectorKind: "tag",
114+exactVersion: false,
115+pinState: "floating-without-integrity",
116+},
117+warnings: ["npm-spec-floating", "npm-spec-missing-integrity"],
118+});
119+});
120+121+it("reports invalid npm specs while preserving local source metadata", () => {
122+expect(
123+describePluginInstallSource({
124+npmSpec: "github:vendor/demo",
125+localPath: "extensions/demo",
126+}),
127+).toEqual({
128+local: {
129+path: "extensions/demo",
130+},
131+warnings: ["invalid-npm-spec"],
132+});
133+});
134+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。