Vinyl adapter for the file system.
npm install vinyl-fs[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Coveralls Status][coveralls-image]][coveralls-url]
[Vinyl][vinyl] adapter for the file system.
[Vinyl][vinyl] is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: path and contents. These are the main attributes on a [Vinyl][vinyl] object. 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. [Vinyl][vinyl] can be used to describe files from all of these sources.
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 a src(globs) and a dest(folder) method. Each return a stream. The src stream produces Vinyl objects, and the dest stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the symlink method vinyl-fs provides.
``javascript
var map = require('map-stream');
var vfs = require('vinyl-fs');
var log = function (file, cb) {
console.log(file.path);
cb(null, file);
};
vfs
.src(['./js/*/.js', '!./js/vendor/*.js'])
.pipe(map(log))
.pipe(vfs.dest('./output'));
`
Takes a glob string or an array of glob strings as the first argument and an options object as the second.
Returns a stream of [vinyl] File objects.
Note: UTF-8 BOM will be removed from all UTF-8 files read with .src unless disabled in the options.
#### Globs
Globs are executed in order, so negations should follow positive globs.
For example:
`js`
fs.src(['!b', '']);
would not exclude any files, but the following would exclude all files starting with "b":
`js`
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 the [vinyl] File object 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 to false will make file.contents a 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 to false will make file.contents = null and 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: Date or Number
Default: undefined
##### options.removeBOM
Causes the BOM to be removed on UTF-8 encoded files. Set to false if you need the BOM for some reason.
Type: Boolean
Default: true
##### options.encoding
Optionally transcode from the given encoding. The default is 'utf8'. We usefalse
[iconv-lite], please refer to its Wiki for a list of supported encodings. You
can set this to to avoid any transcoding, and effectively just pass
around raw binary data.
Type: String or Boolean
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 to false to preserve them as symlinks and make file.symlink equal 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 in [glob-stream] and [anymatch] and are forwarded verbatim.
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 each [vinyl] File object and must return a folder path.File
Returns a stream that accepts [vinyl] objects, 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 the stat.mode, stat.mtime and stat.atime of the [vinyl] File object differ from the file on the filesystem.process.getuid
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 support or process.geteuid in node. This is due to Windows having very unexpected results through usage of fs.fchmod and fs.futimes.
Note: The fs.futimes() method internally converts stat.mtime and stat.atime timestamps to seconds; this division by 1000 may cause some loss of precision in 32-bit Node.js.
If the file has a symlink attribute specifying a target path, then a symlink will be created.
Note: The file will be modified after being written to this stream.
- cwd, base, and path will be overwritten to match the folder.stat
- will be updated to match the file on the filesystem.contents
- will 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 the [vinyl] File object 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 the [vinyl] File is not symbolic.
Type: Number
Default: The mode of the input file (file.stat.mode) if any, or the process mode if the input file has no mode property.
##### 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.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 usefalse
[iconv-lite], please refer to its Wiki for a list of supported encodings. You
can set this to to avoid any transcoding, and effectively just pass
around raw binary data.
Type: String or Boolean
Default: 'utf8'.
##### options.sourcemaps
Enables sourcemap support on files passed through the stream. Will write inline soucemaps if specified as true.String
Specifying a path will write external sourcemaps at the given path.
Examples:
`js
// Write as inline comments
vfs.dest('./', { sourcemaps: true });
// Write as files in the same folder
vfs.dest('./', { sourcemaps: '.' });
`
Type: Boolean or String
Default: undefined (do not write sourcemaps)
##### options.relativeSymlinks
When creating a symlink, whether or not the created symlink should be relative. If false, the symlink will be absolute.
Note: This option will be ignored if a junction is 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 a junction.
This option is only relevant on Windows and ignored elsewhere. Please refer to the [Symbolic Links on Windows][symbolic-caveats] section below.
Type: Boolean
Default: true
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 each [vinyl] File object and must return a folder path.File
Returns a stream that accepts [vinyl] objects, 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, and path will be overwritten to match the folder.stat
- will be updated to match the symlink on the filesystem.contents
- will be set to null.symlink
- will be added or replaced to be the original path.
Note: On Windows, directory links are created using Junctions by default. Use the useJunctions option 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 the [vinyl] File object 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. If false, the symlink will be absolute.
Note: This option will be ignored if a junction is 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 a junction.
This option is only relevant on Windows and ignored elsewhere. Please refer to the [Symbolic Links on Windows][symbolic-caveats] section below.
Type: Boolean
Default: true
#### Symbolic Links on Windows
When creating symbolic links on Windows, we pass a type argument to Node'sfs module which specifies the kind of target we link to (one of 'file','dir' or 'junction'). Specifically, this will be 'file' when the target'junction'
is a regular file, if the target is a directory, or 'dir' ifuseJunctions
the target is a directory and the user overrides the option
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-fs will behave slightly differently depending onsymlink()
whether the dangling link is being created via or via dest().
For dangling links created via symlink(), the incoming vinyl represents theisDirectory()
target and so we will look to its stats to guess the desired type. In
particular, if returns false then we'll create a 'file' type'junction'
link, otherwise we will create a or a 'dir' type link dependinguseJunctions
on the value of the option.
For dangling links created via dest(), the incoming vinyl represents the link -src()
typically read off disk via with the resolveSymlinks option set to'file'`, which may cause unexpected behavior
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
if you are creating a "dangling" link to a directory. It is advised to avoid this
scenario.
MIT
[downloads-image]: https://img.shields.io/npm/dm/vinyl-fs.svg?style=flat-square
[npm-url]: https://www.npmjs.com/package/vinyl-fs
[npm-image]: https://img.shields.io/npm/v/vinyl-fs.svg?style=flat-square
[ci-url]: https://github.com/gulpjs/vinyl-fs/actions?query=workflow:dev
[ci-image]: https://img.shields.io/github/actions/workflow/status/gulpjs/vinyl-fs/dev.yml??branch=master&style=flat-square
[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl-fs
[coveralls-image]: https://img.shields.io/coveralls/gulpjs/vinyl-fs.svg?style=flat-square
[symbolic-caveats]: #symbolic-links-on-windows
[glob-stream]: https://github.com/gulpjs/glob-stream
[anymatch]: https://github.com/micromatch/anymatch
[vinyl]: https://github.com/gulpjs/vinyl
[iconv-lite]: https://github.com/ashtuchkin/iconv-lite