1 |
|
2 | 'use strict'
|
3 |
|
4 | const fs = require('fs')
|
5 | const path = require('path')
|
6 | const argx = require('argx')
|
7 | const mkdirp = require('mkdirp')
|
8 | const filedel = require('filedel')
|
9 | const {hasDuplicate, isStream} = require('./helpers')
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | async 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 |
|
70 | await new Promise((resolve) =>
|
71 | process.nextTick(() => resolve())
|
72 | )
|
73 |
|
74 | return result
|
75 | }
|
76 |
|
77 | module.exports = writeout
|