UNPKG

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