UNPKG

@itkyk/ftp-controller

Version:

## How to use this module. 1. Npm module install ``` $ npm i -D @itkyk/ftp-controller ```

137 lines (136 loc) 5.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.certification = void 0; const Util_1 = __importDefault(require("./Util")); const FtpDeploy = require("ftp-deploy"); const fs = require("fs"); const ftpDeploy = new FtpDeploy(); const readline = require("readline"); let bar = ""; let fileTotalCount = null; const defaultOptions = { user: "anonymous", password: "anonymous", host: "", localRoot: `./dist/`, remoteRoot: "/htdocs/", include: ["*", "**/*"], deleteRemote: false, forcePasv: false }; const getEnvData = (option) => { return require("dotenv").config({ path: `./ftp/.env.${option.deploy}` }); }; const transformObject = (option) => { const result = getEnvData(option).parsed; const resultOptions = result; if (result.port) { resultOptions.port = Number(result.port); } if (result.include) { resultOptions.include = result.include.split(","); } if (result.exclude) { resultOptions.exclude = result.exclude.split(","); } if (result.deleteRemote) { resultOptions.deleteRemote = result.deleteRemote === "true" ? true : false; } if (result.forcePasv) { resultOptions.forcePasv = result.forcePasv === "true" ? true : false; } if (result.sftp) { resultOptions.sftp = result.sftp === "true" ? true : false; } if (result.privateKey) { resultOptions.privateKey = fs.readFileSync(result.privateKey); } const options = Object.assign(defaultOptions, resultOptions); return options; }; const createBar = (_fileUpdatedRate) => { bar = ""; for (let k = 0; k <= 100; k += 10) { if (k <= _fileUpdatedRate) { bar += '\u001b[34m\u2588\u001b[0m'; } else { bar += '\u001b[0m\u2588'; } } }; const pushLogFile = (data) => { let pushText = ""; for (let i = 0; i < data.length; i++) { pushText = pushText + `Status: ${data[i].uploaded}, Date: ${data[i].date}, File: ${data[i].name}\n`; } fs.writeFileSync("./ftp/ftp-upload.log", pushText); }; const deploy = (key, list = false) => { const deployFileList = []; const ftpOptions = transformObject({ deploy: key, list }); console.log("\x1b[34m---------------------"); console.log("!! Start Deploying !!"); console.log("---------------------\x1b[0m"); ftpDeploy.deploy(ftpOptions).then(() => { if (list) { for (let i = 0; i < deployFileList.length; i++) { const status = deployFileList[i].uploaded ? Util_1.default.logGreen("Success!") : Util_1.default.logRed("Failure!"); const pushText = `filename: ${deployFileList[i].name}, Status: ${status}`; console.log(pushText); } } pushLogFile(deployFileList); readline.clearLine(process.stdout); readline.cursorTo(process.stdout, 0); createBar(100); process.stdout.write(`uploading(100%) ${bar} complete.`); console.log("\n\x1b[32m---------------------"); console.log("Completed file upload"); console.log("---------------------\x1b[0m"); process.exit(0); }).catch((err) => { console.log("\x1b[31m Error file upload\x1b[0\n", err); }); ftpDeploy.on("uploading", (data) => { fileTotalCount = data.totalFilesCount + 1; const fileUpdatedRate = Math.trunc(data.transferredFileCount / fileTotalCount * 100); createBar(fileUpdatedRate); process.stdout.write('\x1B[?25l'); if (data.transferredFileCount) { readline.clearLine(process.stdout); readline.cursorTo(process.stdout, 0); } process.stdout.write(`uploading(${fileUpdatedRate}%) ${bar} ${data.filename}`); process.stdout.write('\x1B[?25h'); const date = new Date(); deployFileList.push({ name: data.filename, uploaded: true, date: `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` }); }); ftpDeploy.on("upload-error", (data) => { const date = new Date(); deployFileList.push({ name: data.filename, uploaded: false, date: `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` }); }); }; const certification = (option) => { const input = require('readline').createInterface({ input: process.stdin, output: process.stdout }); const value = option.deploy.toUpperCase(); input.question(`deployするには「${value}」を入力してください。`, (ans) => { if (ans === value) { deploy(option.deploy, option.list); } else { console.log("入力値が違います。\n再度実行してください。"); process.exit(0); } }); }; exports.certification = certification; exports.default = deploy;