@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,96 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug, 1);
4
+ let child_process = require("child_process");
5
+ let path = require("path");
6
+ let readline = require("readline");
7
+ let util = require("util");
8
+ //#region src/utils/process.ts
9
+ var debug$1 = (0, debug.default)("verdaccio:e2e-cli:process");
10
+ var debugRead = (0, debug.default)("verdaccio:e2e-cli:line");
11
+ var _verbose = false;
12
+ function setVerbose(v) {
13
+ _verbose = v;
14
+ }
15
+ var COLORS = {
16
+ reset: "\x1B[0m",
17
+ dim: "\x1B[2m",
18
+ cyan: "\x1B[36m",
19
+ green: "\x1B[32m",
20
+ red: "\x1B[31m",
21
+ yellow: "\x1B[33m"
22
+ };
23
+ function shortCmd(cmd, args) {
24
+ return `${(0, path.basename)(cmd)} ${args.join(" ")}`;
25
+ }
26
+ /**
27
+ * Always-on scenario tracing, printed inline with the test output in the same
28
+ * style as the verbose `$ <command>` lines — so a red scenario explains what
29
+ * it actually saw (statuses, headers, bodies, timings) in any run, CI or
30
+ * local, without a reproduction. Accepts util.format tokens (%s %d %j %o).
31
+ */
32
+ function trace(fmt, ...args) {
33
+ process.stdout.write(` ${COLORS.dim}» ${(0, util.format)(fmt, ...args)}${COLORS.reset}\n`);
34
+ }
35
+ async function exec(options, cmd, args) {
36
+ debug$1("start exec %o %o %o", options, cmd, args ? args.join(" ") : "");
37
+ let stdout = "";
38
+ let stderr = "";
39
+ if (_verbose) {
40
+ const cwd = options.cwd ? ` ${COLORS.dim}(cwd: ${(0, path.basename)(String(options.cwd))})${COLORS.reset}` : "";
41
+ process.stdout.write(` ${COLORS.cyan}$${COLORS.reset} ${shortCmd(cmd, args)}${cwd}\n`);
42
+ }
43
+ const spawnOptions = {
44
+ cwd: options.cwd,
45
+ stdio: options.stdio || "pipe",
46
+ env: options.env || process.env
47
+ };
48
+ if (process.platform.startsWith("win")) {
49
+ args.unshift("/c", cmd);
50
+ cmd = "cmd.exe";
51
+ spawnOptions.stdio = "pipe";
52
+ }
53
+ const start = Date.now();
54
+ const childProcess = (0, child_process.spawn)(cmd, args, spawnOptions);
55
+ if (childProcess.stdout) {
56
+ childProcess.stdout.on("data", (data) => {
57
+ debugRead("data %o", data.toString());
58
+ });
59
+ (0, readline.createInterface)({
60
+ input: childProcess.stdout,
61
+ output: process.stdout,
62
+ terminal: false
63
+ }).on("line", function(line) {
64
+ debugRead("line %o", line);
65
+ stdout += line;
66
+ });
67
+ }
68
+ if (childProcess.stderr) childProcess.stderr.on("data", (data) => {
69
+ stderr += data.toString();
70
+ });
71
+ const err = /* @__PURE__ */ new Error(`Running "${cmd} ${args.join(" ")}" returned error code `);
72
+ return new Promise((resolve, reject) => {
73
+ childProcess.on("exit", (code) => {
74
+ const duration = Date.now() - start;
75
+ debugRead("exit %o", code);
76
+ if (_verbose) {
77
+ const status = code ? `${COLORS.red}exit ${code}${COLORS.reset}` : `${COLORS.green}ok${COLORS.reset}`;
78
+ process.stdout.write(` ${COLORS.dim} -> ${status} ${COLORS.dim}(${duration}ms)${COLORS.reset}\n`);
79
+ }
80
+ if (!code) resolve({
81
+ stdout,
82
+ stderr
83
+ });
84
+ else {
85
+ err.message += `${code}...\n\nSTDOUT:\n${stdout}\n\nSTDERR:\n${stderr}\n`;
86
+ reject(err);
87
+ }
88
+ });
89
+ });
90
+ }
91
+ //#endregion
92
+ exports.exec = exec;
93
+ exports.setVerbose = setVerbose;
94
+ exports.trace = trace;
95
+
96
+ //# sourceMappingURL=process.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.cjs","names":[],"sources":["../../../src/utils/process.ts"],"sourcesContent":["import { SpawnOptions, spawn } from 'child_process';\nimport buildDebug from 'debug';\nimport { basename } from 'path';\nimport { createInterface } from 'readline';\nimport { format } from 'util';\n\nimport { ExecOutput } from '../types';\n\nconst debug = buildDebug('verdaccio:e2e-cli:process');\nconst debugRead = buildDebug('verdaccio:e2e-cli:line');\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean) {\n _verbose = v;\n}\n\nconst COLORS = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n cyan: '\\x1b[36m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n};\n\nfunction shortCmd(cmd: string, args: string[]): string {\n const bin = basename(cmd);\n return `${bin} ${args.join(' ')}`;\n}\n\n/**\n * Always-on scenario tracing, printed inline with the test output in the same\n * style as the verbose `$ <command>` lines — so a red scenario explains what\n * it actually saw (statuses, headers, bodies, timings) in any run, CI or\n * local, without a reproduction. Accepts util.format tokens (%s %d %j %o).\n */\nexport function trace(fmt: string, ...args: unknown[]): void {\n process.stdout.write(` ${COLORS.dim}» ${format(fmt, ...args)}${COLORS.reset}\\n`);\n}\n\nexport async function exec(\n options: SpawnOptions,\n cmd: string,\n args: string[]\n): Promise<ExecOutput> {\n debug('start exec %o %o %o', options, cmd, args ? args.join(' ') : '');\n let stdout = '';\n let stderr = '';\n\n if (_verbose) {\n const cwd = options.cwd\n ? ` ${COLORS.dim}(cwd: ${basename(String(options.cwd))})${COLORS.reset}`\n : '';\n process.stdout.write(` ${COLORS.cyan}$${COLORS.reset} ${shortCmd(cmd, args)}${cwd}\\n`);\n }\n\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n stdio: options.stdio || 'pipe',\n env: options.env || process.env,\n };\n\n if (process.platform.startsWith('win')) {\n args.unshift('/c', cmd);\n cmd = 'cmd.exe';\n spawnOptions.stdio = 'pipe';\n }\n\n const start = Date.now();\n const childProcess = spawn(cmd, args, spawnOptions);\n\n if (childProcess.stdout) {\n childProcess.stdout.on('data', (data) => {\n debugRead('data %o', data.toString());\n });\n const rl = createInterface({\n input: childProcess.stdout,\n output: process.stdout,\n terminal: false,\n });\n\n rl.on('line', function (line) {\n debugRead('line %o', line);\n stdout += line;\n });\n }\n\n if (childProcess.stderr) {\n childProcess.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n }\n\n const err = new Error(`Running \"${cmd} ${args.join(' ')}\" returned error code `);\n return new Promise((resolve, reject) => {\n childProcess.on('exit', (code) => {\n const duration = Date.now() - start;\n debugRead('exit %o', code);\n\n if (_verbose) {\n const status = code\n ? `${COLORS.red}exit ${code}${COLORS.reset}`\n : `${COLORS.green}ok${COLORS.reset}`;\n process.stdout.write(\n ` ${COLORS.dim} -> ${status} ${COLORS.dim}(${duration}ms)${COLORS.reset}\\n`\n );\n }\n\n if (!code) {\n resolve({ stdout, stderr });\n } else {\n err.message += `${code}...\\n\\nSTDOUT:\\n${stdout}\\n\\nSTDERR:\\n${stderr}\\n`;\n reject(err);\n }\n });\n });\n}\n"],"mappings":";;;;;;;;AAQA,IAAM,WAAA,GAAQ,MAAA,QAAA,CAAW,2BAA2B;AACpD,IAAM,aAAA,GAAY,MAAA,QAAA,CAAW,wBAAwB;AAErD,IAAI,WAAW;AAEf,SAAgB,WAAW,GAAY;CACrC,WAAW;AACb;AAEA,IAAM,SAAS;CACb,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,QAAQ;AACV;AAEA,SAAS,SAAS,KAAa,MAAwB;CAErD,OAAO,IAAA,GADK,KAAA,SAAA,CAAS,GACX,EAAI,GAAG,KAAK,KAAK,GAAG;AAChC;;;;;;;AAQA,SAAgB,MAAM,KAAa,GAAG,MAAuB;CAC3D,QAAQ,OAAO,MAAM,SAAS,OAAO,IAAI,KAAA,GAAI,KAAA,OAAA,CAAO,KAAK,GAAG,IAAI,IAAI,OAAO,MAAM,GAAG;AACtF;AAEA,eAAsB,KACpB,SACA,KACA,MACqB;CACrB,QAAM,uBAAuB,SAAS,KAAK,OAAO,KAAK,KAAK,GAAG,IAAI,EAAE;CACrE,IAAI,SAAS;CACb,IAAI,SAAS;CAEb,IAAI,UAAU;EACZ,MAAM,MAAM,QAAQ,MAChB,IAAI,OAAO,IAAI,SAAA,GAAQ,KAAA,SAAA,CAAS,OAAO,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,UAC/D;EACJ,QAAQ,OAAO,MAAM,SAAS,OAAO,KAAK,GAAG,OAAO,MAAM,GAAG,SAAS,KAAK,IAAI,IAAI,IAAI,GAAG;CAC5F;CAEA,MAAM,eAA6B;EACjC,KAAK,QAAQ;EACb,OAAO,QAAQ,SAAS;EACxB,KAAK,QAAQ,OAAO,QAAQ;CAC9B;CAEA,IAAI,QAAQ,SAAS,WAAW,KAAK,GAAG;EACtC,KAAK,QAAQ,MAAM,GAAG;EACtB,MAAM;EACN,aAAa,QAAQ;CACvB;CAEA,MAAM,QAAQ,KAAK,IAAI;CACvB,MAAM,gBAAA,GAAe,cAAA,MAAA,CAAM,KAAK,MAAM,YAAY;CAElD,IAAI,aAAa,QAAQ;EACvB,aAAa,OAAO,GAAG,SAAS,SAAS;GACvC,UAAU,WAAW,KAAK,SAAS,CAAC;EACtC,CAAC;EAOD,CAAA,GANW,SAAA,gBAAA,CAAgB;GACzB,OAAO,aAAa;GACpB,QAAQ,QAAQ;GAChB,UAAU;EACZ,CAEA,CAAA,CAAG,GAAG,QAAQ,SAAU,MAAM;GAC5B,UAAU,WAAW,IAAI;GACzB,UAAU;EACZ,CAAC;CACH;CAEA,IAAI,aAAa,QACf,aAAa,OAAO,GAAG,SAAS,SAAS;EACvC,UAAU,KAAK,SAAS;CAC1B,CAAC;CAGH,MAAM,sBAAM,IAAI,MAAM,YAAY,IAAI,GAAG,KAAK,KAAK,GAAG,EAAE,uBAAuB;CAC/E,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,aAAa,GAAG,SAAS,SAAS;GAChC,MAAM,WAAW,KAAK,IAAI,IAAI;GAC9B,UAAU,WAAW,IAAI;GAEzB,IAAI,UAAU;IACZ,MAAM,SAAS,OACX,GAAG,OAAO,IAAI,OAAO,OAAO,OAAO,UACnC,GAAG,OAAO,MAAM,IAAI,OAAO;IAC/B,QAAQ,OAAO,MACb,SAAS,OAAO,IAAI,OAAO,OAAO,GAAG,OAAO,IAAI,GAAG,SAAS,KAAK,OAAO,MAAM,GAChF;GACF;GAEA,IAAI,CAAC,MACH,QAAQ;IAAE;IAAQ;GAAO,CAAC;QACrB;IACL,IAAI,WAAW,GAAG,KAAK,kBAAkB,OAAO,eAAe,OAAO;IACtE,OAAO,GAAG;GACZ;EACF,CAAC;CACH,CAAC;AACH"}
@@ -0,0 +1,55 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug, 1);
4
+ let path = require("path");
5
+ let fs_promises = require("fs/promises");
6
+ let os = require("os");
7
+ //#region src/utils/project.ts
8
+ var debug$1 = (0, debug.default)("verdaccio:e2e-cli:project");
9
+ async function createTempFolder(prefix) {
10
+ const sanitized = prefix.replace(/[^a-zA-Z0-9-_]/g, "-");
11
+ debug$1("creating temp folder %o", sanitized);
12
+ return (0, fs_promises.mkdtemp)((0, path.join)((0, os.tmpdir)(), `verdaccio-e2e-${sanitized}-`));
13
+ }
14
+ function getPackageJSON(packageName, version = "1.0.0", dependencies = {}, devDependencies = {}) {
15
+ debug$1("creating package.json %o", packageName);
16
+ return JSON.stringify({
17
+ name: packageName,
18
+ version,
19
+ description: "some cool project",
20
+ main: "index.js",
21
+ scripts: { test: "echo exit 1" },
22
+ dependencies,
23
+ devDependencies,
24
+ keywords: ["foo", "bar"],
25
+ author: "Verdaccio E2E <verdaccio@example.org>",
26
+ license: "MIT"
27
+ });
28
+ }
29
+ function getREADME(packageName) {
30
+ return `
31
+ # My README ${packageName}
32
+
33
+ some text
34
+
35
+ ## subtitle
36
+
37
+ more text
38
+ `;
39
+ }
40
+ async function prepareGenericEmptyProject(packageName, version, port, token, registryDomain, dependencies = {}, devDependencies = {}) {
41
+ debug$1("preparing generic project %o", packageName);
42
+ const getNPMrc = (port, token, registry) => `//localhost:${port}/:_authToken=${token}\nregistry=${registry}\nmin-release-age=0\naudit=false\nfund=false`;
43
+ const tempFolder = await createTempFolder("temp-folder");
44
+ await (0, fs_promises.writeFile)((0, path.join)(tempFolder, "package.json"), getPackageJSON(packageName, version, dependencies, devDependencies));
45
+ await (0, fs_promises.writeFile)((0, path.join)(tempFolder, "README.md"), getREADME(packageName));
46
+ await (0, fs_promises.writeFile)((0, path.join)(tempFolder, ".npmrc"), getNPMrc(port, token, registryDomain));
47
+ return { tempFolder };
48
+ }
49
+ //#endregion
50
+ exports.createTempFolder = createTempFolder;
51
+ exports.getPackageJSON = getPackageJSON;
52
+ exports.getREADME = getREADME;
53
+ exports.prepareGenericEmptyProject = prepareGenericEmptyProject;
54
+
55
+ //# sourceMappingURL=project.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.cjs","names":[],"sources":["../../../src/utils/project.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { mkdirSync } from 'fs';\nimport { mkdtemp, writeFile } from 'fs/promises';\nimport { tmpdir } from 'os';\nimport { join } from 'path';\n\nconst debug = buildDebug('verdaccio:e2e-cli:project');\n\nexport async function createTempFolder(prefix: string): Promise<string> {\n const sanitized = prefix.replace(/[^a-zA-Z0-9-_]/g, '-');\n debug('creating temp folder %o', sanitized);\n return mkdtemp(join(tmpdir(), `verdaccio-e2e-${sanitized}-`));\n}\n\nexport function getPackageJSON(\n packageName: string,\n version = '1.0.0',\n dependencies: Record<string, string> = {},\n devDependencies: Record<string, string> = {}\n): string {\n debug('creating package.json %o', packageName);\n const json = {\n name: packageName,\n version,\n description: 'some cool project',\n main: 'index.js',\n scripts: {\n test: 'echo exit 1',\n },\n dependencies,\n devDependencies,\n keywords: ['foo', 'bar'],\n author: 'Verdaccio E2E <verdaccio@example.org>',\n license: 'MIT',\n };\n return JSON.stringify(json);\n}\n\nexport function getREADME(packageName: string): string {\n return `\n # My README ${packageName}\n\n some text\n\n ## subtitle\n\n more text\n `;\n}\n\nexport async function prepareGenericEmptyProject(\n packageName: string,\n version: string,\n port: number,\n token: string,\n registryDomain: string,\n dependencies: Record<string, string> = {},\n devDependencies: Record<string, string> = {}\n): Promise<{ tempFolder: string }> {\n debug('preparing generic project %o', packageName);\n // `min-release-age=0` keeps the harness hermetic: npm 12 added a release-age\n // cooldown that, if set in the developer's global ~/.npmrc, would reject the\n // just-published packages these tests install (ETARGET / \"no matching version\n // ... before <date>\"). Pinning it per-project overrides any global value.\n // It's an npm-only key — pnpm (minimum-release-age) and yarn ignore it.\n // `audit=false`/`fund=false` stop npm's implicit audit/fund calls on every\n // install — the registry would proxy those upstream, and the suite must run\n // fully offline (the dedicated audit test still runs `npm audit` explicitly).\n const getNPMrc = (port: number, token: string, registry: string) =>\n `//localhost:${port}/:_authToken=${token}\\nregistry=${registry}\\nmin-release-age=0\\naudit=false\\nfund=false`;\n const tempFolder = await createTempFolder('temp-folder');\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 await writeFile(join(tempFolder, '.npmrc'), getNPMrc(port, token, registryDomain));\n return { tempFolder };\n}\n"],"mappings":";;;;;;;AAMA,IAAM,WAAA,GAAQ,MAAA,QAAA,CAAW,2BAA2B;AAEpD,eAAsB,iBAAiB,QAAiC;CACtE,MAAM,YAAY,OAAO,QAAQ,mBAAmB,GAAG;CACvD,QAAM,2BAA2B,SAAS;CAC1C,QAAA,GAAO,YAAA,QAAA,EAAA,GAAQ,KAAA,KAAA,EAAA,GAAK,GAAA,OAAA,CAAO,GAAG,iBAAiB,UAAU,EAAE,CAAC;AAC9D;AAEA,SAAgB,eACd,aACA,UAAU,SACV,eAAuC,CAAC,GACxC,kBAA0C,CAAC,GACnC;CACR,QAAM,4BAA4B,WAAW;CAe7C,OAAO,KAAK,UAAU;EAbpB,MAAM;EACN;EACA,aAAa;EACb,MAAM;EACN,SAAS,EACP,MAAM,cACR;EACA;EACA;EACA,UAAU,CAAC,OAAO,KAAK;EACvB,QAAQ;EACR,SAAS;CAEW,CAAI;AAC5B;AAEA,SAAgB,UAAU,aAA6B;CACrD,OAAO;iBACQ,YAAY;;;;;;;;AAQ7B;AAEA,eAAsB,2BACpB,aACA,SACA,MACA,OACA,gBACA,eAAuC,CAAC,GACxC,kBAA0C,CAAC,GACV;CACjC,QAAM,gCAAgC,WAAW;CASjD,MAAM,YAAY,MAAc,OAAe,aAC7C,eAAe,KAAK,eAAe,MAAM,aAAa,SAAS;CACjE,MAAM,aAAa,MAAM,iBAAiB,aAAa;CACvD,OAAA,GAAM,YAAA,UAAA,EAAA,GACJ,KAAA,KAAA,CAAK,YAAY,cAAc,GAC/B,eAAe,aAAa,SAAS,cAAc,eAAe,CACpE;CACA,OAAA,GAAM,YAAA,UAAA,EAAA,GAAU,KAAA,KAAA,CAAK,YAAY,WAAW,GAAG,UAAU,WAAW,CAAC;CACrE,OAAA,GAAM,YAAA,UAAA,EAAA,GAAU,KAAA,KAAA,CAAK,YAAY,QAAQ,GAAG,SAAS,MAAM,OAAO,cAAc,CAAC;CACjF,OAAO,EAAE,WAAW;AACtB"}
@@ -0,0 +1,117 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_http_client = require("./http-client.cjs");
3
+ let debug = require("debug");
4
+ debug = require_runtime.__toESM(debug, 1);
5
+ let zlib = require("zlib");
6
+ //#region src/utils/publish.ts
7
+ var debug$1 = (0, debug.default)("verdaccio:e2e-cli:publish");
8
+ /** Build a single ustar tar entry (512-byte header + padded content). */
9
+ function tarEntry(name, content) {
10
+ const header = Buffer.alloc(512);
11
+ header.write(name, 0, 100, "utf8");
12
+ header.write("0000644\0", 100, 8);
13
+ header.write("0000000\0", 108, 8);
14
+ header.write("0000000\0", 116, 8);
15
+ header.write(content.length.toString(8).padStart(11, "0") + "\0", 124, 12);
16
+ header.write("00000000000\0", 136, 12);
17
+ header.write(" ", 148, 8);
18
+ header.write("0", 156, 1);
19
+ header.write("ustar\0", 257, 6);
20
+ header.write("00", 263, 2);
21
+ let checksum = 0;
22
+ for (const byte of header) checksum += byte;
23
+ header.write(checksum.toString(8).padStart(6, "0") + "\0 ", 148, 8);
24
+ const padding = Buffer.alloc((512 - content.length % 512) % 512);
25
+ return Buffer.concat([
26
+ header,
27
+ content,
28
+ padding
29
+ ]);
30
+ }
31
+ /** Build a minimal valid npm package tarball (package/package.json inside). */
32
+ function buildPackageTarball(pkgName, version, dependencies = {}) {
33
+ const manifest = {
34
+ name: pkgName,
35
+ version,
36
+ description: "e2e local package",
37
+ main: "index.js",
38
+ dependencies,
39
+ license: "MIT"
40
+ };
41
+ const tar = Buffer.concat([
42
+ tarEntry("package/package.json", Buffer.from(JSON.stringify(manifest, null, 2))),
43
+ tarEntry("package/index.js", Buffer.from("module.exports = {};\n")),
44
+ Buffer.alloc(1024)
45
+ ]);
46
+ return (0, zlib.gzipSync)(tar, { level: 9 });
47
+ }
48
+ /**
49
+ * Publish straight through the registry HTTP API (same PUT an npm client
50
+ * sends). Used for adapters that cannot publish themselves (eg. deno) so
51
+ * every fixture still comes from the registry under test — never from an
52
+ * external registry.
53
+ */
54
+ async function publishViaHttp(ctx, pkgName, version = "1.0.0", dependencies = {}) {
55
+ const tarball = buildPackageTarball(pkgName, version, dependencies);
56
+ const { shasum, integrity } = require_http_client.computeDist(tarball);
57
+ const filename = `${pkgName.replace(/^@[^/]+\//, "")}-${version}.tgz`;
58
+ const encodedName = pkgName.startsWith("@") ? pkgName.replaceAll("/", "%2f") : pkgName;
59
+ const tarballUrl = `${ctx.registryUrl}/${encodedName}/-/${filename}`;
60
+ const body = {
61
+ _id: pkgName,
62
+ name: pkgName,
63
+ description: "e2e local package",
64
+ "dist-tags": { latest: version },
65
+ versions: { [version]: {
66
+ _id: `${pkgName}@${version}`,
67
+ name: pkgName,
68
+ version,
69
+ description: "e2e local package",
70
+ main: "index.js",
71
+ dependencies,
72
+ license: "MIT",
73
+ dist: {
74
+ tarball: tarballUrl,
75
+ shasum,
76
+ integrity
77
+ }
78
+ } },
79
+ _attachments: { [filename]: {
80
+ content_type: "application/octet-stream",
81
+ data: tarball.toString("base64"),
82
+ length: tarball.length
83
+ } }
84
+ };
85
+ const response = await fetch(`${ctx.registryUrl}/${encodedName}`, {
86
+ method: "PUT",
87
+ headers: {
88
+ "Content-Type": "application/json",
89
+ Authorization: `Bearer ${ctx.token}`
90
+ },
91
+ body: JSON.stringify(body)
92
+ });
93
+ if (response.status !== 201 && response.status !== 200) {
94
+ const text = await response.text();
95
+ throw new Error(`HTTP publish of ${pkgName}@${version} failed: ${response.status} ${text}`);
96
+ }
97
+ debug$1("published %s@%s via HTTP", pkgName, version);
98
+ }
99
+ /**
100
+ * Publish a package to the registry under test so later steps (install, ci,
101
+ * audit, info, search…) can consume it without ever touching an external
102
+ * registry — the whole suite must be runnable offline. Uses the package
103
+ * manager when it can publish, the raw HTTP API otherwise (eg. deno).
104
+ */
105
+ async function publishLocalPackage(ctx, pkgName, version = "1.0.0", dependencies = {}) {
106
+ if (!ctx.adapter.supports.has("publish")) return publishViaHttp(ctx, pkgName, version, dependencies);
107
+ const { tempFolder } = await ctx.adapter.prepareProject(pkgName, version, ctx.registryUrl, ctx.port, ctx.token, dependencies);
108
+ if (ctx.adapter.type === "yarn-modern") await ctx.adapter.exec({ cwd: tempFolder }, "install");
109
+ await ctx.adapter.exec({ cwd: tempFolder }, "publish", ...ctx.adapter.registryArg(ctx.registryUrl));
110
+ debug$1("published local package %s@%s", pkgName, version);
111
+ }
112
+ //#endregion
113
+ exports.buildPackageTarball = buildPackageTarball;
114
+ exports.publishLocalPackage = publishLocalPackage;
115
+ exports.publishViaHttp = publishViaHttp;
116
+
117
+ //# sourceMappingURL=publish.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.cjs","names":[],"sources":["../../../src/utils/publish.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { gzipSync } from 'zlib';\n\nimport { TestContext } from '../types';\nimport { computeDist } from './http-client';\n\nconst debug = buildDebug('verdaccio:e2e-cli:publish');\n\n/** Build a single ustar tar entry (512-byte header + padded content). */\nfunction tarEntry(name: string, content: Buffer): Buffer {\n const header = Buffer.alloc(512);\n header.write(name, 0, 100, 'utf8');\n header.write('0000644\\0', 100, 8); // mode\n header.write('0000000\\0', 108, 8); // uid\n header.write('0000000\\0', 116, 8); // gid\n header.write(content.length.toString(8).padStart(11, '0') + '\\0', 124, 12); // size\n header.write('00000000000\\0', 136, 12); // mtime (epoch, keeps output deterministic)\n header.write(' ', 148, 8); // chksum placeholder (spaces while summing)\n header.write('0', 156, 1); // typeflag: regular file\n header.write('ustar\\0', 257, 6); // magic\n header.write('00', 263, 2); // version\n let checksum = 0;\n for (const byte of header) {\n checksum += byte;\n }\n header.write(checksum.toString(8).padStart(6, '0') + '\\0 ', 148, 8);\n const padding = Buffer.alloc((512 - (content.length % 512)) % 512);\n return Buffer.concat([header, content, padding]);\n}\n\n/** Build a minimal valid npm package tarball (package/package.json inside). */\nexport function buildPackageTarball(\n pkgName: string,\n version: string,\n dependencies: Record<string, string> = {}\n): Buffer {\n const manifest = {\n name: pkgName,\n version,\n description: 'e2e local package',\n main: 'index.js',\n dependencies,\n license: 'MIT',\n };\n const tar = Buffer.concat([\n tarEntry('package/package.json', Buffer.from(JSON.stringify(manifest, null, 2))),\n tarEntry('package/index.js', Buffer.from('module.exports = {};\\n')),\n Buffer.alloc(1024), // tar end-of-archive marker\n ]);\n return gzipSync(tar, { level: 9 });\n}\n\n/**\n * Publish straight through the registry HTTP API (same PUT an npm client\n * sends). Used for adapters that cannot publish themselves (eg. deno) so\n * every fixture still comes from the registry under test — never from an\n * external registry.\n */\nexport async function publishViaHttp(\n ctx: TestContext,\n pkgName: string,\n version = '1.0.0',\n dependencies: Record<string, string> = {}\n): Promise<void> {\n const tarball = buildPackageTarball(pkgName, version, dependencies);\n const { shasum, integrity } = computeDist(tarball);\n const filename = `${pkgName.replace(/^@[^/]+\\//, '')}-${version}.tgz`;\n const encodedName = pkgName.startsWith('@') ? pkgName.replaceAll('/', '%2f') : pkgName;\n const tarballUrl = `${ctx.registryUrl}/${encodedName}/-/${filename}`;\n const body = {\n _id: pkgName,\n name: pkgName,\n description: 'e2e local package',\n 'dist-tags': { latest: version },\n versions: {\n [version]: {\n _id: `${pkgName}@${version}`,\n name: pkgName,\n version,\n description: 'e2e local package',\n main: 'index.js',\n dependencies,\n license: 'MIT',\n dist: { tarball: tarballUrl, shasum, integrity },\n },\n },\n _attachments: {\n [filename]: {\n content_type: 'application/octet-stream',\n data: tarball.toString('base64'),\n length: tarball.length,\n },\n },\n };\n const response = await fetch(`${ctx.registryUrl}/${encodedName}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${ctx.token}`,\n },\n body: JSON.stringify(body),\n });\n if (response.status !== 201 && response.status !== 200) {\n const text = await response.text();\n throw new Error(`HTTP publish of ${pkgName}@${version} failed: ${response.status} ${text}`);\n }\n debug('published %s@%s via HTTP', pkgName, version);\n}\n\n/**\n * Publish a package to the registry under test so later steps (install, ci,\n * audit, info, search…) can consume it without ever touching an external\n * registry — the whole suite must be runnable offline. Uses the package\n * manager when it can publish, the raw HTTP API otherwise (eg. deno).\n */\nexport async function publishLocalPackage(\n ctx: TestContext,\n pkgName: string,\n version = '1.0.0',\n dependencies: Record<string, string> = {}\n): Promise<void> {\n if (!ctx.adapter.supports.has('publish')) {\n return publishViaHttp(ctx, pkgName, version, dependencies);\n }\n const { tempFolder } = await ctx.adapter.prepareProject(\n pkgName,\n version,\n ctx.registryUrl,\n ctx.port,\n ctx.token,\n dependencies\n );\n // yarn modern requires an install first to generate the lockfile\n if (ctx.adapter.type === 'yarn-modern') {\n await ctx.adapter.exec({ cwd: tempFolder }, 'install');\n }\n await ctx.adapter.exec(\n { cwd: tempFolder },\n 'publish',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n debug('published local package %s@%s', pkgName, version);\n}\n"],"mappings":";;;;;;AAMA,IAAM,WAAA,GAAQ,MAAA,QAAA,CAAW,2BAA2B;;AAGpD,SAAS,SAAS,MAAc,SAAyB;CACvD,MAAM,SAAS,OAAO,MAAM,GAAG;CAC/B,OAAO,MAAM,MAAM,GAAG,KAAK,MAAM;CACjC,OAAO,MAAM,aAAa,KAAK,CAAC;CAChC,OAAO,MAAM,aAAa,KAAK,CAAC;CAChC,OAAO,MAAM,aAAa,KAAK,CAAC;CAChC,OAAO,MAAM,QAAQ,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,MAAM,KAAK,EAAE;CACzE,OAAO,MAAM,iBAAiB,KAAK,EAAE;CACrC,OAAO,MAAM,YAAY,KAAK,CAAC;CAC/B,OAAO,MAAM,KAAK,KAAK,CAAC;CACxB,OAAO,MAAM,WAAW,KAAK,CAAC;CAC9B,OAAO,MAAM,MAAM,KAAK,CAAC;CACzB,IAAI,WAAW;CACf,KAAK,MAAM,QAAQ,QACjB,YAAY;CAEd,OAAO,MAAM,SAAS,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC;CAClE,MAAM,UAAU,OAAO,OAAO,MAAO,QAAQ,SAAS,OAAQ,GAAG;CACjE,OAAO,OAAO,OAAO;EAAC;EAAQ;EAAS;CAAO,CAAC;AACjD;;AAGA,SAAgB,oBACd,SACA,SACA,eAAuC,CAAC,GAChC;CACR,MAAM,WAAW;EACf,MAAM;EACN;EACA,aAAa;EACb,MAAM;EACN;EACA,SAAS;CACX;CACA,MAAM,MAAM,OAAO,OAAO;EACxB,SAAS,wBAAwB,OAAO,KAAK,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC,CAAC;EAC/E,SAAS,oBAAoB,OAAO,KAAK,wBAAwB,CAAC;EAClE,OAAO,MAAM,IAAI;CACnB,CAAC;CACD,QAAA,GAAO,KAAA,SAAA,CAAS,KAAK,EAAE,OAAO,EAAE,CAAC;AACnC;;;;;;;AAQA,eAAsB,eACpB,KACA,SACA,UAAU,SACV,eAAuC,CAAC,GACzB;CACf,MAAM,UAAU,oBAAoB,SAAS,SAAS,YAAY;CAClE,MAAM,EAAE,QAAQ,cAAc,oBAAA,YAAY,OAAO;CACjD,MAAM,WAAW,GAAG,QAAQ,QAAQ,aAAa,EAAE,EAAE,GAAG,QAAQ;CAChE,MAAM,cAAc,QAAQ,WAAW,GAAG,IAAI,QAAQ,WAAW,KAAK,KAAK,IAAI;CAC/E,MAAM,aAAa,GAAG,IAAI,YAAY,GAAG,YAAY,KAAK;CAC1D,MAAM,OAAO;EACX,KAAK;EACL,MAAM;EACN,aAAa;EACb,aAAa,EAAE,QAAQ,QAAQ;EAC/B,UAAU,GACP,UAAU;GACT,KAAK,GAAG,QAAQ,GAAG;GACnB,MAAM;GACN;GACA,aAAa;GACb,MAAM;GACN;GACA,SAAS;GACT,MAAM;IAAE,SAAS;IAAY;IAAQ;GAAU;EACjD,EACF;EACA,cAAc,GACX,WAAW;GACV,cAAc;GACd,MAAM,QAAQ,SAAS,QAAQ;GAC/B,QAAQ,QAAQ;EAClB,EACF;CACF;CACA,MAAM,WAAW,MAAM,MAAM,GAAG,IAAI,YAAY,GAAG,eAAe;EAChE,QAAQ;EACR,SAAS;GACP,gBAAgB;GAChB,eAAe,UAAU,IAAI;EAC/B;EACA,MAAM,KAAK,UAAU,IAAI;CAC3B,CAAC;CACD,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;EACtD,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,MAAM,IAAI,MAAM,mBAAmB,QAAQ,GAAG,QAAQ,WAAW,SAAS,OAAO,GAAG,MAAM;CAC5F;CACA,QAAM,4BAA4B,SAAS,OAAO;AACpD;;;;;;;AAQA,eAAsB,oBACpB,KACA,SACA,UAAU,SACV,eAAuC,CAAC,GACzB;CACf,IAAI,CAAC,IAAI,QAAQ,SAAS,IAAI,SAAS,GACrC,OAAO,eAAe,KAAK,SAAS,SAAS,YAAY;CAE3D,MAAM,EAAE,eAAe,MAAM,IAAI,QAAQ,eACvC,SACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,OACJ,YACF;CAEA,IAAI,IAAI,QAAQ,SAAS,eACvB,MAAM,IAAI,QAAQ,KAAK,EAAE,KAAK,WAAW,GAAG,SAAS;CAEvD,MAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,WAAW,GAClB,WACA,GAAG,IAAI,QAAQ,YAAY,IAAI,WAAW,CAC5C;CACA,QAAM,iCAAiC,SAAS,OAAO;AACzD"}
@@ -0,0 +1,56 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug, 1);
4
+ let _verdaccio_registry_cli = require("@verdaccio/registry-cli");
5
+ //#region src/utils/registry-client.ts
6
+ var debug$1 = (0, debug.default)("verdaccio:e2e-cli:registry-client");
7
+ /**
8
+ * Creates a user on the registry and returns the auth token.
9
+ * Uses a unique username per run to avoid 409 conflicts.
10
+ * Works against any running Verdaccio instance with htpasswd auth.
11
+ */
12
+ async function createUser(registryUrl, user = `e2e-user-${Date.now()}`, password = "e2e-test-password") {
13
+ debug$1("creating user %s on %s", user, registryUrl);
14
+ const url = `${registryUrl}/-/user/org.couchdb.user:${encodeURIComponent(user)}`;
15
+ const response = await fetch(url, {
16
+ method: "PUT",
17
+ headers: { "Content-Type": "application/json" },
18
+ body: JSON.stringify({
19
+ name: user,
20
+ password,
21
+ _id: `org.couchdb.user:${user}`,
22
+ type: "user",
23
+ roles: [],
24
+ date: (/* @__PURE__ */ new Date()).toISOString()
25
+ })
26
+ });
27
+ const body = await response.json();
28
+ if (response.status === 201 || response.status === 200 || response.status === 409) {
29
+ const token = body.token;
30
+ if (token) {
31
+ debug$1("user %s authenticated, token obtained", user);
32
+ return {
33
+ token,
34
+ user
35
+ };
36
+ }
37
+ }
38
+ throw new Error(`Failed to create/login user "${user}" on ${registryUrl}: ${response.status} ${JSON.stringify(body)}`);
39
+ }
40
+ /**
41
+ * Ping the registry to check it's alive.
42
+ * Uses @verdaccio/registry-cli ping.
43
+ */
44
+ async function pingRegistry(registryUrl) {
45
+ debug$1("pinging %s", registryUrl);
46
+ try {
47
+ return (await (0, _verdaccio_registry_cli.ping)(registryUrl)).ok;
48
+ } catch {
49
+ return false;
50
+ }
51
+ }
52
+ //#endregion
53
+ exports.createUser = createUser;
54
+ exports.pingRegistry = pingRegistry;
55
+
56
+ //# sourceMappingURL=registry-client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.cjs","names":[],"sources":["../../../src/utils/registry-client.ts"],"sourcesContent":["import buildDebug from 'debug';\n\nimport { ping } from '@verdaccio/registry-cli';\n\nconst debug = buildDebug('verdaccio:e2e-cli:registry-client');\n\nexport type RegistryAuth = {\n token: string;\n user: string;\n};\n\n/**\n * Creates a user on the registry and returns the auth token.\n * Uses a unique username per run to avoid 409 conflicts.\n * Works against any running Verdaccio instance with htpasswd auth.\n */\nexport async function createUser(\n registryUrl: string,\n user = `e2e-user-${Date.now()}`,\n password = 'e2e-test-password'\n): Promise<RegistryAuth> {\n debug('creating user %s on %s', user, registryUrl);\n const url = `${registryUrl}/-/user/org.couchdb.user:${encodeURIComponent(user)}`;\n const response = await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name: user,\n password,\n _id: `org.couchdb.user:${user}`,\n type: 'user',\n roles: [],\n date: new Date().toISOString(),\n }),\n });\n\n const body = (await response.json()) as any;\n\n if (response.status === 201 || response.status === 200 || response.status === 409) {\n const token = body.token;\n if (token) {\n debug('user %s authenticated, token obtained', user);\n return { token, user };\n }\n }\n\n throw new Error(\n `Failed to create/login user \"${user}\" on ${registryUrl}: ${response.status} ${JSON.stringify(body)}`\n );\n}\n\n/**\n * Ping the registry to check it's alive.\n * Uses @verdaccio/registry-cli ping.\n */\nexport async function pingRegistry(registryUrl: string): Promise<boolean> {\n debug('pinging %s', registryUrl);\n try {\n const result = await ping(registryUrl);\n return result.ok;\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;AAIA,IAAM,WAAA,GAAQ,MAAA,QAAA,CAAW,mCAAmC;;;;;;AAY5D,eAAsB,WACpB,aACA,OAAO,YAAY,KAAK,IAAI,KAC5B,WAAW,qBACY;CACvB,QAAM,0BAA0B,MAAM,WAAW;CACjD,MAAM,MAAM,GAAG,YAAY,2BAA2B,mBAAmB,IAAI;CAC7E,MAAM,WAAW,MAAM,MAAM,KAAK;EAChC,QAAQ;EACR,SAAS,EAAE,gBAAgB,mBAAmB;EAC9C,MAAM,KAAK,UAAU;GACnB,MAAM;GACN;GACA,KAAK,oBAAoB;GACzB,MAAM;GACN,OAAO,CAAC;GACR,uBAAM,IAAI,KAAK,EAAA,CAAE,YAAY;EAC/B,CAAC;CACH,CAAC;CAED,MAAM,OAAQ,MAAM,SAAS,KAAK;CAElC,IAAI,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;EACjF,MAAM,QAAQ,KAAK;EACnB,IAAI,OAAO;GACT,QAAM,yCAAyC,IAAI;GACnD,OAAO;IAAE;IAAO;GAAK;EACvB;CACF;CAEA,MAAM,IAAI,MACR,gCAAgC,KAAK,OAAO,YAAY,IAAI,SAAS,OAAO,GAAG,KAAK,UAAU,IAAI,GACpG;AACF;;;;;AAMA,eAAsB,aAAa,aAAuC;CACxE,QAAM,cAAc,WAAW;CAC/B,IAAI;EAEF,QAAO,OAAA,GADc,wBAAA,KAAA,CAAK,WAAW,EAAA,CACvB;CAChB,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -0,0 +1,62 @@
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
+ //#region src/adapters/bun.ts
6
+ var debug = buildDebug("verdaccio:e2e-cli:bun");
7
+ var BUN_SUPPORTED_COMMANDS = /* @__PURE__ */ new Set([
8
+ "publish",
9
+ "install",
10
+ "info",
11
+ "audit"
12
+ ]);
13
+ function detectVersion(bin) {
14
+ try {
15
+ return execSync(`${bin} --version`, {
16
+ encoding: "utf8",
17
+ timeout: 5e3
18
+ }).trim();
19
+ } catch {
20
+ return "unknown";
21
+ }
22
+ }
23
+ function resolveBunBin(binPath) {
24
+ if (binPath) return binPath;
25
+ return "bun";
26
+ }
27
+ function createBunAdapter(binPath, _version) {
28
+ const bin = resolveBunBin(binPath);
29
+ const resolved = detectVersion(bin);
30
+ debug("creating bun adapter with bin: %s (%s)", bin, resolved);
31
+ return {
32
+ name: `bun@${resolved}`,
33
+ type: "bun",
34
+ bin,
35
+ supports: BUN_SUPPORTED_COMMANDS,
36
+ registryArg(url) {
37
+ return ["--registry", url];
38
+ },
39
+ prefixArg(folder) {
40
+ return ["--cwd", folder];
41
+ },
42
+ exec(options, ...args) {
43
+ if (args[0] === "info") {
44
+ const pkgName = args[1];
45
+ const cleaned = args.slice(2).filter((a) => a !== "--registry").filter((a) => !a.startsWith("http"));
46
+ return exec(options, bin, [
47
+ "info",
48
+ pkgName,
49
+ ...cleaned
50
+ ]);
51
+ }
52
+ return exec(options, bin, args);
53
+ },
54
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
55
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
56
+ }
57
+ };
58
+ }
59
+ //#endregion
60
+ export { createBunAdapter };
61
+
62
+ //# sourceMappingURL=bun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.js","names":[],"sources":["../../../src/adapters/bun.ts"],"sourcesContent":["import { SpawnOptions, execSync } from 'child_process';\nimport buildDebug from 'debug';\n\nimport { ExecOutput, PackageManagerAdapter } from '../types';\nimport { exec } from '../utils/process';\nimport { prepareGenericEmptyProject } from '../utils/project';\n\nconst debug = buildDebug('verdaccio:e2e-cli:bun');\n\nconst BUN_SUPPORTED_COMMANDS = new Set(['publish', 'install', 'info', 'audit']);\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 resolveBunBin(binPath?: string): string {\n if (binPath) return binPath;\n return 'bun';\n}\n\nexport function createBunAdapter(binPath?: string, _version?: string): PackageManagerAdapter {\n const bin = resolveBunBin(binPath);\n const resolved = detectVersion(bin);\n debug('creating bun adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `bun@${resolved}`,\n type: 'bun',\n bin,\n supports: BUN_SUPPORTED_COMMANDS,\n\n registryArg(url: string): string[] {\n return ['--registry', url];\n },\n\n prefixArg(folder: string): string[] {\n return ['--cwd', folder];\n },\n\n exec(options: SpawnOptions, ...args: string[]): Promise<ExecOutput> {\n const cmd = args[0];\n\n if (cmd === 'info') {\n // bun info <pkg> reads registry from .npmrc, strip --registry <url>\n const pkgName = args[1];\n const filteredArgs = args.slice(2).filter((a) => a !== '--registry');\n // also remove the URL that follows --registry\n const cleaned = filteredArgs.filter((a) => !a.startsWith('http'));\n return exec(options, bin, ['info', pkgName, ...cleaned]);\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 return prepareGenericEmptyProject(\n packageName,\n version,\n port,\n token,\n registryUrl,\n dependencies,\n devDependencies\n );\n },\n };\n\n return adapter;\n}\n"],"mappings":";;;;;AAOA,IAAM,QAAQ,WAAW,uBAAuB;AAEhD,IAAM,yCAAyB,IAAI,IAAI;CAAC;CAAW;CAAW;CAAQ;AAAO,CAAC;AAE9E,SAAS,cAAc,KAAqB;CAC1C,IAAI;EACF,OAAO,SAAS,GAAG,IAAI,aAAa;GAAE,UAAU;GAAQ,SAAS;EAAK,CAAC,CAAC,CAAC,KAAK;CAChF,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAAc,SAA0B;CAC/C,IAAI,SAAS,OAAO;CACpB,OAAO;AACT;AAEA,SAAgB,iBAAiB,SAAkB,UAA0C;CAC3F,MAAM,MAAM,cAAc,OAAO;CACjC,MAAM,WAAW,cAAc,GAAG;CAClC,MAAM,0CAA0C,KAAK,QAAQ;CAoD7D,OAAO;EAjDL,MAAM,OAAO;EACb,MAAM;EACN;EACA,UAAU;EAEV,YAAY,KAAuB;GACjC,OAAO,CAAC,cAAc,GAAG;EAC3B;EAEA,UAAU,QAA0B;GAClC,OAAO,CAAC,SAAS,MAAM;EACzB;EAEA,KAAK,SAAuB,GAAG,MAAqC;GAGlE,IAFY,KAAK,OAEL,QAAQ;IAElB,MAAM,UAAU,KAAK;IAGrB,MAAM,UAFe,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,MAAM,YAEvC,CAAA,CAAa,QAAQ,MAAM,CAAC,EAAE,WAAW,MAAM,CAAC;IAChE,OAAO,KAAK,SAAS,KAAK;KAAC;KAAQ;KAAS,GAAG;IAAO,CAAC;GACzD;GAEA,OAAO,KAAK,SAAS,KAAK,IAAI;EAChC;EAEA,MAAM,eACJ,aACA,SACA,aACA,MACA,OACA,eAAuC,CAAC,GACxC,kBAA0C,CAAC,GACV;GACjC,OAAO,2BACL,aACA,SACA,MACA,OACA,aACA,cACA,eACF;EACF;CAGK;AACT"}
@@ -0,0 +1,59 @@
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
+ //#region src/adapters/deno.ts
6
+ var debug = buildDebug("verdaccio:e2e-cli:deno");
7
+ var DENO_SUPPORTED_COMMANDS = /* @__PURE__ */ new Set(["install", "info"]);
8
+ function detectVersion(bin) {
9
+ try {
10
+ const match = execSync(`${bin} --version`, {
11
+ encoding: "utf8",
12
+ timeout: 5e3
13
+ }).match(/deno (\S+)/);
14
+ return match ? match[1] : "unknown";
15
+ } catch {
16
+ return "unknown";
17
+ }
18
+ }
19
+ function resolveDenoBin(binPath) {
20
+ if (binPath) return binPath;
21
+ return "deno";
22
+ }
23
+ function createDenoAdapter(binPath, _version) {
24
+ const bin = resolveDenoBin(binPath);
25
+ const resolved = detectVersion(bin);
26
+ debug("creating deno adapter with bin: %s (%s)", bin, resolved);
27
+ return {
28
+ name: `deno@${resolved}`,
29
+ type: "deno",
30
+ bin,
31
+ supports: DENO_SUPPORTED_COMMANDS,
32
+ registryArg(_url) {
33
+ return [];
34
+ },
35
+ prefixArg(folder) {
36
+ return ["--root", folder];
37
+ },
38
+ exec(options, ...args) {
39
+ const cmd = args[0];
40
+ if (cmd === "info") {
41
+ const filteredArgs = [
42
+ "info",
43
+ `npm:${args[1]}`,
44
+ "--node-modules-dir=auto"
45
+ ].concat(args.slice(2).filter((a) => a !== "--json"));
46
+ return exec(options, bin, filteredArgs);
47
+ }
48
+ if (cmd === "install") return exec(options, bin, ["install"]);
49
+ return exec(options, bin, args);
50
+ },
51
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
52
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
53
+ }
54
+ };
55
+ }
56
+ //#endregion
57
+ export { createDenoAdapter };
58
+
59
+ //# sourceMappingURL=deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deno.js","names":[],"sources":["../../../src/adapters/deno.ts"],"sourcesContent":["import { SpawnOptions, execSync } from 'child_process';\nimport buildDebug from 'debug';\n\nimport { ExecOutput, PackageManagerAdapter } from '../types';\nimport { exec } from '../utils/process';\nimport { prepareGenericEmptyProject } from '../utils/project';\n\nconst debug = buildDebug('verdaccio:e2e-cli:deno');\n\nconst DENO_SUPPORTED_COMMANDS = new Set(['install', 'info']);\n\nfunction detectVersion(bin: string): string {\n try {\n const output = execSync(`${bin} --version`, { encoding: 'utf8', timeout: 5000 });\n const match = output.match(/deno (\\S+)/);\n return match ? match[1] : 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nfunction resolveDenoBin(binPath?: string): string {\n if (binPath) return binPath;\n return 'deno';\n}\n\nexport function createDenoAdapter(binPath?: string, _version?: string): PackageManagerAdapter {\n const bin = resolveDenoBin(binPath);\n const resolved = detectVersion(bin);\n debug('creating deno adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `deno@${resolved}`,\n type: 'deno',\n bin,\n supports: DENO_SUPPORTED_COMMANDS,\n\n registryArg(_url: string): string[] {\n // deno reads the registry from .npmrc (written by prepareProject), no CLI flag needed\n return [];\n },\n\n prefixArg(folder: string): string[] {\n return ['--root', folder];\n },\n\n exec(options: SpawnOptions, ...args: string[]): Promise<ExecOutput> {\n const cmd = args[0];\n\n if (cmd === 'info') {\n // deno info npm:<pkg> --node-modules-dir=auto\n const pkgName = args[1];\n const filteredArgs = ['info', `npm:${pkgName}`, '--node-modules-dir=auto'].concat(\n args.slice(2).filter((a) => a !== '--json')\n );\n return exec(options, bin, filteredArgs);\n }\n\n if (cmd === 'install') {\n // deno install — reads registry from .npmrc, no extra flags needed\n return exec(options, bin, ['install']);\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 return prepareGenericEmptyProject(\n packageName,\n version,\n port,\n token,\n registryUrl,\n dependencies,\n devDependencies\n );\n },\n };\n\n return adapter;\n}\n"],"mappings":";;;;;AAOA,IAAM,QAAQ,WAAW,wBAAwB;AAEjD,IAAM,0CAA0B,IAAI,IAAI,CAAC,WAAW,MAAM,CAAC;AAE3D,SAAS,cAAc,KAAqB;CAC1C,IAAI;EAEF,MAAM,QADS,SAAS,GAAG,IAAI,aAAa;GAAE,UAAU;GAAQ,SAAS;EAAK,CAChE,CAAA,CAAO,MAAM,YAAY;EACvC,OAAO,QAAQ,MAAM,KAAK;CAC5B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eAAe,SAA0B;CAChD,IAAI,SAAS,OAAO;CACpB,OAAO;AACT;AAEA,SAAgB,kBAAkB,SAAkB,UAA0C;CAC5F,MAAM,MAAM,eAAe,OAAO;CAClC,MAAM,WAAW,cAAc,GAAG;CAClC,MAAM,2CAA2C,KAAK,QAAQ;CA0D9D,OAAO;EAvDL,MAAM,QAAQ;EACd,MAAM;EACN;EACA,UAAU;EAEV,YAAY,MAAwB;GAElC,OAAO,CAAC;EACV;EAEA,UAAU,QAA0B;GAClC,OAAO,CAAC,UAAU,MAAM;EAC1B;EAEA,KAAK,SAAuB,GAAG,MAAqC;GAClE,MAAM,MAAM,KAAK;GAEjB,IAAI,QAAQ,QAAQ;IAGlB,MAAM,eAAe;KAAC;KAAQ,OADd,KAAK;KAC2B;IAAyB,CAAC,CAAC,OACzE,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,MAAM,QAAQ,CAC5C;IACA,OAAO,KAAK,SAAS,KAAK,YAAY;GACxC;GAEA,IAAI,QAAQ,WAEV,OAAO,KAAK,SAAS,KAAK,CAAC,SAAS,CAAC;GAGvC,OAAO,KAAK,SAAS,KAAK,IAAI;EAChC;EAEA,MAAM,eACJ,aACA,SACA,aACA,MACA,OACA,eAAuC,CAAC,GACxC,kBAA0C,CAAC,GACV;GACjC,OAAO,2BACL,aACA,SACA,MACA,OACA,aACA,cACA,eACF;EACF;CAGK;AACT"}
@@ -0,0 +1,6 @@
1
+ import { createBunAdapter } from "./bun.js";
2
+ import { createDenoAdapter } from "./deno.js";
3
+ import { createNpmAdapter } from "./npm.js";
4
+ import { createPnpmAdapter } from "./pnpm.js";
5
+ import { createYarnModernAdapter } from "./yarn-modern.js";
6
+ export { createBunAdapter, createDenoAdapter, createNpmAdapter, createPnpmAdapter, createYarnModernAdapter };
@@ -0,0 +1,83 @@
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
+ //#region src/adapters/npm.ts
6
+ var debug = buildDebug("verdaccio:e2e-cli:npm");
7
+ var NPM_SUPPORTED_COMMANDS = /* @__PURE__ */ new Set([
8
+ "publish",
9
+ "unpublish",
10
+ "install",
11
+ "info",
12
+ "audit",
13
+ "deprecate",
14
+ "dist-tag",
15
+ "ping",
16
+ "search"
17
+ ]);
18
+ var NPM_SUPPORTED_MAJORS = [
19
+ 10,
20
+ 11,
21
+ 12
22
+ ];
23
+ function detectVersion(bin) {
24
+ try {
25
+ return execSync(`${bin} --version`, {
26
+ encoding: "utf8",
27
+ timeout: 5e3
28
+ }).trim();
29
+ } catch {
30
+ return "unknown";
31
+ }
32
+ }
33
+ function assertSupportedVersion(resolved) {
34
+ const major = parseInt(resolved.split(".")[0], 10);
35
+ if (!Number.isNaN(major) && !NPM_SUPPORTED_MAJORS.includes(major)) throw new Error(`npm@${resolved} is not supported. Supported majors: ${NPM_SUPPORTED_MAJORS.join(", ")}`);
36
+ }
37
+ function installNpm(version) {
38
+ const pkg = `npm@${version}`;
39
+ debug("installing %s into temp dir", pkg);
40
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
41
+ execSync(`npm install --prefix "${tmpDir}" ${pkg} --loglevel=error`, {
42
+ encoding: "utf8",
43
+ timeout: 3e4
44
+ });
45
+ const bin = `${tmpDir}/node_modules/.bin/npm`;
46
+ const installed = detectVersion(bin);
47
+ debug("installed npm %s at %s", installed, bin);
48
+ console.log(` Auto-installed npm ${installed}`);
49
+ return bin;
50
+ }
51
+ function resolveNpmBin(binPath, version) {
52
+ if (binPath) return binPath;
53
+ if (version) return installNpm(version);
54
+ return "npm";
55
+ }
56
+ function createNpmAdapter(binPath, version) {
57
+ const bin = resolveNpmBin(binPath, version);
58
+ const resolved = detectVersion(bin);
59
+ assertSupportedVersion(resolved);
60
+ debug("creating npm adapter with bin: %s (%s)", bin, resolved);
61
+ return {
62
+ name: `npm@${resolved}`,
63
+ type: "npm",
64
+ bin,
65
+ supports: NPM_SUPPORTED_COMMANDS,
66
+ registryArg(url) {
67
+ return ["--registry", url];
68
+ },
69
+ prefixArg(folder) {
70
+ return ["--prefix", folder];
71
+ },
72
+ exec(options, ...args) {
73
+ return exec(options, bin, args);
74
+ },
75
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
76
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
77
+ }
78
+ };
79
+ }
80
+ //#endregion
81
+ export { createNpmAdapter };
82
+
83
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","names":[],"sources":["../../../src/adapters/npm.ts"],"sourcesContent":["import { SpawnOptions, execSync } from 'child_process';\nimport buildDebug from 'debug';\n\nimport { ExecOutput, PackageManagerAdapter } from '../types';\nimport { exec } from '../utils/process';\nimport { prepareGenericEmptyProject } from '../utils/project';\n\nconst debug = buildDebug('verdaccio:e2e-cli:npm');\n\nconst NPM_SUPPORTED_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// Only currently maintained npm majors are supported by the suite.\nconst NPM_SUPPORTED_MAJORS = [10, 11, 12];\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) && !NPM_SUPPORTED_MAJORS.includes(major)) {\n throw new Error(\n `npm@${resolved} is not supported. Supported majors: ${NPM_SUPPORTED_MAJORS.join(', ')}`\n );\n }\n}\n\nfunction installNpm(version: string): string {\n const pkg = `npm@${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/npm`;\n const installed = detectVersion(bin);\n debug('installed npm %s at %s', installed, bin);\n console.log(` Auto-installed npm ${installed}`);\n return bin;\n}\n\nfunction resolveNpmBin(binPath?: string, version?: string): string {\n if (binPath) return binPath;\n if (version) return installNpm(version);\n return 'npm';\n}\n\nexport function createNpmAdapter(binPath?: string, version?: string): PackageManagerAdapter {\n const bin = resolveNpmBin(binPath, version);\n const resolved = detectVersion(bin);\n assertSupportedVersion(resolved);\n debug('creating npm adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `npm@${resolved}`,\n type: 'npm',\n bin,\n supports: NPM_SUPPORTED_COMMANDS,\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 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 return prepareGenericEmptyProject(\n packageName,\n version,\n port,\n token,\n registryUrl,\n dependencies,\n devDependencies\n );\n },\n };\n\n return adapter;\n}\n"],"mappings":";;;;;AAOA,IAAM,QAAQ,WAAW,uBAAuB;AAEhD,IAAM,yCAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,IAAM,uBAAuB;CAAC;CAAI;CAAI;AAAE;AAExC,SAAS,cAAc,KAAqB;CAC1C,IAAI;EACF,OAAO,SAAS,GAAG,IAAI,aAAa;GAAE,UAAU;GAAQ,SAAS;EAAK,CAAC,CAAC,CAAC,KAAK;CAChF,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,uBAAuB,UAAwB;CACtD,MAAM,QAAQ,SAAS,SAAS,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE;CACjD,IAAI,CAAC,OAAO,MAAM,KAAK,KAAK,CAAC,qBAAqB,SAAS,KAAK,GAC9D,MAAM,IAAI,MACR,OAAO,SAAS,uCAAuC,qBAAqB,KAAK,IAAI,GACvF;AAEJ;AAEA,SAAS,WAAW,SAAyB;CAC3C,MAAM,MAAM,OAAO;CACnB,MAAM,+BAA+B,GAAG;CACxC,MAAM,SAAS,SAAS,aAAa,EAAE,UAAU,OAAO,CAAC,CAAC,CAAC,KAAK;CAChE,SAAS,yBAAyB,OAAO,IAAI,IAAI,oBAAoB;EACnE,UAAU;EACV,SAAS;CACX,CAAC;CACD,MAAM,MAAM,GAAG,OAAO;CACtB,MAAM,YAAY,cAAc,GAAG;CACnC,MAAM,0BAA0B,WAAW,GAAG;CAC9C,QAAQ,IAAI,wBAAwB,WAAW;CAC/C,OAAO;AACT;AAEA,SAAS,cAAc,SAAkB,SAA0B;CACjE,IAAI,SAAS,OAAO;CACpB,IAAI,SAAS,OAAO,WAAW,OAAO;CACtC,OAAO;AACT;AAEA,SAAgB,iBAAiB,SAAkB,SAAyC;CAC1F,MAAM,MAAM,cAAc,SAAS,OAAO;CAC1C,MAAM,WAAW,cAAc,GAAG;CAClC,uBAAuB,QAAQ;CAC/B,MAAM,0CAA0C,KAAK,QAAQ;CAyC7D,OAAO;EAtCL,MAAM,OAAO;EACb,MAAM;EACN;EACA,UAAU;EAEV,YAAY,KAAuB;GACjC,OAAO,CAAC,cAAc,GAAG;EAC3B;EAEA,UAAU,QAA0B;GAClC,OAAO,CAAC,YAAY,MAAM;EAC5B;EAEA,KAAK,SAAuB,GAAG,MAAqC;GAClE,OAAO,KAAK,SAAS,KAAK,IAAI;EAChC;EAEA,MAAM,eACJ,aACA,SACA,aACA,MACA,OACA,eAAuC,CAAC,GACxC,kBAA0C,CAAC,GACV;GACjC,OAAO,2BACL,aACA,SACA,MACA,OACA,aACA,cACA,eACF;EACF;CAGK;AACT"}