Refactor routing in App component to enhance navigation and improve error handling by integrating dynamic routes and updating the NotFound route.

This commit is contained in:
becarta
2025-05-23 12:43:00 +02:00
parent f40db0f5c9
commit a544759a3b
11127 changed files with 1647032 additions and 0 deletions

153
node_modules/vfile/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,153 @@
import type {VFile} from './lib/index.js'
// See: <https://github.com/sindresorhus/type-fest/blob/main/source/empty-object.d.ts>
declare const emptyObjectSymbol: unique symbol
// To do: next major: remove.
export type {Options as MessageOptions} from 'vfile-message'
export {VFile} from './lib/index.js'
// To do: next major: remove.
// Deprecated names (w/ prefix):
export type {
Compatible as VFileCompatible,
DataMap as VFileDataMap,
Data as VFileData,
Options as VFileOptions,
ReporterSettings as VFileReporterSettings,
Reporter as VFileReporter,
Value as VFileValue
}
/**
* Things that can be passed to the constructor.
*/
export type Compatible = Options | URL | VFile | Value
/**
* Raw source map.
*
* See:
* <https://github.com/mozilla/source-map/blob/60adcb0/source-map.d.ts#L15-L23>.
*/
export interface Map {
/**
* The generated file this source map is associated with.
*/
file: string
/**
* A string of base64 VLQs which contain the actual mappings.
*/
mappings: string
/**
* An array of identifiers which can be referenced by individual mappings.
*/
names: Array<string>
/**
* An array of contents of the original source files.
*/
sourcesContent?: Array<string> | undefined
/**
* The URL root from which all sources are relative.
*/
sourceRoot?: string | undefined
/**
* An array of URLs to the original source files.
*/
sources: Array<string>
/**
* Which version of the source map spec this map is following.
*/
version: number
}
/**
* This map registers the type of the `data` key of a `VFile`.
*
* This type can be augmented to register custom `data` types.
*
* @example
* declare module 'vfile' {
* interface DataMap {
* // `file.data.name` is typed as `string`
* name: string
* }
* }
*/
export interface DataMap {
[emptyObjectSymbol]?: never
}
/**
* Custom info.
*
* Known attributes can be added to {@linkcode DataMap}
*/
export type Data = Record<string, unknown> & Partial<DataMap>
/**
* Configuration.
*/
export interface Options {
/**
* Arbitrary fields that will be shallow copied over to the new file.
*/
[key: string]: unknown
/**
* Set `basename` (name).
*/
basename?: string | null | undefined
/**
* Set `cwd` (working directory).
*/
cwd?: string | null | undefined
/**
* Set `data` (associated info).
*/
data?: Data | null | undefined
/**
* Set `dirname` (path w/o basename).
*/
dirname?: string | null | undefined
/**
* Set `extname` (extension with dot).
*/
extname?: string | null | undefined
/**
* Set `history` (paths the file moved between).
*/
history?: Array<string> | null | undefined
/**
* Set `path` (current path).
*/
path?: URL | string | null | undefined
/**
* Set `stem` (name without extension).
*/
stem?: string | null | undefined
/**
* Set `value` (the contents of the file).
*/
value?: Value | null | undefined
}
/**
* Configuration for reporters.
*/
export type ReporterSettings = Record<string, unknown>
/**
* Type for a reporter.
*/
export type Reporter<Settings = ReporterSettings> = (
files: Array<VFile>,
options: Settings
) => string
/**
* Contents of the file.
*
* Can either be text or a `Uint8Array` structure.
*/
export type Value = Uint8Array | string

2
node_modules/vfile/index.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
// More types exposed from `index.d.ts`.
export {VFile} from './lib/index.js'

1465
node_modules/vfile/lib/index.d.ts generated vendored Normal file

File diff suppressed because it is too large Load Diff

1
node_modules/vfile/lib/index.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.js"],"names":[],"mappings":"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"}

643
node_modules/vfile/lib/index.js generated vendored Normal file
View File

