@verdaccio/e2e-cli 3.0.0 → 3.2.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 (209) hide show
  1. package/bin/e2e-cli.js +6 -26
  2. package/build/adapters/adapter.d.ts +1 -0
  3. package/build/adapters/bun.d.ts +2 -0
  4. package/build/adapters/deno.d.ts +2 -0
  5. package/build/adapters/index.d.ts +5 -0
  6. package/build/adapters/npm.d.ts +2 -0
  7. package/build/adapters/pnpm.d.ts +2 -0
  8. package/build/adapters/yarn-modern.d.ts +2 -0
  9. package/build/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  10. package/build/cjs/adapters/bun.cjs +64 -0
  11. package/build/cjs/adapters/bun.cjs.map +1 -0
  12. package/build/cjs/adapters/deno.cjs +61 -0
  13. package/build/cjs/adapters/deno.cjs.map +1 -0
  14. package/build/cjs/adapters/index.cjs +10 -0
  15. package/build/cjs/adapters/npm.cjs +85 -0
  16. package/build/cjs/adapters/npm.cjs.map +1 -0
  17. package/build/cjs/adapters/pnpm.cjs +114 -0
  18. package/build/cjs/adapters/pnpm.cjs.map +1 -0
  19. package/build/cjs/adapters/yarn-modern.cjs +207 -0
  20. package/build/cjs/adapters/yarn-modern.cjs.map +1 -0
  21. package/build/cjs/index.cjs +186 -11
  22. package/build/cjs/index.cjs.map +1 -0
  23. package/build/cjs/reporter.cjs +113 -0
  24. package/build/cjs/reporter.cjs.map +1 -0
  25. package/build/cjs/runner.cjs +141 -0
  26. package/build/cjs/runner.cjs.map +1 -0
  27. package/build/cjs/scenarios/index.cjs +25 -0
  28. package/build/cjs/scenarios/index.cjs.map +1 -0
  29. package/build/cjs/scenarios/install-multiple-deps.cjs +119 -0
  30. package/build/cjs/scenarios/install-multiple-deps.cjs.map +1 -0
  31. package/build/cjs/scenarios/metadata.cjs +121 -0
  32. package/build/cjs/scenarios/metadata.cjs.map +1 -0
  33. package/build/cjs/scenarios/minimum-release-age.cjs +111 -0
  34. package/build/cjs/scenarios/minimum-release-age.cjs.map +1 -0
  35. package/build/cjs/scenarios/search.cjs +200 -0
  36. package/build/cjs/scenarios/search.cjs.map +1 -0
  37. package/build/cjs/scenarios/tarballs.cjs +170 -0
  38. package/build/cjs/scenarios/tarballs.cjs.map +1 -0
  39. package/build/cjs/scenarios/uplink-failure.cjs +141 -0
  40. package/build/cjs/scenarios/uplink-failure.cjs.map +1 -0
  41. package/build/cjs/tests/audit.cjs +60 -0
  42. package/build/cjs/tests/audit.cjs.map +1 -0
  43. package/build/cjs/tests/ci.cjs +83 -0
  44. package/build/cjs/tests/ci.cjs.map +1 -0
  45. package/build/cjs/tests/deprecate.cjs +108 -0
  46. package/build/cjs/tests/deprecate.cjs.map +1 -0
  47. package/build/cjs/tests/dist-tags.cjs +43 -0
  48. package/build/cjs/tests/dist-tags.cjs.map +1 -0
  49. package/build/cjs/tests/index.cjs +49 -0
  50. package/build/cjs/tests/index.cjs.map +1 -0
  51. package/build/cjs/tests/info.cjs +31 -0
  52. package/build/cjs/tests/info.cjs.map +1 -0
  53. package/build/cjs/tests/install.cjs +30 -0
  54. package/build/cjs/tests/install.cjs.map +1 -0
  55. package/build/cjs/tests/login.cjs +126 -0
  56. package/build/cjs/tests/login.cjs.map +1 -0
  57. package/build/cjs/tests/ping.cjs +26 -0
  58. package/build/cjs/tests/ping.cjs.map +1 -0
  59. package/build/cjs/tests/publish.cjs +36 -0
  60. package/build/cjs/tests/publish.cjs.map +1 -0
  61. package/build/cjs/tests/search.cjs +23 -0
  62. package/build/cjs/tests/search.cjs.map +1 -0
  63. package/build/cjs/tests/unpublish.cjs +40 -0
  64. package/build/cjs/tests/unpublish.cjs.map +1 -0
  65. package/build/cjs/utils/e2e-config.cjs +59 -0
  66. package/build/cjs/utils/e2e-config.cjs.map +1 -0
  67. package/build/cjs/utils/http-client.cjs +111 -0
  68. package/build/cjs/utils/http-client.cjs.map +1 -0
  69. package/build/cjs/utils/info.cjs +25 -0
  70. package/build/cjs/utils/info.cjs.map +1 -0
  71. package/build/cjs/utils/mock-uplink.cjs +196 -0
  72. package/build/cjs/utils/mock-uplink.cjs.map +1 -0
  73. package/build/cjs/utils/pending-checks.cjs +21 -0
  74. package/build/cjs/utils/pending-checks.cjs.map +1 -0
  75. package/build/cjs/utils/process.cjs +96 -0
  76. package/build/cjs/utils/process.cjs.map +1 -0
  77. package/build/cjs/utils/project.cjs +55 -0
  78. package/build/cjs/utils/project.cjs.map +1 -0
  79. package/build/cjs/utils/publish.cjs +117 -0
  80. package/build/cjs/utils/publish.cjs.map +1 -0
  81. package/build/cjs/utils/registry-client.cjs +56 -0
  82. package/build/cjs/utils/registry-client.cjs.map +1 -0
  83. package/build/esm/adapters/bun.js +62 -0
  84. package/build/esm/adapters/bun.js.map +1 -0
  85. package/build/esm/adapters/deno.js +59 -0
  86. package/build/esm/adapters/deno.js.map +1 -0
  87. package/build/esm/adapters/index.js +6 -0
  88. package/build/esm/adapters/npm.js +83 -0
  89. package/build/esm/adapters/npm.js.map +1 -0
  90. package/build/esm/adapters/pnpm.js +112 -0
  91. package/build/esm/adapters/pnpm.js.map +1 -0
  92. package/build/esm/adapters/yarn-modern.js +204 -0
  93. package/build/esm/adapters/yarn-modern.js.map +1 -0
  94. package/build/esm/index.js +174 -10
  95. package/build/esm/index.js.map +1 -0
  96. package/build/esm/reporter.js +108 -0
  97. package/build/esm/reporter.js.map +1 -0
  98. package/build/esm/runner.js +138 -0
  99. package/build/esm/runner.js.map +1 -0
  100. package/build/esm/scenarios/index.js +19 -0
  101. package/build/esm/scenarios/index.js.map +1 -0
  102. package/build/esm/scenarios/install-multiple-deps.js +117 -0
  103. package/build/esm/scenarios/install-multiple-deps.js.map +1 -0
  104. package/build/esm/scenarios/metadata.js +119 -0
  105. package/build/esm/scenarios/metadata.js.map +1 -0
  106. package/build/esm/scenarios/minimum-release-age.js +108 -0
  107. package/build/esm/scenarios/minimum-release-age.js.map +1 -0
  108. package/build/esm/scenarios/search.js +198 -0
  109. package/build/esm/scenarios/search.js.map +1 -0
  110. package/build/esm/scenarios/tarballs.js +168 -0
  111. package/build/esm/scenarios/tarballs.js.map +1 -0
  112. package/build/esm/scenarios/uplink-failure.js +139 -0
  113. package/build/esm/scenarios/uplink-failure.js.map +1 -0
  114. package/build/esm/tests/audit.js +57 -0
  115. package/build/esm/tests/audit.js.map +1 -0
  116. package/build/esm/tests/ci.js +80 -0
  117. package/build/esm/tests/ci.js.map +1 -0
  118. package/build/esm/tests/deprecate.js +105 -0
  119. package/build/esm/tests/deprecate.js.map +1 -0
  120. package/build/esm/tests/dist-tags.js +41 -0
  121. package/build/esm/tests/dist-tags.js.map +1 -0
  122. package/build/esm/tests/index.js +37 -0
  123. package/build/esm/tests/index.js.map +1 -0
  124. package/build/esm/tests/info.js +29 -0
  125. package/build/esm/tests/info.js.map +1 -0
  126. package/build/esm/tests/install.js +28 -0
  127. package/build/esm/tests/install.js.map +1 -0
  128. package/build/esm/tests/login.js +122 -0
  129. package/build/esm/tests/login.js.map +1 -0
  130. package/build/esm/tests/ping.js +24 -0
  131. package/build/esm/tests/ping.js.map +1 -0
  132. package/build/esm/tests/publish.js +34 -0
  133. package/build/esm/tests/publish.js.map +1 -0
  134. package/build/esm/tests/search.js +21 -0
  135. package/build/esm/tests/search.js.map +1 -0
  136. package/build/esm/tests/unpublish.js +38 -0
  137. package/build/esm/tests/unpublish.js.map +1 -0
  138. package/build/esm/utils/e2e-config.js +58 -0
  139. package/build/esm/utils/e2e-config.js.map +1 -0
  140. package/build/esm/utils/http-client.js +105 -0
  141. package/build/esm/utils/http-client.js.map +1 -0
  142. package/build/esm/utils/info.js +24 -0
  143. package/build/esm/utils/info.js.map +1 -0
  144. package/build/esm/utils/mock-uplink.js +194 -0
  145. package/build/esm/utils/mock-uplink.js.map +1 -0
  146. package/build/esm/utils/pending-checks.js +21 -0
  147. package/build/esm/utils/pending-checks.js.map +1 -0
  148. package/build/esm/utils/process.js +92 -0
  149. package/build/esm/utils/process.js.map +1 -0
  150. package/build/esm/utils/project.js +50 -0
  151. package/build/esm/utils/project.js.map +1 -0
  152. package/build/esm/utils/publish.js +113 -0
  153. package/build/esm/utils/publish.js.map +1 -0
  154. package/build/esm/utils/registry-client.js +53 -0
  155. package/build/esm/utils/registry-client.js.map +1 -0
  156. package/build/index.d.ts +6 -15
  157. package/build/reporter.d.ts +7 -0
  158. package/build/runner.d.ts +13 -0
  159. package/build/scenarios/index.d.ts +9 -0
  160. package/build/scenarios/install-multiple-deps.d.ts +2 -0
  161. package/build/scenarios/metadata.d.ts +2 -0
  162. package/build/scenarios/minimum-release-age.d.ts +11 -0
  163. package/build/scenarios/search.d.ts +2 -0
  164. package/build/scenarios/tarballs.d.ts +2 -0
  165. package/build/scenarios/uplink-failure.d.ts +2 -0
  166. package/build/tests/audit.d.ts +2 -0
  167. package/build/tests/ci.d.ts +2 -0
  168. package/build/tests/deprecate.d.ts +2 -0
  169. package/build/tests/dist-tags.d.ts +2 -0
  170. package/build/tests/index.d.ts +15 -0
  171. package/build/tests/info.d.ts +2 -0
  172. package/build/tests/install.d.ts +2 -0
  173. package/build/tests/login.d.ts +2 -0
  174. package/build/tests/ping.d.ts +2 -0
  175. package/build/tests/publish.d.ts +2 -0
  176. package/build/tests/search.d.ts +2 -0
  177. package/build/tests/unpublish.d.ts +2 -0
  178. package/build/types.d.ts +91 -0
  179. package/build/utils/e2e-config.d.ts +21 -0
  180. package/build/utils/http-client.d.ts +49 -0
  181. package/build/utils/index.d.ts +4 -0
  182. package/build/utils/info.d.ts +14 -0
  183. package/build/utils/mock-uplink.d.ts +47 -0
  184. package/build/utils/pending-checks.d.ts +12 -0
  185. package/build/utils/process.d.ts +11 -0
  186. package/build/utils/project.d.ts +6 -0
  187. package/build/utils/publish.d.ts +17 -0
  188. package/build/utils/registry-client.d.ts +15 -0
  189. package/package.json +16 -14
  190. package/Cargo.lock +0 -1591
  191. package/Cargo.toml +0 -19
  192. package/build/bin/verdaccio-e2e +0 -0
  193. package/scripts/build-js-package.mjs +0 -25
  194. package/src/e2e_tests/audit.rs +0 -51
  195. package/src/e2e_tests/ci.rs +0 -32
  196. package/src/e2e_tests/deprecate.rs +0 -64
  197. package/src/e2e_tests/dist_tags.rs +0 -56
  198. package/src/e2e_tests/info.rs +0 -43
  199. package/src/e2e_tests/install.rs +0 -27
  200. package/src/e2e_tests/login.rs +0 -64
  201. package/src/e2e_tests/mod.rs +0 -104
  202. package/src/e2e_tests/ping.rs +0 -33
  203. package/src/e2e_tests/publish.rs +0 -68
  204. package/src/e2e_tests/search.rs +0 -14
  205. package/src/e2e_tests/unpublish.rs +0 -37
  206. package/src/main.rs +0 -1411
  207. package/src/scenarios/install_multiple_deps.rs +0 -99
  208. package/src/scenarios/minimum_release_age.rs +0 -45
  209. package/src/scenarios/mod.rs +0 -11
