@verdaccio/e2e-cli 2.10.2 → 3.0.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.
- package/Cargo.lock +1591 -0
- package/Cargo.toml +19 -0
- package/bin/e2e-cli.js +26 -6
- package/build/bin/verdaccio-e2e +0 -0
- package/build/cjs/index.cjs +11 -166
- package/build/esm/index.js +10 -153
- package/build/index.d.ts +15 -6
- package/package.json +14 -16
- package/scripts/build-js-package.mjs +25 -0
- package/src/e2e_tests/audit.rs +51 -0
- package/src/e2e_tests/ci.rs +32 -0
- package/src/e2e_tests/deprecate.rs +64 -0
- package/src/e2e_tests/dist_tags.rs +56 -0
- package/src/e2e_tests/info.rs +43 -0
- package/src/e2e_tests/install.rs +27 -0
- package/src/e2e_tests/login.rs +64 -0
- package/src/e2e_tests/mod.rs +104 -0
- package/src/e2e_tests/ping.rs +33 -0
- package/src/e2e_tests/publish.rs +68 -0
- package/src/e2e_tests/search.rs +14 -0
- package/src/e2e_tests/unpublish.rs +37 -0
- package/src/main.rs +1411 -0
- package/src/scenarios/install_multiple_deps.rs +99 -0
- package/src/scenarios/minimum_release_age.rs +45 -0
- package/src/scenarios/mod.rs +11 -0
- package/build/adapters/adapter.d.ts +0 -1
- package/build/adapters/bun.d.ts +0 -2
- package/build/adapters/deno.d.ts +0 -2
- package/build/adapters/index.d.ts +0 -6
- package/build/adapters/npm.d.ts +0 -2
- package/build/adapters/pnpm.d.ts +0 -2
- package/build/adapters/yarn-classic.d.ts +0 -2
- package/build/adapters/yarn-modern.d.ts +0 -2
- package/build/cjs/_virtual/_rolldown/runtime.cjs +0 -23
- package/build/cjs/adapters/bun.cjs +0 -63
- package/build/cjs/adapters/bun.cjs.map +0 -1
- package/build/cjs/adapters/deno.cjs +0 -58
- package/build/cjs/adapters/deno.cjs.map +0 -1
- package/build/cjs/adapters/index.cjs +0 -6
- package/build/cjs/adapters/npm.cjs +0 -75
- package/build/cjs/adapters/npm.cjs.map +0 -1
- package/build/cjs/adapters/pnpm.cjs +0 -104
- package/build/cjs/adapters/pnpm.cjs.map +0 -1
- package/build/cjs/adapters/yarn-classic.cjs +0 -98
- package/build/cjs/adapters/yarn-classic.cjs.map +0 -1
- package/build/cjs/adapters/yarn-modern.cjs +0 -206
- package/build/cjs/adapters/yarn-modern.cjs.map +0 -1
- package/build/cjs/index.cjs.map +0 -1
- package/build/cjs/reporter.cjs +0 -113
- package/build/cjs/reporter.cjs.map +0 -1
- package/build/cjs/runner.cjs +0 -141
- package/build/cjs/runner.cjs.map +0 -1
- package/build/cjs/scenarios/index.cjs +0 -8
- package/build/cjs/scenarios/index.cjs.map +0 -1
- package/build/cjs/scenarios/install-multiple-deps.cjs +0 -117
- package/build/cjs/scenarios/install-multiple-deps.cjs.map +0 -1
- package/build/cjs/scenarios/minimum-release-age.cjs +0 -112
- package/build/cjs/scenarios/minimum-release-age.cjs.map +0 -1
- package/build/cjs/tests/audit.cjs +0 -47
- package/build/cjs/tests/audit.cjs.map +0 -1
- package/build/cjs/tests/ci.cjs +0 -83
- package/build/cjs/tests/ci.cjs.map +0 -1
- package/build/cjs/tests/deprecate.cjs +0 -107
- package/build/cjs/tests/deprecate.cjs.map +0 -1
- package/build/cjs/tests/dist-tags.cjs +0 -43
- package/build/cjs/tests/dist-tags.cjs.map +0 -1
- package/build/cjs/tests/index.cjs +0 -33
- package/build/cjs/tests/index.cjs.map +0 -1
- package/build/cjs/tests/info.cjs +0 -42
- package/build/cjs/tests/info.cjs.map +0 -1
- package/build/cjs/tests/install.cjs +0 -27
- package/build/cjs/tests/install.cjs.map +0 -1
- package/build/cjs/tests/login.cjs +0 -117
- package/build/cjs/tests/login.cjs.map +0 -1
- package/build/cjs/tests/ping.cjs +0 -30
- package/build/cjs/tests/ping.cjs.map +0 -1
- package/build/cjs/tests/publish.cjs +0 -37
- package/build/cjs/tests/publish.cjs.map +0 -1
- package/build/cjs/tests/search.cjs +0 -19
- package/build/cjs/tests/search.cjs.map +0 -1
- package/build/cjs/tests/unpublish.cjs +0 -40
- package/build/cjs/tests/unpublish.cjs.map +0 -1
- package/build/cjs/utils/info.cjs +0 -25
- package/build/cjs/utils/info.cjs.map +0 -1
- package/build/cjs/utils/process.cjs +0 -85
- package/build/cjs/utils/process.cjs.map +0 -1
- package/build/cjs/utils/project.cjs +0 -55
- package/build/cjs/utils/project.cjs.map +0 -1
- package/build/cjs/utils/registry-client.cjs +0 -56
- package/build/cjs/utils/registry-client.cjs.map +0 -1
- package/build/esm/adapters/bun.js +0 -61
- package/build/esm/adapters/bun.js.map +0 -1
- package/build/esm/adapters/deno.js +0 -56
- package/build/esm/adapters/deno.js.map +0 -1
- package/build/esm/adapters/index.js +0 -7
- package/build/esm/adapters/npm.js +0 -73
- package/build/esm/adapters/npm.js.map +0 -1
- package/build/esm/adapters/pnpm.js +0 -102
- package/build/esm/adapters/pnpm.js.map +0 -1
- package/build/esm/adapters/yarn-classic.js +0 -96
- package/build/esm/adapters/yarn-classic.js.map +0 -1
- package/build/esm/adapters/yarn-modern.js +0 -203
- package/build/esm/adapters/yarn-modern.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/esm/reporter.js +0 -107
- package/build/esm/reporter.js.map +0 -1
- package/build/esm/runner.js +0 -138
- package/build/esm/runner.js.map +0 -1
- package/build/esm/scenarios/index.js +0 -8
- package/build/esm/scenarios/index.js.map +0 -1
- package/build/esm/scenarios/install-multiple-deps.js +0 -114
- package/build/esm/scenarios/install-multiple-deps.js.map +0 -1
- package/build/esm/scenarios/minimum-release-age.js +0 -109
- package/build/esm/scenarios/minimum-release-age.js.map +0 -1
- package/build/esm/tests/audit.js +0 -44
- package/build/esm/tests/audit.js.map +0 -1
- package/build/esm/tests/ci.js +0 -80
- package/build/esm/tests/ci.js.map +0 -1
- package/build/esm/tests/deprecate.js +0 -104
- package/build/esm/tests/deprecate.js.map +0 -1
- package/build/esm/tests/dist-tags.js +0 -41
- package/build/esm/tests/dist-tags.js.map +0 -1
- package/build/esm/tests/index.js +0 -33
- package/build/esm/tests/index.js.map +0 -1
- package/build/esm/tests/info.js +0 -40
- package/build/esm/tests/info.js.map +0 -1
- package/build/esm/tests/install.js +0 -25
- package/build/esm/tests/install.js.map +0 -1
- package/build/esm/tests/login.js +0 -113
- package/build/esm/tests/login.js.map +0 -1
- package/build/esm/tests/ping.js +0 -28
- package/build/esm/tests/ping.js.map +0 -1
- package/build/esm/tests/publish.js +0 -35
- package/build/esm/tests/publish.js.map +0 -1
- package/build/esm/tests/search.js +0 -17
- package/build/esm/tests/search.js.map +0 -1
- package/build/esm/tests/unpublish.js +0 -38
- package/build/esm/tests/unpublish.js.map +0 -1
- package/build/esm/utils/info.js +0 -24
- package/build/esm/utils/info.js.map +0 -1
- package/build/esm/utils/process.js +0 -82
- package/build/esm/utils/process.js.map +0 -1
- package/build/esm/utils/project.js +0 -50
- package/build/esm/utils/project.js.map +0 -1
- package/build/esm/utils/registry-client.js +0 -53
- package/build/esm/utils/registry-client.js.map +0 -1
- package/build/reporter.d.ts +0 -7
- package/build/runner.d.ts +0 -13
- package/build/scenarios/index.d.ts +0 -5
- package/build/scenarios/install-multiple-deps.d.ts +0 -2
- package/build/scenarios/minimum-release-age.d.ts +0 -11
- package/build/tests/audit.d.ts +0 -2
- package/build/tests/ci.d.ts +0 -2
- package/build/tests/deprecate.d.ts +0 -2
- package/build/tests/dist-tags.d.ts +0 -2
- package/build/tests/index.d.ts +0 -15
- package/build/tests/info.d.ts +0 -2
- package/build/tests/install.d.ts +0 -2
- package/build/tests/login.d.ts +0 -2
- package/build/tests/ping.d.ts +0 -2
- package/build/tests/publish.d.ts +0 -2
- package/build/tests/search.d.ts +0 -2
- package/build/tests/unpublish.d.ts +0 -2
- package/build/types.d.ts +0 -81
- package/build/utils/index.d.ts +0 -4
- package/build/utils/info.d.ts +0 -14
- package/build/utils/process.d.ts +0 -4
- package/build/utils/project.d.ts +0 -6
- package/build/utils/registry-client.d.ts +0 -15
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let assert = require("assert");
|
|
3
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
4
|
-
//#region src/tests/dist-tags.ts
|
|
5
|
-
async function publishPkg(ctx, tempFolder, extraArgs = []) {
|
|
6
|
-
await ctx.adapter.exec({ cwd: tempFolder }, "publish", ...extraArgs, ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
7
|
-
}
|
|
8
|
-
async function bumpVersion(ctx, tempFolder) {
|
|
9
|
-
await ctx.adapter.exec({ cwd: tempFolder }, "version", "minor", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
10
|
-
}
|
|
11
|
-
async function testDistTags(ctx) {
|
|
12
|
-
const id = ctx.runId;
|
|
13
|
-
const pkgName1 = `@foo/dt1-${id}`;
|
|
14
|
-
const { tempFolder: tf1 } = await ctx.adapter.prepareProject(pkgName1, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
15
|
-
await publishPkg(ctx, tf1);
|
|
16
|
-
await bumpVersion(ctx, tf1);
|
|
17
|
-
await publishPkg(ctx, tf1, ["--tag", "beta"]);
|
|
18
|
-
const resp1 = await ctx.adapter.exec({ cwd: tf1 }, "dist-tag", "ls", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
19
|
-
assert.default.strictEqual(resp1.stdout, "beta: 1.1.0latest: 1.0.0");
|
|
20
|
-
const pkgName2 = `@verdaccio/dt2-${id}`;
|
|
21
|
-
const { tempFolder: tf2 } = await ctx.adapter.prepareProject(pkgName2, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
22
|
-
await publishPkg(ctx, tf2);
|
|
23
|
-
await bumpVersion(ctx, tf2);
|
|
24
|
-
await publishPkg(ctx, tf2, ["--tag", "beta"]);
|
|
25
|
-
const resp2 = await ctx.adapter.exec({ cwd: tf2 }, "dist-tag", "rm", `${pkgName2}@1.1.0`, "beta", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
26
|
-
assert.default.strictEqual(resp2.stdout, `-beta: ${pkgName2}@1.1.0`);
|
|
27
|
-
const pkgName3 = `@verdaccio/dt3-${id}`;
|
|
28
|
-
const { tempFolder: tf3 } = await ctx.adapter.prepareProject(pkgName3, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
29
|
-
await publishPkg(ctx, tf3);
|
|
30
|
-
await bumpVersion(ctx, tf3);
|
|
31
|
-
await publishPkg(ctx, tf3);
|
|
32
|
-
const resp3 = await ctx.adapter.exec({ cwd: tf3 }, "dist-tag", "add", `${pkgName3}@1.1.0`, "alfa", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
33
|
-
assert.default.strictEqual(resp3.stdout, `+alfa: ${pkgName3}@1.1.0`);
|
|
34
|
-
}
|
|
35
|
-
var distTagsTest = {
|
|
36
|
-
name: "dist-tags",
|
|
37
|
-
requires: ["dist-tag"],
|
|
38
|
-
run: testDistTags
|
|
39
|
-
};
|
|
40
|
-
//#endregion
|
|
41
|
-
exports.distTagsTest = distTagsTest;
|
|
42
|
-
|
|
43
|
-
//# sourceMappingURL=dist-tags.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dist-tags.cjs","names":[],"sources":["../../../src/tests/dist-tags.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function publishPkg(ctx: TestContext, tempFolder: string, extraArgs: string[] = []) {\n await ctx.adapter.exec(\n { cwd: tempFolder },\n 'publish',\n ...extraArgs,\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n}\n\nasync function bumpVersion(ctx: TestContext, tempFolder: string) {\n await ctx.adapter.exec(\n { cwd: tempFolder },\n 'version',\n 'minor',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n}\n\nasync function testDistTags(ctx: TestContext): Promise<void> {\n const id = ctx.runId;\n\n // Test 1: list dist-tags\n const pkgName1 = `@foo/dt1-${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 publishPkg(ctx, tf1);\n await bumpVersion(ctx, tf1);\n await publishPkg(ctx, tf1, ['--tag', 'beta']);\n const resp1 = await ctx.adapter.exec(\n { cwd: tf1 },\n 'dist-tag',\n 'ls',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.strictEqual(resp1.stdout, 'beta: 1.1.0latest: 1.0.0');\n\n // Test 2: remove tag\n const pkgName2 = `@verdaccio/dt2-${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);\n await publishPkg(ctx, tf2, ['--tag', 'beta']);\n const resp2 = await ctx.adapter.exec(\n { cwd: tf2 },\n 'dist-tag',\n 'rm',\n `${pkgName2}@1.1.0`,\n 'beta',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.strictEqual(resp2.stdout, `-beta: ${pkgName2}@1.1.0`);\n\n // Test 3: add tag\n const pkgName3 = `@verdaccio/dt3-${id}`;\n const { tempFolder: tf3 } = await ctx.adapter.prepareProject(\n pkgName3,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n await publishPkg(ctx, tf3);\n await bumpVersion(ctx, tf3);\n await publishPkg(ctx, tf3);\n const resp3 = await ctx.adapter.exec(\n { cwd: tf3 },\n 'dist-tag',\n 'add',\n `${pkgName3}@1.1.0`,\n 'alfa',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n assert.strictEqual(resp3.stdout, `+alfa: ${pkgName3}@1.1.0`);\n}\n\nexport const distTagsTest: TestDefinition = {\n name: 'dist-tags',\n requires: ['dist-tag'],\n run: testDistTags,\n};\n"],"mappings":";;;;AAIA,eAAe,WAAW,KAAkB,YAAoB,YAAsB,EAAE,EAAE;CACxF,MAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,YAAY,EACnB,WACA,GAAG,WACH,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;;AAGH,eAAe,YAAY,KAAkB,YAAoB;CAC/D,MAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,YAAY,EACnB,WACA,SACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;;AAGH,eAAe,aAAa,KAAiC;CAC3D,MAAM,KAAK,IAAI;CAGf,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,YAAY,QAAQ,MAAM,IAAI,QAAQ,eAC5C,UACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;CACD,MAAM,WAAW,KAAK,IAAI;CAC1B,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,WAAW,KAAK,KAAK,CAAC,SAAS,OAAO,CAAC;CAC7C,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAC9B,EAAE,KAAK,KAAK,EACZ,YACA,MACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CACD,OAAA,QAAO,YAAY,MAAM,QAAQ,2BAA2B;CAG5D,MAAM,WAAW,kBAAkB;CACnC,MAAM,EAAE,YAAY,QAAQ,MAAM,IAAI,QAAQ,eAC5C,UACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;CACD,MAAM,WAAW,KAAK,IAAI;CAC1B,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,WAAW,KAAK,KAAK,CAAC,SAAS,OAAO,CAAC;CAC7C,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAC9B,EAAE,KAAK,KAAK,EACZ,YACA,MACA,GAAG,SAAS,SACZ,QACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CACD,OAAA,QAAO,YAAY,MAAM,QAAQ,UAAU,SAAS,QAAQ;CAG5D,MAAM,WAAW,kBAAkB;CACnC,MAAM,EAAE,YAAY,QAAQ,MAAM,IAAI,QAAQ,eAC5C,UACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;CACD,MAAM,WAAW,KAAK,IAAI;CAC1B,MAAM,YAAY,KAAK,IAAI;CAC3B,MAAM,WAAW,KAAK,IAAI;CAC1B,MAAM,QAAQ,MAAM,IAAI,QAAQ,KAC9B,EAAE,KAAK,KAAK,EACZ,YACA,OACA,GAAG,SAAS,SACZ,QACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CACD,OAAA,QAAO,YAAY,MAAM,QAAQ,UAAU,SAAS,QAAQ;;AAG9D,IAAa,eAA+B;CAC1C,MAAM;CACN,UAAU,CAAC,WAAW;CACtB,KAAK;CACN"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require("../scenarios/install-multiple-deps.cjs");
|
|
2
|
-
require("../scenarios/minimum-release-age.cjs");
|
|
3
|
-
const require_index = require("../scenarios/index.cjs");
|
|
4
|
-
const require_audit = require("./audit.cjs");
|
|
5
|
-
const require_ci = require("./ci.cjs");
|
|
6
|
-
const require_deprecate = require("./deprecate.cjs");
|
|
7
|
-
const require_dist_tags = require("./dist-tags.cjs");
|
|
8
|
-
const require_info = require("./info.cjs");
|
|
9
|
-
const require_install = require("./install.cjs");
|
|
10
|
-
const require_login = require("./login.cjs");
|
|
11
|
-
const require_ping = require("./ping.cjs");
|
|
12
|
-
const require_publish = require("./publish.cjs");
|
|
13
|
-
const require_search = require("./search.cjs");
|
|
14
|
-
const require_unpublish = require("./unpublish.cjs");
|
|
15
|
-
//#region src/tests/index.ts
|
|
16
|
-
var allTests = [
|
|
17
|
-
require_publish.publishTest,
|
|
18
|
-
require_install.installTest,
|
|
19
|
-
require_ci.ciTest,
|
|
20
|
-
require_audit.auditTest,
|
|
21
|
-
require_info.infoTest,
|
|
22
|
-
require_deprecate.deprecateTest,
|
|
23
|
-
require_dist_tags.distTagsTest,
|
|
24
|
-
require_login.loginTest,
|
|
25
|
-
require_ping.pingTest,
|
|
26
|
-
require_search.searchTest,
|
|
27
|
-
require_unpublish.unpublishTest,
|
|
28
|
-
...require_index.allScenarios
|
|
29
|
-
];
|
|
30
|
-
//#endregion
|
|
31
|
-
exports.allTests = allTests;
|
|
32
|
-
|
|
33
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/tests/index.ts"],"sourcesContent":["import { allScenarios, installMultipleDepsScenario, minimumReleaseAgeScenario } from '../scenarios';\nimport { TestDefinition } from '../types';\nimport { auditTest } from './audit';\nimport { ciTest } from './ci';\nimport { deprecateTest } from './deprecate';\nimport { distTagsTest } from './dist-tags';\nimport { infoTest } from './info';\nimport { installTest } from './install';\nimport { loginTest } from './login';\nimport { pingTest } from './ping';\nimport { publishTest } from './publish';\nimport { searchTest } from './search';\nimport { unpublishTest } from './unpublish';\n\nexport const allTests: TestDefinition[] = [\n publishTest,\n installTest,\n ciTest,\n auditTest,\n infoTest,\n deprecateTest,\n distTagsTest,\n loginTest,\n pingTest,\n searchTest,\n unpublishTest,\n // Scenarios (complex, multi-step tests)\n ...allScenarios,\n];\n\nexport {\n publishTest,\n installTest,\n ciTest,\n auditTest,\n infoTest,\n deprecateTest,\n distTagsTest,\n loginTest,\n pingTest,\n searchTest,\n unpublishTest,\n // Scenarios\n installMultipleDepsScenario,\n minimumReleaseAgeScenario,\n allScenarios,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAcA,IAAa,WAA6B;CACxC,gBAAA;CACA,gBAAA;CACA,WAAA;CACA,cAAA;CACA,aAAA;CACA,kBAAA;CACA,kBAAA;CACA,cAAA;CACA,aAAA;CACA,eAAA;CACA,kBAAA;CAEA,GAAG,cAAA;CACJ"}
|
package/build/cjs/tests/info.cjs
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
const require_project = require("../utils/project.cjs");
|
|
3
|
-
const require_info = require("../utils/info.cjs");
|
|
4
|
-
let path = require("path");
|
|
5
|
-
let fs_promises = require("fs/promises");
|
|
6
|
-
let assert = require("assert");
|
|
7
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
8
|
-
//#region src/tests/info.ts
|
|
9
|
-
async function testInfo(ctx) {
|
|
10
|
-
const tempFolder = await require_project.createTempFolder("info-test");
|
|
11
|
-
await (0, fs_promises.writeFile)((0, path.join)(tempFolder, "package.json"), JSON.stringify({
|
|
12
|
-
name: "info-test",
|
|
13
|
-
version: "1.0.0"
|
|
14
|
-
}));
|
|
15
|
-
const resp = await ctx.adapter.exec({ cwd: tempFolder }, "info", "verdaccio", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
16
|
-
if (ctx.adapter.type === "yarn-classic") {
|
|
17
|
-
const dataLine = resp.stdout.split("\n").filter(Boolean).find((l) => {
|
|
18
|
-
try {
|
|
19
|
-
return JSON.parse(l).type === "inspect";
|
|
20
|
-
} catch {
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
assert.default.ok(dataLine, "Expected yarn info NDJSON to contain an \"inspect\" entry");
|
|
25
|
-
} else if (ctx.adapter.type === "deno") {
|
|
26
|
-
const output = resp.stdout + resp.stderr;
|
|
27
|
-
assert.default.ok(output.includes("verdaccio"), "Expected deno info output to reference verdaccio");
|
|
28
|
-
} else {
|
|
29
|
-
const parsedBody = require_info.parseInfoJson(resp.stdout);
|
|
30
|
-
assert.default.strictEqual(parsedBody.name, "verdaccio", "Expected package name \"verdaccio\"");
|
|
31
|
-
assert.default.ok(parsedBody.dependencies !== void 0, "Expected \"dependencies\" to be defined");
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
var infoTest = {
|
|
35
|
-
name: "info",
|
|
36
|
-
requires: ["info"],
|
|
37
|
-
run: testInfo
|
|
38
|
-
};
|
|
39
|
-
//#endregion
|
|
40
|
-
exports.infoTest = infoTest;
|
|
41
|
-
|
|
42
|
-
//# sourceMappingURL=info.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info.cjs","names":[],"sources":["../../../src/tests/info.ts"],"sourcesContent":["import assert from 'assert';\nimport { writeFile } from 'fs/promises';\nimport { join } from 'path';\n\nimport { TestContext, TestDefinition } from '../types';\nimport { parseInfoJson } from '../utils/info';\nimport { createTempFolder } from '../utils/project';\n\nasync function testInfo(ctx: TestContext): Promise<void> {\n // Create a minimal temp project so yarn modern has a project context\n // and yarn classic doesn't pick up the repo's packageManager field\n const tempFolder = await createTempFolder('info-test');\n await writeFile(\n join(tempFolder, 'package.json'),\n JSON.stringify({ name: 'info-test', version: '1.0.0' })\n );\n\n const resp = await ctx.adapter.exec(\n { cwd: tempFolder },\n 'info',\n 'verdaccio',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n\n if (ctx.adapter.type === 'yarn-classic') {\n const lines = resp.stdout.split('\\n').filter(Boolean);\n const dataLine = lines.find((l) => {\n try {\n const obj = JSON.parse(l);\n return obj.type === 'inspect';\n } catch {\n return false;\n }\n });\n assert.ok(dataLine, 'Expected yarn info NDJSON to contain an \"inspect\" entry');\n } else if (ctx.adapter.type === 'deno') {\n // deno info npm:<pkg> outputs a text dependency tree\n const output = resp.stdout + resp.stderr;\n assert.ok(output.includes('verdaccio'), 'Expected deno info output to reference verdaccio');\n } else {\n const parsedBody = parseInfoJson(resp.stdout);\n assert.strictEqual(parsedBody.name, 'verdaccio', 'Expected package name \"verdaccio\"');\n assert.ok(parsedBody.dependencies !== undefined, 'Expected \"dependencies\" to be defined');\n }\n}\n\nexport const infoTest: TestDefinition = {\n name: 'info',\n requires: ['info'],\n run: testInfo,\n};\n"],"mappings":";;;;;;;;AAQA,eAAe,SAAS,KAAiC;CAGvD,MAAM,aAAa,MAAM,gBAAA,iBAAiB,YAAY;CACtD,OAAA,GAAA,YAAA,YAAA,GAAA,KAAA,MACO,YAAY,eAAe,EAChC,KAAK,UAAU;EAAE,MAAM;EAAa,SAAS;EAAS,CAAC,CACxD;CAED,MAAM,OAAO,MAAM,IAAI,QAAQ,KAC7B,EAAE,KAAK,YAAY,EACnB,QACA,aACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CAED,IAAI,IAAI,QAAQ,SAAS,gBAAgB;EAEvC,MAAM,WADQ,KAAK,OAAO,MAAM,KAAK,CAAC,OAAO,QAC5B,CAAM,MAAM,MAAM;GACjC,IAAI;IAEF,OADY,KAAK,MAAM,EAChB,CAAI,SAAS;WACd;IACN,OAAO;;IAET;EACF,OAAA,QAAO,GAAG,UAAU,4DAA0D;QACzE,IAAI,IAAI,QAAQ,SAAS,QAAQ;EAEtC,MAAM,SAAS,KAAK,SAAS,KAAK;EAClC,OAAA,QAAO,GAAG,OAAO,SAAS,YAAY,EAAE,mDAAmD;QACtF;EACL,MAAM,aAAa,aAAA,cAAc,KAAK,OAAO;EAC7C,OAAA,QAAO,YAAY,WAAW,MAAM,aAAa,sCAAoC;EACrF,OAAA,QAAO,GAAG,WAAW,iBAAiB,KAAA,GAAW,0CAAwC;;;AAI7F,IAAa,WAA2B;CACtC,MAAM;CACN,UAAU,CAAC,OAAO;CAClB,KAAK;CACN"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let assert = require("assert");
|
|
3
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
4
|
-
//#region src/tests/install.ts
|
|
5
|
-
async function testInstall(ctx) {
|
|
6
|
-
const { tempFolder } = await ctx.adapter.prepareProject(`install-test-${ctx.runId}`, "1.0.0", ctx.registryUrl, ctx.port, ctx.token, { react: "18.2.0" });
|
|
7
|
-
const isNpm = ctx.adapter.type === "npm";
|
|
8
|
-
const args = isNpm ? [
|
|
9
|
-
"install",
|
|
10
|
-
"--json",
|
|
11
|
-
...ctx.adapter.registryArg(ctx.registryUrl)
|
|
12
|
-
] : ["install", ...ctx.adapter.registryArg(ctx.registryUrl)];
|
|
13
|
-
const resp = await ctx.adapter.exec({ cwd: tempFolder }, ...args);
|
|
14
|
-
if (isNpm) {
|
|
15
|
-
const parsedBody = JSON.parse(resp.stdout);
|
|
16
|
-
assert.default.ok(parsedBody.added !== void 0, "Expected \"added\" field in install response");
|
|
17
|
-
} else assert.default.ok(true, "Install completed successfully");
|
|
18
|
-
}
|
|
19
|
-
var installTest = {
|
|
20
|
-
name: "install",
|
|
21
|
-
requires: ["install"],
|
|
22
|
-
run: testInstall
|
|
23
|
-
};
|
|
24
|
-
//#endregion
|
|
25
|
-
exports.installTest = installTest;
|
|
26
|
-
|
|
27
|
-
//# sourceMappingURL=install.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install.cjs","names":[],"sources":["../../../src/tests/install.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function testInstall(ctx: TestContext): Promise<void> {\n const { tempFolder } = await ctx.adapter.prepareProject(\n `install-test-${ctx.runId}`,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token,\n { react: '18.2.0' }\n );\n\n const isNpm = ctx.adapter.type === 'npm';\n\n // pnpm doesn't support --json on install\n const args = isNpm\n ? ['install', '--json', ...ctx.adapter.registryArg(ctx.registryUrl)]\n : ['install', ...ctx.adapter.registryArg(ctx.registryUrl)];\n\n const resp = await ctx.adapter.exec({ cwd: tempFolder }, ...args);\n\n if (isNpm) {\n const parsedBody = JSON.parse(resp.stdout);\n assert.ok(parsedBody.added !== undefined, 'Expected \"added\" field in install response');\n } else {\n // for pnpm/yarn just verify it completed without error (exit code 0)\n assert.ok(true, 'Install completed successfully');\n }\n}\n\nexport const installTest: TestDefinition = {\n name: 'install',\n requires: ['install'],\n run: testInstall,\n};\n"],"mappings":";;;;AAIA,eAAe,YAAY,KAAiC;CAC1D,MAAM,EAAE,eAAe,MAAM,IAAI,QAAQ,eACvC,gBAAgB,IAAI,SACpB,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,OACJ,EAAE,OAAO,UAAU,CACpB;CAED,MAAM,QAAQ,IAAI,QAAQ,SAAS;CAGnC,MAAM,OAAO,QACT;EAAC;EAAW;EAAU,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY;EAAC,GAClE,CAAC,WAAW,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAAC;CAE5D,MAAM,OAAO,MAAM,IAAI,QAAQ,KAAK,EAAE,KAAK,YAAY,EAAE,GAAG,KAAK;CAEjE,IAAI,OAAO;EACT,MAAM,aAAa,KAAK,MAAM,KAAK,OAAO;EAC1C,OAAA,QAAO,GAAG,WAAW,UAAU,KAAA,GAAW,+CAA6C;QAGvF,OAAA,QAAO,GAAG,MAAM,iCAAiC;;AAIrD,IAAa,cAA8B;CACzC,MAAM;CACN,UAAU,CAAC,UAAU;CACrB,KAAK;CACN"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
const require_project = require("../utils/project.cjs");
|
|
3
|
-
let debug = require("debug");
|
|
4
|
-
debug = require_runtime.__toESM(debug, 1);
|
|
5
|
-
let path = require("path");
|
|
6
|
-
let fs_promises = require("fs/promises");
|
|
7
|
-
let js_yaml = require("js-yaml");
|
|
8
|
-
js_yaml = require_runtime.__toESM(js_yaml, 1);
|
|
9
|
-
let assert = require("assert");
|
|
10
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
11
|
-
//#region src/tests/login.ts
|
|
12
|
-
var debug$1 = (0, debug.default)("verdaccio:e2e-cli:test:login");
|
|
13
|
-
/**
|
|
14
|
-
* Creates a project with registry config but WITHOUT auth token,
|
|
15
|
-
* so whoami will use the token saved by login to ~/.yarnrc.yml.
|
|
16
|
-
*/
|
|
17
|
-
async function prepareLoginProject(ctx, name) {
|
|
18
|
-
debug$1("preparing project for %s (no auth token)", name);
|
|
19
|
-
const tempFolder = await require_project.createTempFolder(name);
|
|
20
|
-
const yamlContent = js_yaml.default.dump({
|
|
21
|
-
npmRegistryServer: ctx.registryUrl,
|
|
22
|
-
enableImmutableInstalls: false,
|
|
23
|
-
unsafeHttpWhitelist: ["localhost"]
|
|
24
|
-
});
|
|
25
|
-
await (0, fs_promises.writeFile)((0, path.join)(tempFolder, ".yarnrc.yml"), yamlContent);
|
|
26
|
-
await (0, fs_promises.writeFile)((0, path.join)(tempFolder, "package.json"), JSON.stringify({
|
|
27
|
-
name,
|
|
28
|
-
version: "1.0.0"
|
|
29
|
-
}));
|
|
30
|
-
if (ctx.adapter.importPlugin) {
|
|
31
|
-
debug$1("importing npm-login plugin into %s", tempFolder);
|
|
32
|
-
await ctx.adapter.importPlugin(tempFolder, "npm-login");
|
|
33
|
-
}
|
|
34
|
-
return tempFolder;
|
|
35
|
-
}
|
|
36
|
-
async function yarnLogin(ctx, cwd, user, password, email) {
|
|
37
|
-
debug$1("yarn npm login as %s", user);
|
|
38
|
-
return ctx.adapter.exec({ cwd }, "login", "--auth-type=legacy", `--user=${user}`, `--password=${password}`, `--email=${email}`);
|
|
39
|
-
}
|
|
40
|
-
async function yarnWhoami(ctx, cwd) {
|
|
41
|
-
const resp = await ctx.adapter.exec({ cwd }, "whoami");
|
|
42
|
-
debug$1("yarn npm whoami: %s", resp.stdout);
|
|
43
|
-
return resp.stdout;
|
|
44
|
-
}
|
|
45
|
-
async function testLogin(ctx) {
|
|
46
|
-
const type = ctx.adapter.type;
|
|
47
|
-
const id = ctx.runId;
|
|
48
|
-
if (type !== "yarn-modern") {
|
|
49
|
-
debug$1("login test only supported for yarn-modern, skipping %s", type);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const user1 = `login-a-${id}`;
|
|
53
|
-
const password1 = "test-password-123";
|
|
54
|
-
const email1 = `${user1}@test.example.com`;
|
|
55
|
-
await ctx.subTest("create new user + whoami", async () => {
|
|
56
|
-
const tf = await prepareLoginProject(ctx, `verdaccio-login1-${id}`);
|
|
57
|
-
const loginResp = await yarnLogin(ctx, tf, user1, password1, email1);
|
|
58
|
-
assert.default.ok(loginResp.stdout.includes("Logged in") || loginResp.stdout.includes("token saved"), `Expected login success message but got "${loginResp.stdout}"`);
|
|
59
|
-
const who = await yarnWhoami(ctx, tf);
|
|
60
|
-
assert.default.ok(who.includes(user1), `Expected whoami "${user1}" but got "${who}"`);
|
|
61
|
-
});
|
|
62
|
-
await ctx.subTest("login existing user", async () => {
|
|
63
|
-
const tf = await prepareLoginProject(ctx, `verdaccio-login2-${id}`);
|
|
64
|
-
const loginResp = await yarnLogin(ctx, tf, user1, password1, email1);
|
|
65
|
-
assert.default.ok(loginResp.stdout.includes("Logged in") || loginResp.stdout.includes("token saved"), `Expected login success for existing user but got "${loginResp.stdout}"`);
|
|
66
|
-
const who = await yarnWhoami(ctx, tf);
|
|
67
|
-
assert.default.ok(who.includes(user1), `Expected "${user1}" but got "${who}"`);
|
|
68
|
-
});
|
|
69
|
-
await ctx.subTest("wrong password fails", async () => {
|
|
70
|
-
const tf = await prepareLoginProject(ctx, `verdaccio-login3-${id}`);
|
|
71
|
-
let loginFailed = false;
|
|
72
|
-
try {
|
|
73
|
-
await yarnLogin(ctx, tf, user1, "wrong-password", email1);
|
|
74
|
-
} catch {
|
|
75
|
-
loginFailed = true;
|
|
76
|
-
}
|
|
77
|
-
assert.default.ok(loginFailed, "Login with wrong password should have failed");
|
|
78
|
-
});
|
|
79
|
-
await ctx.subTest("login then publish", async () => {
|
|
80
|
-
const pkgName = `@verdaccio/login-pub-${id}`;
|
|
81
|
-
const tf = await require_project.createTempFolder(`login-pub-${id}`);
|
|
82
|
-
const yamlContent = js_yaml.default.dump({
|
|
83
|
-
npmRegistryServer: ctx.registryUrl,
|
|
84
|
-
enableImmutableInstalls: false,
|
|
85
|
-
unsafeHttpWhitelist: ["localhost"]
|
|
86
|
-
});
|
|
87
|
-
await (0, fs_promises.writeFile)((0, path.join)(tf, ".yarnrc.yml"), yamlContent);
|
|
88
|
-
await (0, fs_promises.writeFile)((0, path.join)(tf, "package.json"), require_project.getPackageJSON(pkgName, "1.0.0"));
|
|
89
|
-
await (0, fs_promises.writeFile)((0, path.join)(tf, "README.md"), require_project.getREADME(pkgName));
|
|
90
|
-
if (ctx.adapter.importPlugin) await ctx.adapter.importPlugin(tf, "npm-login");
|
|
91
|
-
await yarnLogin(ctx, tf, user1, password1, email1);
|
|
92
|
-
await ctx.adapter.exec({ cwd: tf }, "install");
|
|
93
|
-
const pubResp = await ctx.adapter.exec({ cwd: tf }, "publish");
|
|
94
|
-
assert.default.ok(pubResp.stdout.includes("Package archive published"), `Expected publish success but got "${pubResp.stdout}"`);
|
|
95
|
-
});
|
|
96
|
-
await ctx.subTest("switch users", async () => {
|
|
97
|
-
const user2 = `login-b-${id}`;
|
|
98
|
-
const password2 = "other-password-456";
|
|
99
|
-
const email2 = `${user2}@test.example.com`;
|
|
100
|
-
const tf = await prepareLoginProject(ctx, `verdaccio-login5-${id}`);
|
|
101
|
-
await yarnLogin(ctx, tf, user1, password1, email1);
|
|
102
|
-
const who1 = await yarnWhoami(ctx, tf);
|
|
103
|
-
assert.default.ok(who1.includes(user1), `Expected "${user1}" but got "${who1}"`);
|
|
104
|
-
await yarnLogin(ctx, tf, user2, password2, email2);
|
|
105
|
-
const who2 = await yarnWhoami(ctx, tf);
|
|
106
|
-
assert.default.ok(who2.includes(user2), `Expected "${user2}" after switch but got "${who2}"`);
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
var loginTest = {
|
|
110
|
-
name: "login",
|
|
111
|
-
requires: ["login"],
|
|
112
|
-
run: testLogin
|
|
113
|
-
};
|
|
114
|
-
//#endregion
|
|
115
|
-
exports.loginTest = loginTest;
|
|
116
|
-
|
|
117
|
-
//# sourceMappingURL=login.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login.cjs","names":[],"sources":["../../../src/tests/login.ts"],"sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport { writeFile } from 'fs/promises';\nimport YAML from 'js-yaml';\nimport { join } from 'path';\n\nimport { TestContext, TestDefinition } from '../types';\nimport { createTempFolder, getPackageJSON, getREADME } from '../utils/project';\n\nconst debug = buildDebug('verdaccio:e2e-cli:test:login');\n\n/**\n * Creates a project with registry config but WITHOUT auth token,\n * so whoami will use the token saved by login to ~/.yarnrc.yml.\n */\nasync function prepareLoginProject(ctx: TestContext, name: string): Promise<string> {\n debug('preparing project for %s (no auth token)', name);\n const tempFolder = await createTempFolder(name);\n const yamlContent = YAML.dump({\n npmRegistryServer: ctx.registryUrl,\n enableImmutableInstalls: false,\n unsafeHttpWhitelist: ['localhost'],\n });\n await writeFile(join(tempFolder, '.yarnrc.yml'), yamlContent);\n await writeFile(join(tempFolder, 'package.json'), JSON.stringify({ name, version: '1.0.0' }));\n if (ctx.adapter.importPlugin) {\n debug('importing npm-login plugin into %s', tempFolder);\n await ctx.adapter.importPlugin(tempFolder, 'npm-login');\n }\n return tempFolder;\n}\n\nasync function yarnLogin(\n ctx: TestContext,\n cwd: string,\n user: string,\n password: string,\n email: string\n) {\n debug('yarn npm login as %s', user);\n return ctx.adapter.exec(\n { cwd },\n 'login',\n '--auth-type=legacy',\n `--user=${user}`,\n `--password=${password}`,\n `--email=${email}`\n );\n}\n\nasync function yarnWhoami(ctx: TestContext, cwd: string): Promise<string> {\n const resp = await ctx.adapter.exec({ cwd }, 'whoami');\n debug('yarn npm whoami: %s', resp.stdout);\n return resp.stdout;\n}\n\nasync function testLogin(ctx: TestContext): Promise<void> {\n const type = ctx.adapter.type;\n const id = ctx.runId;\n\n if (type !== 'yarn-modern') {\n debug('login test only supported for yarn-modern, skipping %s', type);\n return;\n }\n\n const user1 = `login-a-${id}`;\n const password1 = 'test-password-123';\n const email1 = `${user1}@test.example.com`;\n\n await ctx.subTest('create new user + whoami', async () => {\n const tf = await prepareLoginProject(ctx, `verdaccio-login1-${id}`);\n const loginResp = await yarnLogin(ctx, tf, user1, password1, email1);\n assert.ok(\n loginResp.stdout.includes('Logged in') || loginResp.stdout.includes('token saved'),\n `Expected login success message but got \"${loginResp.stdout}\"`\n );\n const who = await yarnWhoami(ctx, tf);\n assert.ok(who.includes(user1), `Expected whoami \"${user1}\" but got \"${who}\"`);\n });\n\n await ctx.subTest('login existing user', async () => {\n const tf = await prepareLoginProject(ctx, `verdaccio-login2-${id}`);\n const loginResp = await yarnLogin(ctx, tf, user1, password1, email1);\n assert.ok(\n loginResp.stdout.includes('Logged in') || loginResp.stdout.includes('token saved'),\n `Expected login success for existing user but got \"${loginResp.stdout}\"`\n );\n const who = await yarnWhoami(ctx, tf);\n assert.ok(who.includes(user1), `Expected \"${user1}\" but got \"${who}\"`);\n });\n\n await ctx.subTest('wrong password fails', async () => {\n const tf = await prepareLoginProject(ctx, `verdaccio-login3-${id}`);\n let loginFailed = false;\n try {\n await yarnLogin(ctx, tf, user1, 'wrong-password', email1);\n } catch {\n loginFailed = true;\n }\n assert.ok(loginFailed, 'Login with wrong password should have failed');\n });\n\n await ctx.subTest('login then publish', async () => {\n const pkgName = `@verdaccio/login-pub-${id}`;\n const tf = await createTempFolder(`login-pub-${id}`);\n const yamlContent = YAML.dump({\n npmRegistryServer: ctx.registryUrl,\n enableImmutableInstalls: false,\n unsafeHttpWhitelist: ['localhost'],\n });\n await writeFile(join(tf, '.yarnrc.yml'), yamlContent);\n await writeFile(join(tf, 'package.json'), getPackageJSON(pkgName, '1.0.0'));\n await writeFile(join(tf, 'README.md'), getREADME(pkgName));\n if (ctx.adapter.importPlugin) {\n await ctx.adapter.importPlugin(tf, 'npm-login');\n }\n await yarnLogin(ctx, tf, user1, password1, email1);\n await ctx.adapter.exec({ cwd: tf }, 'install');\n const pubResp = await ctx.adapter.exec({ cwd: tf }, 'publish');\n assert.ok(\n pubResp.stdout.includes('Package archive published'),\n `Expected publish success but got \"${pubResp.stdout}\"`\n );\n });\n\n await ctx.subTest('switch users', async () => {\n const user2 = `login-b-${id}`;\n const password2 = 'other-password-456';\n const email2 = `${user2}@test.example.com`;\n const tf = await prepareLoginProject(ctx, `verdaccio-login5-${id}`);\n\n await yarnLogin(ctx, tf, user1, password1, email1);\n const who1 = await yarnWhoami(ctx, tf);\n assert.ok(who1.includes(user1), `Expected \"${user1}\" but got \"${who1}\"`);\n\n await yarnLogin(ctx, tf, user2, password2, email2);\n const who2 = await yarnWhoami(ctx, tf);\n assert.ok(who2.includes(user2), `Expected \"${user2}\" after switch but got \"${who2}\"`);\n });\n}\n\nexport const loginTest: TestDefinition = {\n name: 'login',\n requires: ['login'],\n run: testLogin,\n};\n"],"mappings":"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"}
|
package/build/cjs/tests/ping.cjs
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let assert = require("assert");
|
|
3
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
4
|
-
//#region src/tests/ping.ts
|
|
5
|
-
async function testPing(ctx) {
|
|
6
|
-
const type = ctx.adapter.type;
|
|
7
|
-
const needsProject = type === "yarn-modern";
|
|
8
|
-
let cwd;
|
|
9
|
-
if (needsProject) {
|
|
10
|
-
const { tempFolder } = await ctx.adapter.prepareProject(`verdaccio-ping-${ctx.runId}`, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
11
|
-
cwd = tempFolder;
|
|
12
|
-
if (ctx.adapter.importPlugin) await ctx.adapter.importPlugin(tempFolder, "npm-ping");
|
|
13
|
-
}
|
|
14
|
-
const jsonFlag = type === "yarn-modern" ? [] : ["--json"];
|
|
15
|
-
const resp = await ctx.adapter.exec({ cwd }, "ping", ...jsonFlag, ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
16
|
-
if (type === "yarn-modern") assert.default.ok(true, "ping succeeded");
|
|
17
|
-
else {
|
|
18
|
-
const parsedBody = JSON.parse(resp.stdout);
|
|
19
|
-
assert.default.strictEqual(parsedBody.registry, ctx.registryUrl + "/", `Expected registry "${ctx.registryUrl}/" but got "${parsedBody.registry}"`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
var pingTest = {
|
|
23
|
-
name: "ping",
|
|
24
|
-
requires: ["ping"],
|
|
25
|
-
run: testPing
|
|
26
|
-
};
|
|
27
|
-
//#endregion
|
|
28
|
-
exports.pingTest = pingTest;
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=ping.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ping.cjs","names":[],"sources":["../../../src/tests/ping.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function testPing(ctx: TestContext): Promise<void> {\n const type = ctx.adapter.type;\n const needsProject = type === 'yarn-modern';\n let cwd: string | undefined;\n\n if (needsProject) {\n const { tempFolder } = await ctx.adapter.prepareProject(\n `verdaccio-ping-${ctx.runId}`,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n cwd = tempFolder;\n if (ctx.adapter.importPlugin) {\n await ctx.adapter.importPlugin(tempFolder, 'npm-ping');\n }\n }\n\n const jsonFlag = type === 'yarn-modern' ? [] : ['--json'];\n const resp = await ctx.adapter.exec(\n { cwd },\n 'ping',\n ...jsonFlag,\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n\n if (type === 'yarn-modern') {\n // yarn npm ping succeeding (exit code 0) is sufficient proof the registry is reachable\n assert.ok(true, 'ping succeeded');\n } else {\n const parsedBody = JSON.parse(resp.stdout);\n assert.strictEqual(\n parsedBody.registry,\n ctx.registryUrl + '/',\n `Expected registry \"${ctx.registryUrl}/\" but got \"${parsedBody.registry}\"`\n );\n }\n}\n\nexport const pingTest: TestDefinition = {\n name: 'ping',\n requires: ['ping'],\n run: testPing,\n};\n"],"mappings":";;;;AAIA,eAAe,SAAS,KAAiC;CACvD,MAAM,OAAO,IAAI,QAAQ;CACzB,MAAM,eAAe,SAAS;CAC9B,IAAI;CAEJ,IAAI,cAAc;EAChB,MAAM,EAAE,eAAe,MAAM,IAAI,QAAQ,eACvC,kBAAkB,IAAI,SACtB,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;EACD,MAAM;EACN,IAAI,IAAI,QAAQ,cACd,MAAM,IAAI,QAAQ,aAAa,YAAY,WAAW;;CAI1D,MAAM,WAAW,SAAS,gBAAgB,EAAE,GAAG,CAAC,SAAS;CACzD,MAAM,OAAO,MAAM,IAAI,QAAQ,KAC7B,EAAE,KAAK,EACP,QACA,GAAG,UACH,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CAED,IAAI,SAAS,eAEX,OAAA,QAAO,GAAG,MAAM,iBAAiB;MAC5B;EACL,MAAM,aAAa,KAAK,MAAM,KAAK,OAAO;EAC1C,OAAA,QAAO,YACL,WAAW,UACX,IAAI,cAAc,KAClB,sBAAsB,IAAI,YAAY,cAAc,WAAW,SAAS,GACzE;;;AAIL,IAAa,WAA2B;CACtC,MAAM;CACN,UAAU,CAAC,OAAO;CAClB,KAAK;CACN"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let assert = require("assert");
|
|
3
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
4
|
-
//#region src/tests/publish.ts
|
|
5
|
-
async function testPublish(ctx) {
|
|
6
|
-
const packages = [
|
|
7
|
-
`verdaccio-memory-${ctx.runId}`,
|
|
8
|
-
`verdaccio-${ctx.runId}`,
|
|
9
|
-
`@verdaccio/foo-${ctx.runId}`,
|
|
10
|
-
`@verdaccio/some-foo-${ctx.runId}`
|
|
11
|
-
];
|
|
12
|
-
const type = ctx.adapter.type;
|
|
13
|
-
for (const pkgName of packages) {
|
|
14
|
-
const { tempFolder } = await ctx.adapter.prepareProject(pkgName, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
15
|
-
if (type === "yarn-modern") await ctx.adapter.exec({ cwd: tempFolder }, "install");
|
|
16
|
-
const resp = await ctx.adapter.exec({ cwd: tempFolder }, "publish", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
17
|
-
if (type === "yarn-modern") assert.default.ok(resp.stdout.match(/Package archive published/), `Expected "Package archive published" for ${pkgName} but got "${resp.stdout}"`);
|
|
18
|
-
else if (type === "yarn-classic") assert.default.ok(resp.stdout.length > 0, `Expected publish output for ${pkgName}`);
|
|
19
|
-
else if (type === "bun") assert.default.ok(true, `Publish succeeded for ${pkgName}`);
|
|
20
|
-
else try {
|
|
21
|
-
const parsedBody = JSON.parse(resp.stdout);
|
|
22
|
-
assert.default.strictEqual(parsedBody.name, pkgName, `Expected package name "${pkgName}" but got "${parsedBody.name}"`);
|
|
23
|
-
assert.default.ok(parsedBody.files, `Expected files to be defined for ${pkgName}`);
|
|
24
|
-
} catch {
|
|
25
|
-
assert.default.ok(true, `Publish succeeded for ${pkgName}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
var publishTest = {
|
|
30
|
-
name: "publish",
|
|
31
|
-
requires: ["publish"],
|
|
32
|
-
run: testPublish
|
|
33
|
-
};
|
|
34
|
-
//#endregion
|
|
35
|
-
exports.publishTest = publishTest;
|
|
36
|
-
|
|
37
|
-
//# sourceMappingURL=publish.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"publish.cjs","names":[],"sources":["../../../src/tests/publish.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function testPublish(ctx: TestContext): Promise<void> {\n const packages = [\n `verdaccio-memory-${ctx.runId}`,\n `verdaccio-${ctx.runId}`,\n `@verdaccio/foo-${ctx.runId}`,\n `@verdaccio/some-foo-${ctx.runId}`,\n ];\n\n const type = ctx.adapter.type;\n\n for (const pkgName of packages) {\n const { tempFolder } = await ctx.adapter.prepareProject(\n pkgName,\n '1.0.0',\n ctx.registryUrl,\n ctx.port,\n ctx.token\n );\n\n // yarn modern requires install before publish to generate lockfile\n if (type === 'yarn-modern') {\n await ctx.adapter.exec({ cwd: tempFolder }, 'install');\n }\n\n const resp = await ctx.adapter.exec(\n { cwd: tempFolder },\n 'publish',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n\n if (type === 'yarn-modern') {\n assert.ok(\n resp.stdout.match(/Package archive published/),\n `Expected \"Package archive published\" for ${pkgName} but got \"${resp.stdout}\"`\n );\n } else if (type === 'yarn-classic') {\n // yarn classic --json outputs NDJSON — just verify no error exit (exit code 0 is enough)\n assert.ok(resp.stdout.length > 0, `Expected publish output for ${pkgName}`);\n } else if (type === 'bun') {\n // bun publish outputs text confirmation — exit code 0 is sufficient\n assert.ok(true, `Publish succeeded for ${pkgName}`);\n } else {\n // npm / pnpm\n try {\n const parsedBody = JSON.parse(resp.stdout);\n assert.strictEqual(\n parsedBody.name,\n pkgName,\n `Expected package name \"${pkgName}\" but got \"${parsedBody.name}\"`\n );\n assert.ok(parsedBody.files, `Expected files to be defined for ${pkgName}`);\n } catch {\n // pnpm v11+ native publish doesn't output JSON — exit code 0 is sufficient\n assert.ok(true, `Publish succeeded for ${pkgName}`);\n }\n }\n }\n}\n\nexport const publishTest: TestDefinition = {\n name: 'publish',\n requires: ['publish'],\n run: testPublish,\n};\n"],"mappings":";;;;AAIA,eAAe,YAAY,KAAiC;CAC1D,MAAM,WAAW;EACf,oBAAoB,IAAI;EACxB,aAAa,IAAI;EACjB,kBAAkB,IAAI;EACtB,uBAAuB,IAAI;EAC5B;CAED,MAAM,OAAO,IAAI,QAAQ;CAEzB,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,EAAE,eAAe,MAAM,IAAI,QAAQ,eACvC,SACA,SACA,IAAI,aACJ,IAAI,MACJ,IAAI,MACL;EAGD,IAAI,SAAS,eACX,MAAM,IAAI,QAAQ,KAAK,EAAE,KAAK,YAAY,EAAE,UAAU;EAGxD,MAAM,OAAO,MAAM,IAAI,QAAQ,KAC7B,EAAE,KAAK,YAAY,EACnB,WACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;EAED,IAAI,SAAS,eACX,OAAA,QAAO,GACL,KAAK,OAAO,MAAM,4BAA4B,EAC9C,4CAA4C,QAAQ,YAAY,KAAK,OAAO,GAC7E;OACI,IAAI,SAAS,gBAElB,OAAA,QAAO,GAAG,KAAK,OAAO,SAAS,GAAG,+BAA+B,UAAU;OACtE,IAAI,SAAS,OAElB,OAAA,QAAO,GAAG,MAAM,yBAAyB,UAAU;OAGnD,IAAI;GACF,MAAM,aAAa,KAAK,MAAM,KAAK,OAAO;GAC1C,OAAA,QAAO,YACL,WAAW,MACX,SACA,0BAA0B,QAAQ,aAAa,WAAW,KAAK,GAChE;GACD,OAAA,QAAO,GAAG,WAAW,OAAO,oCAAoC,UAAU;UACpE;GAEN,OAAA,QAAO,GAAG,MAAM,yBAAyB,UAAU;;;;AAM3D,IAAa,cAA8B;CACzC,MAAM;CACN,UAAU,CAAC,UAAU;CACrB,KAAK;CACN"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let assert = require("assert");
|
|
3
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
4
|
-
//#region src/tests/search.ts
|
|
5
|
-
async function testSearch(ctx) {
|
|
6
|
-
const resp = await ctx.adapter.exec({}, "search", "@verdaccio/cli", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
7
|
-
const pkgFind = JSON.parse(resp.stdout).find((item) => item.name === "@verdaccio/cli");
|
|
8
|
-
assert.default.ok(pkgFind, "Expected to find @verdaccio/cli in search results");
|
|
9
|
-
assert.default.strictEqual(pkgFind.name, "@verdaccio/cli");
|
|
10
|
-
}
|
|
11
|
-
var searchTest = {
|
|
12
|
-
name: "search",
|
|
13
|
-
requires: ["search"],
|
|
14
|
-
run: testSearch
|
|
15
|
-
};
|
|
16
|
-
//#endregion
|
|
17
|
-
exports.searchTest = searchTest;
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=search.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.cjs","names":[],"sources":["../../../src/tests/search.ts"],"sourcesContent":["import assert from 'assert';\n\nimport { TestContext, TestDefinition } from '../types';\n\nasync function testSearch(ctx: TestContext): Promise<void> {\n const resp = await ctx.adapter.exec(\n {},\n 'search',\n '@verdaccio/cli',\n '--json',\n ...ctx.adapter.registryArg(ctx.registryUrl)\n );\n const parsedBody = JSON.parse(resp.stdout);\n const pkgFind = parsedBody.find((item: any) => item.name === '@verdaccio/cli');\n assert.ok(pkgFind, 'Expected to find @verdaccio/cli in search results');\n assert.strictEqual(pkgFind.name, '@verdaccio/cli');\n}\n\nexport const searchTest: TestDefinition = {\n name: 'search',\n requires: ['search'],\n run: testSearch,\n};\n"],"mappings":";;;;AAIA,eAAe,WAAW,KAAiC;CACzD,MAAM,OAAO,MAAM,IAAI,QAAQ,KAC7B,EAAE,EACF,UACA,kBACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;CAED,MAAM,UADa,KAAK,MAAM,KAAK,OACnB,CAAW,MAAM,SAAc,KAAK,SAAS,iBAAiB;CAC9E,OAAA,QAAO,GAAG,SAAS,oDAAoD;CACvE,OAAA,QAAO,YAAY,QAAQ,MAAM,iBAAiB;;AAGpD,IAAa,aAA6B;CACxC,MAAM;CACN,UAAU,CAAC,SAAS;CACpB,KAAK;CACN"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let assert = require("assert");
|
|
3
|
-
assert = require_runtime.__toESM(assert, 1);
|
|
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), `Expected unpublish output to contain "${pkgName2}" 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
|
|
@@ -1 +0,0 @@
|
|
|
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),\n `Expected unpublish output to contain \"${pkgName2}\" 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;CAC9D,MAAM,IAAI,QAAQ,KAChB,EAAE,KAAK,YAAY,EACnB,WACA,UACA,GAAG,IAAI,QAAQ,YAAY,IAAI,YAAY,CAC5C;;AAGH,eAAe,YAAY,KAAkB,YAAoB,MAAc;CAC7E,MAAM,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;CACD,MAAM,WAAW,KAAK,WAAW;CACjC,MAAM,YAAY,KAAK,YAAY,QAAQ;CAC3C,MAAM,WAAW,KAAK,WAAW;CACjC,MAAM,YAAY,KAAK,YAAY,QAAQ;CAC3C,MAAM,WAAW,KAAK,WAAW;CACjC,MAAM,YAAY,KAAK,YAAY,QAAQ;CAC3C,MAAM,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;CACD,OAAA,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;CACD,MAAM,WAAW,KAAK,IAAI;CAC1B,MAAM,YAAY,KAAK,KAAK,QAAQ;CACpC,MAAM,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;CACD,OAAA,QAAO,GACL,MAAM,OAAO,SAAS,SAAS,EAC/B,yCAAyC,SAAS,aAAa,MAAM,OAAO,GAC7E;;AAGH,IAAa,gBAAgC;CAC3C,MAAM;CACN,UAAU,CAAC,YAAY;CACvB,KAAK;CACN"}
|
package/build/cjs/utils/info.cjs
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
//#region src/utils/info.ts
|
|
2
|
-
/**
|
|
3
|
-
* Normalize the parsed output of `npm/pnpm info <pkg> --json`.
|
|
4
|
-
*
|
|
5
|
-
* npm 12+ wraps the result in a single-element JSON array
|
|
6
|
-
* (e.g. `[{ "name": "verdaccio", ... }]`) for both full-packument and
|
|
7
|
-
* version-specific queries, whereas older npm versions return a bare object.
|
|
8
|
-
* When multiple results match a range, the array holds one entry per match;
|
|
9
|
-
* the last entry is the highest (latest) version, which is what the tests want.
|
|
10
|
-
*
|
|
11
|
-
* Returns the bare object as-is for backward compatibility.
|
|
12
|
-
*/
|
|
13
|
-
function normalizeInfo(parsed) {
|
|
14
|
-
if (Array.isArray(parsed)) return parsed[parsed.length - 1];
|
|
15
|
-
return parsed;
|
|
16
|
-
}
|
|
17
|
-
/** Parse `info --json` stdout and normalize to a single info object. */
|
|
18
|
-
function parseInfoJson(stdout) {
|
|
19
|
-
return normalizeInfo(JSON.parse(stdout));
|
|
20
|
-
}
|
|
21
|
-
//#endregion
|
|
22
|
-
exports.normalizeInfo = normalizeInfo;
|
|
23
|
-
exports.parseInfoJson = parseInfoJson;
|
|
24
|
-
|
|
25
|
-
//# sourceMappingURL=info.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"info.cjs","names":[],"sources":["../../../src/utils/info.ts"],"sourcesContent":["/**\n * Normalize the parsed output of `npm/pnpm info <pkg> --json`.\n *\n * npm 12+ wraps the result in a single-element JSON array\n * (e.g. `[{ \"name\": \"verdaccio\", ... }]`) for both full-packument and\n * version-specific queries, whereas older npm versions return a bare object.\n * When multiple results match a range, the array holds one entry per match;\n * the last entry is the highest (latest) version, which is what the tests want.\n *\n * Returns the bare object as-is for backward compatibility.\n */\nexport function normalizeInfo(parsed: any): any {\n if (Array.isArray(parsed)) {\n return parsed[parsed.length - 1];\n }\n return parsed;\n}\n\n/** Parse `info --json` stdout and normalize to a single info object. */\nexport function parseInfoJson(stdout: string): any {\n return normalizeInfo(JSON.parse(stdout));\n}\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,cAAc,QAAkB;CAC9C,IAAI,MAAM,QAAQ,OAAO,EACvB,OAAO,OAAO,OAAO,SAAS;CAEhC,OAAO;;;AAIT,SAAgB,cAAc,QAAqB;CACjD,OAAO,cAAc,KAAK,MAAM,OAAO,CAAC"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
let debug = require("debug");
|
|
3
|
-
debug = require_runtime.__toESM(debug, 1);
|
|
4
|
-
let child_process = require("child_process");
|
|
5
|
-
let path = require("path");
|
|
6
|
-
let readline = require("readline");
|
|
7
|
-
//#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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.cjs","names":[],"sources":["../../../src/utils/process.ts"],"sourcesContent":["import { SpawnOptions, spawn } from 'child_process';\nimport buildDebug from 'debug';\nimport { basename } from 'path';\nimport { createInterface } from 'readline';\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(\n options: SpawnOptions,\n cmd: string,\n args: string[]\n): Promise<ExecOutput> {\n debug('start exec %o %o %o', options, cmd, args ? args.join(' ') : '');\n let stdout = '';\n let stderr = '';\n\n if (_verbose) {\n const cwd = options.cwd\n ? ` ${COLORS.dim}(cwd: ${basename(String(options.cwd))})${COLORS.reset}`\n : '';\n process.stdout.write(` ${COLORS.cyan}$${COLORS.reset} ${shortCmd(cmd, args)}${cwd}\\n`);\n }\n\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n stdio: options.stdio || 'pipe',\n env: options.env || process.env,\n };\n\n if (process.platform.startsWith('win')) {\n args.unshift('/c', cmd);\n cmd = 'cmd.exe';\n spawnOptions.stdio = 'pipe';\n }\n\n const start = Date.now();\n const childProcess = spawn(cmd, args, spawnOptions);\n\n if (childProcess.stdout) {\n childProcess.stdout.on('data', (data) => {\n debugRead('data %o', data.toString());\n });\n const rl = createInterface({\n input: childProcess.stdout,\n output: process.stdout,\n terminal: false,\n });\n\n rl.on('line', function (line) {\n debugRead('line %o', line);\n stdout += line;\n });\n }\n\n if (childProcess.stderr) {\n childProcess.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n }\n\n const err = new Error(`Running \"${cmd} ${args.join(' ')}\" returned error code `);\n return new Promise((resolve, reject) => {\n childProcess.on('exit', (code) => {\n const duration = Date.now() - start;\n debugRead('exit %o', code);\n\n if (_verbose) {\n const status = code\n ? `${COLORS.red}exit ${code}${COLORS.reset}`\n : `${COLORS.green}ok${COLORS.reset}`;\n process.stdout.write(\n ` ${COLORS.dim} -> ${status} ${COLORS.dim}(${duration}ms)${COLORS.reset}\\n`\n );\n }\n\n if (!code) {\n resolve({ stdout, stderr });\n } else {\n err.message += `${code}...\\n\\nSTDOUT:\\n${stdout}\\n\\nSTDERR:\\n${stderr}\\n`;\n reject(err);\n }\n });\n });\n}\n"],"mappings":";;;;;;;AAOA,IAAM,WAAA,GAAA,MAAA,SAAmB,4BAA4B;AACrD,IAAM,aAAA,GAAA,MAAA,SAAuB,yBAAyB;AAEtD,IAAI,WAAW;AAEf,SAAgB,WAAW,GAAY;CACrC,WAAW;;AAGb,IAAM,SAAS;CACb,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,QAAQ;CACT;AAED,SAAS,SAAS,KAAa,MAAwB;CAErD,OAAO,IAAA,GAAA,KAAA,UADc,IACX,CAAI,GAAG,KAAK,KAAK,IAAI;;AAGjC,eAAsB,KACpB,SACA,KACA,MACqB;CACrB,QAAM,uBAAuB,SAAS,KAAK,OAAO,KAAK,KAAK,IAAI,GAAG,GAAG;CACtE,IAAI,SAAS;CACb,IAAI,SAAS;CAEb,IAAI,UAAU;EACZ,MAAM,MAAM,QAAQ,MAChB,IAAI,OAAO,IAAI,SAAA,GAAA,KAAA,UAAiB,OAAO,QAAQ,IAAI,CAAC,CAAC,GAAG,OAAO,UAC/D;EACJ,QAAQ,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;CAED,IAAI,QAAQ,SAAS,WAAW,MAAM,EAAE;EACtC,KAAK,QAAQ,MAAM,IAAI;EACvB,MAAM;EACN,aAAa,QAAQ;;CAGvB,MAAM,QAAQ,KAAK,KAAK;CACxB,MAAM,gBAAA,GAAA,cAAA,OAAqB,KAAK,MAAM,aAAa;CAEnD,IAAI,aAAa,QAAQ;EACvB,aAAa,OAAO,GAAG,SAAS,SAAS;GACvC,UAAU,WAAW,KAAK,UAAU,CAAC;IACrC;EAOF,CAAA,GAAA,SAAA,iBAN2B;GACzB,OAAO,aAAa;GACpB,QAAQ,QAAQ;GAChB,UAAU;GACX,CAED,CAAG,GAAG,QAAQ,SAAU,MAAM;GAC5B,UAAU,WAAW,KAAK;GAC1B,UAAU;IACV;;CAGJ,IAAI,aAAa,QACf,aAAa,OAAO,GAAG,SAAS,SAAS;EACvC,UAAU,KAAK,UAAU;GACzB;CAGJ,MAAM,sBAAM,IAAI,MAAM,YAAY,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,wBAAwB;CAChF,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,aAAa,GAAG,SAAS,SAAS;GAChC,MAAM,WAAW,KAAK,KAAK,GAAG;GAC9B,UAAU,WAAW,KAAK;GAE1B,IAAI,UAAU;IACZ,MAAM,SAAS,OACX,GAAG,OAAO,IAAI,OAAO,OAAO,OAAO,UACnC,GAAG,OAAO,MAAM,IAAI,OAAO;IAC/B,QAAQ,OAAO,MACb,SAAS,OAAO,IAAI,OAAO,OAAO,GAAG,OAAO,IAAI,GAAG,SAAS,KAAK,OAAO,MAAM,IAC/E;;GAGH,IAAI,CAAC,MACH,QAAQ;IAAE;IAAQ;IAAQ,CAAC;QACtB;IACL,IAAI,WAAW,GAAG,KAAK,kBAAkB,OAAO,eAAe,OAAO;IACtE,OAAO,IAAI;;IAEb;GACF"}
|