Fă backup unui folder cu BACKUP() și RESTORE() și rulează comenzi cu SHELL()
BACKUP(filename, directory, [callback], [filter])împachetează un director (cu subdirectoarele lui) într-un singur fișier și se rezolvă cu{ filename, files, size }. Un fișier existent cu acel nume este înlocuit. Fără callback returnează o promisiune.RESTORE(filename, directory, [callback], [filter])despachetează un fișier făcut cuBACKUP()într-un director, creând folderele necesare, și se rezolvă cu{ files, size, path }.SHELL(command, [callback], [cwd])rulează o comandă de shell și se rezolvă cu ieșirea ei (stdout). Folderul este cel al proiectului sau textul pe care îl dai ca ultim argument. Când comanda eșuează, promisiunea este respinsă cu o eroare al căreicodeeste codul de ieșire. Cu un callback este apelat cacallback(err, stdout, stderr).
SHELL() rulează exact textul pe care i-l dai: nu construi niciodată comanda din ceea ce a trimis un utilizator.
const Fs = require('fs');
const Path = require('path');
exports.install = function() {
ROUTE('GET /backup/', backup);
ROUTE('GET /shell/', shell);
};
async function backup($) {
// a folder with a file and a subfolder
const source = PATH.tmp('source');
Fs.rmSync(source, { recursive: true, force: true });
Fs.mkdirSync(Path.join(source, 'sub'), { recursive: true });
Fs.writeFileSync(Path.join(source, 'a.txt'), 'hello');
Fs.writeFileSync(Path.join(source, 'sub', 'b.txt'), 'world');
const file = PATH.tmp('folder.backup');
const packed = await BACKUP(file, source);
const target = PATH.tmp('restored');
Fs.rmSync(target, { recursive: true, force: true });
const unpacked = await RESTORE(file, target);
$.json({
packed: [packed.files, packed.filename === file, Fs.existsSync(file)],
unpacked: [unpacked.files, unpacked.size, unpacked.path === target],
content: [Fs.readFileSync(Path.join(target, 'a.txt'), 'utf8'), Fs.readFileSync(Path.join(target, 'sub', 'b.txt'), 'utf8')]
});
}
async function shell($) {
const output = await SHELL('echo hello');
const where = await SHELL('pwd', PATH.tmp());
let code = null;
try {
await SHELL('exit 3');
} catch (e) {
code = e.code;
}
SHELL('echo from callback', (err, stdout) => $.json({ output: output, where: where.trim() === PATH.tmp() || where.trim().endsWith('/tmp'), code: code, callback: stdout }));
}