loz 0.2.13 → 0.3.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.
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ // npx mocha -r ts-node/register src/llm/test.ts
13
+ const chai_1 = require("chai");
14
+ const _1 = require(".");
15
+ require("mocha");
16
+ const GITHUB_ACTIONS = process.env.GITHUB_ACTIONS === "true" ? true : false;
17
+ function callback(input) {
18
+ return new Promise((resolve, reject) => {
19
+ console.log(input);
20
+ resolve();
21
+ });
22
+ }
23
+ describe("Test LLM API", () => {
24
+ before(() => { });
25
+ after(() => { });
26
+ it("OpenAI API should generate '2'", function () {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ if (process.env.OPENAI_API_KEY === undefined)
29
+ throw new Error("API_KEY environment variable is not set.");
30
+ const openai = new _1.OpenAiAPI(process.env.OPENAI_API_KEY);
31
+ const settings = {
32
+ model: "gpt-3.5-turbo",
33
+ prompt: "1+1=",
34
+ temperature: 0,
35
+ max_tokens: 60,
36
+ top_p: 1.0,
37
+ stream: true,
38
+ frequency_penalty: 0.0,
39
+ presence_penalty: 0.0,
40
+ };
41
+ const complete = yield openai.completion(settings);
42
+ (0, chai_1.expect)(complete.content).to.equal("2");
43
+ });
44
+ });
45
+ if (GITHUB_ACTIONS === false) {
46
+ it("Llama2 should generate '2'", function () {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const ollama = new _1.OllamaAPI();
49
+ const settings = {
50
+ model: "llama2",
51
+ prompt: "1+1=",
52
+ temperature: 0,
53
+ max_tokens: 60,
54
+ top_p: 1.0,
55
+ stream: true,
56
+ frequency_penalty: 0.0,
57
+ presence_penalty: 0.0,
58
+ };
59
+ const complete = yield ollama.completion(settings);
60
+ console.log(complete.content);
61
+ (0, chai_1.expect)(complete.content.indexOf("2")).to.not.equal(-1);
62
+ });
63
+ });
64
+ }
65
+ if (GITHUB_ACTIONS === false) {
66
+ it("codellama should generate '2'", function () {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ const ollama = new _1.OllamaAPI();
69
+ const settings = {
70
+ model: "codellama",
71
+ prompt: "1+1=",
72
+ temperature: 0,
73
+ max_tokens: 60,
74
+ top_p: 1.0,
75
+ stream: true,
76
+ frequency_penalty: 0.0,
77
+ presence_penalty: 0.0,
78
+ };
79
+ const complete = yield ollama.completion(settings);
80
+ console.log(complete.content);
81
+ (0, chai_1.expect)(complete.content.indexOf("2")).to.not.equal(-1);
82
+ });
83
+ });
84
+ }
85
+ });
86
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/llm/test.ts"],"names":[],"mappings":"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"}
package/dist/loz.js ADDED
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.Loz = void 0;
20
+ const fs = require("fs");
21
+ const path = require("path");
22
+ const os = require("os");
23
+ const readlinePromises = require("readline/promises");
24
+ const llm_1 = require("./llm");
25
+ const prompt_1 = require("./prompt");
26
+ const history_1 = require("./history");
27
+ const utils_1 = require("./utils");
28
+ const constant_1 = require("./constant");
29
+ const config_1 = require("./config");
30
+ const git_1 = require("./git");
31
+ const LOZ_SAFE = process.env.LOZ_SAFE === "true" ? true : false;
32
+ // Get the path to the home directory
33
+ const HOME_PATH = os.homedir() || "";
34
+ const promptForGIT = "Generate a Git commit message based on the following code changes. Ensure the message adheres to the following guidelines:\n\n" +
35
+ "1. Separate the subject from the body with a blank line.\n" +
36
+ "2. Limit the subject line to 50 characters and capitalize it.\n" +
37
+ "3. Use the imperative mood in the subject line.\n" +
38
+ "4. The message should only include the subject and body, focusing on committing message, not the actual commit command.\n" +
39
+ "5. Wrap the body at 72 characters.\n" +
40
+ "6. Use the body to explain the 'what' and 'why', not the 'how'.\n" +
41
+ "7. Do not include the issue number or code diff in the body.\n\n" +
42
+ "Code Changes:\n";
43
+ class Loz {
44
+ constructor() {
45
+ this.config = new config_1.Config();
46
+ this.git = new git_1.Git();
47
+ this.attribution = false;
48
+ this.defaultSettings = {
49
+ model: config_1.DEFAULT_OPENAI_MODEL,
50
+ prompt: "",
51
+ temperature: 0,
52
+ max_tokens: 60,
53
+ top_p: 1.0,
54
+ stream: true,
55
+ frequency_penalty: 0.0,
56
+ presence_penalty: 0.0,
57
+ };
58
+ this.configPath = path.join(HOME_PATH, ".loz");
59
+ const dirPath = (0, utils_1.checkGitRepo)() ? constant_1.LOG_DEV_PATH : this.configPath;
60
+ this.chatHistoryManager = new history_1.ChatHistoryManager(dirPath);
61
+ }
62
+ init() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ if ((0, utils_1.checkGitRepo)() === true) {
65
+ if (!fs.existsSync(constant_1.LOG_DEV_PATH)) {
66
+ fs.mkdirSync(constant_1.LOG_DEV_PATH);
67
+ }
68
+ }
69
+ yield this.initLLMfromConfig();
70
+ });
71
+ }
72
+ // load config from JSON file
73
+ initLLMfromConfig() {
74
+ var _a, _b, _c, _d;
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ if (!fs.existsSync(this.configPath)) {
77
+ fs.mkdirSync(this.configPath);
78
+ }
79
+ yield this.config.loadConfig(this.configPath);
80
+ const api = this.checkAPI() || "openai";
81
+ if (api === "ollama") {
82
+ const result = yield (0, utils_1.runShellCommand)("ollama --version");
83
+ if (constant_1.DEBUG)
84
+ console.log(result);
85
+ if (result.indexOf("ollama") === -1) {
86
+ console.log("Please install ollama with llama2 and codellama first: see https://ollama.ai/download \n");
87
+ process.exit(1);
88
+ }
89
+ this.llmAPI = new llm_1.OllamaAPI();
90
+ this.defaultSettings.model =
91
+ ((_a = this.config.get("model")) === null || _a === void 0 ? void 0 : _a.value) || config_1.DEFAULT_OLLAMA_MODEL;
92
+ return;
93
+ }
94
+ // For OpenAI API
95
+ let apiKey = (_b = this.config.get("openai.apikey")) === null || _b === void 0 ? void 0 : _b.value;
96
+ if (!apiKey) {
97
+ const rl = readlinePromises.createInterface({
98
+ input: process.stdin,
99
+ output: process.stdout,
100
+ });
101
+ apiKey = yield (0, config_1.requestApiKey)(rl);
102
+ this.config.set("openai.apikey", apiKey);
103
+ this.config.save();
104
+ rl.close();
105
+ }
106
+ this.llmAPI = new llm_1.OpenAiAPI(apiKey);
107
+ this.defaultSettings.model =
108
+ ((_c = this.config.get("model")) === null || _c === void 0 ? void 0 : _c.value) || config_1.DEFAULT_OPENAI_MODEL;
109
+ // Check if the attribution is enabled
110
+ const attributionValue = (_d = this.config.get("attribution")) === null || _d === void 0 ? void 0 : _d.value;
111
+ if (attributionValue === "false") {
112
+ this.config.set("attribution", "false");
113
+ this.attribution = false;
114
+ }
115
+ else {
116
+ if (attributionValue === "true") {
117
+ this.attribution = true;
118
+ }
119
+ else {
120
+ this.attribution = false;
121
+ }
122
+ }
123
+ });
124
+ }
125
+ checkAPI() {
126
+ var _a;
127
+ //console.log("API: " + this.config.get("api")?.value);
128
+ return (_a = this.config.get("api")) === null || _a === void 0 ? void 0 : _a.value;
129
+ }
130
+ completeUserPrompt(prompt) {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ const params = this.defaultSettings;
133
+ params.max_tokens = 500;
134
+ params.prompt = prompt;
135
+ const completion = yield this.llmAPI.completion(params);
136
+ const promptAndCompleteText = {
137
+ mode: "",
138
+ model: completion.model,
139
+ prompt: prompt,
140
+ answer: completion.content,
141
+ };
142
+ this.chatHistoryManager.addChat(promptAndCompleteText);
143
+ return completion;
144
+ });
145
+ }
146
+ runGitCommit() {
147
+ return __awaiter(this, void 0, void 0, function* () {
148
+ let diff = yield this.git.getDiffFromStaged();
149
+ // Remove the first line of the diff
150
+ diff = diff.replace(/.*\n/, "");
151
+ const prompt = promptForGIT + diff + "\n" + "Commit Message: ";
152
+ const params = this.defaultSettings;
153
+ params.max_tokens = 500;
154
+ params.prompt = prompt;
155
+ const complete = yield this.llmAPI.completion(params);
156
+ if (complete.content === "") {
157
+ console.log("Failed to generate a commit message");
158
+ return undefined;
159
+ }
160
+ try {
161
+ if (this.attribution) {
162
+ yield this.git.commit(complete.content + "\n\nGenerated by " + complete.model);
163
+ }
164
+ else {
165
+ yield this.git.commit(complete.content);
166
+ }
167
+ const commitHEAD = yield this.git.showHEAD();
168
+ console.log("\n# Generated commit message: \n");
169
+ console.log(commitHEAD);
170
+ }
171
+ catch (error) {
172
+ console.log(error);
173
+ return undefined;
174
+ }
175
+ const promptAndCompleteText = {
176
+ mode: "loz commit mode",
177
+ model: complete.model,
178
+ prompt: prompt,
179
+ answer: complete.content,
180
+ };
181
+ this.chatHistoryManager.addChat(promptAndCompleteText);
182
+ return complete.content;
183
+ });
184
+ }
185
+ // git diff | loz --git
186
+ generateGitCommitMessage(diff) {
187
+ return __awaiter(this, void 0, void 0, function* () {
188
+ if (constant_1.DEBUG)
189
+ console.log("writeGitCommitMessage");
190
+ const params = this.defaultSettings;
191
+ params.max_tokens = 500;
192
+ params.prompt = promptForGIT + diff + "\n" + "Commit Message: ";
193
+ const completion = yield this.llmAPI.completion(params);
194
+ const promptAndCompleteText = {
195
+ mode: "loz --git",
196
+ model: completion.model,
197
+ prompt: params.prompt,
198
+ answer: completion.content,
199
+ };
200
+ this.chatHistoryManager.addChat(promptAndCompleteText);
201
+ return completion;
202
+ });
203
+ }
204
+ // Interactive mode
205
+ runCompletion(params) {
206
+ var _a, e_1, _b, _c;
207
+ var _d, _e;
208
+ return __awaiter(this, void 0, void 0, function* () {
209
+ let curCompleteText = "";
210
+ if (this.checkAPI() === "openai") {
211
+ let stream;
212
+ try {
213
+ stream = yield this.llmAPI.completionStream(params);
214
+ }
215
+ catch (error) {
216
+ console.log(error.message + ":");
217
+ if (error.response) {
218
+ // console.log(error.response.data);
219
+ if (error.response.status === 401) {
220
+ console.log("Invalid API key");
221
+ }
222
+ else if (error.response.status === 429) {
223
+ console.log("API request limit reached");
224
+ }
225
+ }
226
+ process.exit();
227
+ }
228
+ try {
229
+ try {
230
+ for (var _f = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield stream_1.next(), _a = stream_1_1.done, !_a; _f = true) {
231
+ _c = stream_1_1.value;
232
+ _f = false;
233
+ const data = _c;
234
+ if (data === null)
235
+ return;
236
+ const streamData = ((_e = (_d = data.choices[0]) === null || _d === void 0 ? void 0 : _d.delta) === null || _e === void 0 ? void 0 : _e.content) || "";
237
+ curCompleteText += streamData;
238
+ process.stdout.write(streamData);
239
+ }
240
+ }
241
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
242
+ finally {
243
+ try {
244
+ if (!_f && !_a && (_b = stream_1.return)) yield _b.call(stream_1);
245
+ }
246
+ finally { if (e_1) throw e_1.error; }
247
+ }
248
+ process.stdout.write("\n");
249
+ }
250
+ catch (error) {
251
+ console.error("An error occurred during OpenAI request: ", error);
252
+ }
253
+ }
254
+ else {
255
+ const complete = yield this.llmAPI.completion(params);
256
+ curCompleteText = complete.content;
257
+ process.stdout.write(curCompleteText);
258
+ process.stdout.write("\n");
259
+ }
260
+ const promptAndCompleteText = {
261
+ mode: "interactive",
262
+ model: params.model,
263
+ prompt: params.prompt,
264
+ answer: curCompleteText,
265
+ };
266
+ this.chatHistoryManager.addChat(promptAndCompleteText);
267
+ });
268
+ }
269
+ runPromptInteractiveMode() {
270
+ return new Promise((resolve, reject) => {
271
+ const cli = new prompt_1.CommandLinePrompt((input) => __awaiter(this, void 0, void 0, function* () {
272
+ const tokens = input.split(" ");
273
+ if (input === "exit" || input === "quit") {
274
+ cli.exit();
275
+ resolve("Done");
276
+ return;
277
+ }
278
+ else if (input.indexOf("config") === 0 && tokens.length <= 3) {
279
+ yield this.handleConfigCommand(tokens);
280
+ }
281
+ else if (input.length !== 0) {
282
+ const params = this.defaultSettings;
283
+ params.prompt = input;
284
+ params.max_tokens = 4000;
285
+ yield this.runCompletion(params);
286
+ }
287
+ cli.prompt();
288
+ }));
289
+ cli.start(true);
290
+ });
291
+ }
292
+ handleConfigCommand(tokens) {
293
+ return __awaiter(this, void 0, void 0, function* () {
294
+ if (tokens.length === 3) {
295
+ if (this.config.set(tokens[1], tokens[2]) === false) {
296
+ return;
297
+ }
298
+ if (this.config.get(tokens[1]) !== undefined) {
299
+ console.log(`The ${tokens[1]} has been updated to '${tokens[2]}'`);
300
+ }
301
+ this.config.save();
302
+ // Restart the interactive mode.
303
+ yield this.initLLMfromConfig();
304
+ }
305
+ else if (tokens.length === 2) {
306
+ console.log(this.config.get(tokens[1]));
307
+ }
308
+ else if (tokens.length === 1) {
309
+ this.config.print();
310
+ }
311
+ else {
312
+ console.log("Invalid command");
313
+ }
314
+ });
315
+ }
316
+ setAPI(api, model) {
317
+ return __awaiter(this, void 0, void 0, function* () {
318
+ if (api === "ollama" || api === "openai") {
319
+ this.config.set("api", api);
320
+ }
321
+ if (model) {
322
+ this.config.set("model", model);
323
+ }
324
+ this.config.save();
325
+ yield this.initLLMfromConfig();
326
+ });
327
+ }
328
+ handlePrompt(prompt) {
329
+ return __awaiter(this, void 0, void 0, function* () {
330
+ const systemPrompt = "Decide if the following prompt can be translated into Linux commands. " +
331
+ "If yes, generate only the corresponding Linux commands in JSON format, assuming the current directory is '.'. " +
332
+ "If no, provide an explanation in plain text.\n\n" +
333
+ "Input: " +
334
+ prompt +
335
+ "\nResponse: ";
336
+ const completion = yield this.completeUserPrompt(systemPrompt + prompt);
337
+ // If the completion is not a JSON object, but a plain text.
338
+ if (!completion.content.startsWith("{")) {
339
+ console.log(completion.content);
340
+ const promptAndCompleteText = {
341
+ mode: "regular mode",
342
+ model: completion.model,
343
+ prompt: systemPrompt,
344
+ answer: completion.content,
345
+ };
346
+ this.chatHistoryManager.addChat(promptAndCompleteText);
347
+ return;
348
+ }
349
+ if (constant_1.DEBUG)
350
+ console.log(completion.content);
351
+ let json;
352
+ try {
353
+ json = JSON.parse(completion.content);
354
+ if (constant_1.DEBUG)
355
+ console.log(JSON.stringify(json, null, 2));
356
+ }
357
+ catch (error) {
358
+ console.error("Error parsing JSON:", error);
359
+ return;
360
+ }
361
+ let linuxCommand = json.commands ? json.commands : json.command;
362
+ if (json.arguments && json.arguments.length > 0) {
363
+ linuxCommand += " " + json.arguments.join(" ");
364
+ }
365
+ // Add the command to the chat history
366
+ const promptAndCompleteText = {
367
+ mode: "command generation mode",
368
+ model: completion.model,
369
+ prompt: systemPrompt,
370
+ answer: completion,
371
+ };
372
+ this.chatHistoryManager.addChat(promptAndCompleteText);
373
+ if (!LOZ_SAFE) {
374
+ try {
375
+ yield (0, utils_1.runCommand)(linuxCommand);
376
+ }
377
+ catch (error) {
378
+ if (error.indexOf("No output") === 0)
379
+ console.log(error);
380
+ else
381
+ console.error("Error running command:", error);
382
+ }
383
+ return;
384
+ }
385
+ let answer = "n";
386
+ try {
387
+ const rl = readlinePromises.createInterface({
388
+ input: process.stdin,
389
+ output: process.stdout,
390
+ });
391
+ answer = yield rl.question(`Do you want to run this command?: ${linuxCommand} (y/n) `);
392
+ rl.close();
393
+ }
394
+ catch (error) {
395
+ console.error("Error during user interaction:", error);
396
+ }
397
+ if (answer.toLowerCase() === "y") {
398
+ try {
399
+ yield (0, utils_1.runCommand)(linuxCommand);
400
+ }
401
+ catch (error) {
402
+ if (error.indexOf("No output") === 0)
403
+ console.log(error);
404
+ else
405
+ console.error("Error running command:", error);
406
+ }
407
+ }
408
+ });
409
+ }
410
+ close() {
411
+ this.chatHistoryManager.saveChatHistory();
412
+ }
413
+ }
414
+ exports.Loz = Loz;
415
+ //# sourceMappingURL=loz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loz.js","sourceRoot":"","sources":["../src/loz.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CommandLinePrompt = void 0;
13
+ const readline = require("readline");
14
+ class CommandLinePrompt {
15
+ constructor(callback) {
16
+ // ...
17
+ this.callback = callback;
18
+ this.rl = readline.createInterface({
19
+ input: process.stdin,
20
+ output: process.stdout,
21
+ });
22
+ }
23
+ prompt() {
24
+ this.rl.prompt();
25
+ }
26
+ start(blinking) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ // Set the prompt to display before each input
29
+ this.rl.setPrompt("> ");
30
+ // Show the cursor and prompt the user for input
31
+ this.rl.prompt();
32
+ // Set the terminal to raw mode to allow for cursor manipulation
33
+ process.stdin.setRawMode(true);
34
+ // Display a blinking cursor
35
+ if (blinking) {
36
+ this.timer = setInterval(() => {
37
+ process.stdout.write("\x1B[?25h");
38
+ setTimeout(() => {
39
+ process.stdout.write("\x1B[?25l");
40
+ }, 500);
41
+ }, 1000);
42
+ }
43
+ // Listen for user input
44
+ this.rl.on("line", (input) => __awaiter(this, void 0, void 0, function* () {
45
+ this.rl.prompt();
46
+ yield this.callback(input);
47
+ }));
48
+ // Handle CTRL+C to exit the program
49
+ this.rl.on("SIGINT", () => {
50
+ clearInterval(this.timer);
51
+ this.rl.close();
52
+ });
53
+ });
54
+ }
55
+ exit() {
56
+ clearInterval(this.timer);
57
+ // Show the cursor
58
+ process.stdout.write("\x1B[?25h");
59
+ // Try to enable cursor blinking
60
+ process.stdout.write("\x1B[?12h");
61
+ // Reset the terminal to the normal mode
62
+ process.stdin.setRawMode(false);
63
+ this.rl.close();
64
+ }
65
+ }
66
+ exports.CommandLinePrompt = CommandLinePrompt;
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompt/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAAqC;AAMrC,MAAa,iBAAiB;IAK5B,YAAY,QAA0C;QACpD,MAAM;QACN,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACnB,CAAC;IAEY,KAAK,CAAC,QAAkB;;YACnC,8CAA8C;YAC9C,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAExB,gDAAgD;YAChD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YAEjB,gEAAgE;YAChE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAE/B,4BAA4B;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;oBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAClC,UAAU,CAAC,GAAG,EAAE;wBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBACpC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACV,CAAC,EAAE,IAAI,CAAC,CAAC;YACX,CAAC;YAED,wBAAwB;YACxB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAO,KAAK,EAAE,EAAE;gBACjC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAA,CAAC,CAAC;YAEH,oCAAoC;YACpC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEM,IAAI;QACT,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,kBAAkB;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,gCAAgC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AA7DD,8CA6DC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const chai_1 = require("chai");
13
+ const _1 = require(".");
14
+ require("mocha");
15
+ const mockStdin = require("mock-stdin");
16
+ const GITHUB_ACTIONS = process.env.GITHUB_ACTIONS === "true" ? true : false;
17
+ function callback(input) {
18
+ return new Promise((resolve, reject) => {
19
+ console.log(input);
20
+ resolve();
21
+ });
22
+ }
23
+ describe("Test prompt", () => {
24
+ let stdin;
25
+ before(() => {
26
+ stdin = mockStdin.stdin();
27
+ });
28
+ after(() => {
29
+ stdin.restore();
30
+ });
31
+ it("callback should work", function () {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ this.timeout(5000);
34
+ process.nextTick(() => {
35
+ stdin.send("loz\n");
36
+ });
37
+ const cli = new _1.CommandLinePrompt((input) => __awaiter(this, void 0, void 0, function* () {
38
+ (0, chai_1.expect)(input).to.equal("loz");
39
+ return Promise.resolve();
40
+ }));
41
+ yield cli.start();
42
+ cli.exit();
43
+ });
44
+ });
45
+ it("test should end without runnig cli.exit()", function () {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ this.timeout(5000);
48
+ process.nextTick(() => {
49
+ stdin.send("exit\n");
50
+ });
51
+ const cli = new _1.CommandLinePrompt((input) => __awaiter(this, void 0, void 0, function* () {
52
+ (0, chai_1.expect)(input).to.equal("exit");
53
+ return Promise.resolve();
54
+ }));
55
+ yield cli.start();
56
+ });
57
+ });
58
+ });
59
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/prompt/test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA8B;AAC9B,wBAAsC;AACtC,iBAAe;AACf,wCAAwC;AAExC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAE5E,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,KAA0B,CAAC;IAE/B,MAAM,CAAC,GAAG,EAAE;QACV,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACT,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE;;YACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnB,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACpB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,IAAI,oBAAiB,CAAC,CAAO,KAAa,EAAE,EAAE;gBACxD,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC,CAAA,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;KAAA,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE;;YAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAEnB,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,IAAI,oBAAiB,CAAC,CAAO,KAAa,EAAE,EAAE;gBACxD,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC/B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC,CAAA,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}