123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- "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;
|