Skip to content

gulpjs/vinyl-fs

Repository files navigation

vinyl-fs

NPM versionDownloadsBuild StatusCoveralls Status

Vinyladapter for the file system.

What is Vinyl?

Vinylis a very simple metadata object that describes a file. When you think of a file, two attributes come to mind:pathandcontents.These are the main attributes on aVinylobject. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services.Vinylcan be used to describe files from all of these sources.

What is a Vinyl Adapter?

While Vinyl provides a clean way to describe a file, we now need a way to access these files. Each file source needs what we call a "Vinyl adapter". A Vinyl adapter simply exposes asrc(globs)and adest(folder)method. Each return a stream. Thesrcstream produces Vinyl objects, and thedeststream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as thesymlinkmethodvinyl-fsprovides.

Usage

varmap=require('map-stream');
varvfs=require('vinyl-fs');

varlog=function(file,cb){
console.log(file.path);
cb(null,file);
};

vfs
.src(['./js/**/*.js','!./js/vendor/*.js'])
.pipe(map(log))
.pipe(vfs.dest('./output'));

API

src(globs[, options])

Takes a glob string or an array of glob strings as the first argument and an options object as the second. Returns a stream ofvinylFileobjects.

Note: UTF-8 BOM will be removed from all UTF-8 files read with.srcunless disabled in the options.

Globs

Globs are executed in order, so negations should follow positive globs.

For example:

fs.src(['!b*','*']);

would not exclude any files, but the following would exclude all files starting with "b":

fs.src(['*','!b*']);

Options

  • Values passed to the options must be of the expected type, otherwise they will be ignored.
  • All options can be passed a function instead of a value. The function will be called with thevinylFileobject as its only argument and must return a value of the expected type for that option.
options.buffer

Whether or not you want to buffer the file contents into memory. Setting tofalsewill makefile.contentsa paused Stream.

Type:Boolean

Default:true

options.read

Whether or not you want the file to be read at all. Useful for stuff like removing files. Setting tofalsewill makefile.contents = nulland will disable writing the file to disk via.dest().

Type:Boolean

Default:true

options.since

Only streams files that have been modified since the time specified.

Type:DateorNumber

Default:undefined

options.removeBOM

Causes the BOM to be removed on UTF-8 encoded files. Set tofalseif you need the BOM for some reason.

Type:Boolean

Default:true

options.encoding

Optionally transcode from the given encoding. The default is'utf8'.We use iconv-lite,please refer to its Wiki for a list of supported encodings. You can set this tofalseto avoid any transcoding, and effectively just pass around raw binary data.

Type:StringorBoolean

Default:'utf8'

options.sourcemaps

Enables sourcemap support on files passed through the stream. Will load inline sourcemaps and resolve sourcemap links from files.

Type:Boolean

Default:false

options.resolveSymlinks

Whether or not to recursively resolve symlinks to their targets. Set tofalseto preserve them as symlinks and makefile.symlinkequal the original symlink's target path.

Type:Boolean

Default:true

options.dot

Whether or not you want globs to match on dot files (e.g..gitignore).

Note: This option is not resolved from a function because it is passed verbatim to anymatch.

Type:Boolean

Default:false

other

Any glob-related options are documented inglob-streamandanymatchand are forwarded verbatim.

dest(folder[, options])

Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with eachvinylFileobject and must return a folder path. Returns a stream that acceptsvinylFileobjects, writes them to disk at the folder/cwd specified, and passes them downstream so you can keep piping these around.

Once the file is written to disk, an attempt is made to determine if thestat.mode,stat.mtimeandstat.atimeof thevinylFileobject differ from the file on the filesystem. If they differ and the running process owns the file, the corresponding filesystem metadata is updated. If they don't differ or the process doesn't own the file, the attempt is skipped silently. This functionality is disabled on Windows operating systems or any other OS that doesn't supportprocess.getuidorprocess.geteuidin node. This is due to Windows having very unexpected results through usage offs.fchmodandfs.futimes.

Note: Thefs.futimes()method internally convertsstat.mtimeandstat.atimetimestamps to seconds; this division by1000may cause some loss of precision in 32-bit Node.js.

If the file has asymlinkattribute specifying a target path, then a symlink will be created.

Note: The file will be modified after being written to this stream.

  • cwd,base,andpathwill be overwritten to match the folder.
  • statwill be updated to match the file on the filesystem.
  • contentswill have it's position reset to the beginning if it is a stream.

Options

  • Values passed to the options must be of the expected type, otherwise they will be ignored.
  • All options can be passed a function instead of a value. The function will be called with thevinylFileobject as its only argument and must return a value of the expected type for that option.