@@ -0,0 +1,643 @@
/**
* @import {Node, Point, Position} from 'unist'
* @import {Options as MessageOptions} from 'vfile-message'
* @import {Compatible, Data, Map, Options, Value} from 'vfile'
*/
/**
* @typedef {object & {type: string, position?: Position | undefined}} NodeLike
*/
import {VFileMessage} from 'vfile-message'
import {minpath} from '#minpath'
import {minproc} from '#minproc'
import {urlToPath, isUrl} from '#minurl'
/**
* Order of setting (least specific to most), we need this because otherwise
* `{stem: 'a', path: '~/b.js'}` would throw, as a path is needed before a
* stem can be set.
*/
const order = /** @type {const} */ ([
'history',
'path',
'basename',
'stem',
'extname',
'dirname'
])
export class VFile {
/**
* Create a new virtual file.
*
* `options` is treated as:
*
* * `string` or `Uint8Array` — `{value: options}`
* * `URL` — `{path: options}`
* * `VFile` — shallow copies its data over to the new file
* * `object` — 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.
*
* @param {Compatible | null | undefined} [value]
* File value.
* @returns
* New instance.
*/
constructor(value) {
/** @type {Options | VFile} */
let options
if (!value) {
options = {}
} else if (isUrl(value)) {
options = {path: value}
} else if (typeof value === 'string' || isUint8Array(value)) {
options = {value}
} else {
options = value
}
/* eslint-disable no-unused-expressions */
/**
* Base of `path` (default: `process.cwd()` or `'/'` in browsers).
*
* @type {string}
*/
// Prevent calling `cwd` (which could be expensive) if its not needed;
// the empty string will be overridden in the next block.
this.cwd = 'cwd' in options ? '' : minproc.cwd()
/**
* Place to store custom info (default: `{}`).
*
* Its OK to store custom data directly on the file but moving it to
* `data` is recommended.
*
* @type {Data}
*/
this.data = {}
/**
* List of file paths the file moved between.
*
* The first is the original path and the last is the current path.
*
* @type {Array<string>}
*/
this.history = []
/**
* List of messages associated with the file.
*
* @type {Array<VFileMessage>}
*/
this.messages = []
/**
* Raw value.
*
* @type {Value}
*/
this.value
// The below are non-standard, they are “well-known”.
// As in, used in several tools.
/**
* Source map.
*
* This type is equivalent to the `RawSourceMap` type from the `source-map`
* module.
*
* @type {Map | null | undefined}
*/
this.map
/**
* Custom, non-string, compiled, representation.
*
* This is used by unified to store non-string results.
* One example is when turning markdown into React nodes.
*
* @type {unknown}
*/
this.result
/**
* Whether a file was saved to disk.
*
* This is used by vfile reporters.
*
* @type {boolean}
*/
this.stored
/* eslint-enable no-unused-expressions */
// Set path related properties in the correct order.
let index = -1
while (++index < order.length) {
const field = order[index]
// Note: we specifically use `in` instead of `hasOwnProperty` to accept
// `vfile`s too.
if (
field in options &&
options[field] !== undefined &&
options[field] !== null
) {
// @ts-expect-error: TS doesnt understand basic reality.
this[field] = field === 'history' ? [...options[field]] : options[field]
}
}
/** @type {string} */
let field
// Set non-path related properties.
for (field in options) {
// @ts-expect-error: fine to set other things.
if (!order.includes(field)) {
// @ts-expect-error: fine to set other things.
this[field] = options[field]
}
}
}
/**
* Get the basename (including extname) (example: `'index.min.js'`).
*
* @returns {string | undefined}
* Basename.
*/
get basename() {
return typeof this.path === 'string'
? minpath.basename(this.path)
: undefined
}
/**
* Set basename (including extname) (`'index.min.js'`).
*
* Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\'`
* on windows).
* Cannot be nullified (use `file.path = file.dirname` instead).
*
* @param {string} basename
* Basename.
* @returns {undefined}
* Nothing.
*/
set basename(basename) {
assertNonEmpty(basename, 'basename')
assertPart(basename, 'basename')
this.path = minpath.join(this.dirname || '', basename)
}
/**
* Get the parent path (example: `'~'`).
*
* @returns {string | undefined}
* Dirname.
*/
get dirname() {
return typeof this.path === 'string'
? minpath.dirname(this.path)
: undefined
}
/**
* Set the parent path (example: `'~'`).
*
* Cannot be set if theres no `path` yet.
*
* @param {string | undefined} dirname
* Dirname.
* @returns {undefined}
* Nothing.
*/
set dirname(dirname) {
assertPath(this.basename, 'dirname')
this.path = minpath.join(dirname || '', this.basename)
}
/**
* Get the extname (including dot) (example: `'.js'`).
*
* @returns {string | undefined}
* Extname.
*/
get extname() {
return typeof this.path === 'string'
? minpath.extname(this.path)
: undefined
}
/**
* Set the extname (including dot) (example: `'.js'`).
*
* Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\'`
* on windows).
* Cannot be set if theres no `path` yet.
*
* @param {string | undefined} extname
* Extname.
* @returns {undefined}
* Nothing.
*/
set extname(extname) {
assertPart(extname, 'extname')
assertPath(this.dirname, 'extname')
if (extname) {
if (extname.codePointAt(0) !== 46 /* `.` */) {
throw new Error('`extname` must start with `.`')
}
if (extname.includes('.', 1)) {
throw new Error('`extname` cannot contain multiple dots')
}
}
this.path = minpath.join(this.dirname, this.stem + (extname || ''))
}
/**
* Get the full path (example: `'~/index.min.js'`).
*
* @returns {string}
* Path.
*/
get path() {
return this.history[this.history.length - 1]
}
/**
* Set the full path (example: `'~/index.min.js'`).
*
* Cannot be nullified.
* You can set a file URL (a `URL` object with a `file:` protocol) which will
* be turned into a path with `url.fileURLToPath`.
*
* @param {URL | string} path
* Path.
* @returns {undefined}
* Nothing.
*/
set path(path) {
if (isUrl(path)) {
path = urlToPath(path)
}
assertNonEmpty(path, 'path')
if (this.path !== path) {
this.history.push(path)
}
}
/**
* Get the stem (basename w/o extname) (example: `'index.min'`).
*
* @returns {string | undefined}
* Stem.
*/
get stem() {
return typeof this.path === 'string'
? minpath.basename(this.path, this.extname)
: undefined
}
/**
* Set the stem (basename w/o extname) (example: `'index.min'`).
*
* Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\'`
* on windows).
* Cannot be nullified (use `file.path = file.dirname` instead).
*
* @param {string} stem
* Stem.
* @returns {undefined}
* Nothing.
*/
set stem(stem) {
assertNonEmpty(stem, 'stem')
assertPart(stem, 'stem')
this.path = minpath.join(this.dirname || '', stem + (this.extname || ''))
}
// Normal prototypal methods.
/**
* Create a fatal message for `reason` associated with the file.
*
* The `fatal` field of the message is set to `true` (error; file not usable)
* and the `file` field is set to the current file path.
* The message is added to the `messages` field on `file`.
*
* > 🪦 **Note**: also has obsolete signatures.
*
* @overload
* @param {string} reason
* @param {MessageOptions | null | undefined} [options]
* @returns {never}
*
* @overload
* @param {string} reason
* @param {Node | NodeLike | null | undefined} parent
* @param {string | null | undefined} [origin]
* @returns {never}
*
* @overload
* @param {string} reason
* @param {Point | Position | null | undefined} place
* @param {string | null | undefined} [origin]
* @returns {never}
*
* @overload
* @param {string} reason
* @param {string | null | undefined} [origin]
* @returns {never}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {Node | NodeLike | null | undefined} parent
* @param {string | null | undefined} [origin]
* @returns {never}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {Point | Position | null | undefined} place
* @param {string | null | undefined} [origin]
* @returns {never}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {string | null | undefined} [origin]
* @returns {never}
*
* @param {Error | VFileMessage | string} causeOrReason
* Reason for message, should use markdown.
* @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]
* Configuration (optional).
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {never}
* Never.
* @throws {VFileMessage}
* Message.
*/
fail(causeOrReason, optionsOrParentOrPlace, origin) {
// @ts-expect-error: the overloads are fine.
const message = this.message(causeOrReason, optionsOrParentOrPlace, origin)
message.fatal = true
throw message
}
/**
* Create an info message for `reason` associated with the file.
*
* The `fatal` field of the message is set to `undefined` (info; change
* likely not needed) and the `file` field is set to the current file path.
* The message is added to the `messages` field on `file`.
*
* > 🪦 **Note**: also has obsolete signatures.
*
* @overload
* @param {string} reason
* @param {MessageOptions | null | undefined} [options]
* @returns {VFileMessage}
*
* @overload
* @param {string} reason
* @param {Node | NodeLike | null | undefined} parent
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {string} reason
* @param {Point | Position | null | undefined} place
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {string} reason
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {Node | NodeLike | null | undefined} parent
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {Point | Position | null | undefined} place
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @param {Error | VFileMessage | string} causeOrReason
* Reason for message, should use markdown.
* @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]
* Configuration (optional).
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {VFileMessage}
* Message.
*/
info(causeOrReason, optionsOrParentOrPlace, origin) {
// @ts-expect-error: the overloads are fine.
const message = this.message(causeOrReason, optionsOrParentOrPlace, origin)
message.fatal = undefined
return message
}
/**
* Create a message for `reason` associated with the file.
*
* The `fatal` field of the message is set to `false` (warning; change may be
* needed) and the `file` field is set to the current file path.
* The message is added to the `messages` field on `file`.
*
* > 🪦 **Note**: also has obsolete signatures.
*
* @overload
* @param {string} reason
* @param {MessageOptions | null | undefined} [options]
* @returns {VFileMessage}
*
* @overload
* @param {string} reason
* @param {Node | NodeLike | null | undefined} parent
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {string} reason
* @param {Point | Position | null | undefined} place
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {string} reason
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {Node | NodeLike | null | undefined} parent
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {Point | Position | null | undefined} place
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @overload
* @param {Error | VFileMessage} cause
* @param {string | null | undefined} [origin]
* @returns {VFileMessage}
*
* @param {Error | VFileMessage | string} causeOrReason
* Reason for message, should use markdown.
* @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]
* Configuration (optional).
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {VFileMessage}
* Message.
*/
message(causeOrReason, optionsOrParentOrPlace, origin) {
const message = new VFileMessage(
// @ts-expect-error: the overloads are fine.
causeOrReason,
optionsOrParentOrPlace,
origin
)
if (this.path) {
message.name = this.path + ':' + message.name
message.file = this.path
}
message.fatal = false
this.messages.push(message)
return message
}
/**
* Serialize the file.
*
* > **Note**: which encodings are supported depends on the engine.
* > For info on Node.js, see:
* > <https://nodejs.org/api/util.html#whatwg-supported-encodings>.
*
* @param {string | null | undefined} [encoding='utf8']
* Character encoding to understand `value` as when its a `Uint8Array`
* (default: `'utf-8'`).
* @returns {string}
* Serialized file.
*/
toString(encoding) {
if (this.value === undefined) {
return ''
}
if (typeof this.value === 'string') {
return this.value
}
const decoder = new TextDecoder(encoding || undefined)
return decoder.decode(this.value)
}
}
/**
* Assert that `part` is not a path (as in, does not contain `path.sep`).
*
* @param {string | null | undefined} part
* File path part.
* @param {string} name
* Part name.
* @returns {undefined}
* Nothing.
*/
function assertPart(part, name) {
if (part && part.includes(minpath.sep)) {
throw new Error(
'`' + name + '` cannot be a path: did not expect `' + minpath.sep + '`'
)
}
}
/**
* Assert that `part` is not empty.
*
* @param {string | undefined} part
* Thing.
* @param {string} name
* Part name.
* @returns {asserts part is string}
* Nothing.
*/
function assertNonEmpty(part, name) {
if (!part) {
throw new Error('`' + name + '` cannot be empty')
}
}
/**
* Assert `path` exists.
*
* @param {string | undefined} path
* Path.
* @param {string} name
* Dependency name.
* @returns {asserts path is string}
* Nothing.
*/
function assertPath(path, name) {
if (!path) {
throw new Error('Setting `' + name + '` requires `path` to be set too')
}
}
/**
* Assert `value` is an `Uint8Array`.
*
* @param {unknown} value
* thing.
* @returns {value is Uint8Array}
* Whether `value` is an `Uint8Array`.
*/
function isUint8Array(value) {
return Boolean(
value &&
typeof value === 'object' &&
'byteLength' in value &&
'byteOffset' in value
)
}

