jaune-fs
Version:
file system for jaune framework
186 lines (147 loc) • 4.82 kB
text/coffeescript
###*
* @file NodeJS module that implements file system handler based on local
* file system.
* @author Alvaro Juste <juste.alvaro@gmail.com>
###
"use strict"
mime = require "mime"
ncp = require "ncp"
{
join
} = require "path"
{
createReadStream
createWriteStream
exists
rename
readFile
stat
writeFile
unlink
} = require "fs"
stream = require "stream"
###*
* @function Convert to absolute path
* @param {String} path The path
* @returns {String} Converted path
###
convertPathToAbsolute = (path) -> join process.cwd(), path
###*
* @class File system constructor.
* @param {object} connection Accepts the connection to the file system.
###
class FSFileSystem
constructor: (@connection) ->
###*
* @function Move a file
* @param {String} source Source path
* @param {String} target Targett path
* @param {Boolean} [options.absolute] When true the path is not
* converted to absolute.
###
move: (source, target, options = {absolute: no}) ->
source = convertPathToAbsolute source unless options.absolute
target = convertPathToAbsolute target unless options.absolute
new Promise (res, rej) ->
rename source, target, (err) ->
return res() unless err?
rej(err)
###*
* @function Writes a file into file system.
* @param {String} path Where to write
* @param {Buffer|String|Stream} data Data to be written into file.
* @param {Boolean} [options.absolute] When true the path is not
* converted to absolute.
###
writeFile : (path, data, options = {absolute: no}) ->
path = convertPathToAbsolute path unless options.absolute
new Promise (res, rej) ->
if data instanceof stream
write = createWriteStream path
data
.on "end", res
.on "error", rej
write
.on "open", -> data.pipe write
.on "error", rej
else
writeFile convertPathToAbsolute(path), data, (err) ->
return rej err if err?
res()
###*
* @function Reads a file at the given path.
* @param {String} path The path to read file from.
* @param {String} [options.encoding] The encoding of the file
* @param {Boolean} [options.absolute] When true the path is not
* converted to absolute.
###
readFile : (path, options = {encoding: "binary", absolute: no}) ->
path = convertPathToAbsolute path unless options.absolute
new Promise (res, rej) =>
switch options.encoding
when 'binary'
p = @exists(path, absolute: yes)
p.then (exists) ->
return res createReadStream path if exists
rej new Error "file does not exists"
else
readFile path, options.encoding, (err, data) ->
return rej err if err?
res data
###*
* @function Checks if file exists.
* @param {path} string The path to file.
###
exists : (path, options = {absolute: no}) ->
path = convertPathToAbsolute path unless options.absolute
new Promise (res, rej) -> exists path, res
###
* @function Copies a path into another.
* @param {from} string The source path.
* @param {to} string The destination path.
###
copy : (from, to) ->
new Promise (res, rej) ->
ncp convertPathToAbsolute(from), convertPathToAbsolute(to), (err) ->
return rej err if err?
res()
###*
* @function Removes a file
* @param {String} path The file to be removed
* @param {Boolean} [options.absolute] When true the path is not
* converted to absolute.
###
removeFile : (path, options = {absolue: no}) ->
path = convertPathToAbsolute path unless options.absolute
new Promise (res, rej) ->
unlink path, (err) ->
return rej err if err?
res()
###*
* @function Retrieves the STAT object for a specified path.
* @param {path} string The source path.
* @param {function} cb Standard callback function.
###
stat : (path, options = {absolute: no}) ->
path = convertPathToAbsolute path unless options.absolute
new Promise (res, rej) ->
stat path, (err, stat) ->
return rej err if err?
res new FSClientStat path, stat
###*
* @class Local file system STAT object wrapper.
* @param {object} connection Accepts the connection to the file system.
* @param {string} path The path of the STAT object.
###
class FSClientStat
constructor: (@path, @stat) ->
{@mtime, @size} = @stat
###*
* @function Checks if STAT is a directory.
###
isDirectory : -> @stat.isDirectory()
###*
* @function Returns the MIME type of file.
###
getMime : -> if @isDirectory() then "" else mime.lookup(@path)
module.exports = FsClient : FSFileSystem