From 2fa332adc3ab25874fb0a1b2bd4e0bfcff11482e Mon Sep 17 00:00:00 2001 From: Salim Blume <53222598+salim-runsafe@users.noreply.github.com> Date: Wed, 13 Jul 2022 14:33:17 -0500 Subject: [PATCH 1/3] Add partial replacements. --- src/line-replace.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/line-replace.js b/src/line-replace.js index bbbcfab..f6c747c 100644 --- a/src/line-replace.js +++ b/src/line-replace.js @@ -5,7 +5,7 @@ const stream = require('stream') const rename = util.promisify(fs.rename) const unlink = util.promisify(fs.unlink) -function lineReplace({ file, line, text, addNewLine = true, callback }) { +function lineReplace({ file, line, text, addNewLine = true, textToReplace, callback }) { const readStream = fs.createReadStream(file) const tempFile = `${file}.tmp` const writeStream = fs.createWriteStream(tempFile) @@ -33,9 +33,16 @@ function lineReplace({ file, line, text, addNewLine = true, callback }) { // Replace. if (currentLine === line) { - replacedText = originalLine - if (addNewLine) return writeStream.write(`${text}\n`) - return writeStream.write(`${text}`) + let output; + if (textToReplace) { + replacedText = textToReplace + output = originalLine.replace(textToReplace, text) + } else { + replacedText = originalLine + output = text + } + if (addNewLine) return writeStream.write(`${output}\n`) + return writeStream.write(`${output}`) } // Save original line. From ac69606bf894d16ba4d906a13ae1a848434ece43 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Sun, 22 Jan 2023 20:34:13 -0500 Subject: [PATCH 2/3] Return promise instead of using callback --- src/line-replace.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/line-replace.js b/src/line-replace.js index f6c747c..f2c11d3 100644 --- a/src/line-replace.js +++ b/src/line-replace.js @@ -57,11 +57,10 @@ function lineReplace({ file, line, text, addNewLine = true, textToReplace, callb await unlink(file) // Delete original file. await rename(tempFile, file) // Rename temp file with original file name. } catch (error) { - callback({ error, file, line, replacedText, text }) - return + return new Promise(resolve => { return { error, file, line, replacedText, text } }) } - callback({ file, line, replacedText, text }) + return new Promise(resolve => { return { file, line, replacedText, text } }) }) }) } From 3408e71dd6bcdfb866fcf92611f2a8fbe70d40c0 Mon Sep 17 00:00:00 2001 From: Salim Blume Date: Sun, 22 Jan 2023 20:41:22 -0500 Subject: [PATCH 3/3] Use reject as well --- src/line-replace.js | 100 +++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 48 deletions(-) diff --git a/src/line-replace.js b/src/line-replace.js index f2c11d3..3f91aba 100644 --- a/src/line-replace.js +++ b/src/line-replace.js @@ -5,64 +5,68 @@ const stream = require('stream') const rename = util.promisify(fs.rename) const unlink = util.promisify(fs.unlink) -function lineReplace({ file, line, text, addNewLine = true, textToReplace, callback }) { - const readStream = fs.createReadStream(file) - const tempFile = `${file}.tmp` - const writeStream = fs.createWriteStream(tempFile) - const rl = readline.createInterface(readStream, stream) - let replacedText +function lineReplace({ file, line, text, addNewLine = true, textToReplace }) { - readStream.on('error', async ({ message }) => { - await unlink(tempFile) - callback({ error: message, file, line, replacedText, text }) - }) + return new Promise((resolve, reject) => { + const readStream = fs.createReadStream(file) + const tempFile = `${file}.tmp` + const writeStream = fs.createWriteStream(tempFile) + const rl = readline.createInterface(readStream, stream) - writeStream.on('error', async ({ message }) => { - await unlink(tempFile) - callback({ error: message, file, line, replacedText, text }) - }) + let replacedText - rl.on('error', async ({ message }) => { - await unlink(tempFile) - callback({ error: message, file, line, replacedText, text }) - }) + readStream.on('error', async ({ message }) => { + await unlink(tempFile) + reject({ error: message, file, line, replacedText, text }) + }) - let currentLine = 0 - rl.on('line', (originalLine) => { - ++currentLine + writeStream.on('error', async ({ message }) => { + await unlink(tempFile) + reject({ error: message, file, line, replacedText, text }) + }) - // Replace. - if (currentLine === line) { - let output; - if (textToReplace) { - replacedText = textToReplace - output = originalLine.replace(textToReplace, text) - } else { - replacedText = originalLine - output = text - } - if (addNewLine) return writeStream.write(`${output}\n`) - return writeStream.write(`${output}`) - } + rl.on('error', async ({ message }) => { + await unlink(tempFile) + reject({ error: message, file, line, replacedText, text }) + }) - // Save original line. - writeStream.write(`${originalLine}\n`) - }) + let currentLine = 0 + rl.on('line', (originalLine) => { + ++currentLine - rl.on('close', () => { - // Finish writing to temp file and replace files. - // Replace original file with fixed file (the temp file). - writeStream.end(async () => { - try { - await unlink(file) // Delete original file. - await rename(tempFile, file) // Rename temp file with original file name. - } catch (error) { - return new Promise(resolve => { return { error, file, line, replacedText, text } }) + // Replace. + if (currentLine === line) { + let output; + if (textToReplace) { + replacedText = textToReplace + output = originalLine.replace(textToReplace, text) + } else { + replacedText = originalLine + output = text + } + if (addNewLine) return writeStream.write(`${output}\n`) + return writeStream.write(`${output}`) } - return new Promise(resolve => { return { file, line, replacedText, text } }) + // Save original line. + writeStream.write(`${originalLine}\n`) + }) + + rl.on('close', () => { + // Finish writing to temp file and replace files. + // Replace original file with fixed file (the temp file). + writeStream.end(async () => { + try { + await unlink(file) // Delete original file. + await rename(tempFile, file) // Rename temp file with original file name. + } catch (error) { + reject({ error, file, line, replacedText, text }) + } + + resolve({ file, line, replacedText, text }) + }) }) - }) + }); } module.exports = lineReplace