UNPKG

@argdown/node

Version:

Async Argdown application for node.js

93 lines 3.91 kB
let fs = require("fs"); let path = require("path"); let mkdirp = require("mkdirp"); import defaultsDeep from "lodash.defaultsdeep"; import isString from "lodash.isstring"; import isEmpty from "lodash.isempty"; import isFunction from "lodash.isfunction"; import { ArgdownPluginError } from "@argdown/core"; export class SaveAsFilePlugin { constructor(config) { this.name = "SaveAsFilePlugin"; this.runAsync = async (request, response, logger) => { const settings = this.getSettings(request); if (!settings.dataKey) { throw new ArgdownPluginError(this.name, "missing-dataKey-setting", "No data key."); } let fileContent = !settings.isRequestData ? response[settings.dataKey] : request[settings.dataKey]; if (fileContent === undefined) { throw new ArgdownPluginError(this.name, "missing-content", "No content to save."); } if (!isString(fileContent) && !Buffer.isBuffer(fileContent)) { throw new ArgdownPluginError(this.name, "invalid-content", "Content is neither a string nor a buffer."); } if (isEmpty(fileContent)) { throw new ArgdownPluginError(this.name, "missing-content", "Data field is empty string."); } const dataSettings = !settings.isRequestData && settings.dataKey ? request[settings.dataKey] : null; let fileName = "default"; let outputDir = settings.outputDir; if (request.outputPath) { outputDir = path.dirname(request.outputPath); } else if (dataSettings && dataSettings.outputDir) { outputDir = path.dirname(dataSettings.outputDir); } if (request.outputPath) { fileName = this.getFileName(request.outputPath); } else if (isFunction(settings.fileName)) { fileName = settings.fileName.call(this, settings, request, response); } else if (isString(settings.fileName)) { fileName = settings.fileName; } else if (request.inputPath) { fileName = this.getFileName(request.inputPath); } if (request.outputSuffix) { fileName = fileName + request.outputSuffix; } if (dataSettings && dataSettings.outputDir) { outputDir = dataSettings.outputDir; } if (outputDir && settings.extension) { response.outputPath = await this.saveAsFile(fileContent, outputDir, fileName, settings.extension, logger); } }; this.defaults = defaultsDeep({}, config, { dataKey: "test", extension: ".txt", outputDir: "./output" }); } getSettings(request) { let settings = request.saveAs || {}; settings = defaultsDeep({}, settings, this.defaults); return settings; } getFileName(file) { let extension = path.extname(file); return path.basename(file, extension); } async saveAsFile(data, outputDir, fileName, extension, logger) { let absoluteOutputDir = path.resolve(process.cwd(), outputDir); const outputPath = path.resolve(absoluteOutputDir, fileName + extension); await mkdirp(absoluteOutputDir); await new Promise((resolve, reject) => { fs.writeFile(outputPath, data, function (err) { if (err) { reject(err); } logger.log("verbose", "Saved " + absoluteOutputDir + "/" + fileName + extension); resolve(); }); }); return outputPath; } } //# sourceMappingURL=SaveAsFilePlugin.js.map