import * as fs from 'graceful-fs'; import { dirname } from 'path'; import mkdirp from 'mkdirp'; import resolvePath from '../utils/resolvePath'; export const writeFile = asyncMethod( 'writeFile' ); export const appendFile = asyncMethod( 'appendFile' ); export const writeFileSync = syncMethod( 'writeFileSync' ); export const appendFileSync = syncMethod( 'appendFileSync' ); function normaliseArguments ( args ) { args = Array.prototype.slice.call( args, 0 ); let opts = {}; if ( typeof args[ args.length - 1 ] === 'object' && !( args[ args.length - 1 ] instanceof Buffer ) ) { opts = args.pop(); } return { opts, data: args.pop(), dest: resolvePath( args ) }; } function asyncMethod ( methodName ) { return function () { const { dest, data, opts } = normaliseArguments( arguments ); return new Promise( ( fulfil, reject ) => { mkdirp( dirname( dest ), err => { if ( err ) { reject( err ); } else { fs[ methodName ]( dest, data, opts, err => { if ( err ) { reject( err ); } else { fulfil( data ); } }); } }); }); }; } function syncMethod ( methodName ) { return function () { const { dest, data } = normaliseArguments( arguments ); mkdirp.sync( dirname( dest ) ); return fs[ methodName ]( dest, data ); }; }