Skip to content

Commit 28d9641

Browse files
committed
feat: implement new package prompt and new cli
1 parent 9aa9c32 commit 28d9641

File tree

5 files changed

+1166
-1364
lines changed

5 files changed

+1166
-1364
lines changed

package.json

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@
66
"license": "MIT",
77
"main": "./lib/src/index.js",
88
"dependencies": {
9+
"@inquirer/prompts": "^5.5.0",
910
"date-fns": "2.28.0",
1011
"gaxios": "5.0.0",
11-
"ora": "5.4.1",
12-
"prompts": "2.4.2"
12+
"ora": "5.4.1"
1313
},
1414
"devDependencies": {
1515
"@release-it/conventional-changelog": "^8.0.2",
1616
"@types/jest": "27.5.0",
1717
"@types/node": "16.11.7",
18-
"@types/prompts": "2.0.14",
1918
"@typescript-eslint/eslint-plugin": "5.22.0",
2019
"@typescript-eslint/parser": "5.22.0",
2120
"eslint": "8.14.0",
@@ -27,7 +26,7 @@
2726
"release-it": "^17.6.0",
2827
"ts-jest": "28.0.0",
2928
"ts-node": "^10.9.2",
30-
"typescript": "4.6.4"
29+
"typescript": "5.6.2"
3130
},
3231
"scripts": {
3332
"build": "tsc",
@@ -54,14 +53,14 @@
5453
"commitMessage": "chore: release ${version}",
5554
"tagName": "v${version}",
5655
"commitMode": "direct",
57-
"push": true
56+
"push": true,
57+
"branch": "release-candidate"
5858
},
5959
"npm": {
6060
"publish": true
6161
},
6262
"github": {
63-
"release": true,
64-
"web": true
63+
"release": true
6564
},
6665
"plugins": {
6766
"@release-it/conventional-changelog": {
@@ -71,7 +70,7 @@
7170
}
7271
},
7372
"bin": {
74-
"npm-increaser-downloads": "lib/src/cli.js"
73+
"nid": "lib/src/cli.js"
7574
},
7675
"directories": {
7776
"lib": "lib"

src/cli/prompts.spec.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import prompts from "prompts";
1+
import { input, number } from '@inquirer/prompts';
22
import { getPackageName, getNumberOfDownloads, getMaxConcurrentDownloads, getDownloadTimeout, getConfigFromCli } from "./prompts";
33
import { Config } from "../models/config.model";
44

5-
// Mock the prompts module
6-
jest.mock("prompts");
7-
const mockPrompts = prompts as jest.MockedFunction<typeof prompts>;
5+
// Mock the @inquirer/prompts module
6+
jest.mock('@inquirer/prompts', () => ({
7+
input: jest.fn(),
8+
number: jest.fn(),
9+
}));
810

911
describe("cli prompts", () => {
1012
beforeEach(() => {
@@ -13,42 +15,42 @@ describe("cli prompts", () => {
1315

1416
describe("getPackageName", () => {
1517
it("should return the package name when prompted", async () => {
16-
mockPrompts.mockResolvedValue({ value: "test-package" });
18+
(input as jest.Mock).mockResolvedValue("test-package");
1719
const result = await getPackageName();
1820
expect(result).toBe("test-package");
1921
});
2022
});
2123

2224
describe("getNumberOfDownloads", () => {
2325
it("should return the number of downloads when prompted", async () => {
24-
mockPrompts.mockResolvedValue({ value: 1000 });
26+
(number as jest.Mock).mockResolvedValue(1000);
2527
const result = await getNumberOfDownloads();
2628
expect(result).toBe(1000);
2729
});
2830
});
2931

3032
describe("getMaxConcurrentDownloads", () => {
3133
it("should return the max concurrent downloads when prompted", async () => {
32-
mockPrompts.mockResolvedValue({ value: 300 });
34+
(number as jest.Mock).mockResolvedValue(300);
3335
const result = await getMaxConcurrentDownloads();
3436
expect(result).toBe(300);
3537
});
3638
});
3739

3840
describe("getDownloadTimeout", () => {
3941
it("should return the download timeout when prompted", async () => {
40-
mockPrompts.mockResolvedValue({ value: 3000 });
42+
(number as jest.Mock).mockResolvedValue(3000);
4143
const result = await getDownloadTimeout();
4244
expect(result).toBe(3000);
4345
});
4446
});
4547

4648
describe("getConfigFromCli", () => {
4749
it("should return a complete config object when all prompts are answered", async () => {
48-
mockPrompts.mockResolvedValueOnce({ value: "test-package" })
49-
.mockResolvedValueOnce({ value: 1000 })
50-
.mockResolvedValueOnce({ value: 300 })
51-
.mockResolvedValueOnce({ value: 3000 });
50+
(input as jest.Mock).mockResolvedValueOnce("test-package");
51+
(number as jest.Mock).mockResolvedValueOnce(1000)
52+
.mockResolvedValueOnce(300)
53+
.mockResolvedValueOnce(3000);
5254

5355
const expectedConfig: Config = {
5456
packageName: "test-package",

src/cli/prompts.ts

Lines changed: 14 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,39 @@
1-
import prompts, { Answers } from "prompts";
2-
1+
import { input, number } from '@inquirer/prompts';
32
import { Config } from "../models/config.model";
4-
53
import { validateNumbers, validatePackageName } from "./validators";
64

7-
// `prompts` package uses generics which accepts string literal values and then uses those values as types
8-
// This means I have to ensure I use a string literal type that matches a string literal value
9-
const PROMPT_NAME = "value";
10-
type PromptType = "value";
11-
125
export const getPackageName = async (): Promise<string> => {
13-
const promptData: Answers<PromptType> = await prompts({
14-
name: PROMPT_NAME,
15-
type: "text",
6+
return input({
167
message: "Package name: ",
178
validate: (name: string) => validatePackageName(name),
189
});
19-
20-
return promptData[PROMPT_NAME];
2110
};
2211

2312
export const getNumberOfDownloads = async (): Promise<number> => {
24-
const promptData: Answers<PromptType> = await prompts({
25-
name: PROMPT_NAME,
26-
type: "number",
13+
const result = await number({
2714
message: "Number of downloads: ",
28-
initial: 1000,
29-
validate: (downloads: number) => validateNumbers(downloads),
15+
default: 1000,
16+
validate: (downloads: number | undefined) => validateNumbers(downloads),
3017
});
31-
32-
return promptData[PROMPT_NAME];
18+
return result ?? 1000;
3319
};
3420

3521
export const getMaxConcurrentDownloads = async (): Promise<number> => {
36-
const promptData: Answers<PromptType> = await prompts({
37-
name: PROMPT_NAME,
38-
type: "number",
22+
const result = await number({
3923
message: "Number of concurrent downloads: ",
40-
initial: 300,
41-
validate: (downloads: number) => validateNumbers(downloads),
24+
default: 300,
25+
validate: (downloads: number | undefined) => validateNumbers(downloads),
4226
});
43-
44-
return promptData[PROMPT_NAME];
27+
return result ?? 300;
4528
};
4629

4730
export const getDownloadTimeout = async (): Promise<number> => {
48-
const promptData: Answers<PromptType> = await prompts({
49-
name: PROMPT_NAME,
50-
type: "number",
31+
const result = await number({
5132
message: "Time to wait for a download to complete (in ms): ",
52-
initial: 3000,
53-
validate: (downloads: number) => validateNumbers(downloads),
33+
default: 3000,
34+
validate: (downloads: number | undefined) => validateNumbers(downloads),
5435
});
55-
56-
return promptData[PROMPT_NAME];
36+
return result ?? 3000;
5737
};
5838

5939
const getEmptyConfig = (): Config => {

src/spammer/spammer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { NpmjsResponse } from "../models/npmjs-response.model";
55
import { NpmsioResponse } from "../models/npmsio-response.model";
66
import { Stats } from "../models/stats.model";
77
import { getEncodedPackageName, stripOrganisationFromPackageName } from "./utils";
8+
import { terminalSpinner } from "../cli/logger";
89

910
export const getNpmsioResponse = async () => {
1011
const encodedPackageName: string = getEncodedPackageName(getConfig().packageName);
@@ -36,15 +37,18 @@ export const getNpmjsResponse = async (): Promise<NpmjsResponse> => {
3637

3738
export const getVersionPackage = async (): Promise<string> => {
3839
try {
40+
terminalSpinner.start();
3941
const npmioResponse = await getNpmsioResponse();
42+
terminalSpinner.succeed(`Package version found on npms.io with version ${npmioResponse.collected.metadata.version}`);
4043
return npmioResponse.collected.metadata.version;
4144
} catch (npmioError) {
42-
console.log("Package not found in npms.io, trying npmjs.com...");
45+
terminalSpinner.text = "Package not found in npms.io, trying npmjs.com...";
4346
try {
4447
const npmjsResponse = await getNpmjsResponse();
45-
console.log(`Package found on npmjs.com with version ${npmjsResponse.version}`);
48+
terminalSpinner.succeed(`Package found on npmjs.com with version ${npmjsResponse.version}`);
4649
return npmjsResponse.version;
4750
} catch (npmjsError) {
51+
terminalSpinner.fail("Failed to get package version");
4852
throw new Error(`Failed to get package version: ${npmioError.message}, ${npmjsError.message}`);
4953
}
5054
}

0 commit comments

Comments
 (0)