options.cwd

The working directory the folder is relative to.

Type:String

Default:process.cwd()

options.mode

The mode the files should be created with. This option is only resolved if thevinylFileis not symbolic.

Type:Number

Default: Themodeof the input file (file.stat.mode) if any, or the process mode if the input file has nomodeproperty.

options.dirMode

The mode directories should be created with.

Type:Number

Default: The processmode.

options.overwrite

Whether or not existing files with the same path should be overwritten.

Type:Boolean

Default:true(always overwrite existing files)

options.append

Whether or not new data should be appended after existing file contents (if any).

Type:Boolean

Default:false(always replace existing contents, if any)

options.encoding

Optionally transcode to the given encoding. The default is'utf8'.We use iconv-lite,please refer to its Wiki for a list of supported encodings. You can set this tofalseto avoid any transcoding, and effectively just pass around raw binary data.

Type:StringorBoolean

Default:'utf8'.

options.sourcemaps

Enables sourcemap support on files passed through the stream. Will write inline soucemaps if specified astrue. Specifying aStringpath will write external sourcemaps at the given path.

Examples:

// Write as inline comments
vfs.dest('./',{sourcemaps:true});

// Write as files in the same folder
vfs.dest('./',{sourcemaps:'.'});

Type:BooleanorString

Default:undefined(do not write sourcemaps)

options.relativeSymlinks

When creating a symlink, whether or not the created symlink should be relative. Iffalse,the symlink will be absolute.

Note: This option will be ignored if ajunctionis being created, as they must be absolute.

Type:Boolean

Default:false

options.useJunctions

When creating a symlink, whether or not a directory symlink should be created as ajunction. This option is only relevant on Windows and ignored elsewhere. Please refer to theSymbolic Links on Windowssection below.

Type:Boolean

Default:true

symlink(folder[, options])

Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with eachvinylFileobject and must return a folder path. Returns a stream that acceptsvinylFileobjects, creates a symbolic link (i.e. symlink) at the folder/cwd specified, and passes them downstream so you can keep piping these around.

Note: The file will be modified after being written to this stream.

  • cwd,base,andpathwill be overwritten to match the folder.
  • statwill be updated to match the symlink on the filesystem.
  • contentswill be set tonull.
  • symlinkwill be added or replaced to be the original path.

Note: On Windows, directory links are created using Junctions by default. Use theuseJunctionsoption to disable this behavior.

Options

  • Values passed to the options must be of the expected type, otherwise they will be ignored.
  • All options can be passed a function instead of a value. The function will be called with thevinylFileobject as its only argument and must return a value of the expected type for that option.
options.cwd

The working directory the folder is relative to.

Type:String

Default:process.cwd()

options.dirMode

The mode directories should be created with.

Type:Number

Default: The process mode.

options.overwrite

Whether or not existing files with the same path should be overwritten.

Type:Boolean

Default:true(always overwrite existing files)

options.relativeSymlinks

Whether or not the created symlinks should be relative. Iffalse,the symlink will be absolute.

Note: This option will be ignored if ajunctionis being created, as they must be absolute.

Type:Boolean

Default:false

options.useJunctions

When creating a symlink, whether or not a directory symlink should be created as ajunction. This option is only relevant on Windows and ignored elsewhere. Please refer to theSymbolic Links on Windowssection below.

Type:Boolean

Default:true

Symbolic Links on Windows

When creating symbolic links on Windows, we pass atypeargument to Node's fsmodule which specifies the kind of target we link to (one of'file', 'dir'or'junction'). Specifically, this will be'file'when the target is a regular file,'junction'if the target is a directory, or'dir'if the target is a directory and the user overrides theuseJunctionsoption default.

However, if the user tries to make a "dangling" link (pointing to a non-existent target) we won't be able to determine automatically which type we should use. In these cases,vinyl-fswill behave slightly differently depending on whether the dangling link is being created viasymlink()or viadest().

For dangling links created viasymlink(),the incoming vinyl represents the target and so we will look to its stats to guess the desired type. In particular, ifisDirectory()returns false then we'll create a'file'type link, otherwise we will create a'junction'or a'dir'type link depending on the value of theuseJunctionsoption.

For dangling links created viadest(),the incoming vinyl represents the link - typically read off disk viasrc()with theresolveSymlinksoption set to false. In this case, we won't be able to make any reasonable guess as to the type of link and we default to using'file',which may cause unexpected behavior if you are creating a "dangling" link to a directory. It is advised to avoid this scenario.

License

MIT