@verdaccio/e2e-cli 2.1.0 → 2.1.1

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 (113) hide show
  1. package/build/adapters/adapter.d.ts +1 -0
  2. package/build/adapters/index.d.ts +4 -0
  3. package/build/adapters/npm.d.ts +2 -0
  4. package/build/adapters/pnpm.d.ts +2 -0
  5. package/build/adapters/yarn-classic.d.ts +2 -0
  6. package/build/adapters/yarn-modern.d.ts +2 -0
  7. package/build/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  8. package/build/cjs/adapters/index.cjs +4 -0
  9. package/build/cjs/adapters/npm.cjs +47 -0
  10. package/build/cjs/adapters/npm.cjs.map +1 -0
  11. package/build/cjs/adapters/pnpm.cjs +47 -0
  12. package/build/cjs/adapters/pnpm.cjs.map +1 -0
  13. package/build/cjs/adapters/yarn-classic.cjs +64 -0
  14. package/build/cjs/adapters/yarn-classic.cjs.map +1 -0
  15. package/build/cjs/adapters/yarn-modern.cjs +83 -0
  16. package/build/cjs/adapters/yarn-modern.cjs.map +1 -0
  17. package/build/cjs/index.cjs +139 -0
  18. package/build/cjs/index.cjs.map +1 -0
  19. package/build/cjs/reporter.cjs +60 -0
  20. package/build/cjs/reporter.cjs.map +1 -0
  21. package/build/cjs/runner.cjs +102 -0
  22. package/build/cjs/runner.cjs.map +1 -0
  23. package/build/cjs/tests/audit.cjs +27 -0
  24. package/build/cjs/tests/audit.cjs.map +1 -0
  25. package/build/cjs/tests/deprecate.cjs +67 -0
  26. package/build/cjs/tests/deprecate.cjs.map +1 -0
  27. package/build/cjs/tests/dist-tags.cjs +43 -0
  28. package/build/cjs/tests/dist-tags.cjs.map +1 -0
  29. package/build/cjs/tests/index.cjs +27 -0
  30. package/build/cjs/tests/index.cjs.map +1 -0
  31. package/build/cjs/tests/info.cjs +38 -0
  32. package/build/cjs/tests/info.cjs.map +1 -0
  33. package/build/cjs/tests/install.cjs +28 -0
  34. package/build/cjs/tests/install.cjs.map +1 -0
  35. package/build/cjs/tests/ping.cjs +18 -0
  36. package/build/cjs/tests/ping.cjs.map +1 -0
  37. package/build/cjs/tests/publish.cjs +34 -0
  38. package/build/cjs/tests/publish.cjs.map +1 -0
  39. package/build/cjs/tests/search.cjs +19 -0
  40. package/build/cjs/tests/search.cjs.map +1 -0
  41. package/build/cjs/tests/star.cjs +27 -0
  42. package/build/cjs/tests/star.cjs.map +1 -0
  43. package/build/cjs/tests/unpublish.cjs +40 -0
  44. package/build/cjs/tests/unpublish.cjs.map +1 -0
  45. package/build/cjs/utils/process.cjs +85 -0
  46. package/build/cjs/utils/process.cjs.map +1 -0
  47. package/build/cjs/utils/project.cjs +55 -0
  48. package/build/cjs/utils/project.cjs.map +1 -0
  49. package/build/cjs/utils/registry-client.cjs +61 -0
  50. package/build/cjs/utils/registry-client.cjs.map +1 -0
  51. package/build/esm/adapters/index.js +5 -0
  52. package/build/esm/adapters/npm.js +45 -0
  53. package/build/esm/adapters/npm.js.map +1 -0
  54. package/build/esm/adapters/pnpm.js +45 -0
  55. package/build/esm/adapters/pnpm.js.map +1 -0
  56. package/build/esm/adapters/yarn-classic.js +62 -0
  57. package/build/esm/adapters/yarn-classic.js.map +1 -0
  58. package/build/esm/adapters/yarn-modern.js +80 -0
  59. package/build/esm/adapters/yarn-modern.js.map +1 -0
  60. package/build/esm/index.js +129 -0
  61. package/build/esm/index.js.map +1 -0
  62. package/build/esm/reporter.js +56 -0
  63. package/build/esm/reporter.js.map +1 -0
  64. package/build/esm/runner.js +99 -0
  65. package/build/esm/runner.js.map +1 -0
  66. package/build/esm/tests/audit.js +25 -0
  67. package/build/esm/tests/audit.js.map +1 -0
  68. package/build/esm/tests/deprecate.js +65 -0
  69. package/build/esm/tests/deprecate.js.map +1 -0
  70. package/build/esm/tests/dist-tags.js +41 -0
  71. package/build/esm/tests/dist-tags.js.map +1 -0
  72. package/build/esm/tests/index.js +27 -0
  73. package/build/esm/tests/index.js.map +1 -0
  74. package/build/esm/tests/info.js +36 -0
  75. package/build/esm/tests/info.js.map +1 -0
  76. package/build/esm/tests/install.js +26 -0
  77. package/build/esm/tests/install.js.map +1 -0
  78. package/build/esm/tests/ping.js +16 -0
  79. package/build/esm/tests/ping.js.map +1 -0
  80. package/build/esm/tests/publish.js +32 -0
  81. package/build/esm/tests/publish.js.map +1 -0
  82. package/build/esm/tests/search.js +17 -0
  83. package/build/esm/tests/search.js.map +1 -0
  84. package/build/esm/tests/star.js +25 -0
  85. package/build/esm/tests/star.js.map +1 -0
  86. package/build/esm/tests/unpublish.js +38 -0
  87. package/build/esm/tests/unpublish.js.map +1 -0
  88. package/build/esm/utils/process.js +82 -0
  89. package/build/esm/utils/process.js.map +1 -0
  90. package/build/esm/utils/project.js +50 -0
  91. package/build/esm/utils/project.js.map +1 -0
  92. package/build/esm/utils/registry-client.js +57 -0
  93. package/build/esm/utils/registry-client.js.map +1 -0
  94. package/build/index.d.ts +5 -0
  95. package/build/reporter.d.ts +6 -0
  96. package/build/runner.d.ts +13 -0
  97. package/build/tests/audit.d.ts +2 -0
  98. package/build/tests/deprecate.d.ts +2 -0
  99. package/build/tests/dist-tags.d.ts +2 -0
  100. package/build/tests/index.d.ts +13 -0
  101. package/build/tests/info.d.ts +2 -0
  102. package/build/tests/install.d.ts +2 -0
  103. package/build/tests/ping.d.ts +2 -0
  104. package/build/tests/publish.d.ts +2 -0
  105. package/build/tests/search.d.ts +2 -0
  106. package/build/tests/star.d.ts +2 -0
  107. package/build/tests/unpublish.d.ts +2 -0
  108. package/build/types.d.ts +65 -0
  109. package/build/utils/index.d.ts +3 -0
  110. package/build/utils/process.d.ts +5 -0
  111. package/build/utils/project.d.ts +6 -0
  112. package/build/utils/registry-client.d.ts +14 -0
  113. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
