@esha_susan/mockingbird-cli 1.0.0 ā 1.1.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/dist/cli/cli.js +7 -0
- package/dist/cli/init.js +102 -0
- package/package.json +3 -1
package/dist/cli/cli.js
CHANGED
|
@@ -8,12 +8,19 @@ const generator_1 = require("../generator/generator");
|
|
|
8
8
|
const writer_1 = require("../writer/writer");
|
|
9
9
|
const reporter_1 = require("../reporter/reporter");
|
|
10
10
|
const logger_1 = require("../utils/logger");
|
|
11
|
+
const init_1 = require("./init");
|
|
11
12
|
function runCLI() {
|
|
12
13
|
const program = new commander_1.Command();
|
|
13
14
|
program
|
|
14
15
|
.name("mockingbird")
|
|
15
16
|
.description("AI-powered Jest test generator for Express.js APIs")
|
|
16
17
|
.version("1.0.0");
|
|
18
|
+
program
|
|
19
|
+
.command("init")
|
|
20
|
+
.description("Set up your Gemini API key for Mockingbird")
|
|
21
|
+
.action(async () => {
|
|
22
|
+
await (0, init_1.runInit)();
|
|
23
|
+
});
|
|
17
24
|
program
|
|
18
25
|
.command("run")
|
|
19
26
|
.description("Scan a project and generate Jest tests for its API routes")
|
package/dist/cli/init.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.runInit = runInit;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
43
|
+
const logger_1 = require("../utils/logger");
|
|
44
|
+
async function runInit() {
|
|
45
|
+
console.log("\nš¦ Welcome to Mockingbird CLI!\n");
|
|
46
|
+
(0, logger_1.logInfo)("To generate tests, you need a free Google Gemini API key.");
|
|
47
|
+
(0, logger_1.logInfo)("Get one at: https://aistudio.google.com\n");
|
|
48
|
+
const answers = await inquirer_1.default.prompt([
|
|
49
|
+
{
|
|
50
|
+
type: "password",
|
|
51
|
+
name: "apiKey",
|
|
52
|
+
message: "Enter your Gemini API key:",
|
|
53
|
+
mask: "*",
|
|
54
|
+
validate: (input) => {
|
|
55
|
+
if (!input || input.trim().length === 0) {
|
|
56
|
+
return "API key cannot be empty";
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
]);
|
|
62
|
+
const envPath = path.resolve(process.cwd(), ".env");
|
|
63
|
+
const envContent = `GEMINI_API_KEY=${answers.apiKey.trim()}\n`;
|
|
64
|
+
try {
|
|
65
|
+
if (fs.existsSync(envPath)) {
|
|
66
|
+
// Read existing .env content
|
|
67
|
+
const existingContent = fs.readFileSync(envPath, "utf-8");
|
|
68
|
+
if (existingContent.includes("GEMINI_API_KEY")) {
|
|
69
|
+
// Key already exists ā ask before overwriting just that line
|
|
70
|
+
const overwrite = await inquirer_1.default.prompt([
|
|
71
|
+
{
|
|
72
|
+
type: "confirm",
|
|
73
|
+
name: "confirm",
|
|
74
|
+
message: "GEMINI_API_KEY already exists in .env. Update it?",
|
|
75
|
+
default: false
|
|
76
|
+
}
|
|
77
|
+
]);
|
|
78
|
+
if (!overwrite.confirm) {
|
|
79
|
+
(0, logger_1.logInfo)("Keeping existing GEMINI_API_KEY. Setup cancelled.");
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Replace just the GEMINI_API_KEY line, leave everything else untouched
|
|
83
|
+
const updatedContent = existingContent.replace(/GEMINI_API_KEY=.*/, `GEMINI_API_KEY=${answers.apiKey.trim()}`);
|
|
84
|
+
fs.writeFileSync(envPath, updatedContent, "utf-8");
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// .env exists but no GEMINI_API_KEY ā safely append it
|
|
88
|
+
fs.appendFileSync(envPath, `\nGEMINI_API_KEY=${answers.apiKey.trim()}\n`, "utf-8");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// No .env exists ā create a fresh one
|
|
93
|
+
fs.writeFileSync(envPath, envContent, "utf-8");
|
|
94
|
+
}
|
|
95
|
+
(0, logger_1.logSuccess)("\n.env updated successfully!");
|
|
96
|
+
(0, logger_1.logSuccess)("You're all set. Run: mockingbird run <path-to-your-project>");
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
100
|
+
(0, logger_1.logError)(`Failed to update .env file: ${message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@esha_susan/mockingbird-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "AI-powered test generation CLI for Express.js backends",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -31,9 +31,11 @@
|
|
|
31
31
|
"chalk": "^4.1.2",
|
|
32
32
|
"commander": "^15.0.0",
|
|
33
33
|
"dotenv": "^17.4.2",
|
|
34
|
+
"inquirer": "^8.2.7",
|
|
34
35
|
"prettier": "^3.8.3"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
38
|
+
"@types/inquirer": "^8.2.13",
|
|
37
39
|
"@types/jest": "^30.0.0",
|
|
38
40
|
"@types/node": "^25.9.1",
|
|
39
41
|
"jest": "^30.4.2",
|