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