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