@verdaccio/e2e-cli 2.1.0 → 2.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 (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 +78 -0
  10. package/build/cjs/adapters/npm.cjs.map +1 -0
  11. package/build/cjs/adapters/pnpm.cjs +78 -0
  12. package/build/cjs/adapters/pnpm.cjs.map +1 -0
  13. package/build/cjs/adapters/yarn-classic.cjs +96 -0
  14. package/build/cjs/adapters/yarn-classic.cjs.map +1 -0
  15. package/build/cjs/adapters/yarn-modern.cjs +133 -0
  16. package/build/cjs/adapters/yarn-modern.cjs.map +1 -0
  17. package/build/cjs/index.cjs +152 -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 +76 -0
  53. package/build/esm/adapters/npm.js.map +1 -0
  54. package/build/esm/adapters/pnpm.js +76 -0
  55. package/build/esm/adapters/pnpm.js.map +1 -0
  56. package/build/esm/adapters/yarn-classic.js +94 -0
  57. package/build/esm/adapters/yarn-classic.js.map +1 -0
  58. package/build/esm/adapters/yarn-modern.js +130 -0
  59. package/build/esm/adapters/yarn-modern.js.map +1 -0
  60. package/build/esm/index.js +142 -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 @@
1
+ {"version":3,"file":"star.cjs","names":[],"sources":["../../../src/tests/star.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function testStar(ctx: TestContext): Promise<void> {\n const id = ctx.runId;\n\n // Test 1: star a package\n const pkgName1 = `@verdaccio/star1-${id}`;\n const { tempFolder: tf1 } = await ctx.adapter.prepareProject(\n pkgName1,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n await ctx.adapter.exec(\n { cwd: tf1 },\n 'publish',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n const resp1 = await ctx.adapter.exec(\n { cwd: tf1 },\n 'star',\n pkgName1,\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.ok(\n resp1.stdout.includes(pkgName1),\n `Expected star output to contain \"${pkgName1}\" but got \"${resp1.stdout}\"`\n );\n\n // Test 2: unstar a package\n const pkgName2 = `@verdaccio/star2-${id}`;\n const { tempFolder: tf2 } = await ctx.adapter.prepareProject(\n pkgName2,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n await ctx.adapter.exec(\n { cwd: tf2 },\n 'publish',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n await ctx.adapter.exec(\n { cwd: tf2 },\n 'star',\n pkgName2,\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n const resp2 = await ctx.adapter.exec(\n { cwd: tf2 },\n 'unstar',\n pkgName2,\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.ok(\n resp2.stdout.includes(pkgName2),\n `Expected unstar output to contain \"${pkgName2}\" but got \"${resp2.stdout}\"`\n );\n}\n\nexport const starTest: TestDefinition = {\n name: 'star',\n requires: ['star'],\n run: testStar,\n};\n"],"mappings":";;;;AAIA,eAAe,SAAS,KAAiC;CACvD,MAAM,KAAK,IAAI;CAGf,MAAM,WAAW,oBAAoB;CACrC,MAAM,EAAE,YAAY,QAAQ,MAAM,IAAI,QAAQ,eAC5C,UACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;AACD,OAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,KAAK,EACZ,WACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CACD,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAC9B,EAAE,KAAK,KAAK,EACZ,QACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;AACD,QAAA,QAAO,GACL,MAAM,OAAO,SAAS,SAAS,EAC/B,oCAAoC,SAAS,aAAa,MAAM,OAAO,GACxE;CAGD,MAAM,WAAW,oBAAoB;CACrC,MAAM,EAAE,YAAY,QAAQ,MAAM,IAAI,QAAQ,eAC5C,UACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;AACD,OAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,KAAK,EACZ,WACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;AACD,OAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,KAAK,EACZ,QACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CACD,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAC9B,EAAE,KAAK,KAAK,EACZ,UACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;AACD,QAAA,QAAO,GACL,MAAM,OAAO,SAAS,SAAS,EAC/B,sCAAsC,SAAS,aAAa,MAAM,OAAO,GAC1E;;AAGH,IAAa,WAA2B;CACtC,MAAM;CACN,UAAU,CAAC,OAAO;CAClB,KAAK;CACN"}
@@ -0,0 +1,40 @@
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ let assert = require("assert");
3
+ assert = require_runtime.__toESM(assert);
4
+ //#region src/tests/unpublish.ts
5
+ async function publishPkg(ctx, tempFolder) {
6
+ await ctx.adapter.exec({ cwd: tempFolder }, "publish", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
7
+ }
8
+ async function bumpVersion(ctx, tempFolder, bump) {
9
+ await ctx.adapter.exec({ cwd: tempFolder }, "version", bump, "--no--git-tag-version", "--loglevel=info", ...ctx.adapter.registryArg(ctx.registryUrl));
10
+ }
11
+ async function testUnpublish(ctx) {
12
+ const id = ctx.runId;
13
+ const pkgName = `@verdaccio/unpub1-${id}`;
14
+ const { tempFolder } = await ctx.adapter.prepareProject(pkgName, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
15
+ await publishPkg(ctx, tempFolder);
16
+ await bumpVersion(ctx, tempFolder, "minor");
17
+ await publishPkg(ctx, tempFolder);
18
+ await bumpVersion(ctx, tempFolder, "minor");
19
+ await publishPkg(ctx, tempFolder);
20
+ await bumpVersion(ctx, tempFolder, "major");
21
+ await publishPkg(ctx, tempFolder);
22
+ const resp = await ctx.adapter.exec({ cwd: tempFolder }, "unpublish", pkgName, "--force", "--loglevel=info", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
23
+ assert.default.ok(resp.stdout.includes(pkgName), `Expected unpublish output to contain "${pkgName}" but got "${resp.stdout}"`);
24
+ const pkgName2 = `@verdaccio/unpub2-${id}`;
25
+ const { tempFolder: tf2 } = await ctx.adapter.prepareProject(pkgName2, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
26
+ await publishPkg(ctx, tf2);
27
+ await bumpVersion(ctx, tf2, "minor");
28
+ await publishPkg(ctx, tf2);
29
+ const resp2 = await ctx.adapter.exec({ cwd: tf2 }, "unpublish", `${pkgName2}@1.0.0`, "--force", "--loglevel=info", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
30
+ assert.default.ok(resp2.stdout.includes(`${pkgName2}@1.0.0`), `Expected unpublish output to contain "${pkgName2}@1.0.0" but got "${resp2.stdout}"`);
31
+ }
32
+ var unpublishTest = {
33
+ name: "unpublish",
34
+ requires: ["unpublish"],
35
+ run: testUnpublish
36
+ };
37
+ //#endregion
38
+ exports.unpublishTest = unpublishTest;
39
+
40
+ //# sourceMappingURL=unpublish.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpublish.cjs","names":[],"sources":["../../../src/tests/unpublish.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function publishPkg(ctx: TestContext, tempFolder: string) {\n await ctx.adapter.exec(\n { cwd: tempFolder },\n 'publish',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n}\n\nasync function bumpVersion(ctx: TestContext, tempFolder: string, bump: string) {\n await ctx.adapter.exec(\n { cwd: tempFolder },\n 'version',\n bump,\n '--no--git-tag-version',\n '--loglevel=info',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n}\n\nasync function testUnpublish(ctx: TestContext): Promise<void> {\n const id = ctx.runId;\n\n // Test 1: unpublish a full package\n const pkgName = `@verdaccio/unpub1-${id}`;\n const { tempFolder } = await ctx.adapter.prepareProject(\n pkgName,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n await publishPkg(ctx, tempFolder);\n await bumpVersion(ctx, tempFolder, 'minor');\n await publishPkg(ctx, tempFolder);\n await bumpVersion(ctx, tempFolder, 'minor');\n await publishPkg(ctx, tempFolder);\n await bumpVersion(ctx, tempFolder, 'major');\n await publishPkg(ctx, tempFolder);\n\n const resp = await ctx.adapter.exec(\n { cwd: tempFolder },\n 'unpublish',\n pkgName,\n '--force',\n '--loglevel=info',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.ok(\n resp.stdout.includes(pkgName),\n `Expected unpublish output to contain \"${pkgName}\" but got \"${resp.stdout}\"`\n );\n\n // Test 2: unpublish a specific version\n const pkgName2 = `@verdaccio/unpub2-${id}`;\n const { tempFolder: tf2 } = await ctx.adapter.prepareProject(\n pkgName2,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n await publishPkg(ctx, tf2);\n await bumpVersion(ctx, tf2, 'minor');\n await publishPkg(ctx, tf2);\n\n const resp2 = await ctx.adapter.exec(\n { cwd: tf2 },\n 'unpublish',\n `${pkgName2}@1.0.0`,\n '--force',\n '--loglevel=info',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.ok(\n resp2.stdout.includes(`${pkgName2}@1.0.0`),\n `Expected unpublish output to contain \"${pkgName2}@1.0.0\" but got \"${resp2.stdout}\"`\n );\n}\n\nexport const unpublishTest: TestDefinition = {\n name: 'unpublish',\n requires: ['unpublish'],\n run: testUnpublish,\n};\n"],"mappings":";;;;AAIA,eAAe,WAAW,KAAkB,YAAoB;AAC9D,OAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,YAAY,EACnB,WACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;;AAGH,eAAe,YAAY,KAAkB,YAAoB,MAAc;AAC7E,OAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,YAAY,EACnB,WACA,MACA,yBACA,mBACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;;AAGH,eAAe,cAAc,KAAiC;CAC5D,MAAM,KAAK,IAAI;CAGf,MAAM,UAAU,qBAAqB;CACrC,MAAM,EAAE,eAAe,MAAM,IAAI,QAAQ,eACvC,SACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;AACD,OAAM,WAAW,KAAK,WAAW;AACjC,OAAM,YAAY,KAAK,YAAY,QAAQ;AAC3C,OAAM,WAAW,KAAK,WAAW;AACjC,OAAM,YAAY,KAAK,YAAY,QAAQ;AAC3C,OAAM,WAAW,KAAK,WAAW;AACjC,OAAM,YAAY,KAAK,YAAY,QAAQ;AAC3C,OAAM,WAAW,KAAK,WAAW;CAEjC,MAAM,OAAO,MAAM,IAAI,QAAQ,KAC7B,EAAE,KAAK,YAAY,EACnB,aACA,SACA,WACA,mBACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;AACD,QAAA,QAAO,GACL,KAAK,OAAO,SAAS,QAAQ,EAC7B,yCAAyC,QAAQ,aAAa,KAAK,OAAO,GAC3E;CAGD,MAAM,WAAW,qBAAqB;CACtC,MAAM,EAAE,YAAY,QAAQ,MAAM,IAAI,QAAQ,eAC5C,UACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;AACD,OAAM,WAAW,KAAK,IAAI;AAC1B,OAAM,YAAY,KAAK,KAAK,QAAQ;AACpC,OAAM,WAAW,KAAK,IAAI;CAE1B,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAC9B,EAAE,KAAK,KAAK,EACZ,aACA,GAAG,SAAS,SACZ,WACA,mBACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;AACD,QAAA,QAAO,GACL,MAAM,OAAO,SAAS,GAAG,SAAS,QAAQ,EAC1C,yCAAyC,SAAS,mBAAmB,MAAM,OAAO,GACnF;;AAGH,IAAa,gBAAgC;CAC3C,MAAM;CACN,UAAU,CAAC,YAAY;CACvB,KAAK;CACN"}
@@ -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,76 @@
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 = new Set([
8
+ "publish",
9
+ "unpublish",
10
+ "install",
11
+ "info",
12
+ "audit",
13
+ "deprecate",
14
+ "dist-tag",
15
+ "ping",
16
+ "search",
17
+ "star",
18
+ "stars",
19
+ "unstar"
20
+ ]);
21
+ function detectVersion(bin) {
22
+ try {
23
+ return execSync(`${bin} --version`, {
24
+ encoding: "utf8",
25
+ timeout: 5e3
26
+ }).trim();
27
+ } catch {
28
+ return "unknown";
29
+ }
30
+ }
31
+ function installNpm(version) {
32
+ const pkg = `npm@${version}`;
33
+ debug("installing %s into temp dir", pkg);
34
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
35
+ execSync(`npm install --prefix "${tmpDir}" ${pkg} --loglevel=error`, {
36
+ encoding: "utf8",
37
+ timeout: 3e4
38
+ });
39
+ const bin = `${tmpDir}/node_modules/.bin/npm`;
40
+ const installed = detectVersion(bin);
41
+ debug("installed npm %s at %s", installed, bin);
42
+ console.log(` Auto-installed npm ${installed}`);
43
+ return bin;
44
+ }
45
+ function resolveNpmBin(binPath, version) {
46
+ if (binPath) return binPath;
47
+ if (version) return installNpm(version);
48
+ return "npm";
49
+ }
50
+ function createNpmAdapter(binPath, version) {
51
+ const bin = resolveNpmBin(binPath, version);
52
+ const resolved = detectVersion(bin);
53
+ debug("creating npm adapter with bin: %s (%s)", bin, resolved);
54
+ return {
55
+ name: `npm@${resolved}`,
56
+ type: "npm",
57
+ bin,
58
+ supports: NPM_SUPPORTED_COMMANDS,
59
+ registryArg(url) {
60
+ return ["--registry", url];
61
+ },
62
+ prefixArg(folder) {
63
+ return ["--prefix", folder];
64
+ },
65
+ exec(options, ...args) {
66
+ return exec(options, bin, args);
67
+ },
68
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
69
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
70
+ }
71
+ };
72
+ }
73
+ //#endregion
74
+ export { createNpmAdapter };
75
+
76
+ //# 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 'star',\n 'stars',\n 'unstar',\n]);\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 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 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,wBAAwB;AAEjD,IAAM,yBAAyB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,cAAc,KAAqB;AAC1C,KAAI;AACF,SAAO,SAAS,GAAG,IAAI,aAAa;GAAE,UAAU;GAAQ,SAAS;GAAM,CAAC,CAAC,MAAM;SACzE;AACN,SAAO;;;AAIX,SAAS,WAAW,SAAyB;CAC3C,MAAM,MAAM,OAAO;AACnB,OAAM,+BAA+B,IAAI;CACzC,MAAM,SAAS,SAAS,aAAa,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM;AACjE,UAAS,yBAAyB,OAAO,IAAI,IAAI,oBAAoB;EACnE,UAAU;EACV,SAAS;EACV,CAAC;CACF,MAAM,MAAM,GAAG,OAAO;CACtB,MAAM,YAAY,cAAc,IAAI;AACpC,OAAM,0BAA0B,WAAW,IAAI;AAC/C,SAAQ,IAAI,wBAAwB,YAAY;AAChD,QAAO;;AAGT,SAAS,cAAc,SAAkB,SAA0B;AACjE,KAAI,QAAS,QAAO;AACpB,KAAI,QAAS,QAAO,WAAW,QAAQ;AACvC,QAAO;;AAGT,SAAgB,iBAAiB,SAAkB,SAAyC;CAC1F,MAAM,MAAM,cAAc,SAAS,QAAQ;CAC3C,MAAM,WAAW,cAAc,IAAI;AACnC,OAAM,0CAA0C,KAAK,SAAS;AAyC9D,QAvCuC;EACrC,MAAM,OAAO;EACb,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,76 @@
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/pnpm.ts
6
+ var debug = buildDebug("verdaccio:e2e-cli:pnpm");
7
+ var PNPM_SUPPORTED_COMMANDS = new Set([
8
+ "publish",
9
+ "unpublish",
10
+ "install",
11
+ "info",
12
+ "audit",
13
+ "deprecate",
14
+ "dist-tag",
15
+ "ping",
16
+ "search",
17
+ "star",
18
+ "stars",
19
+ "unstar"
20
+ ]);
21
+ function detectVersion(bin) {
22
+ try {
23
+ return execSync(`${bin} --version`, {
24
+ encoding: "utf8",
25
+ timeout: 5e3
26
+ }).trim();
27
+ } catch {
28
+ return "unknown";
29
+ }
30
+ }
31
+ function installPnpm(version) {
32
+ const pkg = `pnpm@${version}`;
33
+ debug("installing %s into temp dir", pkg);
34
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
35
+ execSync(`npm install --prefix "${tmpDir}" ${pkg} --loglevel=error`, {
36
+ encoding: "utf8",
37
+ timeout: 3e4
38
+ });
39
+ const bin = `${tmpDir}/node_modules/.bin/pnpm`;
40
+ const installed = detectVersion(bin);
41
+ debug("installed pnpm %s at %s", installed, bin);
42
+ console.log(` Auto-installed pnpm ${installed}`);
43
+ return bin;
44
+ }
45
+ function resolvePnpmBin(binPath, version) {
46
+ if (binPath) return binPath;
47
+ if (version) return installPnpm(version);
48
+ return "pnpm";
49
+ }
50
+ function createPnpmAdapter(binPath, version) {
51
+ const bin = resolvePnpmBin(binPath, version);
52
+ const resolved = detectVersion(bin);
53
+ debug("creating pnpm adapter with bin: %s (%s)", bin, resolved);
54
+ return {
55
+ name: `pnpm@${resolved}`,
56
+ type: "pnpm",
57
+ bin,
58
+ supports: PNPM_SUPPORTED_COMMANDS,
59
+ registryArg(url) {
60
+ return ["--registry", url];
61
+ },
62
+ prefixArg(folder) {
63
+ return ["--prefix", folder];
64
+ },
65
+ exec(options, ...args) {
66
+ return exec(options, bin, args);
67
+ },
68
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
69
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
70
+ }
71
+ };
72
+ }
73
+ //#endregion
74
+ export { createPnpmAdapter };
75
+
76
+ //# sourceMappingURL=pnpm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm.js","names":[],"sources":["../../../src/adapters/pnpm.ts"],"sourcesContent":["import { SpawnOptions, execSync } from 'child_process';\nimport buildDebug from 'debug';\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\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 installPnpm(version: string): string {\n const pkg = `pnpm@${version}`;\n debug('installing %s into temp dir', pkg);\n const tmpDir = execSync('mktemp -d', { encoding: 'utf8' }).trim();\n execSync(`npm install --prefix \"${tmpDir}\" ${pkg} --loglevel=error`, {\n encoding: 'utf8',\n timeout: 30000,\n });\n const bin = `${tmpDir}/node_modules/.bin/pnpm`;\n const installed = detectVersion(bin);\n debug('installed pnpm %s at %s', installed, bin);\n console.log(` Auto-installed pnpm ${installed}`);\n return bin;\n}\n\nfunction resolvePnpmBin(binPath?: string, version?: string): string {\n if (binPath) return binPath;\n if (version) return installPnpm(version);\n return 'pnpm';\n}\n\nexport function createPnpmAdapter(binPath?: string, version?: string): PackageManagerAdapter {\n const bin = resolvePnpmBin(binPath, version);\n const resolved = detectVersion(bin);\n debug('creating pnpm adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `pnpm@${resolved}`,\n type: 'pnpm',\n bin,\n supports: 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,SAAS,cAAc,KAAqB;AAC1C,KAAI;AACF,SAAO,SAAS,GAAG,IAAI,aAAa;GAAE,UAAU;GAAQ,SAAS;GAAM,CAAC,CAAC,MAAM;SACzE;AACN,SAAO;;;AAIX,SAAS,YAAY,SAAyB;CAC5C,MAAM,MAAM,QAAQ;AACpB,OAAM,+BAA+B,IAAI;CACzC,MAAM,SAAS,SAAS,aAAa,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM;AACjE,UAAS,yBAAyB,OAAO,IAAI,IAAI,oBAAoB;EACnE,UAAU;EACV,SAAS;EACV,CAAC;CACF,MAAM,MAAM,GAAG,OAAO;CACtB,MAAM,YAAY,cAAc,IAAI;AACpC,OAAM,2BAA2B,WAAW,IAAI;AAChD,SAAQ,IAAI,yBAAyB,YAAY;AACjD,QAAO;;AAGT,SAAS,eAAe,SAAkB,SAA0B;AAClE,KAAI,QAAS,QAAO;AACpB,KAAI,QAAS,QAAO,YAAY,QAAQ;AACxC,QAAO;;AAGT,SAAgB,kBAAkB,SAAkB,SAAyC;CAC3F,MAAM,MAAM,eAAe,SAAS,QAAQ;CAC5C,MAAM,WAAW,cAAc,IAAI;AACnC,OAAM,2CAA2C,KAAK,SAAS;AAyC/D,QAvCuC;EACrC,MAAM,QAAQ;EACd,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,94 @@
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 installYarnClassic(version = "1") {
28
+ const pkg = version.startsWith("1") ? `yarn@${version}` : `yarn@1`;
29
+ debug("installing %s into temp dir", pkg);
30
+ const tmpDir = execSync("mktemp -d", { encoding: "utf8" }).trim();
31
+ execSync(`npm install --prefix "${tmpDir}" ${pkg} --loglevel=error`, {
32
+ encoding: "utf8",
33
+ timeout: 3e4
34
+ });
35
+ const bin = `${tmpDir}/node_modules/.bin/yarn`;
36
+ const installed = detectYarnVersion(bin);
37
+ debug("installed yarn %s at %s", installed, bin);
38
+ console.log(` Auto-installed yarn classic ${installed}`);
39
+ return bin;
40
+ }
41
+ function resolveYarnClassicBin(binPath, version) {
42
+ if (binPath) return binPath;
43
+ if (version) return installYarnClassic(version);
44
+ try {
45
+ const systemYarn = execSync("which yarn", {
46
+ encoding: "utf8",
47
+ timeout: 5e3
48
+ }).trim();
49
+ const sysVersion = detectYarnVersion(systemYarn);
50
+ if (sysVersion.split(".")[0] === "1") {
51
+ debug("using system yarn classic %s", sysVersion);
52
+ return systemYarn;
53
+ }
54
+ debug("system yarn is Berry %s, auto-installing classic", sysVersion);
55
+ } catch {
56
+ debug("no system yarn found, auto-installing classic");
57
+ }
58
+ return installYarnClassic();
59
+ }
60
+ function createYarnClassicAdapter(binPath, version) {
61
+ const bin = resolveYarnClassicBin(binPath, version);
62
+ const resolved = detectYarnVersion(bin);
63
+ debug("creating yarn classic adapter with bin: %s (%s)", bin, resolved);
64
+ return {
65
+ name: `yarn-classic@${resolved}`,
66
+ type: "yarn-classic",
67
+ bin,
68
+ supports: YARN_CLASSIC_SUPPORTED_COMMANDS,
69
+ registryArg(url) {
70
+ return ["--registry", url];
71
+ },
72
+ prefixArg(folder) {
73
+ return ["--cwd", folder];
74
+ },
75
+ exec(options, ...args) {
76
+ const env = {
77
+ ...process.env,
78
+ ...options.env,
79
+ COREPACK_ENABLE_STRICT: "0"
80
+ };
81
+ return exec({
82
+ ...options,
83
+ env
84
+ }, bin, args);
85
+ },
86
+ async prepareProject(packageName, version, registryUrl, port, token, dependencies = {}, devDependencies = {}) {
87
+ return prepareGenericEmptyProject(packageName, version, port, token, registryUrl, dependencies, devDependencies);
88
+ }
89
+ };
90
+ }
91
+ //#endregion
92
+ export { createYarnClassicAdapter };
93
+
94
+ //# 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\nfunction installYarnClassic(version = '1'): string {\n const pkg = version.startsWith('1') ? `yarn@${version}` : `yarn@1`;\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/yarn`;\n const installed = detectYarnVersion(bin);\n debug('installed yarn %s at %s', installed, bin);\n console.log(` Auto-installed yarn classic ${installed}`);\n return bin;\n}\n\nfunction resolveYarnClassicBin(binPath?: string, version?: string): string {\n if (binPath) return binPath;\n\n // Always install the requested version to ensure reproducibility\n if (version) {\n return installYarnClassic(version);\n }\n\n // Check if system yarn is 1.x\n try {\n const systemYarn = execSync('which yarn', { encoding: 'utf8', timeout: 5000 }).trim();\n const sysVersion = detectYarnVersion(systemYarn);\n const major = sysVersion.split('.')[0];\n if (major === '1') {\n debug('using system yarn classic %s', sysVersion);\n return systemYarn;\n }\n debug('system yarn is Berry %s, auto-installing classic', sysVersion);\n } catch {\n debug('no system yarn found, auto-installing classic');\n }\n\n return installYarnClassic();\n}\n\nexport function createYarnClassicAdapter(binPath?: string, version?: string): PackageManagerAdapter {\n const bin = resolveYarnClassicBin(binPath, version);\n const resolved = detectYarnVersion(bin);\n debug('creating yarn classic adapter with bin: %s (%s)', bin, resolved);\n\n const adapter: PackageManagerAdapter = {\n name: `yarn-classic@${resolved}`,\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,SAAS,mBAAmB,UAAU,KAAa;CACjD,MAAM,MAAM,QAAQ,WAAW,IAAI,GAAG,QAAQ,YAAY;AAC1D,OAAM,+BAA+B,IAAI;CACzC,MAAM,SAAS,SAAS,aAAa,EAAE,UAAU,QAAQ,CAAC,CAAC,MAAM;AACjE,UAAS,yBAAyB,OAAO,IAAI,IAAI,oBAAoB;EACnE,UAAU;EACV,SAAS;EACV,CAAC;CACF,MAAM,MAAM,GAAG,OAAO;CACtB,MAAM,YAAY,kBAAkB,IAAI;AACxC,OAAM,2BAA2B,WAAW,IAAI;AAChD,SAAQ,IAAI,iCAAiC,YAAY;AACzD,QAAO;;AAGT,SAAS,sBAAsB,SAAkB,SAA0B;AACzE,KAAI,QAAS,QAAO;AAGpB,KAAI,QACF,QAAO,mBAAmB,QAAQ;AAIpC,KAAI;EACF,MAAM,aAAa,SAAS,cAAc;GAAE,UAAU;GAAQ,SAAS;GAAM,CAAC,CAAC,MAAM;EACrF,MAAM,aAAa,kBAAkB,WAAW;AAEhD,MADc,WAAW,MAAM,IAAI,CAAC,OACtB,KAAK;AACjB,SAAM,gCAAgC,WAAW;AACjD,UAAO;;AAET,QAAM,oDAAoD,WAAW;SAC/D;AACN,QAAM,gDAAgD;;AAGxD,QAAO,oBAAoB;;AAG7B,SAAgB,yBAAyB,SAAkB,SAAyC;CAClG,MAAM,MAAM,sBAAsB,SAAS,QAAQ;CACnD,MAAM,WAAW,kBAAkB,IAAI;AACvC,OAAM,mDAAmD,KAAK,SAAS;AA0CvE,QAxCuC;EACrC,MAAM,gBAAgB;EACtB,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"}