47
node_modules/vfile/lib/minpath.browser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,47 @@
export namespace minpath {
export { basename };
export { dirname };
export { extname };
export { join };
export let sep: string;
}
/**
* Get the basename from a path.
*
* @param {string} path
* File path.
* @param {string | null | undefined} [extname]
* Extension to strip.
* @returns {string}
* Stem or basename.
*/
declare function basename(path: string, extname?: string | null | undefined): string;
/**
* Get the dirname from a path.
*
* @param {string} path
* File path.
* @returns {string}
* File path.
*/
declare function dirname(path: string): string;
/**
* Get an extname from a path.
*
* @param {string} path
* File path.
* @returns {string}
* Extname.
*/
declare function extname(path: string): string;
/**
* Join segments from a path.
*
* @param {Array<string>} segments
* Path segments.
* @returns {string}
* File path.
*/
declare function join(...segments: Array<string>): string;
export {};
//# sourceMappingURL=minpath.browser.d.ts.map

1
node_modules/vfile/lib/minpath.browser.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minpath.browser.d.ts","sourceRoot":"","sources":["minpath.browser.js"],"names":[],"mappings":";;;;;;;AAuDA;;;;;;;;;GASG;AACH,gCAPW,MAAM,YAEN,MAAM,GAAG,IAAI,GAAG,SAAS,GAEvB,MAAM,CAuFlB;AAED;;;;;;;GAOG;AACH,+BALW,MAAM,GAEJ,MAAM,CAmClB;AAED;;;;;;;GAOG;AACH,+BALW,MAAM,GAEJ,MAAM,CAgElB;AAED;;;;;;;GAOG;AACH,mCALW,KAAK,CAAC,MAAM,CAAC,GAEX,MAAM,CAkBlB"}

426
node_modules/vfile/lib/minpath.browser.js generated vendored Normal file
View File

