@verdaccio/e2e-cli 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/adapters/adapter.d.ts +1 -0
- package/build/adapters/index.d.ts +4 -0
- package/build/adapters/npm.d.ts +2 -0
- package/build/adapters/pnpm.d.ts +2 -0
- package/build/adapters/yarn-classic.d.ts +2 -0
- package/build/adapters/yarn-modern.d.ts +2 -0
- package/build/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/build/cjs/adapters/index.cjs +4 -0
- package/build/cjs/adapters/npm.cjs +47 -0
- package/build/cjs/adapters/npm.cjs.map +1 -0
- package/build/cjs/adapters/pnpm.cjs +47 -0
- package/build/cjs/adapters/pnpm.cjs.map +1 -0
- package/build/cjs/adapters/yarn-classic.cjs +64 -0
- package/build/cjs/adapters/yarn-classic.cjs.map +1 -0
- package/build/cjs/adapters/yarn-modern.cjs +83 -0
- package/build/cjs/adapters/yarn-modern.cjs.map +1 -0
- package/build/cjs/index.cjs +139 -0
- package/build/cjs/index.cjs.map +1 -0
- package/build/cjs/reporter.cjs +60 -0
- package/build/cjs/reporter.cjs.map +1 -0
- package/build/cjs/runner.cjs +102 -0
- package/build/cjs/runner.cjs.map +1 -0
- package/build/cjs/tests/audit.cjs +27 -0
- package/build/cjs/tests/audit.cjs.map +1 -0
- package/build/cjs/tests/deprecate.cjs +67 -0
- package/build/cjs/tests/deprecate.cjs.map +1 -0
- package/build/cjs/tests/dist-tags.cjs +43 -0
- package/build/cjs/tests/dist-tags.cjs.map +1 -0
- package/build/cjs/tests/index.cjs +27 -0
- package/build/cjs/tests/index.cjs.map +1 -0
- package/build/cjs/tests/info.cjs +38 -0
- package/build/cjs/tests/info.cjs.map +1 -0
- package/build/cjs/tests/install.cjs +28 -0
- package/build/cjs/tests/install.cjs.map +1 -0
- package/build/cjs/tests/ping.cjs +18 -0
- package/build/cjs/tests/ping.cjs.map +1 -0
- package/build/cjs/tests/publish.cjs +34 -0
- package/build/cjs/tests/publish.cjs.map +1 -0
- package/build/cjs/tests/search.cjs +19 -0
- package/build/cjs/tests/search.cjs.map +1 -0
- package/build/cjs/tests/star.cjs +27 -0
- package/build/cjs/tests/star.cjs.map +1 -0
- package/build/cjs/tests/unpublish.cjs +40 -0
- package/build/cjs/tests/unpublish.cjs.map +1 -0
- package/build/cjs/utils/process.cjs +85 -0
- package/build/cjs/utils/process.cjs.map +1 -0
- package/build/cjs/utils/project.cjs +55 -0
- package/build/cjs/utils/project.cjs.map +1 -0
- package/build/cjs/utils/registry-client.cjs +61 -0
- package/build/cjs/utils/registry-client.cjs.map +1 -0
- package/build/esm/adapters/index.js +5 -0
- package/build/esm/adapters/npm.js +45 -0
- package/build/esm/adapters/npm.js.map +1 -0
- package/build/esm/adapters/pnpm.js +45 -0
- package/build/esm/adapters/pnpm.js.map +1 -0
- package/build/esm/adapters/yarn-classic.js +62 -0
- package/build/esm/adapters/yarn-classic.js.map +1 -0
- package/build/esm/adapters/yarn-modern.js +80 -0
- package/build/esm/adapters/yarn-modern.js.map +1 -0
- package/build/esm/index.js +129 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/reporter.js +56 -0
- package/build/esm/reporter.js.map +1 -0
- package/build/esm/runner.js +99 -0
- package/build/esm/runner.js.map +1 -0
- package/build/esm/tests/audit.js +25 -0
- package/build/esm/tests/audit.js.map +1 -0
- package/build/esm/tests/deprecate.js +65 -0
- package/build/esm/tests/deprecate.js.map +1 -0
- package/build/esm/tests/dist-tags.js +41 -0
- package/build/esm/tests/dist-tags.js.map +1 -0
- package/build/esm/tests/index.js +27 -0
- package/build/esm/tests/index.js.map +1 -0
- package/build/esm/tests/info.js +36 -0
- package/build/esm/tests/info.js.map +1 -0
- package/build/esm/tests/install.js +26 -0
- package/build/esm/tests/install.js.map +1 -0
- package/build/esm/tests/ping.js +16 -0
- package/build/esm/tests/ping.js.map +1 -0
- package/build/esm/tests/publish.js +32 -0
- package/build/esm/tests/publish.js.map +1 -0
- package/build/esm/tests/search.js +17 -0
- package/build/esm/tests/search.js.map +1 -0
- package/build/esm/tests/star.js +25 -0
- package/build/esm/tests/star.js.map +1 -0
- package/build/esm/tests/unpublish.js +38 -0
- package/build/esm/tests/unpublish.js.map +1 -0
- package/build/esm/utils/process.js +82 -0
- package/build/esm/utils/process.js.map +1 -0
- package/build/esm/utils/project.js +50 -0
- package/build/esm/utils/project.js.map +1 -0
- package/build/esm/utils/registry-client.js +57 -0
- package/build/esm/utils/registry-client.js.map +1 -0
- package/build/index.d.ts +5 -0
- package/build/reporter.d.ts +6 -0
- package/build/runner.d.ts +13 -0
- package/build/tests/audit.d.ts +2 -0
- package/build/tests/deprecate.d.ts +2 -0
- package/build/tests/dist-tags.d.ts +2 -0
- package/build/tests/index.d.ts +13 -0
- package/build/tests/info.d.ts +2 -0
- package/build/tests/install.d.ts +2 -0
- package/build/tests/ping.d.ts +2 -0
- package/build/tests/publish.d.ts +2 -0
- package/build/tests/search.d.ts +2 -0
- package/build/tests/star.d.ts +2 -0
- package/build/tests/unpublish.d.ts +2 -0
- package/build/types.d.ts +65 -0
- package/build/utils/index.d.ts +3 -0
- package/build/utils/process.d.ts +5 -0
- package/build/utils/project.d.ts +6 -0
- package/build/utils/registry-client.d.ts +14 -0
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import assert from "assert";
|
|
2
|
+
//#region src/tests/unpublish.ts
|
|
3
|
+
async function publishPkg(ctx, tempFolder) {
|
|
4
|
+
await ctx.adapter.exec({ cwd: tempFolder }, "publish", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
5
|
+
}
|
|
6
|
+
async function bumpVersion(ctx, tempFolder, bump) {
|
|
7
|
+
await ctx.adapter.exec({ cwd: tempFolder }, "version", bump, "--no--git-tag-version", "--loglevel=info", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
8
|
+
}
|
|
9
|
+
async function testUnpublish(ctx) {
|
|
10
|
+
const id = ctx.runId;
|
|
11
|
+
const pkgName = `@verdaccio/unpub1-${id}`;
|
|
12
|
+
const { tempFolder } = await ctx.adapter.prepareProject(pkgName, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
13
|
+
await publishPkg(ctx, tempFolder);
|
|
14
|
+
await bumpVersion(ctx, tempFolder, "minor");
|
|
15
|
+
await publishPkg(ctx, tempFolder);
|
|
16
|
+
await bumpVersion(ctx, tempFolder, "minor");
|
|
17
|
+
await publishPkg(ctx, tempFolder);
|
|
18
|
+
await bumpVersion(ctx, tempFolder, "major");
|
|
19
|
+
await publishPkg(ctx, tempFolder);
|
|
20
|
+
const resp = await ctx.adapter.exec({ cwd: tempFolder }, "unpublish", pkgName, "--force", "--loglevel=info", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
21
|
+
assert.ok(resp.stdout.includes(pkgName), `Expected unpublish output to contain "${pkgName}" but got "${resp.stdout}"`);
|
|
22
|
+
const pkgName2 = `@verdaccio/unpub2-${id}`;
|
|
23
|
+
const { tempFolder: tf2 } = await ctx.adapter.prepareProject(pkgName2, "1.0.0", ctx.registryUrl, ctx.port, ctx.token);
|
|
24
|
+
await publishPkg(ctx, tf2);
|
|
25
|
+
await bumpVersion(ctx, tf2, "minor");
|
|
26
|
+
await publishPkg(ctx, tf2);
|
|
27
|
+
const resp2 = await ctx.adapter.exec({ cwd: tf2 }, "unpublish", `${pkgName2}@1.0.0`, "--force", "--loglevel=info", "--json", ...ctx.adapter.registryArg(ctx.registryUrl));
|
|
28
|
+
assert.ok(resp2.stdout.includes(`${pkgName2}@1.0.0`), `Expected unpublish output to contain "${pkgName2}@1.0.0" but got "${resp2.stdout}"`);
|
|
29
|
+
}
|
|
30
|
+
var unpublishTest = {
|
|
31
|
+
name: "unpublish",
|
|
32
|
+
requires: ["unpublish"],
|
|
33
|
+
run: testUnpublish
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
export { unpublishTest };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=unpublish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpublish.js","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,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,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,82 @@
|
|
|
1
|
+
import buildDebug from "debug";
|
|
2
|
+
import { spawn } from "child_process";
|
|
3
|
+
import { createInterface } from "readline";
|
|
4
|
+
import { basename } from "path";
|
|
5
|
+
//#region src/utils/process.ts
|
|
6
|
+
var debug = buildDebug("verdaccio:e2e-cli:process");
|
|
7
|
+
var debugRead = buildDebug("verdaccio:e2e-cli:line");
|
|
8
|
+
var _verbose = false;
|
|
9
|
+
function setVerbose(v) {
|
|
10
|
+
_verbose = v;
|
|
11
|
+
}
|
|
12
|
+
var COLORS = {
|
|
13
|
+
reset: "\x1B[0m",
|
|
14
|
+
dim: "\x1B[2m",
|
|
15
|
+
cyan: "\x1B[36m",
|
|
16
|
+
green: "\x1B[32m",
|
|
17
|
+
red: "\x1B[31m",
|
|
18
|
+
yellow: "\x1B[33m"
|
|
19
|
+
};
|
|
20
|
+
function shortCmd(cmd, args) {
|
|
21
|
+
return `${basename(cmd)} ${args.join(" ")}`;
|
|
22
|
+
}
|
|
23
|
+
async function exec(options, cmd, args) {
|
|
24
|
+
debug("start exec %o %o %o", options, cmd, args ? args.join(" ") : "");
|
|
25
|
+
let stdout = "";
|
|
26
|
+
let stderr = "";
|
|
27
|
+
if (_verbose) {
|
|
28
|
+
const cwd = options.cwd ? ` ${COLORS.dim}(cwd: ${basename(String(options.cwd))})${COLORS.reset}` : "";
|
|
29
|
+
process.stdout.write(` ${COLORS.cyan}$${COLORS.reset} ${shortCmd(cmd, args)}${cwd}\n`);
|
|
30
|
+
}
|
|
31
|
+
const spawnOptions = {
|
|
32
|
+
cwd: options.cwd,
|
|
33
|
+
stdio: options.stdio || "pipe",
|
|
34
|
+
env: options.env || process.env
|
|
35
|
+
};
|
|
36
|
+
if (process.platform.startsWith("win")) {
|
|
37
|
+
args.unshift("/c", cmd);
|
|
38
|
+
cmd = "cmd.exe";
|
|
39
|
+
spawnOptions.stdio = "pipe";
|
|
40
|
+
}
|
|
41
|
+
const start = Date.now();
|
|
42
|
+
const childProcess = spawn(cmd, args, spawnOptions);
|
|
43
|
+
if (childProcess.stdout) {
|
|
44
|
+
childProcess.stdout.on("data", (data) => {
|
|
45
|
+
debugRead("data %o", data.toString());
|
|
46
|
+
});
|
|
47
|
+
createInterface({
|
|
48
|
+
input: childProcess.stdout,
|
|
49
|
+
output: process.stdout,
|
|
50
|
+
terminal: false
|
|
51
|
+
}).on("line", function(line) {
|
|
52
|
+
debugRead("line %o", line);
|
|
53
|
+
stdout += line;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (childProcess.stderr) childProcess.stderr.on("data", (data) => {
|
|
57
|
+
stderr += data.toString();
|
|
58
|
+
});
|
|
59
|
+
const err = /* @__PURE__ */ new Error(`Running "${cmd} ${args.join(" ")}" returned error code `);
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
childProcess.on("exit", (code) => {
|
|
62
|
+
const duration = Date.now() - start;
|
|
63
|
+
debugRead("exit %o", code);
|
|
64
|
+
if (_verbose) {
|
|
65
|
+
const status = code ? `${COLORS.red}exit ${code}${COLORS.reset}` : `${COLORS.green}ok${COLORS.reset}`;
|
|
66
|
+
process.stdout.write(` ${COLORS.dim} -> ${status} ${COLORS.dim}(${duration}ms)${COLORS.reset}\n`);
|
|
67
|
+
}
|
|
68
|
+
if (!code) resolve({
|
|
69
|
+
stdout,
|
|
70
|
+
stderr
|
|
71
|
+
});
|
|
72
|
+
else {
|
|
73
|
+
err.message += `${code}...\n\nSTDOUT:\n${stdout}\n\nSTDERR:\n${stderr}\n`;
|
|
74
|
+
reject(err);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { exec, setVerbose };
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","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,QAAQ,WAAW,4BAA4B;AACrD,IAAM,YAAY,WAAW,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,GADK,SAAS,IAAI,CACX,GAAG,KAAK,KAAK,IAAI;;AAGjC,eAAsB,KAAK,SAAuB,KAAa,MAAqC;AAClG,OAAM,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,QAAQ,SAAS,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,eAAe,MAAM,KAAK,MAAM,aAAa;AAEnD,KAAI,aAAa,QAAQ;AACvB,eAAa,OAAO,GAAG,SAAS,SAAS;AACvC,aAAU,WAAW,KAAK,UAAU,CAAC;IACrC;AACS,kBAAgB;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,50 @@
|
|
|
1
|
+
import buildDebug from "debug";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { mkdtemp, writeFile } from "fs/promises";
|
|
4
|
+
import { tmpdir } from "os";
|
|
5
|
+
//#region src/utils/project.ts
|
|
6
|
+
var debug = buildDebug("verdaccio:e2e-cli:project");
|
|
7
|
+
async function createTempFolder(prefix) {
|
|
8
|
+
const sanitized = prefix.replace(/[^a-zA-Z0-9-_]/g, "-");
|
|
9
|
+
debug("creating temp folder %o", sanitized);
|
|
10
|
+
return mkdtemp(join(tmpdir(), `verdaccio-e2e-${sanitized}-`));
|
|
11
|
+
}
|
|
12
|
+
function getPackageJSON(packageName, version = "1.0.0", dependencies = {}, devDependencies = {}) {
|
|
13
|
+
debug("creating package.json %o", packageName);
|
|
14
|
+
return JSON.stringify({
|
|
15
|
+
name: packageName,
|
|
16
|
+
version,
|
|
17
|
+
description: "some cool project",
|
|
18
|
+
main: "index.js",
|
|
19
|
+
scripts: { test: "echo exit 1" },
|
|
20
|
+
dependencies,
|
|
21
|
+
devDependencies,
|
|
22
|
+
keywords: ["foo", "bar"],
|
|
23
|
+
author: "Verdaccio E2E <verdaccio@example.org>",
|
|
24
|
+
license: "MIT"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function getREADME(packageName) {
|
|
28
|
+
return `
|
|
29
|
+
# My README ${packageName}
|
|
30
|
+
|
|
31
|
+
some text
|
|
32
|
+
|
|
33
|
+
## subtitle
|
|
34
|
+
|
|
35
|
+
more text
|
|
36
|
+
`;
|
|
37
|
+
}
|
|
38
|
+
async function prepareGenericEmptyProject(packageName, version, port, token, registryDomain, dependencies = {}, devDependencies = {}) {
|
|
39
|
+
debug("preparing generic project %o", packageName);
|
|
40
|
+
const getNPMrc = (port, token, registry) => `//localhost:${port}/:_authToken=${token}\nregistry=${registry}`;
|
|
41
|
+
const tempFolder = await createTempFolder("temp-folder");
|
|
42
|
+
await writeFile(join(tempFolder, "package.json"), getPackageJSON(packageName, version, dependencies, devDependencies));
|
|
43
|
+
await writeFile(join(tempFolder, "README.md"), getREADME(packageName));
|
|
44
|
+
await writeFile(join(tempFolder, ".npmrc"), getNPMrc(port, token, registryDomain));
|
|
45
|
+
return { tempFolder };
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { createTempFolder, getPackageJSON, getREADME, prepareGenericEmptyProject };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","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,QAAQ,WAAW,4BAA4B;AAErD,eAAsB,iBAAiB,QAAiC;CACtE,MAAM,YAAY,OAAO,QAAQ,mBAAmB,IAAI;AACxD,OAAM,2BAA2B,UAAU;AAC3C,QAAO,QAAQ,KAAK,QAAQ,EAAE,iBAAiB,UAAU,GAAG,CAAC;;AAG/D,SAAgB,eACd,aACA,UAAU,SACV,eAAuC,EAAE,EACzC,kBAA0C,EAAE,EACpC;AACR,OAAM,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,OAAM,gCAAgC,YAAY;CAClD,MAAM,YAAY,MAAc,OAAe,aAC7C,eAAe,KAAK,eAAe,MAAM,aAAa;CACxD,MAAM,aAAa,MAAM,iBAAiB,cAAc;AACxD,OAAM,UACJ,KAAK,YAAY,eAAe,EAChC,eAAe,aAAa,SAAS,cAAc,gBAAgB,CACpE;AACD,OAAM,UAAU,KAAK,YAAY,YAAY,EAAE,UAAU,YAAY,CAAC;AACtE,OAAM,UAAU,KAAK,YAAY,SAAS,EAAE,SAAS,MAAM,OAAO,eAAe,CAAC;AAClF,QAAO,EAAE,YAAY"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import buildDebug from "debug";
|
|
2
|
+
import got from "got";
|
|
3
|
+
//#region src/utils/registry-client.ts
|
|
4
|
+
var debug = buildDebug("verdaccio:e2e-cli:registry-client");
|
|
5
|
+
/**
|
|
6
|
+
* Creates a user on the registry and returns the auth token.
|
|
7
|
+
* Uses a unique username per run to avoid 409 conflicts.
|
|
8
|
+
* Works against any running Verdaccio instance with htpasswd auth.
|
|
9
|
+
*/
|
|
10
|
+
async function createUser(registryUrl, user = `e2e-user-${Date.now()}`, password = "e2e-test-password") {
|
|
11
|
+
debug("creating user %s on %s", user, registryUrl);
|
|
12
|
+
const url = `${registryUrl}/-/user/org.couchdb.user:${encodeURIComponent(user)}`;
|
|
13
|
+
const response = await got.put(url, {
|
|
14
|
+
json: {
|
|
15
|
+
name: user,
|
|
16
|
+
password,
|
|
17
|
+
_id: `org.couchdb.user:${user}`,
|
|
18
|
+
type: "user",
|
|
19
|
+
roles: [],
|
|
20
|
+
date: (/* @__PURE__ */ new Date()).toISOString()
|
|
21
|
+
},
|
|
22
|
+
responseType: "json",
|
|
23
|
+
throwHttpErrors: false,
|
|
24
|
+
retry: { limit: 0 }
|
|
25
|
+
});
|
|
26
|
+
const body = response.body;
|
|
27
|
+
if (response.statusCode === 201 || response.statusCode === 200 || response.statusCode === 409) {
|
|
28
|
+
const token = body.token;
|
|
29
|
+
if (token) {
|
|
30
|
+
debug("user %s authenticated, token obtained", user);
|
|
31
|
+
return {
|
|
32
|
+
token,
|
|
33
|
+
user
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw new Error(`Failed to create/login user "${user}" on ${registryUrl}: ${response.statusCode} ${JSON.stringify(body)}`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Ping the registry to check it's alive.
|
|
41
|
+
*/
|
|
42
|
+
async function pingRegistry(registryUrl) {
|
|
43
|
+
debug("pinging %s", registryUrl);
|
|
44
|
+
try {
|
|
45
|
+
return (await got.get(`${registryUrl}/-/ping`, {
|
|
46
|
+
throwHttpErrors: false,
|
|
47
|
+
retry: { limit: 2 },
|
|
48
|
+
timeout: { request: 5e3 }
|
|
49
|
+
})).statusCode === 200;
|
|
50
|
+
} catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { createUser, pingRegistry };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=registry-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.js","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,QAAQ,WAAW,oCAAoC;;;;;;AAY7D,eAAsB,WACpB,aACA,OAAO,YAAY,KAAK,KAAK,IAC7B,WAAW,qBACY;AACvB,OAAM,0BAA0B,MAAM,YAAY;CAClD,MAAM,MAAM,GAAG,YAAY,2BAA2B,mBAAmB,KAAK;CAC9E,MAAM,WAAW,MAAM,IAAI,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,SAAM,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,OAAM,cAAc,YAAY;AAChC,KAAI;AAMF,UALiB,MAAM,IAAI,IAAI,GAAG,YAAY,UAAU;GACtD,iBAAiB;GACjB,OAAO,EAAE,OAAO,GAAG;GACnB,SAAS,EAAE,SAAS,KAAM;GAC3B,CAAC,EACc,eAAe;SACzB;AACN,SAAO"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function main(argv?: string[]): Promise<void>;
|
|
2
|
+
export { allTests } from './tests';
|
|
3
|
+
export { createNpmAdapter, createPnpmAdapter, createYarnClassicAdapter, createYarnModernAdapter } from './adapters';
|
|
4
|
+
export { runAll, runSuite } from './runner';
|
|
5
|
+
export type { PackageManagerAdapter, TestDefinition, TestContext, CliOptions } from './types';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SuiteResult, TestResult } from './types';
|
|
2
|
+
export declare function reportTestStart(adapterName: string, testName: string): void;
|
|
3
|
+
export declare function reportTestResult(result: TestResult): void;
|
|
4
|
+
export declare function reportSuiteStart(adapterName: string): void;
|
|
5
|
+
export declare function reportSkipped(testName: string): void;
|
|
6
|
+
export declare function reportSummary(results: SuiteResult[]): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PackageManagerAdapter, SuiteResult, TestDefinition } from './types';
|
|
2
|
+
export declare function runSuite(adapter: PackageManagerAdapter, tests: TestDefinition[], registryUrl: string, token: string, options: {
|
|
3
|
+
timeout: number;
|
|
4
|
+
testFilter?: string[];
|
|
5
|
+
}): Promise<SuiteResult>;
|
|
6
|
+
export declare function runAll(adapters: PackageManagerAdapter[], tests: TestDefinition[], registryUrl: string, token: string, options: {
|
|
7
|
+
timeout: number;
|
|
8
|
+
concurrency: number;
|
|
9
|
+
testFilter?: string[];
|
|
10
|
+
}): Promise<{
|
|
11
|
+
results: SuiteResult[];
|
|
12
|
+
exitCode: number;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { TestDefinition } from '../types';
|
|
2
|
+
import { auditTest } from './audit';
|
|
3
|
+
import { deprecateTest } from './deprecate';
|
|
4
|
+
import { distTagsTest } from './dist-tags';
|
|
5
|
+
import { infoTest } from './info';
|
|
6
|
+
import { installTest } from './install';
|
|
7
|
+
import { pingTest } from './ping';
|
|
8
|
+
import { publishTest } from './publish';
|
|
9
|
+
import { searchTest } from './search';
|
|
10
|
+
import { starTest } from './star';
|
|
11
|
+
import { unpublishTest } from './unpublish';
|
|
12
|
+
export declare const allTests: TestDefinition[];
|
|
13
|
+
export { publishTest, installTest, auditTest, infoTest, deprecateTest, distTagsTest, pingTest, searchTest, starTest, unpublishTest, };
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { SpawnOptions } from 'child_process';
|
|
3
|
+
export type ExecOutput = {
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
};
|
|
7
|
+
export type ExecFn = (options: SpawnOptions, ...args: string[]) => Promise<ExecOutput>;
|
|
8
|
+
export type TestContext = {
|
|
9
|
+
registryUrl: string;
|
|
10
|
+
token: string;
|
|
11
|
+
port: number;
|
|
12
|
+
exec: ExecFn;
|
|
13
|
+
adapter: PackageManagerAdapter;
|
|
14
|
+
/** Unique suffix for package names to avoid conflicts across runs */
|
|
15
|
+
runId: string;
|
|
16
|
+
};
|
|
17
|
+
export type TestResult = {
|
|
18
|
+
name: string;
|
|
19
|
+
passed: boolean;
|
|
20
|
+
duration: number;
|
|
21
|
+
error?: string;
|
|
22
|
+
};
|
|
23
|
+
export type SuiteResult = {
|
|
24
|
+
adapter: string;
|
|
25
|
+
tests: TestResult[];
|
|
26
|
+
passed: number;
|
|
27
|
+
failed: number;
|
|
28
|
+
skipped: number;
|
|
29
|
+
duration: number;
|
|
30
|
+
};
|
|
31
|
+
export type TestDefinition = {
|
|
32
|
+
name: string;
|
|
33
|
+
run: (ctx: TestContext) => Promise<void>;
|
|
34
|
+
/** Commands required for this test (e.g. 'deprecate', 'star'). Skipped if adapter doesn't support them. */
|
|
35
|
+
requires?: string[];
|
|
36
|
+
};
|
|
37
|
+
export interface PackageManagerAdapter {
|
|
38
|
+
/** Display name, e.g. "npm@10" */
|
|
39
|
+
name: string;
|
|
40
|
+
/** Package manager type: npm, pnpm, yarn-classic, yarn-modern */
|
|
41
|
+
type: 'npm' | 'pnpm' | 'yarn-classic' | 'yarn-modern';
|
|
42
|
+
/** Resolved path to the binary */
|
|
43
|
+
bin: string;
|
|
44
|
+
/** Commands this PM supports */
|
|
45
|
+
supports: Set<string>;
|
|
46
|
+
/** Build --registry args */
|
|
47
|
+
registryArg(url: string): string[];
|
|
48
|
+
/** Build --prefix / --cwd args */
|
|
49
|
+
prefixArg(folder: string): string[];
|
|
50
|
+
/** Execute a command with this PM */
|
|
51
|
+
exec(options: SpawnOptions, ...args: string[]): Promise<ExecOutput>;
|
|
52
|
+
/** Prepare a temp project for testing. Returns path to temp folder. */
|
|
53
|
+
prepareProject(packageName: string, version: string, registryUrl: string, port: number, token: string, dependencies?: Record<string, string>, devDependencies?: Record<string, string>): Promise<{
|
|
54
|
+
tempFolder: string;
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
57
|
+
export type CliOptions = {
|
|
58
|
+
registry: string;
|
|
59
|
+
pm?: string[];
|
|
60
|
+
test?: string[];
|
|
61
|
+
concurrency: number;
|
|
62
|
+
timeout: number;
|
|
63
|
+
token?: string;
|
|
64
|
+
verbose: boolean;
|
|
65
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { SpawnOptions } from 'child_process';
|
|
3
|
+
import { ExecOutput } from '../types';
|
|
4
|
+
export declare function setVerbose(v: boolean): void;
|
|
5
|
+
export declare function exec(options: SpawnOptions, cmd: string, args: string[]): Promise<ExecOutput>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function createTempFolder(prefix: string): Promise<string>;
|
|
2
|
+
export declare function getPackageJSON(packageName: string, version?: string, dependencies?: Record<string, string>, devDependencies?: Record<string, string>): string;
|
|
3
|
+
export declare function getREADME(packageName: string): string;
|
|
4
|
+
export declare function prepareGenericEmptyProject(packageName: string, version: string, port: number, token: string, registryDomain: string, dependencies?: Record<string, string>, devDependencies?: Record<string, string>): Promise<{
|
|
5
|
+
tempFolder: string;
|
|
6
|
+
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type RegistryAuth = {
|
|
2
|
+
token: string;
|
|
3
|
+
user: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Creates a user on the registry and returns the auth token.
|
|
7
|
+
* Uses a unique username per run to avoid 409 conflicts.
|
|
8
|
+
* Works against any running Verdaccio instance with htpasswd auth.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createUser(registryUrl: string, user?: string, password?: string): Promise<RegistryAuth>;
|
|
11
|
+
/**
|
|
12
|
+
* Ping the registry to check it's alive.
|
|
13
|
+
*/
|
|
14
|
+
export declare function pingRegistry(registryUrl: string): Promise<boolean>;
|