4
+ let child_process = require("child_process");
5
+ let readline = require("readline");
6
+ let path = require("path");
7
+ //#region src/utils/process.ts
8
+ var debug$1 = (0, debug.default)("verdaccio:e2e-cli:process");
9
+ var debugRead = (0, debug.default)("verdaccio:e2e-cli:line");
10
+ var _verbose = false;
11
+ function setVerbose(v) {
12
+ _verbose = v;
13
+ }
14
+ var COLORS = {
15
+ reset: "\x1B[0m",
16
+ dim: "\x1B[2m",
17
+ cyan: "\x1B[36m",
18
+ green: "\x1B[32m",
19
+ red: "\x1B[31m",
20
+ yellow: "\x1B[33m"
21
+ };
22
+ function shortCmd(cmd, args) {
23
+ return `${(0, path.basename)(cmd)} ${args.join(" ")}`;
24
+ }
25
+ async function exec(options, cmd, args) {
26
+ debug$1("start exec %o %o %o", options, cmd, args ? args.join(" ") : "");
27
+ let stdout = "";
28
+ let stderr = "";
29
+ if (_verbose) {
30
+ const cwd = options.cwd ? ` ${COLORS.dim}(cwd: ${(0, path.basename)(String(options.cwd))})${COLORS.reset}` : "";
31
+ process.stdout.write(` ${COLORS.cyan}$${COLORS.reset} ${shortCmd(cmd, args)}${cwd}\n`);
32
+ }
33
+ const spawnOptions = {
34
+ cwd: options.cwd,
35
+ stdio: options.stdio || "pipe",
36
+ env: options.env || process.env
37
+ };
38
+ if (process.platform.startsWith("win")) {
39
+ args.unshift("/c", cmd);
40
+ cmd = "cmd.exe";
41
+ spawnOptions.stdio = "pipe";
42
+ }
43
+ const start = Date.now();
44
+ const childProcess = (0, child_process.spawn)(cmd, args, spawnOptions);
45
+ if (childProcess.stdout) {
46
+ childProcess.stdout.on("data", (data) => {
47
+ debugRead("data %o", data.toString());
48
+ });
49
+ (0, readline.createInterface)({
50
+ input: childProcess.stdout,
51
+ output: process.stdout,
52
+ terminal: false
53
+ }).on("line", function(line) {
54
+ debugRead("line %o", line);
55
+ stdout += line;
56
+ });
57
+ }
58
+ if (childProcess.stderr) childProcess.stderr.on("data", (data) => {
59
+ stderr += data.toString();
60
+ });
61
+ const err = /* @__PURE__ */ new Error(`Running "${cmd} ${args.join(" ")}" returned error code `);
62
+ return new Promise((resolve, reject) => {
63
+ childProcess.on("exit", (code) => {
64
+ const duration = Date.now() - start;
65
+ debugRead("exit %o", code);
66
+ if (_verbose) {
67
+ const status = code ? `${COLORS.red}exit ${code}${COLORS.reset}` : `${COLORS.green}ok${COLORS.reset}`;
68
+ process.stdout.write(` ${COLORS.dim} -> ${status} ${COLORS.dim}(${duration}ms)${COLORS.reset}\n`);
69
+ }
70
+ if (!code) resolve({
71
+ stdout,
72
+ stderr
73
+ });
74
+ else {
75
+ err.message += `${code}...\n\nSTDOUT:\n${stdout}\n\nSTDERR:\n${stderr}\n`;
76
+ reject(err);
77
+ }
78
+ });
79
+ });
80
+ }
81
+ //#endregion
82
+ exports.exec = exec;
83
+ exports.setVerbose = setVerbose;
84
+
85
+ //# 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 { createInterface } from 'readline';\nimport { basename } from 'path';\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\nexport async function exec(options: SpawnOptions, cmd: string, args: string[]): 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 ? ` ${COLORS.dim}(cwd: ${basename(String(options.cwd))})${COLORS.reset}` : '';\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(` ${COLORS.dim} -> ${status} ${COLORS.dim}(${duration}ms)${COLORS.reset}\\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":";;;;;;;AAOA,IAAM,WAAA,GAAA,MAAA,SAAmB,4BAA4B;AACrD,IAAM,aAAA,GAAA,MAAA,SAAuB,yBAAyB;AAEtD,IAAI,WAAW;AAEf,SAAgB,WAAW,GAAY;AACrC,YAAW;;AAGb,IAAM,SAAS;CACb,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,QAAQ;CACT;AAED,SAAS,SAAS,KAAa,MAAwB;AAErD,QAAO,IAAA,GAAA,KAAA,UADc,IAAI,CACX,GAAG,KAAK,KAAK,IAAI;;AAGjC,eAAsB,KAAK,SAAuB,KAAa,MAAqC;AAClG,SAAM,uBAAuB,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI,GAAG,GAAG;CACtE,IAAI,SAAS;CACb,IAAI,SAAS;AAEb,KAAI,UAAU;EACZ,MAAM,MAAM,QAAQ,MAAM,IAAI,OAAO,IAAI,SAAA,GAAA,KAAA,UAAiB,OAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,OAAO,UAAU;AACnG,UAAQ,OAAO,MAAM,SAAS,OAAO,KAAK,GAAG,OAAO,MAAM,GAAG,SAAS,KAAK,KAAK,GAAG,IAAI,IAAI;;CAG7F,MAAM,eAA6B;EACjC,KAAK,QAAQ;EACb,OAAO,QAAQ,SAAS;EACxB,KAAK,QAAQ,OAAO,QAAQ;EAC7B;AAED,KAAI,QAAQ,SAAS,WAAW,MAAM,EAAE;AACtC,OAAK,QAAQ,MAAM,IAAI;AACvB,QAAM;AACN,eAAa,QAAQ;;CAGvB,MAAM,QAAQ,KAAK,KAAK;CACxB,MAAM,gBAAA,GAAA,cAAA,OAAqB,KAAK,MAAM,aAAa;AAEnD,KAAI,aAAa,QAAQ;AACvB,eAAa,OAAO,GAAG,SAAS,SAAS;AACvC,aAAU,WAAW,KAAK,UAAU,CAAC;IACrC;AAOF,GAAA,GAAA,SAAA,iBAN2B;GACzB,OAAO,aAAa;GACpB,QAAQ,QAAQ;GAChB,UAAU;GACX,CAAC,CAEC,GAAG,QAAQ,SAAU,MAAM;AAC5B,aAAU,WAAW,KAAK;AAC1B,aAAU;IACV;;AAGJ,KAAI,aAAa,OACf,cAAa,OAAO,GAAG,SAAS,SAAS;AACvC,YAAU,KAAK,UAAU;GACzB;CAGJ,MAAM,sBAAM,IAAI,MAAM,YAAY,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,wBAAwB;AAChF,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,eAAa,GAAG,SAAS,SAAS;GAChC,MAAM,WAAW,KAAK,KAAK,GAAG;AAC9B,aAAU,WAAW,KAAK;AAE1B,OAAI,UAAU;IACZ,MAAM,SAAS,OACX,GAAG,OAAO,IAAI,OAAO,OAAO,OAAO,UACnC,GAAG,OAAO,MAAM,IAAI,OAAO;AAC/B,YAAQ,OAAO,MAAM,SAAS,OAAO,IAAI,OAAO,OAAO,GAAG,OAAO,IAAI,GAAG,SAAS,KAAK,OAAO,MAAM,IAAI;;AAGzG,OAAI,CAAC,KACH,SAAQ;IAAE;IAAQ;IAAQ,CAAC;QACtB;AACL,QAAI,WAAW,GAAG,KAAK,kBAAkB,OAAO,eAAe,OAAO;AACtE,WAAO,IAAI;;IAEb;GACF"}
@@ -0,0 +1,55 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
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}`;
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 const getNPMrc = (port: number, token: string, registry: string) =>\n `//localhost:${port}/:_authToken=${token}\\nregistry=${registry}`;\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,GAAA,MAAA,SAAmB,4BAA4B;AAErD,eAAsB,iBAAiB,QAAiC;CACtE,MAAM,YAAY,OAAO,QAAQ,mBAAmB,IAAI;AACxD,SAAM,2BAA2B,UAAU;AAC3C,SAAA,GAAA,YAAA,UAAA,GAAA,KAAA,OAAA,GAAA,GAAA,SAA4B,EAAE,iBAAiB,UAAU,GAAG,CAAC;;AAG/D,SAAgB,eACd,aACA,UAAU,SACV,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACpC;AACR,SAAM,4BAA4B,YAAY;AAe9C,QAAO,KAAK,UAdC;EACX,MAAM;EACN;EACA,aAAa;EACb,MAAM;EACN,SAAS,EACP,MAAM,eACP;EACD;EACA;EACA,UAAU,CAAC,OAAO,MAAM;EACxB,QAAQ;EACR,SAAS;EACV,CAC0B;;AAG7B,SAAgB,UAAU,aAA6B;AACrD,QAAO;iBACQ,YAAY;;;;;;;;;AAU7B,eAAsB,2BACpB,aACA,SACA,MACA,OACA,gBACA,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACX;AACjC,SAAM,gCAAgC,YAAY;CAClD,MAAM,YAAY,MAAc,OAAe,aAC7C,eAAe,KAAK,eAAe,MAAM,aAAa;CACxD,MAAM,aAAa,MAAM,iBAAiB,cAAc;AACxD,QAAA,GAAA,YAAA,YAAA,GAAA,KAAA,MACO,YAAY,eAAe,EAChC,eAAe,aAAa,SAAS,cAAc,gBAAgB,CACpE;AACD,QAAA,GAAA,YAAA,YAAA,GAAA,KAAA,MAAqB,YAAY,YAAY,EAAE,UAAU,YAAY,CAAC;AACtE,QAAA,GAAA,YAAA,YAAA,GAAA,KAAA,MAAqB,YAAY,SAAS,EAAE,SAAS,MAAM,OAAO,eAAe,CAAC;AAClF,QAAO,EAAE,YAAY"}
@@ -0,0 +1,61 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
4
+ let got = require("got");
5
+ got = require_runtime.__toESM(got);
6
+ //#region src/utils/registry-client.ts
7
+ var debug$1 = (0, debug.default)("verdaccio:e2e-cli:registry-client");
8
+ /**
9
+ * Creates a user on the registry and returns the auth token.
10
+ * Uses a unique username per run to avoid 409 conflicts.
11
+ * Works against any running Verdaccio instance with htpasswd auth.
12
+ */
13
+ async function createUser(registryUrl, user = `e2e-user-${Date.now()}`, password = "e2e-test-password") {
14
+ debug$1("creating user %s on %s", user, registryUrl);
15
+ const url = `${registryUrl}/-/user/org.couchdb.user:${encodeURIComponent(user)}`;
16
+ const response = await got.default.put(url, {
17
+ json: {
18
+ name: user,
19
+ password,
20
+ _id: `org.couchdb.user:${user}`,
21
+ type: "user",
22
+ roles: [],
23
+ date: (/* @__PURE__ */ new Date()).toISOString()
24
+ },
25
+ responseType: "json",
26
+ throwHttpErrors: false,
27
+ retry: { limit: 0 }
28
+ });
29
+ const body = response.body;
30
+ if (response.statusCode === 201 || response.statusCode === 200 || response.statusCode === 409) {
31
+ const token = body.token;
32
+ if (token) {
33
+ debug$1("user %s authenticated, token obtained", user);
34
+ return {
35
+ token,
36
+ user
37
+ };
38
+ }
39
+ }
40
+ throw new Error(`Failed to create/login user "${user}" on ${registryUrl}: ${response.statusCode} ${JSON.stringify(body)}`);
41
+ }
42
+ /**
43
+ * Ping the registry to check it's alive.
44
+ */
45
+ async function pingRegistry(registryUrl) {
46
+ debug$1("pinging %s", registryUrl);
47
+ try {
48
+ return (await got.default.get(`${registryUrl}/-/ping`, {
49
+ throwHttpErrors: false,
50
+ retry: { limit: 2 },
51
+ timeout: { request: 5e3 }
52
+ })).statusCode === 200;
53
+ } catch {
54
+ return false;
55
+ }
56
+ }
57
+ //#endregion
58
+ exports.createUser = createUser;
59
+ exports.pingRegistry = pingRegistry;
60
+
61
+ //# 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';\nimport got from 'got';\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 got.put(url, {\n json: {\n name: user,\n password,\n _id: `org.couchdb.user:${user}`,\n type: 'user',\n roles: [],\n date: new Date().toISOString(),\n },\n responseType: 'json',\n throwHttpErrors: false,\n retry: { limit: 0 },\n });\n\n const body = response.body as any;\n\n // 409 = user already exists, the PUT still returns a token (login)\n if (response.statusCode === 201 || response.statusCode === 200 || response.statusCode === 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.statusCode} ${JSON.stringify(body)}`\n );\n}\n\n/**\n * Ping the registry to check it's alive.\n */\nexport async function pingRegistry(registryUrl: string): Promise<boolean> {\n debug('pinging %s', registryUrl);\n try {\n const response = await got.get(`${registryUrl}/-/ping`, {\n throwHttpErrors: false,\n retry: { limit: 2 },\n timeout: { request: 5000 },\n });\n return response.statusCode === 200;\n } catch {\n return false;\n }\n}\n"],"mappings":";;;;;;AAGA,IAAM,WAAA,GAAA,MAAA,SAAmB,oCAAoC;;;;;;AAY7D,eAAsB,WACpB,aACA,OAAO,YAAY,KAAK,KAAK,IAC7B,WAAW,qBACY;AACvB,SAAM,0BAA0B,MAAM,YAAY;CAClD,MAAM,MAAM,GAAG,YAAY,2BAA2B,mBAAmB,KAAK;CAC9E,MAAM,WAAW,MAAM,IAAA,QAAI,IAAI,KAAK;EAClC,MAAM;GACJ,MAAM;GACN;GACA,KAAK,oBAAoB;GACzB,MAAM;GACN,OAAO,EAAE;GACT,uBAAM,IAAI,MAAM,EAAC,aAAa;GAC/B;EACD,cAAc;EACd,iBAAiB;EACjB,OAAO,EAAE,OAAO,GAAG;EACpB,CAAC;CAEF,MAAM,OAAO,SAAS;AAGtB,KAAI,SAAS,eAAe,OAAO,SAAS,eAAe,OAAO,SAAS,eAAe,KAAK;EAC7F,MAAM,QAAQ,KAAK;AACnB,MAAI,OAAO;AACT,WAAM,yCAAyC,KAAK;AACpD,UAAO;IAAE;IAAO;IAAM;;;AAI1B,OAAM,IAAI,MACR,gCAAgC,KAAK,OAAO,YAAY,IAAI,SAAS,WAAW,GAAG,KAAK,UAAU,KAAK,GACxG;;;;;AAMH,eAAsB,aAAa,aAAuC;AACxE,SAAM,cAAc,YAAY;AAChC,KAAI;AAMF,UALiB,MAAM,IAAA,QAAI,IAAI,GAAG,YAAY,UAAU;GACtD,iBAAiB;GACjB,OAAO,EAAE,OAAO,GAAG;GACnB,SAAS,EAAE,SAAS,KAAM;GAC3B,CAAC,EACc,eAAe;SACzB;AACN,SAAO"}
@@ -0,0 +1,5 @@
1
+ import "./npm.js";
2
+ import "./pnpm.js";
3
+ import "./yarn-classic.js";
4
+ import "./yarn-modern.js";
5
+ export {};
@@ -0,0 +1,45 @@
1
+ import { exec } from "../utils/process.js";
2
+ import { prepareGenericEmptyProject } from "../utils/project.js";
3
+ import buildDebug from "debug";
4
+ //#region src/adapters/npm.ts
5
+ var debug = buildDebug("verdaccio:e2e-cli:npm");
6
+ var NPM_SUPPORTED_COMMANDS = new Set([
7
+ "publish",
8
+ "unpublish",
9
+ "install",
10
+ "info",
11
+ "audit",
12
+ "deprecate",
13
+ "dist-tag",
14
+ "ping",
15
+ "search",
16
+ "star",
17
+ "stars",
18
+ "unstar"
19
+ ]);
20
+ function createNpmAdapter(binPath) {
21
+ const bin = binPath || "npm";
22
+ debug("creating npm adapter with bin: %s", bin);
23
+ return {
24
+ name: `npm`,
25
+ type: "npm",
26
+ bin,
27
+ supports: NPM_SUPPORTED_COMMANDS,
28
+ registryArg(url) {
29
+ return ["--registry", url];
30
+ },
31
+ prefixArg(folder) {
32
+ return ["--prefix", folder];
33
+ },
34
+ exec(options, ...args) {
35
+ return exec(options, bin, args);
36
+ },
37
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
38
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
39
+ }
40
+ };
41
+ }
42
+ //#endregion
43
+ export { createNpmAdapter };
44
+
45
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","names":[],"sources":["../../../src/adapters/npm.ts"],"sourcesContent":["import { SpawnOptions } from 'child_process';\nimport buildDebug from 'debug';\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: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 'star',\n 'stars',\n 'unstar',\n]);\n\nexport function createNpmAdapter(binPath?: string): PackageManagerAdapter {\n const bin = binPath || 'npm';\n debug('creating npm adapter with bin: %s', bin);\n\n const adapter: PackageManagerAdapter = {\n name: `npm`,\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":";;;;AAQA,IAAM,QAAQ,WAAW,wBAAwB;AAEjD,IAAM,yBAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,iBAAiB,SAAyC;CACxE,MAAM,MAAM,WAAW;AACvB,OAAM,qCAAqC,IAAI;AAyC/C,QAvCuC;EACrC,MAAM;EACN,MAAM;EACN;EACA,UAAU;EAEV,YAAY,KAAuB;AACjC,UAAO,CAAC,cAAc,IAAI;;EAG5B,UAAU,QAA0B;AAClC,UAAO,CAAC,YAAY,OAAO;;EAG7B,KAAK,SAAuB,GAAG,MAAqC;AAClE,UAAO,KAAK,SAAS,KAAK,KAAK;;EAGjC,MAAM,eACJ,aACA,SACA,aACA,MACA,OACA,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACX;AACjC,UAAO,2BACL,aACA,SACA,MACA,OACA,aACA,cACA,gBACD;;EAEJ"}
@@ -0,0 +1,45 @@
1
+ import { exec } from "../utils/process.js";
2
+ import { prepareGenericEmptyProject } from "../utils/project.js";
3
+ import buildDebug from "debug";
4
+ //#region src/adapters/pnpm.ts
5
+ var debug = buildDebug("verdaccio:e2e-cli:pnpm");
6
+ var PNPM_SUPPORTED_COMMANDS = new Set([
7
+ "publish",
8
+ "unpublish",
9
+ "install",
10
+ "info",
11
+ "audit",
12
+ "deprecate",
13
+ "dist-tag",
14
+ "ping",
15
+ "search",
16
+ "star",
17
+ "stars",
18
+ "unstar"
19
+ ]);
20
+ function createPnpmAdapter(binPath) {
21
+ const bin = binPath || "pnpm";
22
+ debug("creating pnpm adapter with bin: %s", bin);
23
+ return {
24
+ name: `pnpm`,
25
+ type: "pnpm",
26
+ bin,
27
+ supports: PNPM_SUPPORTED_COMMANDS,
28
+ registryArg(url) {
29
+ return ["--registry", url];
30
+ },
31
+ prefixArg(folder) {
32
+ return ["--prefix", folder];
33
+ },
34
+ exec(options, ...args) {
35
+ return exec(options, bin, args);
36
+ },
37
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
38
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
39
+ }
40
+ };
41
+ }
42
+ //#endregion
43
+ export { createPnpmAdapter };
44
+
45
+ //# sourceMappingURL=pnpm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm.js","names":[],"sources":["../../../src/adapters/pnpm.ts"],"sourcesContent":["import { SpawnOptions } 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:pnpm');\n\nconst PNPM_SUPPORTED_COMMANDS = new Set([\n 'publish',\n 'unpublish',\n 'install',\n 'info',\n 'audit',\n 'deprecate',\n 'dist-tag',\n 'ping',\n 'search',\n 'star',\n 'stars',\n 'unstar',\n]);\n\nexport function createPnpmAdapter(binPath?: string): PackageManagerAdapter {\n const bin = binPath || 'pnpm';\n debug('creating pnpm adapter with bin: %s', bin);\n\n const adapter: PackageManagerAdapter = {\n name: `pnpm`,\n type: 'pnpm',\n bin,\n supports: PNPM_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,yBAAyB;AAElD,IAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,kBAAkB,SAAyC;CACzE,MAAM,MAAM,WAAW;AACvB,OAAM,sCAAsC,IAAI;AAyChD,QAvCuC;EACrC,MAAM;EACN,MAAM;EACN;EACA,UAAU;EAEV,YAAY,KAAuB;AACjC,UAAO,CAAC,cAAc,IAAI;;EAG5B,UAAU,QAA0B;AAClC,UAAO,CAAC,YAAY,OAAO;;EAG7B,KAAK,SAAuB,GAAG,MAAqC;AAClE,UAAO,KAAK,SAAS,KAAK,KAAK;;EAGjC,MAAM,eACJ,aACA,SACA,aACA,MACA,OACA,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACX;AACjC,UAAO,2BACL,aACA,SACA,MACA,OACA,aACA,cACA,gBACD;;EAEJ"}
@@ -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/yarn-classic.ts
6
+ var debug = buildDebug("verdaccio:e2e-cli:yarn-classic");
7
+ var YARN_CLASSIC_SUPPORTED_COMMANDS = new Set([
8
+ "publish",
9
+ "install",
10
+ "info",
11
+ "audit"
12
+ ]);
13
+ function detectYarnVersion(bin) {
14
+ try {
15
+ return execSync(`${bin} --version`, {
16
+ env: {
17
+ ...process.env,
18
+ COREPACK_ENABLE_STRICT: "0"
19
+ },
20
+ encoding: "utf8",
21
+ timeout: 5e3
22
+ }).trim();
23
+ } catch {
24
+ return "unknown";
25
+ }
26
+ }
27
+ function createYarnClassicAdapter(binPath) {
28
+ const bin = binPath || "yarn";
29
+ debug("creating yarn classic adapter with bin: %s", bin);
30
+ const version = detectYarnVersion(bin);
31
+ if (version.split(".")[0] !== "1") throw new Error(`yarn-classic requires Yarn 1.x but found ${version}. Your system yarn is Berry (v${version}). Use --pm yarn-modern instead, or install Yarn Classic 1.x.`);
32
+ return {
33
+ name: `yarn-classic`,
34
+ type: "yarn-classic",
35
+ bin,
36
+ supports: YARN_CLASSIC_SUPPORTED_COMMANDS,
37
+ registryArg(url) {
38
+ return ["--registry", url];
39
+ },
40
+ prefixArg(folder) {
41
+ return ["--cwd", folder];
42
+ },
43
+ exec(options, ...args) {
44
+ const env = {
45
+ ...process.env,
46
+ ...options.env,
47
+ COREPACK_ENABLE_STRICT: "0"
48
+ };
49
+ return exec({
50
+ ...options,
51
+ env
52
+ }, 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 { createYarnClassicAdapter };
61
+
62
+ //# sourceMappingURL=yarn-classic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yarn-classic.js","names":[],"sources":["../../../src/adapters/yarn-classic.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:yarn-classic');\n\nconst YARN_CLASSIC_SUPPORTED_COMMANDS = new Set([\n 'publish',\n 'install',\n 'info',\n 'audit',\n]);\n\nfunction detectYarnVersion(bin: string): string {\n try {\n return execSync(`${bin} --version`, {\n env: { ...process.env, COREPACK_ENABLE_STRICT: '0' },\n encoding: 'utf8',\n timeout: 5000,\n }).trim();\n } catch {\n return 'unknown';\n }\n}\n\nexport function createYarnClassicAdapter(binPath?: string): PackageManagerAdapter {\n const bin = binPath || 'yarn';\n debug('creating yarn classic adapter with bin: %s', bin);\n\n const version = detectYarnVersion(bin);\n const major = version.split('.')[0];\n if (major !== '1') {\n throw new Error(\n `yarn-classic requires Yarn 1.x but found ${version}. ` +\n `Your system yarn is Berry (v${version}). ` +\n `Use --pm yarn-modern instead, or install Yarn Classic 1.x.`\n );\n }\n\n const adapter: PackageManagerAdapter = {\n name: `yarn-classic`,\n type: 'yarn-classic',\n bin,\n supports: YARN_CLASSIC_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 env = { ...process.env, ...options.env, COREPACK_ENABLE_STRICT: '0' };\n return exec({ ...options, env }, 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,iCAAiC;AAE1D,IAAM,kCAAkC,IAAI,IAAI;CAC9C;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,kBAAkB,KAAqB;AAC9C,KAAI;AACF,SAAO,SAAS,GAAG,IAAI,aAAa;GAClC,KAAK;IAAE,GAAG,QAAQ;IAAK,wBAAwB;IAAK;GACpD,UAAU;GACV,SAAS;GACV,CAAC,CAAC,MAAM;SACH;AACN,SAAO;;;AAIX,SAAgB,yBAAyB,SAAyC;CAChF,MAAM,MAAM,WAAW;AACvB,OAAM,8CAA8C,IAAI;CAExD,MAAM,UAAU,kBAAkB,IAAI;AAEtC,KADc,QAAQ,MAAM,IAAI,CAAC,OACnB,IACZ,OAAM,IAAI,MACR,4CAA4C,QAAQ,gCACnB,QAAQ,+DAE1C;AA2CH,QAxCuC;EACrC,MAAM;EACN,MAAM;EACN;EACA,UAAU;EAEV,YAAY,KAAuB;AACjC,UAAO,CAAC,cAAc,IAAI;;EAG5B,UAAU,QAA0B;AAClC,UAAO,CAAC,SAAS,OAAO;;EAG1B,KAAK,SAAuB,GAAG,MAAqC;GAClE,MAAM,MAAM;IAAE,GAAG,QAAQ;IAAK,GAAG,QAAQ;IAAK,wBAAwB;IAAK;AAC3E,UAAO,KAAK;IAAE,GAAG;IAAS;IAAK,EAAE,KAAK,KAAK;;EAG7C,MAAM,eACJ,aACA,SACA,aACA,MACA,OACA,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACX;AACjC,UAAO,2BACL,aACA,SACA,MACA,OACA,aACA,cACA,gBACD;;EAEJ"}
@@ -0,0 +1,80 @@
1
+ import { exec } from "../utils/process.js";
2
+ import { createTempFolder, getPackageJSON, getREADME } from "../utils/project.js";
3
+ import buildDebug from "debug";
4
+ import { join } from "path";
5
+ import { writeFile } from "fs/promises";
6
+ import YAML from "js-yaml";
7
+ import { URL } from "url";
8
+ //#region src/adapters/yarn-modern.ts
9
+ var debug = buildDebug("verdaccio:e2e-cli:yarn-modern");
10
+ var YARN_MODERN_SUPPORTED_COMMANDS = new Set([
11
+ "publish",
12
+ "install",
13
+ "info"
14
+ ]);
15
+ function createYamlConfig(registry, token) {
16
+ const defaultYaml = {
17
+ npmRegistryServer: registry,
18
+ enableImmutableInstalls: false,
19
+ unsafeHttpWhitelist: ["localhost"]
20
+ };
21
+ if (typeof token === "string") {
22
+ const url = new URL(registry);
23
+ defaultYaml.npmRegistries = { [`//${url.hostname}:${url.port}`]: {
24
+ npmAlwaysAuth: true,
25
+ npmAuthToken: token
26
+ } };
27
+ }
28
+ return YAML.dump(defaultYaml);
29
+ }
30
+ function createYarnModernAdapter(binPath) {
31
+ debug("creating yarn modern adapter with bin: %s", binPath);
32
+ return {
33
+ name: `yarn-modern`,
34
+ type: "yarn-modern",
35
+ bin: binPath,
36
+ supports: YARN_MODERN_SUPPORTED_COMMANDS,
37
+ registryArg(_url) {
38
+ return [];
39
+ },
40
+ prefixArg(_folder) {
41
+ return [];
42
+ },
43
+ exec(options, ...args) {
44
+ const env = {
45
+ ...process.env,
46
+ ...options.env,
47
+ COREPACK_ENABLE_STRICT: "0"
48
+ };
49
+ const cmd = args[0];
50
+ let yarnArgs;
51
+ if (cmd === "publish") yarnArgs = [
52
+ "npm",
53
+ "publish",
54
+ ...args.slice(1).filter((a) => a !== "--json" && !a.startsWith("--registry"))
55
+ ];
56
+ else if (cmd === "info") yarnArgs = [
57
+ "npm",
58
+ "info",
59
+ ...args.slice(1).filter((a) => !a.startsWith("--registry"))
60
+ ];
61
+ else yarnArgs = args.filter((a) => !a.startsWith("--registry"));
62
+ return exec({
63
+ ...options,
64
+ env
65
+ }, binPath, yarnArgs);
66
+ },
67
+ async prepareProject(packageName, version, registryUrl, _port, token, dependencies = {}, devDependencies = {}) {
68
+ const tempFolder = await createTempFolder(packageName);
69
+ const yamlContent = createYamlConfig(registryUrl, token);
70
+ await writeFile(join(tempFolder, ".yarnrc.yml"), yamlContent);
71
+ await writeFile(join(tempFolder, "package.json"), getPackageJSON(packageName, version, dependencies, devDependencies));
72
+ await writeFile(join(tempFolder, "README.md"), getREADME(packageName));
73
+ return { tempFolder };
74
+ }
75
+ };
76
+ }
77
+ //#endregion
78
+ export { createYarnModernAdapter };
79
+
80
+ //# 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 } from 'child_process';\nimport buildDebug from 'debug';\nimport { writeFile } from 'fs/promises';\nimport 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(['publish', 'install', 'info']);\n\nfunction createYamlConfig(registry: string, token?: string) {\n const defaultYaml: any = {\n npmRegistryServer: registry,\n enableImmutableInstalls: false,\n unsafeHttpWhitelist: ['localhost'],\n };\n\n if (typeof token === 'string') {\n const url = new URL(registry);\n defaultYaml.npmRegistries = {\n [`//${url.hostname}:${url.port}`]: {\n npmAlwaysAuth: true,\n npmAuthToken: token,\n },\n };\n }\n\n return YAML.dump(defaultYaml);\n}\n\nexport function createYarnModernAdapter(binPath: string): PackageManagerAdapter {\n debug('creating yarn modern adapter with bin: %s', binPath);\n\n const adapter: PackageManagerAdapter = {\n name: `yarn-modern`,\n type: 'yarn-modern',\n bin: binPath,\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 // Disable corepack strict mode so it doesn't enforce the root packageManager field\n const env = { ...process.env, ...options.env, COREPACK_ENABLE_STRICT: '0' };\n\n const cmd = args[0];\n let yarnArgs: string[];\n if (cmd === 'publish') {\n const filtered = args.slice(1).filter(\n (a) => a !== '--json' && !a.startsWith('--registry')\n );\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 {\n yarnArgs = args.filter((a) => !a.startsWith('--registry'));\n }\n\n return exec({ ...options, env }, binPath, 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);\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\n return adapter;\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,QAAQ,WAAW,gCAAgC;AAEzD,IAAM,iCAAiC,IAAI,IAAI;CAAC;CAAW;CAAW;CAAO,CAAC;AAE9E,SAAS,iBAAiB,UAAkB,OAAgB;CAC1D,MAAM,cAAmB;EACvB,mBAAmB;EACnB,yBAAyB;EACzB,qBAAqB,CAAC,YAAY;EACnC;AAED,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,cAAY,gBAAgB,GACzB,KAAK,IAAI,SAAS,GAAG,IAAI,SAAS;GACjC,eAAe;GACf,cAAc;GACf,EACF;;AAGH,QAAO,KAAK,KAAK,YAAY;;AAG/B,SAAgB,wBAAwB,SAAwC;AAC9E,OAAM,6CAA6C,QAAQ;AA0D3D,QAxDuC;EACrC,MAAM;EACN,MAAM;EACN,KAAK;EACL,UAAU;EAEV,YAAY,MAAwB;AAClC,UAAO,EAAE;;EAGX,UAAU,SAA2B;AACnC,UAAO,EAAE;;EAGX,KAAK,SAAuB,GAAG,MAAqC;GAElE,MAAM,MAAM;IAAE,GAAG,QAAQ;IAAK,GAAG,QAAQ;IAAK,wBAAwB;IAAK;GAE3E,MAAM,MAAM,KAAK;GACjB,IAAI;AACJ,OAAI,QAAQ,UAIV,YAAW;IAAC;IAAO;IAAW,GAHb,KAAK,MAAM,EAAE,CAAC,QAC5B,MAAM,MAAM,YAAY,CAAC,EAAE,WAAW,aAAa,CACrD;IACyC;YACjC,QAAQ,OAEjB,YAAW;IAAC;IAAO;IAAQ,GADV,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,CAAC,EAAE,WAAW,aAAa,CAAC;IAClC;OAEvC,YAAW,KAAK,QAAQ,MAAM,CAAC,EAAE,WAAW,aAAa,CAAC;AAG5D,UAAO,KAAK;IAAE,GAAG;IAAS;IAAK,EAAE,SAAS,SAAS;;EAGrD,MAAM,eACJ,aACA,SACA,aACA,OACA,OACA,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACX;GACjC,MAAM,aAAa,MAAM,iBAAiB,YAAY;GACtD,MAAM,cAAc,iBAAiB,aAAa,MAAM;AACxD,SAAM,UAAU,KAAK,YAAY,cAAc,EAAE,YAAY;AAC7D,SAAM,UACJ,KAAK,YAAY,eAAe,EAChC,eAAe,aAAa,SAAS,cAAc,gBAAgB,CACpE;AACD,SAAM,UAAU,KAAK,YAAY,YAAY,EAAE,UAAU,YAAY,CAAC;AACtE,UAAO,EAAE,YAAY;;EAExB"}
@@ -0,0 +1,129 @@
1
+ import { createNpmAdapter } from "./adapters/npm.js";
2
+ import { createPnpmAdapter } from "./adapters/pnpm.js";
3
+ import { createYarnClassicAdapter } from "./adapters/yarn-classic.js";
4
+ import { createYarnModernAdapter } from "./adapters/yarn-modern.js";
5
+ import "./adapters/index.js";
6
+ import { allTests } from "./tests/index.js";
7
+ import { createUser, pingRegistry } from "./utils/registry-client.js";
8
+ import { runAll, runSuite } from "./runner.js";
9
+ import buildDebug from "debug";
10
+ //#region src/index.ts
11
+ buildDebug("verdaccio:e2e-cli");
12
+ function parseAdapters(pmFilters) {
13
+ if (!pmFilters || pmFilters.length === 0) return [createNpmAdapter()];
14
+ const adapters = [];
15
+ for (const filter of pmFilters) {
16
+ const [name, binPath] = filter.split("=");
17
+ const lowerName = name.toLowerCase();
18
+ if (lowerName === "npm") adapters.push(createNpmAdapter(binPath));
19
+ else if (lowerName === "pnpm") adapters.push(createPnpmAdapter(binPath));
20
+ else if (lowerName === "yarn-classic" || lowerName === "yarn1") adapters.push(createYarnClassicAdapter(binPath));
21
+ else if (lowerName.startsWith("yarn-modern") || lowerName === "yarn") {
22
+ if (!binPath) throw new Error(`yarn-modern requires a bin path: --pm yarn-modern=/path/to/yarn.js`);
23
+ adapters.push(createYarnModernAdapter(binPath));
24
+ } else throw new Error(`Unknown package manager: "${name}". Supported: npm, pnpm, yarn-classic, yarn-modern`);
25
+ }
26
+ return adapters;
27
+ }
28
+ function parseArgs(argv) {
29
+ const options = {
30
+ registry: "",
31
+ pm: [],
32
+ test: [],
33
+ concurrency: 1,
34
+ timeout: 5e4,
35
+ verbose: false
36
+ };
37
+ for (let i = 2; i < argv.length; i++) {
38
+ const arg = argv[i];
39
+ if (arg === "--registry" || arg === "-r") options.registry = argv[++i];
40
+ else if (arg === "--pm") options.pm.push(argv[++i]);
41
+ else if (arg === "--test" || arg === "-t") options.test.push(argv[++i]);
42
+ else if (arg === "--concurrency" || arg === "-c") options.concurrency = parseInt(argv[++i], 10);
43
+ else if (arg === "--timeout") options.timeout = parseInt(argv[++i], 10);
44
+ else if (arg === "--token") options.token = argv[++i];
45
+ else if (arg === "--verbose" || arg === "-v") options.verbose = true;
46
+ else if (arg === "--help" || arg === "-h") {
47
+ printHelp();
48
+ process.exit(0);
49
+ } else if (arg.startsWith("--registry=")) options.registry = arg.split("=")[1];
50
+ else if (arg.startsWith("--pm=")) options.pm.push(arg.split("=")[1]);
51
+ else if (arg.startsWith("--test=")) options.test.push(arg.split("=")[1]);
52
+ else if (arg.startsWith("--token=")) options.token = arg.split("=")[1];
53
+ else if (arg.startsWith("--timeout=")) options.timeout = parseInt(arg.split("=")[1], 10);
54
+ else {
55
+ console.error(`Unknown argument: ${arg}`);
56
+ printHelp();
57
+ process.exit(1);
58
+ }
59
+ }
60
+ return options;
61
+ }
62
+ function printHelp() {
63
+ console.log(`
64
+ @verdaccio/e2e-cli - Run Verdaccio e2e tests against any running registry
65
+
66
+ Usage:
67
+ verdaccio-e2e --registry <url> [options]
68
+
69
+ Required:
70
+ -r, --registry <url> Verdaccio registry URL (e.g. http://localhost:4873)
71
+
72
+ Options:
73
+ --pm <name[=path]> Package manager to test (can be repeated)
74
+ Supported: npm, pnpm, yarn-classic, yarn-modern
75
+ Examples: --pm npm --pm pnpm
76
+ --pm npm=/path/to/npm
77
+ --pm yarn-modern=/path/to/yarn.js
78
+ Default: npm
79
+
80
+ -t, --test <name> Filter tests by name (can be repeated)
81
+ Available: publish, install, audit, info, deprecate,
82
+ dist-tags, ping, search, star, unpublish
83
+ Default: all supported by the PM
84
+
85
+ --token <token> Auth token (skips user creation)
86
+ --timeout <ms> Per-test timeout (default: 50000)
87
+ -v, --verbose Enable debug output
88
+ -h, --help Show this help
89
+ `);
90
+ }
91
+ async function main(argv = process.argv) {
92
+ const options = parseArgs(argv);
93
+ if (!options.registry) {
94
+ console.error("Error: --registry is required\n");
95
+ printHelp();
96
+ process.exit(1);
97
+ }
98
+ if (options.verbose) {
99
+ const { setVerbose } = await import("./utils/process.js");
100
+ setVerbose(true);
101
+ }
102
+ console.log(`Checking registry at ${options.registry}...`);
103
+ if (!await pingRegistry(options.registry)) {
104
+ console.error(`Error: Registry at ${options.registry} is not reachable`);
105
+ process.exit(1);
106
+ }
107
+ console.log(`Registry is alive.`);
108
+ let token = options.token;
109
+ if (!token) {
110
+ console.log("Creating test user...");
111
+ const auth = await createUser(options.registry);
112
+ token = auth.token;
113
+ console.log(`User "${auth.user}" created.`);
114
+ }
115
+ const adapters = parseAdapters(options.pm);
116
+ console.log(`Adapters: ${adapters.map((a) => a.name).join(", ")}`);
117
+ const tests = options.test && options.test.length > 0 ? allTests.filter((t) => options.test.includes(t.name)) : allTests;
118
+ console.log(`Tests: ${tests.map((t) => t.name).join(", ")}`);
119
+ const { exitCode } = await runAll(adapters, tests, options.registry, token, {
120
+ timeout: options.timeout,
121
+ concurrency: options.concurrency,
122
+ testFilter: options.test
123
+ });
124
+ process.exit(exitCode);
125
+ }
126
+ //#endregion
127
+ export { allTests, createNpmAdapter, createPnpmAdapter, createYarnClassicAdapter, createYarnModernAdapter, main, runAll, runSuite };
128
+
129
+ //# sourceMappingURL=index.js.map