@@ -0,0 +1,426 @@
// A derivative work based on:
// <https://github.com/browserify/path-browserify>.
// Which is licensed:
//
// MIT License
//
// Copyright (c) 2013 James Halliday
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// A derivative work based on:
//
// Parts of that are extracted from Nodes internal `path` module:
// <https://github.com/nodejs/node/blob/master/lib/path.js>.
// Which is licensed:
//
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
export const minpath = {basename, dirname, extname, join, sep: '/'}
/* eslint-disable max-depth, complexity */
/**
* Get the basename from a path.
*
* @param {string} path
* File path.
* @param {string | null | undefined} [extname]
* Extension to strip.
* @returns {string}
* Stem or basename.
*/
function basename(path, extname) {
if (extname !== undefined && typeof extname !== 'string') {
throw new TypeError('"ext" argument must be a string')
}
assertPath(path)
let start = 0
let end = -1
let index = path.length
/** @type {boolean | undefined} */
let seenNonSlash
if (
extname === undefined ||
extname.length === 0 ||
extname.length > path.length
) {
while (index--) {
if (path.codePointAt(index) === 47 /* `/` */) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now.
if (seenNonSlash) {
start = index + 1
break
}
} else if (end < 0) {
// We saw the first non-path separator, mark this as the end of our
// path component.
seenNonSlash = true
end = index + 1
}
}
return end < 0 ? '' : path.slice(start, end)
}
if (extname === path) {
return ''
}
let firstNonSlashEnd = -1
let extnameIndex = extname.length - 1
while (index--) {
if (path.codePointAt(index) === 47 /* `/` */) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now.
if (seenNonSlash) {
start = index + 1
break
}
} else {
if (firstNonSlashEnd < 0) {
// We saw the first non-path separator, remember this index in case
// we need it if the extension ends up not matching.
seenNonSlash = true
firstNonSlashEnd = index + 1
}
if (extnameIndex > -1) {
// Try to match the explicit extension.
if (path.codePointAt(index) === extname.codePointAt(extnameIndex--)) {
if (extnameIndex < 0) {
// We matched the extension, so mark this as the end of our path
// component
end = index
}
} else {
// Extension does not match, so our result is the entire path
// component
extnameIndex = -1
end = firstNonSlashEnd
}
}
}
}
if (start === end) {
end = firstNonSlashEnd
} else if (end < 0) {
end = path.length
}
return path.slice(start, end)
}
/**
* Get the dirname from a path.
*
* @param {string} path
* File path.
* @returns {string}
* File path.
*/
function dirname(path) {
assertPath(path)
if (path.length === 0) {
return '.'
}
let end = -1
let index = path.length
/** @type {boolean | undefined} */
let unmatchedSlash
// Prefix `--` is important to not run on `0`.
while (--index) {
if (path.codePointAt(index) === 47 /* `/` */) {
if (unmatchedSlash) {
end = index
break
}
} else if (!unmatchedSlash) {
// We saw the first non-path separator
unmatchedSlash = true
}
}
return end < 0
? path.codePointAt(0) === 47 /* `/` */
? '/'
: '.'
: end === 1 && path.codePointAt(0) === 47 /* `/` */
? '//'
: path.slice(0, end)
}
/**
* Get an extname from a path.
*
* @param {string} path
* File path.
* @returns {string}
* Extname.
*/
function extname(path) {
assertPath(path)
let index = path.length
let end = -1
let startPart = 0
let startDot = -1
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find.
let preDotState = 0
/** @type {boolean | undefined} */
let unmatchedSlash
while (index--) {
const code = path.codePointAt(index)
if (code === 47 /* `/` */) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now.
if (unmatchedSlash) {
startPart = index + 1
break
}
continue
}
if (end < 0) {
// We saw the first non-path separator, mark this as the end of our
// extension.
unmatchedSlash = true
end = index + 1
}
if (code === 46 /* `.` */) {
// If this is our first dot, mark it as the start of our extension.
if (startDot < 0) {
startDot = index
} else if (preDotState !== 1) {
preDotState = 1
}
} else if (startDot > -1) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension.
preDotState = -1
}
}
if (
startDot < 0 ||
end < 0 ||
// We saw a non-dot character immediately before the dot.
preDotState === 0 ||
// The (right-most) trimmed path component is exactly `..`.
(preDotState === 1 && startDot === end - 1 && startDot === startPart + 1)
) {
return ''
}
return path.slice(startDot, end)
}
/**
* Join segments from a path.
*
* @param {Array<string>} segments
* Path segments.
* @returns {string}
* File path.
*/
function join(...segments) {
let index = -1
/** @type {string | undefined} */
let joined
while (++index < segments.length) {
assertPath(segments[index])
if (segments[index]) {
joined =
joined === undefined ? segments[index] : joined + '/' + segments[index]
}
}
return joined === undefined ? '.' : normalize(joined)
}
/**
* Normalize a basic file path.
*
* @param {string} path
* File path.
* @returns {string}
* File path.
*/
// Note: `normalize` is not exposed as `path.normalize`, so some code is
// manually removed from it.
function normalize(path) {
assertPath(path)
const absolute = path.codePointAt(0) === 47 /* `/` */
// Normalize the path according to POSIX rules.
let value = normalizeString(path, !absolute)
if (value.length === 0 && !absolute) {
value = '.'
}
if (value.length > 0 && path.codePointAt(path.length - 1) === 47 /* / */) {
value += '/'
}
return absolute ? '/' + value : value
}
/**
* Resolve `.` and `..` elements in a path with directory names.
*
* @param {string} path
* File path.
* @param {boolean} allowAboveRoot
* Whether `..` can move above root.
* @returns {string}
* File path.
*/
function normalizeString(path, allowAboveRoot) {
let result = ''
let lastSegmentLength = 0
let lastSlash = -1
let dots = 0
let index = -1
/** @type {number | undefined} */
let code
/** @type {number} */
let lastSlashIndex
while (++index <= path.length) {
if (index < path.length) {
code = path.codePointAt(index)
} else if (code === 47 /* `/` */) {
break
} else {
code = 47 /* `/` */
}
if (code === 47 /* `/` */) {
if (lastSlash === index - 1 || dots === 1) {
// Empty.
} else if (lastSlash !== index - 1 && dots === 2) {
if (
result.length < 2 ||
lastSegmentLength !== 2 ||
result.codePointAt(result.length - 1) !== 46 /* `.` */ ||
result.codePointAt(result.length - 2) !== 46 /* `.` */
) {
if (result.length > 2) {
lastSlashIndex = result.lastIndexOf('/')
if (lastSlashIndex !== result.length - 1) {
if (lastSlashIndex < 0) {
result = ''
lastSegmentLength = 0
} else {
result = result.slice(0, lastSlashIndex)
lastSegmentLength = result.length - 1 - result.lastIndexOf('/')
}
lastSlash = index
dots = 0
continue
}
} else if (result.length > 0) {
result = ''
lastSegmentLength = 0
lastSlash = index
dots = 0
continue
}
}
if (allowAboveRoot) {
result = result.length > 0 ? result + '/..' : '..'
lastSegmentLength = 2
}
} else {
if (result.length > 0) {
result += '/' + path.slice(lastSlash + 1, index)
} else {
result = path.slice(lastSlash + 1, index)
}
lastSegmentLength = index - lastSlash - 1
}
lastSlash = index
dots = 0
} else if (code === 46 /* `.` */ && dots > -1) {
dots++
} else {
dots = -1
}
}
return result
}
/**
* Make sure `path` is a string.
*
* @param {string} path
* File path.
* @returns {asserts path is string}
* Nothing.
*/
function assertPath(path) {
if (typeof path !== 'string') {
throw new TypeError(
'Path must be a string. Received ' + JSON.stringify(path)
)
}
}
/* eslint-enable max-depth, complexity */

