Skip to content

Instantly share code, notes, and snippets.

@sukima
Created March 15, 2016 13:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sukima/56c65f8608781dbd88ef to your computer and use it in GitHub Desktop.
Save sukima/56c65f8608781dbd88ef to your computer and use it in GitHub Desktop.
import fs from 'fs';
import mktemp from 'mktemp';
import { spawn } from 'child_process';
export default class Editor {
constructor(editor) {
this.editor = editor || process.env.EDITOR || 'vi';
}
writeFile(file, content) {
return new Promise((resolve, reject) => {
fs.writeFile(file, content, err => {
if (err) {
reject(err);
} else {
resolve(file);
}
});
});
}
readFile(file) {
return new Promise((resolve, reject) => {
fs.readFile(file, (err, content) => {
if (err) {
reject(err);
} else {
resolve({file, content});
}
});
});
}
delFile(file) {
return new Promise((resolve, reject) => {
fs.unlink(file, err => {
if (err) {
reject(err);
} else {
resolve(file);
}
});
});
}
edit(file) {
return new Promise((resolve, reject) => {
spawn(this.editor, [file], {stdio: 'inherit'}).on('exit', code => {
if (code === 0) {
resolve(file);
} else {
reject(new Error(`${editor} had non zero exit code: ${code}`));
}
});
});
}
editContent(origContent) {
return mktemp.createFile('XXXXX.txt')
.then(file => this.writeFile(file, origContent))
.then(file => this.edit(file))
.then(file => this.readFile(file))
.then(({file, content}) => this.delFile(file).then(() => content));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment