eddi-cli
Version:
Command line interface to make project-based editing of EDDI personalities possible.
58 lines (48 loc) • 1.83 kB
JavaScript
const path = require('path');
const fs = require('fs/promises');
const writeJson = require('../util/writeJson');
const writeTemplate = require('../template/writeTemplate');
const computeScripts = require('../util/computeScripts');
const log = require('../log');
const { PERSONALITY_FILENAME } = require('../constants');
async function personalityToFiles(personality, options) {
if (!personality) {
return;
}
const personalityDir = path.join(process.cwd(), personality.name);
const backupDir = path.join(personalityDir, 'backup');
try {
await fs.mkdir(personalityDir);
}
catch (e) {
if (e.code === 'EEXIST') {
const personalityFiles = await fs.readdir(personalityDir);
if (personalityFiles.length !== 0) {
log();
log.error(`The folder "${personality.name}" already exists and has files in it.`);
log.error('To prevent `eddi-cli` from overwriting anything, backup the files ' +
'and make sure the folder is empty, before running the command again.');
throw new Error("`eddi-cli` won't create a personality in a folder that already has content.");
}
}
else {
throw e;
}
}
await fs.mkdir(backupDir);
await fs.copyFile(personality.filePath, path.join(backupDir, path.basename(personality.filePath)));
const scripts = await computeScripts(personality.scripts,(script) => {
return writeTemplate(personality, script, personalityDir, {
...options,
personalityDir
});
});
const baseContent = {
name: personality.name,
description: personality.description,
scripts,
_source: personality.filePath,
};
await writeJson(path.join(personalityDir, PERSONALITY_FILENAME), baseContent);
}
module.exports = personalityToFiles;