2
node_modules/vfile/lib/minpath.d.ts generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export { default as minpath } from "node:path";
//# sourceMappingURL=minpath.d.ts.map

1
node_modules/vfile/lib/minpath.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minpath.d.ts","sourceRoot":"","sources":["minpath.js"],"names":[],"mappings":""}

1
node_modules/vfile/lib/minpath.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {default as minpath} from 'node:path'

6
node_modules/vfile/lib/minproc.browser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,6 @@
export namespace minproc {
export { cwd };
}
declare function cwd(): string;
export {};
//# sourceMappingURL=minproc.browser.d.ts.map

1
node_modules/vfile/lib/minproc.browser.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minproc.browser.d.ts","sourceRoot":"","sources":["minproc.browser.js"],"names":[],"mappings":";;;AAKA,+BAEC"}

8
node_modules/vfile/lib/minproc.browser.js generated vendored Normal file
View File

@@ -0,0 +1,8 @@
// Somewhat based on:
// <https://github.com/defunctzombie/node-process/blob/master/browser.js>.
// But I dont think one tiny line of code can be copyrighted. 😅
export const minproc = {cwd}
function cwd() {
return '/'
}

2
node_modules/vfile/lib/minproc.d.ts generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export { default as minproc } from "node:process";
//# sourceMappingURL=minproc.d.ts.map

1
node_modules/vfile/lib/minproc.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minproc.d.ts","sourceRoot":"","sources":["minproc.js"],"names":[],"mappings":""}

1
node_modules/vfile/lib/minproc.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {default as minproc} from 'node:process'

9
node_modules/vfile/lib/minurl.browser.d.ts generated vendored Normal file
View File

@@ -0,0 +1,9 @@
/**
* @param {URL | string} path
* File URL.
* @returns {string}
* File URL.
*/
export function urlToPath(path: URL | string): string;
export { isUrl } from "./minurl.shared.js";
//# sourceMappingURL=minurl.browser.d.ts.map

1
node_modules/vfile/lib/minurl.browser.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minurl.browser.d.ts","sourceRoot":"","sources":["minurl.browser.js"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,gCALW,GAAG,GAAG,MAAM,GAEV,MAAM,CAyBlB"}

76
node_modules/vfile/lib/minurl.browser.js generated vendored Normal file
View File

@@ -0,0 +1,76 @@
import {isUrl} from './minurl.shared.js'
export {isUrl} from './minurl.shared.js'
// See: <https://github.com/nodejs/node/blob/6a3403c/lib/internal/url.js>
/**
* @param {URL | string} path
* File URL.
* @returns {string}
* File URL.
*/
export function urlToPath(path) {
if (typeof path === 'string') {
path = new URL(path)
} else if (!isUrl(path)) {
/** @type {NodeJS.ErrnoException} */
const error = new TypeError(
'The "path" argument must be of type string or an instance of URL. Received `' +
path +
'`'
)
error.code = 'ERR_INVALID_ARG_TYPE'
throw error
}
if (path.protocol !== 'file:') {
/** @type {NodeJS.ErrnoException} */
const error = new TypeError('The URL must be of scheme file')
error.code = 'ERR_INVALID_URL_SCHEME'
throw error
}
return getPathFromURLPosix(path)
}
/**
* Get a path from a POSIX URL.
*
* @param {URL} url
* URL.
* @returns {string}
* File path.
*/
function getPathFromURLPosix(url) {
if (url.hostname !== '') {
/** @type {NodeJS.ErrnoException} */
const error = new TypeError(
'File URL host must be "localhost" or empty on darwin'
)
error.code = 'ERR_INVALID_FILE_URL_HOST'
throw error
}
const pathname = url.pathname
let index = -1
while (++index < pathname.length) {
if (
pathname.codePointAt(index) === 37 /* `%` */ &&
pathname.codePointAt(index + 1) === 50 /* `2` */
) {
const third = pathname.codePointAt(index + 2)
if (third === 70 /* `F` */ || third === 102 /* `f` */) {
/** @type {NodeJS.ErrnoException} */
const error = new TypeError(
'File URL path must not include encoded / characters'
)
error.code = 'ERR_INVALID_FILE_URL_PATH'
throw error
}
}
}
return decodeURIComponent(pathname)
}

3
node_modules/vfile/lib/minurl.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
export { fileURLToPath as urlToPath } from "node:url";
export { isUrl } from "./minurl.shared.js";
//# sourceMappingURL=minurl.d.ts.map

1
node_modules/vfile/lib/minurl.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minurl.d.ts","sourceRoot":"","sources":["minurl.js"],"names":[],"mappings":""}

2
node_modules/vfile/lib/minurl.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {fileURLToPath as urlToPath} from 'node:url'
export {isUrl} from './minurl.shared.js'

20
node_modules/vfile/lib/minurl.shared.d.ts generated vendored Normal file
View File

@@ -0,0 +1,20 @@
/**
* Checks if a value has the shape of a WHATWG URL object.
*
* Using a symbol or instanceof would not be able to recognize URL objects
* coming from other implementations (e.g. in Electron), so instead we are
* checking some well known properties for a lack of a better test.
*
* We use `href` and `protocol` as they are the only properties that are
* easy to retrieve and calculate due to the lazy nature of the getters.
*
* We check for auth attribute to distinguish legacy url instance with
* WHATWG URL instance.
*
* @param {unknown} fileUrlOrPath
* File path or URL.
* @returns {fileUrlOrPath is URL}
* Whether its a URL.
*/
export function isUrl(fileUrlOrPath: unknown): fileUrlOrPath is URL;
//# sourceMappingURL=minurl.shared.d.ts.map

1
node_modules/vfile/lib/minurl.shared.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"minurl.shared.d.ts","sourceRoot":"","sources":["minurl.shared.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qCANW,OAAO,GAEL,aAAa,IAAI,GAAG,CAehC"}

31
node_modules/vfile/lib/minurl.shared.js generated vendored Normal file
View File

@@ -0,0 +1,31 @@
/**
* Checks if a value has the shape of a WHATWG URL object.
*
* Using a symbol or instanceof would not be able to recognize URL objects
* coming from other implementations (e.g. in Electron), so instead we are
* checking some well known properties for a lack of a better test.
*
* We use `href` and `protocol` as they are the only properties that are
* easy to retrieve and calculate due to the lazy nature of the getters.
*
* We check for auth attribute to distinguish legacy url instance with
* WHATWG URL instance.
*
* @param {unknown} fileUrlOrPath
* File path or URL.
* @returns {fileUrlOrPath is URL}
* Whether its a URL.
*/
// From: <https://github.com/nodejs/node/blob/6a3403c/lib/internal/url.js#L720>
export function isUrl(fileUrlOrPath) {
return Boolean(
fileUrlOrPath !== null &&
typeof fileUrlOrPath === 'object' &&
'href' in fileUrlOrPath &&
fileUrlOrPath.href &&
'protocol' in fileUrlOrPath &&
fileUrlOrPath.protocol &&
// @ts-expect-error: indexing is fine.
fileUrlOrPath.auth === undefined
)
}

