Virtual file format for text processing
npm install vfile[![Build][build-badge]][build]
[![Coverage][coverage-badge]][coverage]
[![Downloads][downloads-badge]][downloads]
[![Size][size-badge]][size]
[![Sponsors][sponsors-badge]][collective]
[![Backers][backers-badge]][collective]
[![Chat][chat-badge]][chat]
vfile is a small and browser friendly virtual file format that tracks
metadata about files (such as its path and value) and lint
[messages][api-vfile-messages].
* unified
* What is this?
* When should I use this?
* Install
* Use
* API
* VFile(options?)
* file.cwd
* file.data
* file.history
* file.messages
* file.value
* file.basename
* file.dirname
* file.extname
* file.path
* file.stem
* [VFile#fail(reason[, options])](#vfilefailreason-options)
* [VFile#info(reason[, options])](#vfileinforeason-options)
* [VFile#message(reason[, options])](#vfilemessagereason-options)
* VFile#toString(encoding?)
* Compatible
* Data
* DataMap
* Map
* MessageOptions
* Options
* Reporter
* ReporterSettings
* Value
* Well-known
* List of utilities
* Reporters
* Types
* Compatibility
* Contribute
* Sponsor
* Acknowledgments
* License
vfile is part of the unified collective.
* for more about us, see [unifiedjs.com][site]
* for how the collective is governed, see [unifiedjs/collective][governance]
* for updates, see [@unifiedjs][twitter] on Twitter
This package provides a virtual file format.
It exposes an API to access the file value, path, metadata about the file, and
specifically supports attaching lint messages and errors to certain places in
these files.
The virtual file format is useful when dealing with the concept of files in
places where you might not be able to access the file system.
The message API is particularly useful when making things that check files (as
in, linting).
vfile is made for [unified][], which amongst other things checks files.
However, vfile can be used in other projects that deal with parsing,
transforming, and serializing data, to build linters, compilers, static site
generators, and other build tools.
This is different from the excellent [vinyl][vinyl] in that vfile has a
smaller API, a smaller size, and focuses on messages.
This package is [ESM only][esm].
In Node.js (version 16+), install with [npm][]:
``sh`
npm install vfile
In Deno with [esm.sh][esmsh]:
`js`
import {VFile} from 'https://esm.sh/vfile@6'
In browsers with [esm.sh][esmsh]:
`html`
`js
import {VFile} from 'vfile'
const file = new VFile({
path: '~/example.txt',
value: 'Alpha braavo charlie.'
})
console.log(file.path) // => '~/example.txt'
console.log(file.dirname) // => '~'
file.extname = '.md'
console.log(file.basename) // => 'example.md'
file.basename = 'index.text'
console.log(file.history) // => ['~/example.txt', '~/example.md', '~/index.text']
file.message('Unexpected unknown word braavo, did you mean bravo?', {
place: {line: 1, column: 8},
source: 'spell',
ruleId: 'typo'
})
console.log(file.messages)
`
Yields:
`txtbraavo
[
[~/index.text:1:8: Unexpected unknown word , did you mean bravo?] {braavo
ancestors: undefined,
cause: undefined,
column: 8,
fatal: false,
line: 1,
place: { line: 1, column: 8 },
reason: 'Unexpected unknown word , did you mean bravo?',`
ruleId: 'typo',
source: 'spell',
file: '~/index.text'
}
]
This package exports the identifier [VFile][api-vfile].
There is no default export.
Create a new virtual file.
options is treated as:
* string or [Uint8Array][mdn-uint8-array] — {value: options}URL
* — {path: options}VFile
* — shallow copies its data over to the new fileobject
* — all fields are shallow copied over to the new file
Path related fields are set in the following order (least specific to
most specific): history, path, basename, stem, extname,dirname.
You cannot set dirname or extname without setting either history,path, basename, or stem too.
###### Parameters
* options ([Compatible][api-compatible], optional)
— file value
###### Returns
New instance (VFile).
###### Example
`js`
new VFile()
new VFile('console.log("alpha");')
new VFile(new Uint8Array([0x65, 0x78, 0x69, 0x74, 0x20, 0x31]))
new VFile({path: path.join('path', 'to', 'readme.md')})
new VFile({stem: 'readme', extname: '.md', dirname: path.join('path', 'to')})
new VFile({other: 'properties', are: 'copied', ov: {e: 'r'}})
Base of path (string, default: process.cwd() or '/' in browsers).
Place to store custom info (Record, default: {}).
It’s OK to store custom data directly on the file but moving it to data is
recommended.
List of file paths the file moved between (Array).
The first is the original path and the last is the current path.
List of messages associated with the file
([Array][api-vfile-message]).
Raw value ([Uint8Array][mdn-uint8-array], string, undefined).
Get or set the basename (including extname) (string?, example: 'index.min.js').
Cannot contain path separators ('/' on unix, macOS, and browsers, '\' onfile.path = file.dirname
windows).
Cannot be nullified (use instead).
Get or set the parent path (string?, example: '~').
Cannot be set if there’s no path yet.
Get or set the extname (including dot) (string?, example: '.js').
Cannot contain path separators ('/' on unix, macOS, and browsers, '\' onpath
windows).
Cannot be set if there’s no yet.
Get or set the full path (string?, example: '~/index.min.js').
Cannot be nullified.
You can set a file URL (a URL object with a file: protocol) which will beurl.fileURLToPath
turned into a path with [][file-url-to-path].
Get or set the stem (basename w/o extname) (string?, example: 'index.min').
Cannot contain path separators ('/' on unix, macOS, and browsers, '\' on
windows).
Cannot be nullified.
Create a fatal message for reason associated with the file.
The fatal field of the message is set to true (error; file not usable) andfile
the field is set to the current file path.messages
The message is added to the field on file.
> 🪦 Note: also has obsolete signatures.
###### Parameters
* reason (string)options
— reason for message, should use markdown
* ([MessageOptions][api-message-options], optional)
— configuration
###### Returns
Nothing (never).
###### Throws
Message ([VFileMessage][vmessage]).
Create an info message for reason associated with the file.
The fatal field of the message is set to undefined (info; change likely notfile
needed) and the field is set to the current file path.messages
The message is added to the field on file.
> 🪦 Note: also has obsolete signatures.
###### Parameters
* reason (string)options
— reason for message, should use markdown
* ([MessageOptions][api-message-options], optional)
— configuration
###### Returns
Message ([VFileMessage][vmessage]).
Create a message for reason associated with the file.
The fatal field of the message is set to false (warning; change may befile
needed) and the field is set to the current file path.messages
The message is added to the field on file.
> 🪦 Note: also has obsolete signatures.
###### Parameters
* reason (string)options
— reason for message, should use markdown
* ([MessageOptions][api-message-options], optional)
— configuration
###### Returns
Message ([VFileMessage][vmessage]).
Serialize the file.
> Note: which encodings are supported depends on the engine.
> For info on Node.js, see:
>
###### Parameters
* encoding (string, default: 'utf8')value
— character encoding to understand as when it’s aUint8Array
[][mdn-uint8-array]
###### Returns
Serialized file (string).
Things that can be passed to the constructor (TypeScript type).
###### Type
`ts`
type Compatible = Options | URL | VFile | Value
Custom info (TypeScript type).
Known attributes can be added to [DataMap][api-data-map].
###### Type
`ts`
type Data = Record
This map registers the type of the data key of a VFile (TypeScript type).
This type can be augmented to register custom data types.
###### Type
`ts`
interface DataMap {}
###### Example
`tsfile.data.name
declare module 'vfile' {
interface DataMap {
// is typed as string`
name: string
}
}
Raw source map (TypeScript type).
See [source-map][source-map].
###### Fields
* version (number)sources
— which version of the source map spec this map is following
* (Array)names
— an array of URLs to the original source files
* (Array)sourceRoot
— an array of identifiers which can be referenced by individual mappings
* (string, optional)sourcesContent
— the URL root from which all sources are relative
* (Array, optional)mappings
— an array of contents of the original source files
* (string)file
— a string of base64 VLQs which contain the actual mappings
* (string)
— the generated file this source map is associated with
Options to create messages (TypeScript type).
See [Options in vfile-message][vfile-message-options].
An object with arbitrary fields and the following known fields (TypeScript
type).
###### Fields
* basename (string, optional)basename
— set (name)cwd
* (string, optional)cwd
— set (working directory)data
* ([Data][api-data], optional)data
— set (associated info)dirname
* (string, optional)dirname
— set (path w/o basename)extname
* (string, optional)extname
— set (extension with dot)history
* (Array, optional)history
— set (paths the file moved between)path
* (URL | string, optional)path
— set (current path)stem
* (string, optional)stem
— set (name without extension)value
* ([Value][api-value], optional)value
— set (the contents of the file)
Type for a reporter (TypeScript type).
###### Type
`ts`
type Reporter
files: Array
options: Settings
) => string
Configuration for reporters (TypeScript type).
###### Type
`ts`
type ReporterSettings = Record
Contents of the file (TypeScript type).
Can either be text or a [Uint8Array][mdn-uint8-array] structure.
###### Type
`ts`
type Value = Uint8Array | string
The following fields are considered “non-standard”, but they are allowed, and
some utilities use them:
* map ([Map][api-map])RawSourceMap
— source map; this type is equivalent to the type from thesource-map
moduleresult
* (unknown)stored
— custom, non-string, compiled, representation; this is used by unified to
store non-string results; one example is when turning markdown into React
nodes
* (boolean)
— whether a file was saved to disk; this is used by vfile reporters
There are also well-known fields on messages, see
them in a similar section of
vfile-message.
* convert-vinyl-to-vfile
— transform from [Vinyl][]
* to-vfile
— create a file from a file path and read and write to the file system
* vfile-find-down
— find files by searching the file system downwards
* vfile-find-up
— find files by searching the file system upwards
* vfile-glob
— find files by glob patterns
* vfile-is
— check if a file passes a test
* vfile-location
— convert between positional and offset locations
* vfile-matter
— parse the YAML front matter
* vfile-message
— create a file message
* vfile-messages-to-vscode-diagnostics
— transform file messages to VS Code diagnostics
* vfile-mkdirp
— make sure the directory of a file exists on the file system
* vfile-rename
— rename the path parts of a file
* vfile-sort
— sort messages by line/column
* vfile-statistics
— count messages per category: failures, warnings, etc
* vfile-to-eslint
— convert to ESLint formatter compatible output
> 👉 Note: see [unist][] for projects that work with nodes.
* [vfile-reporter][reporter]vfile-reporter-json
— create a report
* vfile-reporter-folder-json
— create a JSON report
* vfile-reporter-pretty
— create a JSON representation of vfiles
* vfile-reporter-junit
— create a pretty report
* vfile-reporter-position
— create a jUnit report
*
— create a report with content excerpts
> 👉 Note: want to make your own reporter?
> Reporters must accept Array as their first argument, and returnstring
> .vfile-reporter
> Reporters may accept other values too, in which case it’s suggested to stick
> to s interface.
This package is fully typed with [TypeScript][].
It exports the additional types
[Compatible][api-compatible],Data
[][api-data],DataMap
[][api-data-map],Map
[][api-map],MessageOptions
[][api-message-options],Options
[][api-options],Reporter
[][api-reporter],ReporterSettings
[][api-reporter-settings], andValue
[][api-value].
Projects maintained by the unified collective are compatible with maintained
versions of Node.js.
When we cut a new major release, we drop support for unmaintained versions of
Node.
This means we try to keep the current release line, vfile@^6,
compatible with Node.js 16.
See [contributing.md][contributing] in [vfile/.github][health] for ways tosupport.md`][support] for ways to get help.
get started.
See [
This project has a [code of conduct][coc].
By interacting with this repository, organization, or community you agree to
abide by its terms.
Support this effort and give back by sponsoring on [OpenCollective][collective]!
Vercel | Motif | HashiCorp | GitBook | Gatsby | |||||
Netlify ![]() | Coinbase | ThemeIsle | Expo | Boost Note ![]() | Markdown Space ![]() | Holloway | |||
You? | |||||||||
The initial release of this project was authored by
@wooorm.
Thanks to @contra,
@phated, and others for their work on
[Vinyl][], which was a huge inspiration.
Thanks to
@brendo,
@shinnn,
@KyleAMathews,
@sindresorhus, and
@denysdovhan
for contributing commits since!
[MIT][license] © [Titus Wormer][author]
[build-badge]: https://github.com/vfile/vfile/workflows/main/badge.svg
[build]: https://github.com/vfile/vfile/actions
[coverage-badge]: https://img.shields.io/codecov/c/github/vfile/vfile.svg
[coverage]: https://codecov.io/github/vfile/vfile
[downloads-badge]: https://img.shields.io/npm/dm/vfile.svg
[downloads]: https://www.npmjs.com/package/vfile
[size-badge]: https://img.shields.io/badge/dynamic/json?label=minzipped%20size&query=$.size.compressedSize&url=https://deno.bundlejs.com/?q=vfile
[size]: https://bundlejs.com/?q=vfile
[sponsors-badge]: https://opencollective.com/unified/sponsors/badge.svg
[backers-badge]: https://opencollective.com/unified/backers/badge.svg
[collective]: https://opencollective.com/unified
[chat-badge]: https://img.shields.io/badge/chat-discussions-success.svg
[chat]: https://github.com/vfile/vfile/discussions
[npm]: https://docs.npmjs.com/cli/install
[esm]: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c
[esmsh]: https://esm.sh
[typescript]: https://www.typescriptlang.org
[health]: https://github.com/vfile/.github
[contributing]: https://github.com/vfile/.github/blob/main/contributing.md
[support]: https://github.com/vfile/.github/blob/main/support.md
[coc]: https://github.com/vfile/.github/blob/main/code-of-conduct.md
[license]: license
[author]: https://wooorm.com
[unified]: https://github.com/unifiedjs/unified
[vinyl]: https://github.com/gulpjs/vinyl
[site]: https://unifiedjs.com
[twitter]: https://twitter.com/unifiedjs
[unist]: https://github.com/syntax-tree/unist#list-of-utilities
[reporter]: https://github.com/vfile/vfile-reporter
[vmessage]: https://github.com/vfile/vfile-message
[vfile-message-options]: https://github.com/vfile/vfile-message#options
[mdn-uint8-array]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
[source-map]: https://github.com/mozilla/source-map/blob/58819f0/source-map.d.ts#L15-L23
[file-url-to-path]: https://nodejs.org/api/url.html#url_url_fileurltopath_url
[governance]: https://github.com/unifiedjs/collective
[api-vfile-messages]: #filemessages
[api-vfile-message]: #vfilemessagereason-options
[api-vfile]: #vfileoptions
[api-compatible]: #compatible
[api-data]: #data
[api-data-map]: #datamap
[api-map]: #map
[api-message-options]: #messageoptions
[api-options]: #options
[api-reporter]: #reporter
[api-reporter-settings]: #reportersettings
[api-value]: #value