UNPKG

2.1 kBJavaScriptView Raw
1/**
2 * Writeout a file.
3 * @function writeout
4 * @param {string} filename - Filename to write.
5 * @param {string|Buffer|ReadableStream} content - String content to write.
6 * @param {object} [options] - Optional settings.
7 * @param {boolean} [options.mkdirp=false] - Make parent directories.
8 * @param {boolean} [options.skipIfIdentical=false] - Skip to write if existing content is identical.
9 * @param {string} [options.mode='644'] - File permission.
10 * @param {boolean} [options.force=false] - Force to write even if existing file is readonly.
11 * @returns {Promise}
12 */
13
14'use strict'
15
16const fs = require('fs')
17const path = require('path')
18const argx = require('argx')
19const mkdirp = require('mkdirp')
20const filedel = require('filedel')
21const {hasDuplicate, isStream} = require('./helpers')
22
23/** @lends writeout */
24async function writeout (filename, content, options = {}) {
25 if (argx(arguments).pop('function')) {
26 throw new Error('[writeout] Callback is no more supported. Use promise interface instead.')
27 }
28
29 const {
30 mkdirp: needsMkdirp = false,
31 skipIfIdentical = false,
32 force = false,
33 mode = '644'
34 } = options
35
36 const result = {filename}
37
38 if (needsMkdirp) {
39 await new Promise((resolve, reject) =>
40 mkdirp(path.dirname(filename), (err) => err ? reject(err) : resolve())
41 )
42 }
43
44 if (skipIfIdentical) {
45 let skip = await hasDuplicate(filename, content)
46 if (skip) {
47 result.skipped = true
48 return result
49 }
50 }
51
52 if (force) {
53 await filedel(filename, {force: true})
54 }
55
56 if (isStream(content)) {
57 let write = fs.createWriteStream(filename, {mode})
58 await new Promise((resolve, reject) => {
59 content.pipe(write)
60 write.on('close', () => resolve())
61 write.on('error', (err) => reject(err))
62 })
63 } else {
64 await new Promise((resolve, reject) =>
65 fs.writeFile(filename, content, {mode}, (err) => err ? reject(err) : resolve())
66 )
67 }
68
69 result.skipped = false
70
71 // Wait for flush
72 await new Promise((resolve) =>
73 process.nextTick(() => resolve())
74 )
75
76 return result
77}
78
79module.exports = writeout