21
node_modules/vfile/license generated vendored Normal file
View File

@@ -0,0 +1,21 @@
(The MIT License)
Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

134
node_modules/vfile/package.json generated vendored Normal file
View File

@@ -0,0 +1,134 @@
{
"name": "vfile",
"version": "6.0.3",
"description": "Virtual file format for text processing",
"license": "MIT",
"keywords": [
"vfile",
"virtual",
"file",
"text",
"processing",
"message",
"warning",
"error",
"remark",
"retext",
"rehype"
],
"repository": "vfile/vfile",
"bugs": "https://github.com/vfile/vfile/issues",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
},
"author": "Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)",
"contributors": [
"Titus Wormer <tituswormer@gmail.com> (https://wooorm.com)",
"Brendan Abbott <brendan.abbott@temando.com>",
"Denys Dovhan <email@denysdovhan.com>",
"Kyle Mathews <mathews.kyle@gmail.com>",
"Shinnosuke Watanabe <snnskwtnb@gmail.com>",
"Sindre Sorhus <sindresorhus@gmail.com>"
],
"sideEffects": false,
"type": "module",
"exports": "./index.js",
"imports": {
"#minpath": {
"node": "./lib/minpath.js",
"default": "./lib/minpath.browser.js"
},
"#minproc": {
"node": "./lib/minproc.js",
"default": "./lib/minproc.browser.js"
},
"#minurl": {
"node": "./lib/minurl.js",
"default": "./lib/minurl.browser.js"
}
},
"files": [
"lib/",
"index.d.ts",
"index.js"
],
"dependencies": {
"@types/unist": "^3.0.0",
"vfile-message": "^4.0.0"
},
"devDependencies": {
"@types/node": "^22.0.0",
"c8": "^10.0.0",
"prettier": "^3.0.0",
"remark-cli": "^12.0.0",
"remark-preset-wooorm": "^10.0.0",
"type-coverage": "^2.0.0",
"typescript": "^5.0.0",
"xo": "^0.59.0"
},
"scripts": {
"prepack": "npm run build && npm run format",
"build": "tsc --build --clean && tsc --build && type-coverage",
"format": "remark . -qfo && prettier . -w --log-level warn && xo --fix",
"test-api": "node --conditions development test.js",
"test-coverage": "c8 --100 --reporter lcov npm run test-api",
"test": "npm run build && npm run format && npm run test-coverage"
},
"prettier": {
"bracketSpacing": false,
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "none",
"useTabs": false
},
"remarkConfig": {
"plugins": [
"remark-preset-wooorm",
[
"remark-lint-no-html",
false
]
]
},
"typeCoverage": {
"atLeast": 100,
"detail": true,
"ignoreCatch": true,
"strict": true
},
"xo": {
"overrides": [
{
"files": [
"**/*.d.ts"
],
"rules": {
"@typescript-eslint/array-type": [
"error",
{
"default": "generic"
}
],
"@typescript-eslint/ban-types": [
"error",
{
"extendDefaults": true
}
],
"@typescript-eslint/consistent-type-definitions": [
"error",
"interface"
]
}
}
],
"prettier": true,
"rules": {
"logical-assignment-operators": "off",
"unicorn/prefer-at": "off",
"unicorn/prefer-string-replace-all": "off"
}
}
}

785
node_modules/vfile/readme.md generated vendored Normal file
View File

