| "use strict"; | 
| /*** | 
|  * Node External Editor | 
|  * | 
|  * Kevin Gravier <kevin@mrkmg.com> | 
|  * MIT 2019 | 
|  */ | 
| Object.defineProperty(exports, "__esModule", { value: true }); | 
| var chardet_1 = require("chardet"); | 
| var child_process_1 = require("child_process"); | 
| var fs_1 = require("fs"); | 
| var iconv_lite_1 = require("iconv-lite"); | 
| var tmp_1 = require("tmp"); | 
| var CreateFileError_1 = require("./errors/CreateFileError"); | 
| exports.CreateFileError = CreateFileError_1.CreateFileError; | 
| var LaunchEditorError_1 = require("./errors/LaunchEditorError"); | 
| exports.LaunchEditorError = LaunchEditorError_1.LaunchEditorError; | 
| var ReadFileError_1 = require("./errors/ReadFileError"); | 
| exports.ReadFileError = ReadFileError_1.ReadFileError; | 
| var RemoveFileError_1 = require("./errors/RemoveFileError"); | 
| exports.RemoveFileError = RemoveFileError_1.RemoveFileError; | 
| function edit(text, fileOptions) { | 
|     if (text === void 0) { text = ""; } | 
|     var editor = new ExternalEditor(text, fileOptions); | 
|     editor.run(); | 
|     editor.cleanup(); | 
|     return editor.text; | 
| } | 
| exports.edit = edit; | 
| function editAsync(text, callback, fileOptions) { | 
|     if (text === void 0) { text = ""; } | 
|     var editor = new ExternalEditor(text, fileOptions); | 
|     editor.runAsync(function (err, result) { | 
|         if (err) { | 
|             setImmediate(callback, err, null); | 
|         } | 
|         else { | 
|             try { | 
|                 editor.cleanup(); | 
|                 setImmediate(callback, null, result); | 
|             } | 
|             catch (cleanupError) { | 
|                 setImmediate(callback, cleanupError, null); | 
|             } | 
|         } | 
|     }); | 
| } | 
| exports.editAsync = editAsync; | 
| var ExternalEditor = /** @class */ (function () { | 
|     function ExternalEditor(text, fileOptions) { | 
|         if (text === void 0) { text = ""; } | 
|         this.text = ""; | 
|         this.fileOptions = {}; | 
|         this.text = text; | 
|         if (fileOptions) { | 
|             this.fileOptions = fileOptions; | 
|         } | 
|         this.determineEditor(); | 
|         this.createTemporaryFile(); | 
|     } | 
|     ExternalEditor.splitStringBySpace = function (str) { | 
|         var pieces = []; | 
|         var currentString = ""; | 
|         for (var strIndex = 0; strIndex < str.length; strIndex++) { | 
|             var currentLetter = str[strIndex]; | 
|             if (strIndex > 0 && currentLetter === " " && str[strIndex - 1] !== "\\" && currentString.length > 0) { | 
|                 pieces.push(currentString); | 
|                 currentString = ""; | 
|             } | 
|             else { | 
|                 currentString += currentLetter; | 
|             } | 
|         } | 
|         if (currentString.length > 0) { | 
|             pieces.push(currentString); | 
|         } | 
|         return pieces; | 
|     }; | 
|     Object.defineProperty(ExternalEditor.prototype, "temp_file", { | 
|         get: function () { | 
|             console.log("DEPRECATED: temp_file. Use tempFile moving forward."); | 
|             return this.tempFile; | 
|         }, | 
|         enumerable: true, | 
|         configurable: true | 
|     }); | 
|     Object.defineProperty(ExternalEditor.prototype, "last_exit_status", { | 
|         get: function () { | 
|             console.log("DEPRECATED: last_exit_status. Use lastExitStatus moving forward."); | 
|             return this.lastExitStatus; | 
|         }, | 
|         enumerable: true, | 
|         configurable: true | 
|     }); | 
|     ExternalEditor.prototype.run = function () { | 
|         this.launchEditor(); | 
|         this.readTemporaryFile(); | 
|         return this.text; | 
|     }; | 
|     ExternalEditor.prototype.runAsync = function (callback) { | 
|         var _this = this; | 
|         try { | 
|             this.launchEditorAsync(function () { | 
|                 try { | 
|                     _this.readTemporaryFile(); | 
|                     setImmediate(callback, null, _this.text); | 
|                 } | 
|                 catch (readError) { | 
|                     setImmediate(callback, readError, null); | 
|                 } | 
|             }); | 
|         } | 
|         catch (launchError) { | 
|             setImmediate(callback, launchError, null); | 
|         } | 
|     }; | 
|     ExternalEditor.prototype.cleanup = function () { | 
|         this.removeTemporaryFile(); | 
|     }; | 
|     ExternalEditor.prototype.determineEditor = function () { | 
|         var editor = process.env.VISUAL ? process.env.VISUAL : | 
|             process.env.EDITOR ? process.env.EDITOR : | 
|                 /^win/.test(process.platform) ? "notepad" : | 
|                     "vim"; | 
|         var editorOpts = ExternalEditor.splitStringBySpace(editor).map(function (piece) { return piece.replace("\\ ", " "); }); | 
|         var bin = editorOpts.shift(); | 
|         this.editor = { args: editorOpts, bin: bin }; | 
|     }; | 
|     ExternalEditor.prototype.createTemporaryFile = function () { | 
|         try { | 
|             this.tempFile = tmp_1.tmpNameSync(this.fileOptions); | 
|             var opt = { encoding: "utf8" }; | 
|             if (this.fileOptions.hasOwnProperty("mode")) { | 
|                 opt.mode = this.fileOptions.mode; | 
|             } | 
|             fs_1.writeFileSync(this.tempFile, this.text, opt); | 
|         } | 
|         catch (createFileError) { | 
|             throw new CreateFileError_1.CreateFileError(createFileError); | 
|         } | 
|     }; | 
|     ExternalEditor.prototype.readTemporaryFile = function () { | 
|         try { | 
|             var tempFileBuffer = fs_1.readFileSync(this.tempFile); | 
|             if (tempFileBuffer.length === 0) { | 
|                 this.text = ""; | 
|             } | 
|             else { | 
|                 var encoding = chardet_1.detect(tempFileBuffer).toString(); | 
|                 if (!iconv_lite_1.encodingExists(encoding)) { | 
|                     // Probably a bad idea, but will at least prevent crashing | 
|                     encoding = "utf8"; | 
|                 } | 
|                 this.text = iconv_lite_1.decode(tempFileBuffer, encoding); | 
|             } | 
|         } | 
|         catch (readFileError) { | 
|             throw new ReadFileError_1.ReadFileError(readFileError); | 
|         } | 
|     }; | 
|     ExternalEditor.prototype.removeTemporaryFile = function () { | 
|         try { | 
|             fs_1.unlinkSync(this.tempFile); | 
|         } | 
|         catch (removeFileError) { | 
|             throw new RemoveFileError_1.RemoveFileError(removeFileError); | 
|         } | 
|     }; | 
|     ExternalEditor.prototype.launchEditor = function () { | 
|         try { | 
|             var editorProcess = child_process_1.spawnSync(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" }); | 
|             this.lastExitStatus = editorProcess.status; | 
|         } | 
|         catch (launchError) { | 
|             throw new LaunchEditorError_1.LaunchEditorError(launchError); | 
|         } | 
|     }; | 
|     ExternalEditor.prototype.launchEditorAsync = function (callback) { | 
|         var _this = this; | 
|         try { | 
|             var editorProcess = child_process_1.spawn(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" }); | 
|             editorProcess.on("exit", function (code) { | 
|                 _this.lastExitStatus = code; | 
|                 setImmediate(callback); | 
|             }); | 
|         } | 
|         catch (launchError) { | 
|             throw new LaunchEditorError_1.LaunchEditorError(launchError); | 
|         } | 
|     }; | 
|     return ExternalEditor; | 
| }()); | 
| exports.ExternalEditor = ExternalEditor; |