UNPKG

1.97 kBJavaScriptView Raw
1/**
2 * Writeout a file.
3 * @function writeout
4 * @param {string} filename - Filename to write.
5 * @param {string} 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 co = require('co')
17const fs = require('fs')
18const path = require('path')
19const argx = require('argx')
20const mkdirp = require('mkdirp')
21const filedel = require('filedel')
22const _hasDuplicate = require('./_has_duplicate')
23
24/** @lends writeout */
25function writeout (filename, content, options = {}) {
26 if (argx(arguments).pop('function')) {
27 throw new Error('[writeout] Callback is no more supported. Use promise interface instead.')
28 }
29
30 let needsMkdirp = !!options.mkdirp
31 let skipIfIdentical = !!options.skipIfIdentical
32 let force = !!options.force
33 let mode = options.mode || '644'
34
35 let result = { filename }
36
37 return co(function * () {
38 if (needsMkdirp) {
39 yield new Promise((resolve, reject) =>
40 mkdirp(path.dirname(filename), (err) => err ? reject(err) : resolve())
41 )
42 }
43
44 if (skipIfIdentical) {
45 let skip = yield _hasDuplicate(filename, content)
46 if (skip) {
47 result.skipped = true
48 return result
49 }
50 }
51
52 if (force) {
53 yield filedel(filename, { force: true })
54 }
55
56 yield new Promise((resolve, reject) =>
57 fs.writeFile(filename, content, {
58 mode: mode
59 }, (err) => err ? reject(err) : resolve())
60 )
61
62 result.skipped = false
63
64 // Wait for flush
65 yield new Promise((resolve) =>
66 process.nextTick(() => resolve())
67 )
68
69 return result
70 })
71}
72
73module.exports = writeout