@@ -0,0 +1,112 @@
1
+ import { exec } from "../utils/process.js";
2
+ import { prepareGenericEmptyProject } from "../utils/project.js";
3
+ import buildDebug from "debug";
4
+ import { execSync } from "child_process";
5
+ import { join } from "path";
6
+ import { writeFile } from "fs/promises";
7
+ //#region src/adapters/pnpm.ts
8
+ var debug = buildDebug("verdaccio:e2e-cli:pnpm");
9
+ var PNPM_V10_COMMANDS = /* @__PURE__ */ new Set([
10
+ "publish",
11
+ "unpublish",
12
+ "install",
13
+ "info",
14
+ "audit",
15
+ "deprecate",
16
+ "dist-tag",
17
+ "ping",
18
+ "search"
19
+ ]);
20
+ var PNPM_V11_COMMANDS = /* @__PURE__ */ new Set([
21
+ "publish",
22
+ "unpublish",
23
+ "install",
24
+ "info",
25
+ "audit",
26
+ "deprecate"
27
+ ]);
28
+ function getSupportedCommands(version) {
29
+ const major = parseInt(version.split(".")[0], 10);
30
+ if (major >= 11) {
31
+ debug("pnpm v%d detected, using v11 command set", major);
32
+ return PNPM_V11_COMMANDS;
33
+ }
34
+ return PNPM_V10_COMMANDS;
35
+ }
36
+ var PNPM_MIN_SUPPORTED_MAJOR = 10;
37
+ function detectVersion(bin) {
38
+ try {
39
+ return execSync(`${bin} --version`, {
40
+ encoding: "utf8",
41
+ timeout: 5e3
42
+ }).trim();
43
+ } catch {
44
+ return "unknown";
45
+ }
46
+ }
47
+ function assertSupportedVersion(resolved) {
48
+ const major = parseInt(resolved.split(".")[0], 10);
49
+ if (!Number.isNaN(major) && major < PNPM_MIN_SUPPORTED_MAJOR) throw new Error(`pnpm@${resolved} is not supported. Minimum supported major: ${PNPM_MIN_SUPPORTED_MAJOR}`);
50
+ }
51
+ function installPnpm(version) {
52
+ const pkg = `pnpm@${version}`;
53
+ debug("installing %s into temp dir", pkg);
54
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
55
+ execSync(`npm install --prefix "${tmpDir}" ${pkg} --loglevel=error`, {
56
+ encoding: "utf8",
57
+ timeout: 3e4
58
+ });
59
+ const bin = `${tmpDir}/node_modules/.bin/pnpm`;
60
+ const installed = detectVersion(bin);
61
+ debug("installed pnpm %s at %s", installed, bin);
62
+ console.log(` Auto-installed pnpm ${installed}`);
63
+ return bin;
64
+ }
65
+ function resolvePnpmBin(binPath, version) {
66
+ if (binPath) return binPath;
67
+ if (version) return installPnpm(version);
68
+ return "pnpm";
69
+ }
70
+ function createPnpmAdapter(binPath, version) {
71
+ const bin = resolvePnpmBin(binPath, version);
72
+ const resolved = detectVersion(bin);
73
+ assertSupportedVersion(resolved);
74
+ debug("creating pnpm adapter with bin: %s (%s)", bin, resolved);
75
+ return {
76
+ name: `pnpm@${resolved}`,
77
+ type: "pnpm",
78
+ bin,
79
+ supports: getSupportedCommands(resolved),
80
+ registryArg(url) {
81
+ return ["--registry", url];
82
+ },
83
+ prefixArg(folder) {
84
+ return ["--prefix", folder];
85
+ },
86
+ exec(options, ...args) {
87
+ if (parseInt(resolved.split(".")[0], 10) >= 11) {
88
+ const cmd = args[0];
89
+ if (cmd === "deprecate" || cmd === "unpublish" || cmd === "publish" || cmd === "dist-tag") args = args.filter((a) => a !== "--json" && !a.startsWith("--loglevel"));
90
+ if (cmd === "deprecate") {
91
+ const msgIdx = 2;
92
+ if (args.length > msgIdx && args[msgIdx] === "") args = [
93
+ "undeprecate",
94
+ args[1],
95
+ ...args.slice(3)
96
+ ];
97
+ }
98
+ if (cmd === "version") args = args.filter((a) => !a.startsWith("--registry") && !a.startsWith("--loglevel") && !a.startsWith("--no--git-tag-version"));
99
+ }
100
+ return exec(options, bin, args);
101
+ },
102
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
103
+ const project = await prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
104
+ await writeFile(join(project.tempFolder, "pnpm-workspace.yaml"), "minimumReleaseAge: 0\n");
105
+ return project;
106
+ }
107
+ };
108
+ }
109
+ //#endregion
110
+ export { createPnpmAdapter };
111
+
112
+ //# sourceMappingURL=pnpm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm.js","names":[],"sources":["../../../src/adapters/pnpm.ts"],"sourcesContent":["import { SpawnOptions, execSync } from 'child_process';\nimport buildDebug from 'debug';\nimport { writeFile } from 'fs/promises';\nimport { join } from 'path';\n\nimport { ExecOutput, PackageManagerAdapter } from '../types';\nimport { exec } from '../utils/process';\nimport { prepareGenericEmptyProject } from '../utils/project';\n\nconst debug = buildDebug('verdaccio:e2e-cli:pnpm');\n\nconst PNPM_V10_COMMANDS = new Set([\n 'publish',\n 'unpublish',\n 'install',\n 'info',\n 'audit',\n 'deprecate',\n 'dist-tag',\n 'ping',\n 'search',\n]);\n\n// pnpm v11 removed ping and search\n// dist-tag output format changed (no --json), needs adapted assertions\nconst PNPM_V11_COMMANDS = new Set([\n 'publish',\n 'unpublish',\n 'install',\n 'info',\n 'audit',\n 'deprecate',\n]);\n\nfunction getSupportedCommands(version: string): Set<string> {\n const major = parseInt(version.split('.')[0], 10);\n if (major >= 11) {\n debug('pnpm v%d detected, using v11 command set', major);\n return PNPM_V11_COMMANDS;\n }\n return PNPM_V10_COMMANDS;\n}\n\n// pnpm 8 and 9 are end-of-life and no longer supported by the suite.\nconst PNPM_MIN_SUPPORTED_MAJOR = 10;\n\nfunction detectVersion(bin: string): string {\n try {\n return execSync(`${bin} --version`, { encoding: 'utf8', timeout: 5000 }).trim();\n } catch {\n return 'unknown';\n }\n}\n\nfunction assertSupportedVersion(resolved: string): void {\n const major = parseInt(resolved.split('.')[0], 10);\n if (!Number.isNaN(major) && major < PNPM_MIN_SUPPORTED_MAJOR) {\n throw new Error(\n `pnpm@${resolved} is not supported. Minimum supported major: ${PNPM_MIN_SUPPORTED_MAJOR}`\n );\n }\n}\n\nfunction installPnpm(version: string): string {\n const pkg = `pnpm@${version}`;\n debug('installing %s into temp dir', pkg);\n const tmpDir = execSync('mktemp -d', { encoding: 'utf8' }).trim();\n execSync(`npm install --prefix \"${tmpDir}\" ${pkg} --loglevel=error`, {\n encoding: 'utf8',\n timeout: 30000,\n });\n const bin = `${tmpDir}/node_modules/.bin/pnpm`;\n const installed = detectVersion(bin);\n debug('installed pnpm %s at %s', installed, bin);\n console.log(` Auto-installed pnpm ${installed}`);\n return bin;\n}\n\nfunction resolvePnpmBin(binPath?: string, version?: string): string {\n if (binPath) return binPath;\n if (version) return installPnpm(version);\n return 'pnpm';\n}\n\nexport function createPnpmAdapter(binPath?: string, version?: string): PackageManagerAdapter {\n const bin = resolvePnpmBin(binPath, version);\n const resolved = detectVersion(bin);\n assertSupportedVersion(resolved);\n debug('creating pnpm adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `pnpm@${resolved}`,\n type: 'pnpm',\n bin,\n supports: getSupportedCommands(resolved),\n\n registryArg(url: string): string[] {\n return ['--registry', url];\n },\n\n prefixArg(folder: string): string[] {\n return ['--prefix', folder];\n },\n\n exec(options: SpawnOptions, ...args: string[]): Promise<ExecOutput> {\n const major = parseInt(resolved.split('.')[0], 10);\n if (major >= 11) {\n // pnpm v11: native deprecate/unpublish don't support --json\n const cmd = args[0];\n if (cmd === 'deprecate' || cmd === 'unpublish' || cmd === 'publish' || cmd === 'dist-tag') {\n args = args.filter((a) => a !== '--json' && !a.startsWith('--loglevel'));\n }\n // pnpm v11: un-deprecate uses `undeprecate` command instead of `deprecate pkg \"\"`\n if (cmd === 'deprecate') {\n // Check if message arg is empty string (un-deprecate)\n // args: ['deprecate', 'pkg@version', '', ...flags]\n const msgIdx = 2; // message is the third arg\n if (args.length > msgIdx && args[msgIdx] === '') {\n args = ['undeprecate', args[1], ...args.slice(3)];\n }\n }\n // pnpm v11: native version command doesn't accept --registry, --loglevel, or --no--git-tag-version\n if (cmd === 'version') {\n args = args.filter(\n (a) =>\n !a.startsWith('--registry') &&\n !a.startsWith('--loglevel') &&\n !a.startsWith('--no--git-tag-version')\n );\n }\n }\n return exec(options, bin, args);\n },\n\n async prepareProject(\n packageName: string,\n version: string,\n registryUrl: string,\n port: number,\n token: string,\n dependencies: Record<string, string> = {},\n devDependencies: Record<string, string> = {}\n ): Promise<{ tempFolder: string }> {\n const project = await prepareGenericEmptyProject(\n packageName,\n version,\n port,\n token,\n registryUrl,\n dependencies,\n devDependencies\n );\n // pnpm 11.24+ enforces a minimumReleaseAge cooldown by default, which\n // rejects the just-published packages these tests install\n // (ERR_PNPM_NO_MATURE_MATCHING_VERSION). Disable it per project via\n // pnpm-workspace.yaml — the file also marks the temp folder as its own\n // workspace root, isolating it from any parent workspace. Tests that\n // exercise the cooldown itself overwrite this file with their own config.\n await writeFile(join(project.tempFolder, 'pnpm-workspace.yaml'), 'minimumReleaseAge: 0\\n');\n return project;\n },\n };\n\n return adapter;\n}\n"],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ import { exec } from "../utils/process.js";
2
+ import { createTempFolder, getPackageJSON, getREADME } from "../utils/project.js";
3
+ import buildDebug from "debug";
4
+ import { execSync } from "child_process";
5
+ import { join } from "path";
6
+ import { writeFile } from "fs/promises";
7
+ import * as YAML from "js-yaml";
8
+ import { URL } from "url";
9
+ //#region src/adapters/yarn-modern.ts
10
+ var debug = buildDebug("verdaccio:e2e-cli:yarn-modern");
11
+ var YARN_MODERN_SUPPORTED_COMMANDS = /* @__PURE__ */ new Set([
12
+ "publish",
13
+ "install",
14
+ "info",
15
+ "ping",
16
+ "deprecate",
17
+ "login"
18
+ ]);
19
+ var YARN_ENV = {
20
+ COREPACK_ENABLE_STRICT: "0",
21
+ YARN_IGNORE_PATH: "1"
22
+ };
23
+ var YARN_BERRY_4_ENV = {
24
+ YARN_ENABLE_HARDENED_MODE: "0",
25
+ YARN_NPM_MINIMAL_AGE_GATE: "0"
26
+ };
27
+ function parseMajor(version) {
28
+ const major = parseInt(version.split(".")[0], 10);
29
+ return Number.isFinite(major) ? major : 0;
30
+ }
31
+ function getYarnEnv(major) {
32
+ return major >= 4 ? {
33
+ ...YARN_ENV,
34
+ ...YARN_BERRY_4_ENV
35
+ } : { ...YARN_ENV };
36
+ }
37
+ function detectVersion(bin) {
38
+ try {
39
+ return execSync(`${bin} --version`, {
40
+ env: {
41
+ ...process.env,
42
+ ...YARN_ENV
43
+ },
44
+ encoding: "utf8",
45
+ timeout: 5e3
46
+ }).trim();
47
+ } catch {
48
+ return "unknown";
49
+ }
50
+ }
51
+ function installYarnModern(version = "4") {
52
+ const pkg = `@yarnpkg/cli-dist@${version}`;
53
+ debug("installing %s into temp dir", pkg);
54
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
55
+ execSync(`npm install --prefix "${tmpDir}" ${pkg} --loglevel=error`, {
56
+ encoding: "utf8",
57
+ timeout: 3e4
58
+ });
59
+ const bin = `${tmpDir}/node_modules/@yarnpkg/cli-dist/bin/yarn.js`;
60
+ const installed = detectVersion(bin);
61
+ debug("installed yarn modern %s at %s", installed, bin);
62
+ console.log(` Auto-installed yarn modern ${installed}`);
63
+ return bin;
64
+ }
65
+ function resolveYarnBin(binPath, version) {
66
+ if (binPath) return binPath;
67
+ if (version) return installYarnModern(version);
68
+ try {
69
+ const systemYarn = execSync("which yarn", {
70
+ encoding: "utf8",
71
+ timeout: 5e3
72
+ }).trim();
73
+ const sysVersion = detectVersion(systemYarn);
74
+ if (parseInt(sysVersion.split(".")[0], 10) >= 2) {
75
+ debug("using system yarn Berry %s", sysVersion);
76
+ return systemYarn;
77
+ }
78
+ debug("system yarn is Classic %s, auto-installing Berry", sysVersion);
79
+ } catch {
80
+ debug("no system yarn found, auto-installing Berry");
81
+ }
82
+ return installYarnModern();
83
+ }
84
+ function createYamlConfig(registry, token, major) {
85
+ const defaultYaml = {
86
+ npmRegistryServer: registry,
87
+ enableImmutableInstalls: false,
88
+ unsafeHttpWhitelist: ["localhost"]
89
+ };
90
+ if (major >= 4) {
91
+ defaultYaml.enableHardenedMode = false;
92
+ defaultYaml.npmMinimalAgeGate = 0;
93
+ }
94
+ if (typeof token === "string") {
95
+ new URL(registry);
96
+ defaultYaml.npmRegistries = { [registry]: {
97
+ npmAlwaysAuth: true,
98
+ npmAuthToken: token
99
+ } };
100
+ }
101
+ return YAML.dump(defaultYaml);
102
+ }
103
+ function createYarnModernAdapter(binPath, version) {
104
+ const bin = resolveYarnBin(binPath, version);
105
+ const resolved = detectVersion(bin);
106
+ const major = parseMajor(resolved);
107
+ const yarnEnv = getYarnEnv(major);
108
+ debug("creating yarn modern adapter with bin: %s (%s)", bin, resolved);
109
+ return {
110
+ name: `yarn-modern@${resolved}`,
111
+ type: "yarn-modern",
112
+ bin,
113
+ supports: YARN_MODERN_SUPPORTED_COMMANDS,
114
+ registryArg(_url) {
115
+ return [];
116
+ },
117
+ prefixArg(_folder) {
118
+ return [];
119
+ },
120
+ exec(options, ...args) {
121
+ const env = {
122
+ ...process.env,
123
+ ...options.env,
124
+ ...yarnEnv
125
+ };
126
+ const cmd = args[0];
127
+ let yarnArgs;
128
+ if (cmd === "publish") yarnArgs = [
129
+ "npm",
130
+ "publish",
131
+ ...args.slice(1).filter((a) => a !== "--json" && !a.startsWith("--registry"))
132
+ ];
133
+ else if (cmd === "info") yarnArgs = [
134
+ "npm",
135
+ "info",
136
+ ...args.slice(1).filter((a) => !a.startsWith("--registry"))
137
+ ];
138
+ else if (cmd === "ping") yarnArgs = [
139
+ "npm",
140
+ "ping",
141
+ ...args.slice(1).filter((a) => !a.startsWith("--registry"))
142
+ ];
143
+ else if (cmd === "deprecate") yarnArgs = [
144
+ "npm",
145
+ "deprecate",
146
+ ...args.slice(1).filter((a) => !a.startsWith("--registry"))
147
+ ];
148
+ else if (cmd === "login") yarnArgs = [
149
+ "npm",
150
+ "login",
151
+ ...args.slice(1).filter((a) => !a.startsWith("--registry"))
152
+ ];
153
+ else if (cmd === "whoami") yarnArgs = [
154
+ "npm",
155
+ "whoami",
156
+ ...args.slice(1).filter((a) => !a.startsWith("--registry"))
157
+ ];
158
+ else yarnArgs = args.filter((a) => !a.startsWith("--registry"));
159
+ return exec({
160
+ ...options,
161
+ env
162
+ }, bin, yarnArgs);
163
+ },
164
+ async prepareProject(packageName, version, registryUrl, _port, token, dependencies = {}, devDependencies = {}) {
165
+ const tempFolder = await createTempFolder(packageName);
166
+ const yamlContent = createYamlConfig(registryUrl, token, major);
167
+ await writeFile(join(tempFolder, ".yarnrc.yml"), yamlContent);
168
+ await writeFile(join(tempFolder, "package.json"), getPackageJSON(packageName, version, dependencies, devDependencies));
169
+ await writeFile(join(tempFolder, "README.md"), getREADME(packageName));
170
+ return { tempFolder };
171
+ },
172
+ async importPlugin(cwd, pluginName) {
173
+ debug("downloading %s plugin bundle", pluginName);
174
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
175
+ const pkg = `@verdaccio/yarn-plugin-${pluginName}`;
176
+ execSync(`npm pack ${pkg} --pack-destination "${tmpDir}"`, {
177
+ encoding: "utf8",
178
+ timeout: 3e4,
179
+ stdio: "pipe"
180
+ });
181
+ execSync(`tar xzf "${tmpDir}"/*.tgz -C "${tmpDir}"`, {
182
+ encoding: "utf8",
183
+ stdio: "pipe"
184
+ });
185
+ const bundlePath = join(tmpDir, `package/bundles/@yarnpkg/plugin-${pluginName}.js`);
186
+ debug("importing plugin from %s into %s", bundlePath, cwd);
187
+ await exec({
188
+ cwd,
189
+ env: {
190
+ ...process.env,
191
+ ...yarnEnv
192
+ }
193
+ }, bin, [
194
+ "plugin",
195
+ "import",
196
+ bundlePath
197
+ ]);
198
+ }
199
+ };
200
+ }
201
+ //#endregion
202
+ export { createYarnModernAdapter };
203
+
204
+ //# sourceMappingURL=yarn-modern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yarn-modern.js","names":[],"sources":["../../../src/adapters/yarn-modern.ts"],"sourcesContent":["import { SpawnOptions, execSync } from 'child_process';\nimport buildDebug from 'debug';\nimport { writeFile } from 'fs/promises';\nimport * as YAML from 'js-yaml';\nimport { join } from 'path';\nimport { URL } from 'url';\n\nimport { ExecOutput, PackageManagerAdapter } from '../types';\nimport { exec } from '../utils/process';\nimport { createTempFolder, getPackageJSON, getREADME } from '../utils/project';\n\nconst debug = buildDebug('verdaccio:e2e-cli:yarn-modern');\n\nconst YARN_MODERN_SUPPORTED_COMMANDS = new Set([\n 'publish',\n 'install',\n 'info',\n 'ping',\n 'deprecate',\n 'login',\n]);\n\nconst YARN_ENV = {\n COREPACK_ENABLE_STRICT: '0',\n YARN_IGNORE_PATH: '1',\n};\n\n// Hardened mode and the minimum-age quarantine are yarn-4-only settings.\n// Yarn 3 errors on unknown configuration keys, so these can only be applied\n// when we know we're driving a 4.x binary.\nconst YARN_BERRY_4_ENV = {\n YARN_ENABLE_HARDENED_MODE: '0',\n YARN_NPM_MINIMAL_AGE_GATE: '0',\n};\n\nfunction parseMajor(version: string): number {\n const major = parseInt(version.split('.')[0], 10);\n return Number.isFinite(major) ? major : 0;\n}\n\nfunction getYarnEnv(major: number): Record<string, string> {\n return major >= 4 ? { ...YARN_ENV, ...YARN_BERRY_4_ENV } : { ...YARN_ENV };\n}\n\nfunction detectVersion(bin: string): string {\n try {\n return execSync(`${bin} --version`, {\n env: { ...process.env, ...YARN_ENV },\n encoding: 'utf8',\n timeout: 5000,\n }).trim();\n } catch {\n return 'unknown';\n }\n}\n\nfunction installYarnModern(version = '4'): string {\n const pkg = `@yarnpkg/cli-dist@${version}`;\n debug('installing %s into temp dir', pkg);\n const tmpDir = execSync('mktemp -d', { encoding: 'utf8' }).trim();\n execSync(`npm install --prefix \"${tmpDir}\" ${pkg} --loglevel=error`, {\n encoding: 'utf8',\n timeout: 30000,\n });\n const bin = `${tmpDir}/node_modules/@yarnpkg/cli-dist/bin/yarn.js`;\n const installed = detectVersion(bin);\n debug('installed yarn modern %s at %s', installed, bin);\n console.log(` Auto-installed yarn modern ${installed}`);\n return bin;\n}\n\nfunction resolveYarnBin(binPath?: string, version?: string): string {\n if (binPath) return binPath;\n\n if (version) {\n return installYarnModern(version);\n }\n\n try {\n const systemYarn = execSync('which yarn', { encoding: 'utf8', timeout: 5000 }).trim();\n const sysVersion = detectVersion(systemYarn);\n const major = parseInt(sysVersion.split('.')[0], 10);\n if (major >= 2) {\n debug('using system yarn Berry %s', sysVersion);\n return systemYarn;\n }\n debug('system yarn is Classic %s, auto-installing Berry', sysVersion);\n } catch {\n debug('no system yarn found, auto-installing Berry');\n }\n\n return installYarnModern();\n}\n\nfunction createYamlConfig(registry: string, token: string | undefined, major: number) {\n const defaultYaml: any = {\n npmRegistryServer: registry,\n enableImmutableInstalls: false,\n unsafeHttpWhitelist: ['localhost'],\n };\n\n // Yarn 4 hardened mode (auto-on for GitHub PR runs) quarantines freshly\n // published packages — every seed package an e2e scenario publishes is\n // exactly the shape it's designed to block. The hardened-mode flag alone\n // isn't enough in 4.15+; the underlying npmMinimalAgeGate must also be\n // pinned to 0. Yarn 3 errors on these keys, so gate by major.\n if (major >= 4) {\n defaultYaml.enableHardenedMode = false;\n defaultYaml.npmMinimalAgeGate = 0;\n }\n\n if (typeof token === 'string') {\n const url = new URL(registry);\n defaultYaml.npmRegistries = {\n [registry]: {\n npmAlwaysAuth: true,\n npmAuthToken: token,\n },\n };\n }\n\n return YAML.dump(defaultYaml);\n}\n\nexport function createYarnModernAdapter(binPath?: string, version?: string): PackageManagerAdapter {\n const bin = resolveYarnBin(binPath, version);\n const resolved = detectVersion(bin);\n const major = parseMajor(resolved);\n const yarnEnv = getYarnEnv(major);\n debug('creating yarn modern adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `yarn-modern@${resolved}`,\n type: 'yarn-modern',\n bin,\n supports: YARN_MODERN_SUPPORTED_COMMANDS,\n\n registryArg(_url: string): string[] {\n return [];\n },\n\n prefixArg(_folder: string): string[] {\n return [];\n },\n\n exec(options: SpawnOptions, ...args: string[]): Promise<ExecOutput> {\n const env = { ...process.env, ...options.env, ...yarnEnv };\n\n const cmd = args[0];\n let yarnArgs: string[];\n if (cmd === 'publish') {\n const filtered = args.slice(1).filter((a) => a !== '--json' && !a.startsWith('--registry'));\n yarnArgs = ['npm', 'publish', ...filtered];\n } else if (cmd === 'info') {\n const filtered = args.slice(1).filter((a) => !a.startsWith('--registry'));\n yarnArgs = ['npm', 'info', ...filtered];\n } else if (cmd === 'ping') {\n const filtered = args.slice(1).filter((a) => !a.startsWith('--registry'));\n yarnArgs = ['npm', 'ping', ...filtered];\n } else if (cmd === 'deprecate') {\n const filtered = args.slice(1).filter((a) => !a.startsWith('--registry'));\n yarnArgs = ['npm', 'deprecate', ...filtered];\n } else if (cmd === 'login') {\n const filtered = args.slice(1).filter((a) => !a.startsWith('--registry'));\n yarnArgs = ['npm', 'login', ...filtered];\n } else if (cmd === 'whoami') {\n const filtered = args.slice(1).filter((a) => !a.startsWith('--registry'));\n yarnArgs = ['npm', 'whoami', ...filtered];\n } else {\n yarnArgs = args.filter((a) => !a.startsWith('--registry'));\n }\n\n return exec({ ...options, env }, bin, yarnArgs);\n },\n\n async prepareProject(\n packageName: string,\n version: string,\n registryUrl: string,\n _port: number,\n token: string,\n dependencies: Record<string, string> = {},\n devDependencies: Record<string, string> = {}\n ): Promise<{ tempFolder: string }> {\n const tempFolder = await createTempFolder(packageName);\n const yamlContent = createYamlConfig(registryUrl, token, major);\n await writeFile(join(tempFolder, '.yarnrc.yml'), yamlContent);\n await writeFile(\n join(tempFolder, 'package.json'),\n getPackageJSON(packageName, version, dependencies, devDependencies)\n );\n await writeFile(join(tempFolder, 'README.md'), getREADME(packageName));\n return { tempFolder };\n },\n\n async importPlugin(cwd: string, pluginName: string): Promise<void> {\n debug('downloading %s plugin bundle', pluginName);\n const tmpDir = execSync('mktemp -d', { encoding: 'utf8' }).trim();\n const pkg = `@verdaccio/yarn-plugin-${pluginName}`;\n execSync(`npm pack ${pkg} --pack-destination \"${tmpDir}\"`, {\n encoding: 'utf8',\n timeout: 30000,\n stdio: 'pipe',\n });\n execSync(`tar xzf \"${tmpDir}\"/*.tgz -C \"${tmpDir}\"`, {\n encoding: 'utf8',\n stdio: 'pipe',\n });\n const bundlePath = join(tmpDir, `package/bundles/@yarnpkg/plugin-${pluginName}.js`);\n debug('importing plugin from %s into %s', bundlePath, cwd);\n await exec({ cwd, env: { ...process.env, ...yarnEnv } }, bin, [\n 'plugin',\n 'import',\n bundlePath,\n ]);\n },\n };\n\n return adapter;\n}\n"],"mappings":"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"}
@@ -1,10 +1,174 @@
1
- export const allTests = [];
2
- export const allScenarios = [];
3
- export function runAll() { throw new Error('@verdaccio/e2e-cli programmatic API is no longer available in the Rust build. Use the verdaccio-e2e binary.'); }
4
- export function runSuite() { throw new Error('@verdaccio/e2e-cli programmatic API is no longer available in the Rust build. Use the verdaccio-e2e binary.'); }
5
- export function createNpmAdapter() { throw new Error('@verdaccio/e2e-cli adapters are implemented in Rust. Use the verdaccio-e2e binary.'); }
6
- export const createPnpmAdapter = createNpmAdapter;
7
- export const createYarnClassicAdapter = createNpmAdapter;
8
- export const createYarnModernAdapter = createNpmAdapter;
9
- export const createBunAdapter = createNpmAdapter;
10
- export const createDenoAdapter = createNpmAdapter;
1
+ import { createBunAdapter } from "./adapters/bun.js";
2
+ import { createDenoAdapter } from "./adapters/deno.js";
3
+ import { createNpmAdapter } from "./adapters/npm.js";
4
+ import { createPnpmAdapter } from "./adapters/pnpm.js";
5
+ import { createYarnModernAdapter } from "./adapters/yarn-modern.js";
6
+ import "./adapters/index.js";
7
+ import { runAll, runSuite } from "./runner.js";
8
+ import { allScenarios } from "./scenarios/index.js";
9
+ import { allTests } from "./tests/index.js";
10
+ import { createUser, pingRegistry } from "./utils/registry-client.js";
11
+ import buildDebug from "debug";
12
+ //#region src/index.ts
13
+ buildDebug("verdaccio:e2e-cli");
14
+ function parsePmSpec(filter) {
15
+ const eqIdx = filter.indexOf("=");
16
+ if (eqIdx !== -1) return {
17
+ name: filter.slice(0, eqIdx).toLowerCase(),
18
+ binPath: filter.slice(eqIdx + 1)
19
+ };
20
+ const atIdx = filter.indexOf("@");
21
+ if (atIdx !== -1) return {
22
+ name: filter.slice(0, atIdx).toLowerCase(),
23
+ version: filter.slice(atIdx + 1)
24
+ };
25
+ return { name: filter.toLowerCase() };
26
+ }
27
+ function parseAdapters(pmFilters) {
28
+ if (!pmFilters || pmFilters.length === 0) return [createNpmAdapter()];
29
+ const adapters = [];
30
+ for (const filter of pmFilters) {
31
+ const { name, version, binPath } = parsePmSpec(filter);
32
+ if (name === "npm") adapters.push(createNpmAdapter(binPath, version));
33
+ else if (name === "pnpm") adapters.push(createPnpmAdapter(binPath, version));
34
+ else if (name === "yarn-classic" || name === "yarn1") throw new Error("yarn classic (v1) is no longer supported. Use yarn-modern (Yarn 3+) instead.");
35
+ else if (name === "yarn-modern" || name === "yarn") adapters.push(createYarnModernAdapter(binPath, version));
36
+ else if (name === "bun") adapters.push(createBunAdapter(binPath, version));
37
+ else if (name === "deno") adapters.push(createDenoAdapter(binPath, version));
38
+ else throw new Error(`Unknown package manager: "${name}". Supported: npm, pnpm, yarn-modern, bun, deno`);
39
+ }
40
+ return adapters;
41
+ }
42
+ function parseArgs(argv) {
43
+ const options = {
44
+ registry: "",
45
+ pm: [],
46
+ test: [],
47
+ concurrency: 1,
48
+ timeout: 5e4,
49
+ verbose: false
50
+ };
51
+ for (let i = 2; i < argv.length; i++) {
52
+ const arg = argv[i];
53
+ if (arg === "--registry" || arg === "-r") options.registry = argv[++i];
54
+ else if (arg === "--pm") options.pm.push(argv[++i]);
55
+ else if (arg === "--test" || arg === "-t") options.test.push(argv[++i]);
56
+ else if (arg === "--concurrency" || arg === "-c") options.concurrency = parseInt(argv[++i], 10);
57
+ else if (arg === "--timeout") options.timeout = parseInt(argv[++i], 10);
58
+ else if (arg === "--token") options.token = argv[++i];
59
+ else if (arg === "--uplink-port") options.uplinkPort = parseInt(argv[++i], 10);
60
+ else if (arg === "--print-config") options.printConfig = true;
61
+ else if (arg === "--verbose" || arg === "-v") options.verbose = true;
62
+ else if (arg === "--help" || arg === "-h") {
63
+ printHelp();
64
+ process.exit(0);
65
+ } else if (arg.startsWith("--registry=")) options.registry = arg.split("=")[1];
66
+ else if (arg.startsWith("--pm=")) options.pm.push(arg.split("=")[1]);
67
+ else if (arg.startsWith("--test=")) options.test.push(arg.split("=")[1]);
68
+ else if (arg.startsWith("--token=")) options.token = arg.split("=")[1];
69
+ else if (arg.startsWith("--timeout=")) options.timeout = parseInt(arg.split("=")[1], 10);
70
+ else if (arg.startsWith("--uplink-port=")) options.uplinkPort = parseInt(arg.split("=")[1], 10);
71
+ else {
72
+ console.error(`Unknown argument: ${arg}`);
73
+ printHelp();
74
+ process.exit(1);
75
+ }
76
+ }
77
+ return options;
78
+ }
79
+ function printHelp() {
80
+ console.log(`
81
+ @verdaccio/e2e-cli - Run Verdaccio e2e tests against any running registry
82
+
83
+ Usage:
84
+ verdaccio-e2e --registry <url> [options]
85
+
86
+ Required:
87
+ -r, --registry <url> Verdaccio registry URL (e.g. http://localhost:4873)
88
+
89
+ Options:
90
+ --pm <name[@version]> Package manager to test (can be repeated)
91
+ Supported: npm (10-12), pnpm (10+),
92
+ yarn-modern (or yarn, Yarn 3+), bun, deno
93
+ Examples: --pm npm@10 --pm pnpm@11
94
+ --pm yarn-modern@4
95
+ --pm yarn-modern@3
96
+ --pm bun
97
+ --pm npm --pm pnpm (uses system version)
98
+ Auto-installs the requested yarn version if needed
99
+ Default: npm
100
+
101
+ -t, --test <name> Filter tests by name (can be repeated)
102
+ Available: publish, install, ci, audit, info, deprecate,
103
+ dist-tags, ping, search, unpublish
104
+ Scenarios: scenario:install-multiple-deps,
105
+ scenario:minimum-release-age (pnpm 11.1+),
106
+ scenario:tarballs (npm adapter),
107
+ scenario:metadata (npm adapter),
108
+ scenario:search (npm adapter; the
109
+ uplink sub-tests also need
110
+ --uplink-port / E2E_UPLINK_PORT),
111
+ scenario:uplink-failure (npm adapter,
112
+ needs --uplink-port / E2E_UPLINK_PORT
113
+ and a registry started with the config
114
+ from --print-config)
115
+ Default: all supported by the PM
116
+
117
+ --token <token> Auth token (skips user creation)
118
+ --timeout <ms> Per-test timeout (default: 50000)
119
+ --uplink-port <port> Port for the mock uplink used by
120
+ scenario:uplink-failure (default: $E2E_UPLINK_PORT)
121
+ --print-config Print the recommended Verdaccio config for the full
122
+ battery (max_body_size, mock uplink) and exit
123
+ -v, --verbose Enable debug output
124
+ -h, --help Show this help
125
+ `);
126
+ }
127
+ async function main(argv = process.argv) {
128
+ const options = parseArgs(argv);
129
+ if (options.printConfig) {
130
+ const { buildE2EConfig, DEFAULT_UPLINK_PORT } = await import("./utils/e2e-config.js");
131
+ process.stdout.write(buildE2EConfig(options.uplinkPort ?? DEFAULT_UPLINK_PORT));
132
+ process.exit(0);
133
+ }
134
+ if (options.uplinkPort) process.env.E2E_UPLINK_PORT = String(options.uplinkPort);
135
+ if (!options.registry) {
136
+ console.error("Error: --registry is required\n");
137
+ printHelp();
138
+ process.exit(1);
139
+ }
140
+ const { createTempFolder } = await import("./utils/project.js");
141
+ const runDir = await createTempFolder("e2e-run");
142
+ process.chdir(runDir);
143
+ if (options.verbose) {
144
+ const { setVerbose } = await import("./utils/process.js");
145
+ setVerbose(true);
146
+ }
147
+ console.log(`Checking registry at ${options.registry}...`);
148
+ if (!await pingRegistry(options.registry)) {
149
+ console.error(`Error: Registry at ${options.registry} is not reachable`);
150
+ process.exit(1);
151
+ }
152
+ console.log(`Registry is alive.`);
153
+ let token = options.token;
154
+ if (!token) {
155
+ console.log("Creating test user...");
156
+ const auth = await createUser(options.registry);
157
+ token = auth.token;
158
+ console.log(`User "${auth.user}" created.`);
159
+ }
160
+ const adapters = parseAdapters(options.pm);
161
+ console.log(`Adapters: ${adapters.map((a) => a.name).join(", ")}`);
162
+ const tests = options.test && options.test.length > 0 ? allTests.filter((t) => options.test.includes(t.name)) : allTests;
163
+ console.log(`Tests: ${tests.map((t) => t.name).join(", ")}`);
164
+ const { exitCode } = await runAll(adapters, tests, options.registry, token, {
165
+ timeout: options.timeout,
166
+ concurrency: options.concurrency,
167
+ testFilter: options.test
168
+ });
169
+ process.exit(exitCode);
170
+ }
171
+ //#endregion
172
+ export { allScenarios, allTests, createBunAdapter, createDenoAdapter, createNpmAdapter, createPnpmAdapter, createYarnModernAdapter, main, runAll, runSuite };
173
+
174
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":["import buildDebug from 'debug';\n\nimport {\n createBunAdapter,\n createDenoAdapter,\n createNpmAdapter,\n createPnpmAdapter,\n createYarnModernAdapter,\n} from './adapters';\nimport { runAll } from './runner';\nimport { allTests } from './tests';\nimport { CliOptions, PackageManagerAdapter } from './types';\nimport { createUser, pingRegistry } from './utils/registry-client';\n\nconst debug = buildDebug('verdaccio:e2e-cli');\n\nfunction parsePmSpec(filter: string): { name: string; version?: string; binPath?: string } {\n // --pm yarn-modern@3, --pm npm@10, --pm npm=/path/to/bin\n const eqIdx = filter.indexOf('=');\n if (eqIdx !== -1) {\n return { name: filter.slice(0, eqIdx).toLowerCase(), binPath: filter.slice(eqIdx + 1) };\n }\n const atIdx = filter.indexOf('@');\n if (atIdx !== -1) {\n return { name: filter.slice(0, atIdx).toLowerCase(), version: filter.slice(atIdx + 1) };\n }\n return { name: filter.toLowerCase() };\n}\n\nfunction parseAdapters(pmFilters?: string[]): PackageManagerAdapter[] {\n if (!pmFilters || pmFilters.length === 0) {\n return [createNpmAdapter()];\n }\n\n const adapters: PackageManagerAdapter[] = [];\n\n for (const filter of pmFilters) {\n const { name, version, binPath } = parsePmSpec(filter);\n\n if (name === 'npm') {\n adapters.push(createNpmAdapter(binPath, version));\n } else if (name === 'pnpm') {\n adapters.push(createPnpmAdapter(binPath, version));\n } else if (name === 'yarn-classic' || name === 'yarn1') {\n throw new Error(\n 'yarn classic (v1) is no longer supported. Use yarn-modern (Yarn 3+) instead.'\n );\n } else if (name === 'yarn-modern' || name === 'yarn') {\n adapters.push(createYarnModernAdapter(binPath, version));\n } else if (name === 'bun') {\n adapters.push(createBunAdapter(binPath, version));\n } else if (name === 'deno') {\n adapters.push(createDenoAdapter(binPath, version));\n } else {\n throw new Error(\n `Unknown package manager: \"${name}\". Supported: npm, pnpm, yarn-modern, bun, deno`\n );\n }\n }\n\n return adapters;\n}\n\nfunction parseArgs(argv: string[]): CliOptions {\n const options: CliOptions = {\n registry: '',\n pm: [],\n test: [],\n concurrency: 1,\n timeout: 50000,\n verbose: false,\n };\n\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n\n if (arg === '--registry' || arg === '-r') {\n options.registry = argv[++i];\n } else if (arg === '--pm') {\n options.pm!.push(argv[++i]);\n } else if (arg === '--test' || arg === '-t') {\n options.test!.push(argv[++i]);\n } else if (arg === '--concurrency' || arg === '-c') {\n options.concurrency = parseInt(argv[++i], 10);\n } else if (arg === '--timeout') {\n options.timeout = parseInt(argv[++i], 10);\n } else if (arg === '--token') {\n options.token = argv[++i];\n } else if (arg === '--uplink-port') {\n options.uplinkPort = parseInt(argv[++i], 10);\n } else if (arg === '--print-config') {\n options.printConfig = true;\n } else if (arg === '--verbose' || arg === '-v') {\n options.verbose = true;\n } else if (arg === '--help' || arg === '-h') {\n printHelp();\n process.exit(0);\n } else if (arg.startsWith('--registry=')) {\n options.registry = arg.split('=')[1];\n } else if (arg.startsWith('--pm=')) {\n options.pm!.push(arg.split('=')[1]);\n } else if (arg.startsWith('--test=')) {\n options.test!.push(arg.split('=')[1]);\n } else if (arg.startsWith('--token=')) {\n options.token = arg.split('=')[1];\n } else if (arg.startsWith('--timeout=')) {\n options.timeout = parseInt(arg.split('=')[1], 10);\n } else if (arg.startsWith('--uplink-port=')) {\n options.uplinkPort = parseInt(arg.split('=')[1], 10);\n } else {\n console.error(`Unknown argument: ${arg}`);\n printHelp();\n process.exit(1);\n }\n }\n\n return options;\n}\n\nfunction printHelp(): void {\n console.log(`\n @verdaccio/e2e-cli - Run Verdaccio e2e tests against any running registry\n\n Usage:\n verdaccio-e2e --registry <url> [options]\n\n Required:\n -r, --registry <url> Verdaccio registry URL (e.g. http://localhost:4873)\n\n Options:\n --pm <name[@version]> Package manager to test (can be repeated)\n Supported: npm (10-12), pnpm (10+),\n yarn-modern (or yarn, Yarn 3+), bun, deno\n Examples: --pm npm@10 --pm pnpm@11\n --pm yarn-modern@4\n --pm yarn-modern@3\n --pm bun\n --pm npm --pm pnpm (uses system version)\n Auto-installs the requested yarn version if needed\n Default: npm\n\n -t, --test <name> Filter tests by name (can be repeated)\n Available: publish, install, ci, audit, info, deprecate,\n dist-tags, ping, search, unpublish\n Scenarios: scenario:install-multiple-deps,\n scenario:minimum-release-age (pnpm 11.1+),\n scenario:tarballs (npm adapter),\n scenario:metadata (npm adapter),\n scenario:search (npm adapter; the\n uplink sub-tests also need\n --uplink-port / E2E_UPLINK_PORT),\n scenario:uplink-failure (npm adapter,\n needs --uplink-port / E2E_UPLINK_PORT\n and a registry started with the config\n from --print-config)\n Default: all supported by the PM\n\n --token <token> Auth token (skips user creation)\n --timeout <ms> Per-test timeout (default: 50000)\n --uplink-port <port> Port for the mock uplink used by\n scenario:uplink-failure (default: $E2E_UPLINK_PORT)\n --print-config Print the recommended Verdaccio config for the full\n battery (max_body_size, mock uplink) and exit\n -v, --verbose Enable debug output\n -h, --help Show this help\n `);\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const options = parseArgs(argv);\n\n if (options.printConfig) {\n const { buildE2EConfig, DEFAULT_UPLINK_PORT } = await import('./utils/e2e-config');\n process.stdout.write(buildE2EConfig(options.uplinkPort ?? DEFAULT_UPLINK_PORT));\n process.exit(0);\n }\n\n // Expose the mock uplink port to scenarios (scenario:uplink-failure gates on it).\n if (options.uplinkPort) {\n process.env.E2E_UPLINK_PORT = String(options.uplinkPort);\n }\n\n if (!options.registry) {\n console.error('Error: --registry is required\\n');\n printHelp();\n process.exit(1);\n }\n\n // Run from a temp dir to isolate from the host project's packageManager, .yarnrc.yml, etc.\n const { createTempFolder } = await import('./utils/project');\n const runDir = await createTempFolder('e2e-run');\n process.chdir(runDir);\n\n if (options.verbose) {\n const { setVerbose } = await import('./utils/process');\n setVerbose(true);\n }\n\n // Ensure registry is reachable\n console.log(`Checking registry at ${options.registry}...`);\n const alive = await pingRegistry(options.registry);\n if (!alive) {\n console.error(`Error: Registry at ${options.registry} is not reachable`);\n process.exit(1);\n }\n console.log(`Registry is alive.`);\n\n // Get auth token\n let token = options.token;\n if (!token) {\n console.log('Creating test user...');\n const auth = await createUser(options.registry);\n token = auth.token;\n console.log(`User \"${auth.user}\" created.`);\n }\n\n // Build adapter list\n const adapters = parseAdapters(options.pm);\n console.log(`Adapters: ${adapters.map((a) => a.name).join(', ')}`);\n\n // Filter tests\n const tests =\n options.test && options.test.length > 0\n ? allTests.filter((t) => options.test!.includes(t.name))\n : allTests;\n\n console.log(`Tests: ${tests.map((t) => t.name).join(', ')}`);\n\n // Run\n const { exitCode } = await runAll(adapters, tests, options.registry, token, {\n timeout: options.timeout,\n concurrency: options.concurrency,\n testFilter: options.test,\n });\n\n process.exit(exitCode);\n}\n\n// Re-export for programmatic usage\nexport { allTests } from './tests';\nexport { allScenarios } from './scenarios';\nexport {\n createBunAdapter,\n createDenoAdapter,\n createNpmAdapter,\n createPnpmAdapter,\n createYarnModernAdapter,\n} from './adapters';\nexport { runAll, runSuite } from './runner';\nexport type { PackageManagerAdapter, TestDefinition, TestContext, CliOptions } from './types';\n"],"mappings":"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"}