PR-URL: https://github.com/nodejs/node/pull/14417 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Teddy Katz <teddy.katz@gmail.com> Reviewed-By: Roman Reiss <me@silverwind.io> Reviewed-By: Refael Ackermann <refack@gmail.com> |
||
|---|---|---|
| .. | ||
| history.md | ||
| index.js | ||
| LICENSE | ||
| package.json | ||
| readme.md | ||
VFile is a virtual file format used by retext (natural language) and remark (markdown). Two processors which parse, transform, and compile text. Both need a virtual representation of files and a place to store metadata and messages. And, they work in the browser. VFile provides these requirements.
Also, VFile exposes a warning mechanism compatible with ESLints formatters, making it easy to expose stylish warnings, or export tap compliant messages.
VFile is different from (the excellent 👍) vinyl in that it does not include file-system or node-only functionality. No buffers, streams, or stats. In addition, the focus on metadata and messages are useful when processing a file through a middleware pipeline.
Installation
npm:
npm install vfile
VFile is also available for duo, and as an AMD, CommonJS, and globals module, uncompressed and compressed.
Table of Contents
-
- VFile()
- VFile#contents
- VFile#directory
- VFile#filename
- VFile#extension
- VFile#basename()
- VFile#quiet
- VFile#messages
- VFile#history
- VFile#toString()
- VFile#filePath()
- VFile#move(options)
- VFile#namespace(key)
- VFile#message(reason[, position[, ruleId]])
- VFile#warn(reason[, position[, ruleId]])
- VFile#fail(reason[, position[, ruleId]])
- VFile#hasFailed()
- VFileMessage
Usage
var VFile = require('vfile');
var file = new VFile({
'directory': '~',
'filename': 'example',
'extension': 'txt',
'contents': 'Foo *bar* baz'
});
file.toString(); // 'Foo *bar* baz'
file.filePath(); // '~/example.txt'
file.move({'extension': 'md'});
file.filePath(); // '~/example.md'
file.warn('Something went wrong', {'line': 1, 'column': 3});
// { [~/example.md:1:3: Something went wrong]
// name: '~/example.md:1:3',
// file: '~/example.md',
// reason: 'Something went wrong',
// line: 1,
// column: 3,
// fatal: false }
Related Tools
VFiles are used by both retext and remark.
In addition, here’s a list of useful tools:
-
dustinspecker/convert-vinyl-to-vfile— Convert a Vinyl file to a VFile; -
shinnn/is-vfile-message— Check if a value is aVFileMessageobject; -
wooorm/to-vfile— Create a virtual file from a file-path; -
wooorm/vfile-find-down— Find one or more files by searching the file system downwards; -
wooorm/vfile-find-up— Find one or more files by searching the file system upwards; -
wooorm/vfile-location— Convert between positions (line and column-based) and offsets (range-based) locations; -
shinnn/vfile-messages-to-vscode-diagnostics— ConvertVFileMessages into an array of VS Code diagnostics; -
wooorm/vfile-reporter— Stylish reporter for virtual files. -
wooorm/vfile-sort— Sort virtual file messages by line/column;
API
VFile()
VFile objects make it easy to move files, to trigger warnings and errors, and to store supplementary metadata relating to files, all without accessing the file-system.
Example:
var file = new VFile({
'directory': '~',
'filename': 'example',
'extension': 'txt',
'contents': 'Foo *bar* baz'
});
file === VFile(file); // true
file === new VFile(file); // true
VFile('foo') instanceof VFile; // true
Signatures:
file = VFile(contents|options|vFile?).
Parameters:
-
contents(string) — Contents of the file; -
vFile(VFile) — Existing representation, returned without modification; -
options(Object):-
directory(string?, default:'') — Parent directory; -
filename(string?, default:'') — Name, without extension; -
extension(string?, default:'') — Extension(s), without initial dot; -
contents(string?, default:'') — Raw value.
-
Returns:
vFile — Instance.
Notes:
VFile exposes an interface compatible with ESLint’s formatters. For example,
to expose warnings using ESLint’s compact formatter, execute the following:
var compact = require('eslint/lib/formatters/compact');
var VFile = require('vfile');
var vFile = new VFile({
'directory': '~',
'filename': 'hello',
'extension': 'txt'
});
vFile.warn('Whoops, something happened!');
console.log(compact([vFile]));
Which would yield the following:
~/hello.txt: line 0, col 0, Warning - Whoops, something happened!
1 problem
VFile#contents
string — Content of file.
VFile#directory
string — Path to parent directory.
VFile#filename
string — Filename. A file-path can still be generated when no filename exists.
VFile#extension
string — Extension. A file-path can still be generated when no extension
exists.
VFile#basename()
Get the filename, with extension, if applicable.
Example:
var file = new VFile({
'directory': '~',
'filename': 'example',
'extension': 'txt'
});
file.basename() // example.txt
Signatures:
string = vFile.basename().
Returns:
string— Returns the file path without a directory, if applicable.
Otherwise,an empty string is returned.
VFile#quiet
boolean? — Whether an error created by VFile#fail()
is returned (when truthy) or thrown (when falsey).
Ensure all messages associated with a file are handled properly when setting
this to true.
VFile#messages
Array.<VFileMessage> — List of associated messages.
Notes:
VFile#message(), and in turn VFile#warn() and VFile#fail(), return
Error objects that adhere to the VFileMessage schema.
Its results can populate messages.
VFile#history
Array.<String> — List of file-paths the file moved
between.
VFile#toString()
Get the value of the file.
Example:
var vFile = new VFile('Foo');
String(vFile); // 'Foo'
Signatures:
string = vFile.toString().
Returns:
string — Contents.
VFile#filePath()
Get the filename, with extension and directory, if applicable.
Example:
var file = new VFile({
'directory': '~',
'filename': 'example',
'extension': 'txt'
});
String(file.filePath); // ~/example.txt
file.filePath() // ~/example.txt
Signatures:
string = vFile.filePath().
Returns:
string — If the vFile has a filename, it will be prefixed with the
directory (slashed), if applicable, and suffixed with the (dotted) extension
(if applicable). Otherwise, an empty string is returned.
VFile#move(options)
Move a file by passing a new directory, filename, and extension. When these are not given, the default values are kept.
Example:
var file = new VFile({
'directory': '~',
'filename': 'example',
'extension': 'txt',
'contents': 'Foo *bar* baz'
});
file.move({'directory': '/var/www'});
file.filePath(); // '/var/www/example.txt'
file.move({'extension': 'md'});
file.filePath(); // '/var/www/example.md'
Signatures:
vFile = vFile.move(options?).
Parameters:
-
options(Object):-
directory(string, default:'') — Parent directory; -
filename(string?, default:'') — Name, without extension; -
extension(string, default:'') — Extension(s), without initial dot.
-
Returns:
vFile — Context object (chainable).
VFile#namespace(key)
Access metadata.
Example:
var file = new VFile('Foo');
file.namespace('foo').bar = 'baz';
console.log(file.namespace('foo').bar) // 'baz';
Parameters:
key(string) — Namespace key.
Returns:
Object — Private namespace for metadata.
VFile#message(reason[, position[, ruleId]])
Create a message with reason at position. When an error is passed in as
reason, copies the stack. This does not add a message to messages.
Example:
var file = new VFile();
file.message('Something went wrong');
// { [1:1: Something went wrong]
// name: '1:1',
// file: '',
// reason: 'Something went wrong',
// line: null,
// column: null }
Signatures:
VFileMessage = vFile.message(err|reason, node|location|position?, ruleId?).
Parameters:
-
err(Error) — Original error, whose stack and message are used; -
reason(string) — Reason for message; -
node(Node) — Syntax tree object; -
location(Object) — Syntax tree location (found atnode.position); -
position(Object) — Syntax tree position (found atnode.position.startornode.position.end). -
ruleId(string) — Category of warning.
Returns:
VFileMessage — File-related message with location
information.
VFile#warn(reason[, position[, ruleId]])
Warn. Creates a non-fatal message (see VFile#message()),
and adds it to the file's messages list.
Example:
var file = new VFile();
file.warn('Something went wrong');
// { [1:1: Something went wrong]
// name: '1:1',
// file: '',
// reason: 'Something went wrong',
// line: null,
// column: null,
// fatal: false }
See:
VFile#fail(reason[, position[, ruleId]])
Fail. Creates a fatal message (see VFile#message()), sets fatal: true,
adds it to the file's messages list.
If quiet is not true, throws the error.
Example:
var file = new VFile();
file.fail('Something went wrong');
// 1:1: Something went wrong
// at VFile.exception (vfile/index.js:296:11)
// at VFile.fail (vfile/index.js:360:20)
// at repl:1:6
file.quiet = true;
file.fail('Something went wrong');
// { [1:1: Something went wrong]
// name: '1:1',
// file: '',
// reason: 'Something went wrong',
// line: null,
// column: null,
// fatal: true }
See:
VFile#hasFailed()
Check if a fatal message occurred making the file no longer processable.
Example:
var file = new VFile();
file.quiet = true;
file.hasFailed(); // false
file.fail('Something went wrong');
file.hasFailed(); // true
Signatures:
boolean = vFile.hasFailed().
Returns:
boolean — true if at least one of file’s messages has a fatal
property set to true.
VFileMessage
Error — File-related message with location information.
Properties:
-
name(string) — (Starting) location of the message, preceded by its file-path when available, and joined by':'. Used by the nativeError#toString(); -
file(string) — File-path; -
reason(string) — Reason for message; -
line(number?) — Line of error, when available; -
column(number?) — Column of error, when available; -
stack(string?) — Stack of message, when available; -
fatal(boolean?) — Whether the associated file is still processable. -
location(object) — Full range information, when available. Hasstartandendproperties, both set to an object withlineandcolumn, set tonumber?.