@@ -0,0 +1,785 @@
<h1>
<img src="https://raw.githubusercontent.com/vfile/vfile/fc8164b/logo.svg?sanitize=true" alt="vfile" />
</h1>
[![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].
## Contents
* [unified](#unified)
* [What is this?](#what-is-this)
* [When should I use this?](#when-should-i-use-this)
* [Install](#install)
* [Use](#use)
* [API](#api)
* [`VFile(options?)`](#vfileoptions)
* [`file.cwd`](#filecwd)
* [`file.data`](#filedata)
* [`file.history`](#filehistory)
* [`file.messages`](#filemessages)
* [`file.value`](#filevalue)
* [`file.basename`](#filebasename)
* [`file.dirname`](#filedirname)
* [`file.extname`](#fileextname)
* [`file.path`](#filepath)
* [`file.stem`](#filestem)
* [`VFile#fail(reason[, options])`](#vfilefailreason-options)
* [`VFile#info(reason[, options])`](#vfileinforeason-options)
* [`VFile#message(reason[, options])`](#vfilemessagereason-options)
* [`VFile#toString(encoding?)`](#vfiletostringencoding)
* [`Compatible`](#compatible)
* [`Data`](#data)
* [`DataMap`](#datamap)
* [`Map`](#map)
* [`MessageOptions`](#messageoptions)
* [`Options`](#options)
* [`Reporter`](#reporter)
* [`ReporterSettings`](#reportersettings)
* [`Value`](#value)
* [Well-known](#well-known)
* [List of utilities](#list-of-utilities)
* [Reporters](#reporters)
* [Types](#types)
* [Compatibility](#compatibility)
* [Contribute](#contribute)
* [Sponsor](#sponsor)
* [Acknowledgments](#acknowledgments)
* [License](#license)
## unified
**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
## What is this?
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.
## When should I use this?
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.
## Install
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
<script type="module">
import {VFile} from 'https://esm.sh/vfile@6?bundle'
</script>
```
## Use
```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:
```txt
[
[~/index.text:1:8: Unexpected unknown word `braavo`, did you mean `bravo`?] {
ancestors: undefined,
cause: undefined,
column: 8,
fatal: false,
line: 1,
place: { line: 1, column: 8 },
reason: 'Unexpected unknown word `braavo`, did you mean `bravo`?',
ruleId: 'typo',
source: 'spell',
file: '~/index.text'
}
]
```
## API
This package exports the identifier [`VFile`][api-vfile].
There is no default export.
### `VFile(options?)`
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 file
* `object` — 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'}})
```
### `file.cwd`
Base of `path` (`string`, default: `process.cwd()` or `'/'` in browsers).
### `file.data`
Place to store custom info (`Record<string, unknown>`, default: `{}`).
Its OK to store custom data directly on the file but moving it to `data` is
recommended.
### `file.history`
List of file paths the file moved between (`Array<string>`).
The first is the original path and the last is the current path.
### `file.messages`
List of messages associated with the file
([`Array<VFileMessage>`][api-vfile-message]).
### `file.value`
Raw value ([`Uint8Array`][mdn-uint8-array], `string`, `undefined`).
### `file.basename`
Get or set the basename (including extname) (`string?`, example: `'index.min.js'`).
Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\'` on
windows).
Cannot be nullified (use `file.path = file.dirname` instead).
### `file.dirname`
Get or set the parent path (`string?`, example: `'~'`).
Cannot be set if theres no `path` yet.
### `file.extname`
Get or set the extname (including dot) (`string?`, example: `'.js'`).
Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\'` on
windows).
Cannot be set if theres no `path` yet.
### `file.path`
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 be
turned into a path with [`url.fileURLToPath`][file-url-to-path].
### `file.stem`
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.
### `VFile#fail(reason[, options])`
Create a fatal message for `reason` associated with the file.
The `fatal` field of the message is set to `true` (error; file not usable) and
the `file` field is set to the current file path.
The message is added to the `messages` field on `file`.
> 🪦 **Note**: also has obsolete signatures.
###### Parameters
* `reason` (`string`)
— reason for message, should use markdown
* `options` ([`MessageOptions`][api-message-options], optional)
— configuration
###### Returns
Nothing (`never`).
###### Throws
Message ([`VFileMessage`][vmessage]).
### `VFile#info(reason[, options])`
Create an info message for `reason` associated with the file.
The `fatal` field of the message is set to `undefined` (info; change likely not
needed) and the `file` field is set to the current file path.
The message is added to the `messages` field on `file`.
> 🪦 **Note**: also has obsolete signatures.
###### Parameters
* `reason` (`string`)
— reason for message, should use markdown
* `options` ([`MessageOptions`][api-message-options], optional)
— configuration
###### Returns
Message ([`VFileMessage`][vmessage]).
### `VFile#message(reason[, options])`
Create a message for `reason` associated with the file.
The `fatal` field of the message is set to `false` (warning; change may be
needed) and the `file` field is set to the current file path.
The message is added to the `messages` field on `file`.
> 🪦 **Note**: also has obsolete signatures.
###### Parameters
* `reason` (`string`)
— reason for message, should use markdown
* `options` ([`MessageOptions`][api-message-options], optional)
— configuration
###### Returns
Message ([`VFileMessage`][vmessage]).
### `VFile#toString(encoding?)`
Serialize the file.
> **Note**: which encodings are supported depends on the engine.
> For info on Node.js, see:
> <https://nodejs.org/api/util.html#whatwg-supported-encodings>.
###### Parameters
* `encoding` (`string`, default: `'utf8'`)
— character encoding to understand `value` as when its a
[`Uint8Array`][mdn-uint8-array]
###### Returns
Serialized file (`string`).
### `Compatible`
Things that can be passed to the constructor (TypeScript type).
###### Type
```ts
type Compatible = Options | URL | VFile | Value
```
### `Data`
Custom info (TypeScript type).
Known attributes can be added to [`DataMap`][api-data-map].
###### Type
```ts
type Data = Record<string, unknown> & Partial<DataMap>
```
### `DataMap`
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
```ts
declare module 'vfile' {
interface DataMap {
// `file.data.name` is typed as `string`
name: string
}
}
```
### `Map`
Raw source map (TypeScript type).
See [`source-map`][source-map].
###### Fields
* `version` (`number`)
— which version of the source map spec this map is following
* `sources` (`Array<string>`)
— an array of URLs to the original source files
* `names` (`Array<string>`)
— an array of identifiers which can be referenced by individual mappings
* `sourceRoot` (`string`, optional)
— the URL root from which all sources are relative
* `sourcesContent` (`Array<string>`, optional)
— an array of contents of the original source files
* `mappings` (`string`)
— a string of base64 VLQs which contain the actual mappings
* `file` (`string`)
— the generated file this source map is associated with
### `MessageOptions`
Options to create messages (TypeScript type).
See [`Options` in `vfile-message`][vfile-message-options].
### `Options`
An object with arbitrary fields and the following known fields (TypeScript
type).
###### Fields
* `basename` (`string`, optional)
— set `basename` (name)
* `cwd` (`string`, optional)
— set `cwd` (working directory)
* `data` ([`Data`][api-data], optional)
— set `data` (associated info)
* `dirname` (`string`, optional)
— set `dirname` (path w/o basename)
* `extname` (`string`, optional)
— set `extname` (extension with dot)
* `history` (`Array<string>`, optional)
— set `history` (paths the file moved between)
* `path` (`URL | string`, optional)
— set `path` (current path)
* `stem` (`string`, optional)
— set `stem` (name without extension)
* `value` ([`Value`][api-value], optional)
— set `value` (the contents of the file)
### `Reporter`
Type for a reporter (TypeScript type).
###### Type
```ts
type Reporter<Settings = ReporterSettings> = (
files: Array<VFile>,
options: Settings
) => string
```
### `ReporterSettings`
Configuration for reporters (TypeScript type).
###### Type
```ts
type ReporterSettings = Record<string, unknown>
```
### `Value`
Contents of the file (TypeScript type).
Can either be text or a [`Uint8Array`][mdn-uint8-array] structure.
###### Type
```ts
type Value = Uint8Array | string
```
### Well-known
The following fields are considered “non-standard”, but they are allowed, and
some utilities use them:
* `map` ([`Map`][api-map])
— source map; this type is equivalent to the `RawSourceMap` type from the
`source-map` module
* `result` (`unknown`)
— custom, non-string, compiled, representation; this is used by unified to
store non-string results; one example is when turning markdown into React
nodes
* `stored` (`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`](https://github.com/vfile/vfile-message#well-known).
<a name="utilities"></a>
## List of utilities
* [`convert-vinyl-to-vfile`](https://github.com/dustinspecker/convert-vinyl-to-vfile)
— transform from [Vinyl][]
* [`to-vfile`](https://github.com/vfile/to-vfile)
— create a file from a file path and read and write to the file system
* [`vfile-find-down`](https://github.com/vfile/vfile-find-down)
— find files by searching the file system downwards
* [`vfile-find-up`](https://github.com/vfile/vfile-find-up)
— find files by searching the file system upwards
* [`vfile-glob`](https://github.com/shinnn/vfile-glob)
— find files by glob patterns
* [`vfile-is`](https://github.com/vfile/vfile-is)
— check if a file passes a test
* [`vfile-location`](https://github.com/vfile/vfile-location)
— convert between positional and offset locations
* [`vfile-matter`](https://github.com/vfile/vfile-matter)
— parse the YAML front matter
* [`vfile-message`](https://github.com/vfile/vfile-message)
— create a file message
* [`vfile-messages-to-vscode-diagnostics`](https://github.com/shinnn/vfile-messages-to-vscode-diagnostics)
— transform file messages to VS Code diagnostics
* [`vfile-mkdirp`](https://github.com/vfile/vfile-mkdirp)
— make sure the directory of a file exists on the file system
* [`vfile-rename`](https://github.com/vfile/vfile-rename)
— rename the path parts of a file
* [`vfile-sort`](https://github.com/vfile/vfile-sort)
— sort messages by line/column
* [`vfile-statistics`](https://github.com/vfile/vfile-statistics)
— count messages per category: failures, warnings, etc
* [`vfile-to-eslint`](https://github.com/vfile/vfile-to-eslint)
— convert to ESLint formatter compatible output
> 👉 **Note**: see [unist][] for projects that work with nodes.
## Reporters
* [`vfile-reporter`][reporter]
— create a report
* [`vfile-reporter-json`](https://github.com/vfile/vfile-reporter-json)
— create a JSON report
* [`vfile-reporter-folder-json`](https://github.com/vfile/vfile-reporter-folder-json)
— create a JSON representation of vfiles
* [`vfile-reporter-pretty`](https://github.com/vfile/vfile-reporter-pretty)
— create a pretty report
* [`vfile-reporter-junit`](https://github.com/kellyselden/vfile-reporter-junit)
— create a jUnit report
* [`vfile-reporter-position`](https://github.com/Hocdoc/vfile-reporter-position)
— create a report with content excerpts
> 👉 **Note**: want to make your own reporter?
> Reporters *must* accept `Array<VFile>` as their first argument, and return
> `string`.
> Reporters *may* accept other values too, in which case its suggested to stick
> to `vfile-reporter`s interface.
## Types
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], and
[`Value`][api-value].
## Compatibility
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.
## Contribute
See [`contributing.md`][contributing] in [`vfile/.github`][health] for ways to
get started.
See [`support.md`][support] for ways to get help.
This project has a [code of conduct][coc].
By interacting with this repository, organization, or community you agree to
abide by its terms.
## Sponsor
Support this effort and give back by sponsoring on [OpenCollective][collective]!
<table>
<tr valign="middle">
<td width="20%" align="center" rowspan="2" colspan="2">
<a href="https://vercel.com">Vercel</a><br><br>
<a href="https://vercel.com"><img src="https://avatars1.githubusercontent.com/u/14985020?s=256&v=4" width="128"></a>
</td>
<td width="20%" align="center" rowspan="2" colspan="2">
<a href="https://motif.land">Motif</a><br><br>
<a href="https://motif.land"><img src="https://avatars1.githubusercontent.com/u/74457950?s=256&v=4" width="128"></a>
</td>
<td width="20%" align="center" rowspan="2" colspan="2">
<a href="https://www.hashicorp.com">HashiCorp</a><br><br>
<a href="https://www.hashicorp.com"><img src="https://avatars1.githubusercontent.com/u/761456?s=256&v=4" width="128"></a>
</td>
<td width="20%" align="center" rowspan="2" colspan="2">
<a href="https://www.gitbook.com">GitBook</a><br><br>
<a href="https://www.gitbook.com"><img src="https://avatars1.githubusercontent.com/u/7111340?s=256&v=4" width="128"></a>
</td>
<td width="20%" align="center" rowspan="2" colspan="2">
<a href="https://www.gatsbyjs.org">Gatsby</a><br><br>
<a href="https://www.gatsbyjs.org"><img src="https://avatars1.githubusercontent.com/u/12551863?s=256&v=4" width="128"></a>
</td>
</tr>
<tr valign="middle">
</tr>
<tr valign="middle">
<td width="20%" align="center" rowspan="2" colspan="2">
<a href="https://www.netlify.com">Netlify</a><br><br>
<!--OC has a sharper image-->
<a href="https://www.netlify.com"><img src="https://images.opencollective.com/netlify/4087de2/logo/256.png" width="128"></a>
</td>
<td width="10%" align="center">
<a href="https://www.coinbase.com">Coinbase</a><br><br>
<a href="https://www.coinbase.com"><img src="https://avatars1.githubusercontent.com/u/1885080?s=256&v=4" width="64"></a>
</td>
<td width="10%" align="center">
<a href="https://themeisle.com">ThemeIsle</a><br><br>
<a href="https://themeisle.com"><img src="https://avatars1.githubusercontent.com/u/58979018?s=128&v=4" width="64"></a>
</td>
<td width="10%" align="center">
<a href="https://expo.io">Expo</a><br><br>
<a href="https://expo.io"><img src="https://avatars1.githubusercontent.com/u/12504344?s=128&v=4" width="64"></a>
</td>
<td width="10%" align="center">
<a href="https://boostnote.io">Boost Note</a><br><br>
<a href="https://boostnote.io"><img src="https://images.opencollective.com/boosthub/6318083/logo/128.png" width="64"></a>
</td>
<td width="10%" align="center">
<a href="https://markdown.space">Markdown Space</a><br><br>
<a href="https://markdown.space"><img src="https://images.opencollective.com/markdown-space/e1038ed/logo/128.png" width="64"></a>
</td>
<td width="10%" align="center">
<a href="https://www.holloway.com">Holloway</a><br><br>
<a href="https://www.holloway.com"><img src="https://avatars1.githubusercontent.com/u/35904294?s=128&v=4" width="64"></a>
</td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr valign="middle">
<td width="100%" align="center" colspan="8">
<br>
<a href="https://opencollective.com/unified"><strong>You?</strong></a>
<br><br>
</td>
</tr>
</table>
## Acknowledgments
The initial release of this project was authored by
[**@wooorm**](https://github.com/wooorm).
Thanks to [**@contra**](https://github.com/contra),
[**@phated**](https://github.com/phated), and others for their work on
[Vinyl][], which was a huge inspiration.
Thanks to
[**@brendo**](https://github.com/brendo),
[**@shinnn**](https://github.com/shinnn),
[**@KyleAMathews**](https://github.com/KyleAMathews),
[**@sindresorhus**](https://github.com/sindresorhus), and
[**@denysdovhan**](https://github.com/denysdovhan)
for contributing commits since!
## License
[MIT][license] © [Titus Wormer][author]
<!-- Definitions -->
[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