🎉 initiate project *astro_rewrite*

This commit is contained in:
sindrekjelsrud 2023-07-19 21:31:30 +02:00
parent ffd4d5e86c
commit 2ba37bfbe3
8658 changed files with 2268794 additions and 2538 deletions

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

@ -0,0 +1,64 @@
import type {Reporter} from './lib/index.js'
/**
* This is the same as `Buffer` if node types are included, `never` otherwise.
*/
// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
// @ts-ignore Its important to preserve this ignore statement. This makes sure
// it works both with and without node types.
// eslint-disable-next-line n/prefer-global/buffer
type MaybeBuffer = any extends Buffer ? never : Buffer
/**
* Contents of the file.
*
* Can either be text or a `Buffer` structure.
*/
// Note: this does not directly use type `Buffer`, because it can also be used
// in a browser context.
// Instead this leverages `Uint8Array` which is the base type for `Buffer`,
// and a native JavaScript construct.
export type Value = string | MaybeBuffer
/**
* 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
* }
* }
*/
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions, @typescript-eslint/no-empty-interface
export interface DataMap {}
/**
* Custom information.
*
* Known attributes can be added to @see {@link DataMap}
*/
export type Data = Record<string, unknown> & Partial<DataMap>
// Deprecated names (w/ prefix):
export type {Data as VFileData, DataMap as VFileDataMap, Value as VFileValue}
export {VFile} from './lib/index.js'
export type {
BufferEncoding,
Map,
Compatible,
Options,
Reporter,
ReporterSettings,
// Deprecated names (w/ prefix):
Compatible as VFileCompatible,
Options as VFileOptions,
Reporter as VFileReporter,
ReporterSettings as VFileReporterSettings
} from './lib/index.js'

1
node_modules/vfile/index.js generated vendored Normal file
View file

@ -0,0 +1 @@
export {VFile} from './lib/index.js'

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

@ -0,0 +1,355 @@
export class VFile {
/**
* Create a new virtual file.
*
* `options` is treated as:
*
* * `string` or `Buffer` `{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?: Compatible | null | undefined)
/**
* Place to store custom information (default: `{}`).
*
* Its OK to store custom data directly on the file but moving it to
* `data` is recommended.
*
* @type {Data}
*/
data: Data
/**
* List of messages associated with the file.
*
* @type {Array<VFileMessage>}
*/
messages: Array<VFileMessage>
/**
* List of filepaths the file moved between.
*
* The first is the original path and the last is the current path.
*
* @type {Array<string>}
*/
history: Array<string>
/**
* Base of `path` (default: `process.cwd()` or `'/'` in browsers).
*
* @type {string}
*/
cwd: string
/**
* Raw value.
*
* @type {Value}
*/
value: Value
/**
* Whether a file was saved to disk.
*
* This is used by vfile reporters.
*
* @type {boolean}
*/
stored: boolean
/**
* 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}
*/
result: unknown
/**
* Source map.
*
* This type is equivalent to the `RawSourceMap` type from the `source-map`
* module.
*
* @type {Map | null | undefined}
*/
map: Map | null | undefined
/**
* 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 {string | URL} path
*/
set path(arg: string)
/**
* Get the full path (example: `'~/index.min.js'`).
*
* @returns {string}
*/
get path(): string
/**
* Set the parent path (example: `'~'`).
*
* Cannot be set if theres no `path` yet.
*/
set dirname(arg: string | undefined)
/**
* Get the parent path (example: `'~'`).
*/
get dirname(): string | 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).
*/
set basename(arg: string | undefined)
/**
* Get the basename (including extname) (example: `'index.min.js'`).
*/
get basename(): string | 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.
*/
set extname(arg: string | undefined)
/**
* Get the extname (including dot) (example: `'.js'`).
*/
get extname(): string | 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).
*/
set stem(arg: string | undefined)
/**
* Get the stem (basename w/o extname) (example: `'index.min'`).
*/
get stem(): string | undefined
/**
* Serialize the file.
*
* @param {BufferEncoding | null | undefined} [encoding='utf8']
* Character encoding to understand `value` as when its a `Buffer`
* (default: `'utf8'`).
* @returns {string}
* Serialized file.
*/
toString(encoding?: BufferEncoding | null | undefined): string
/**
* Create a warning message associated with the file.
*
* Its `fatal` is set to `false` and `file` is set to the current file path.
* Its added to `file.messages`.
*
* @param {string | Error | VFileMessage} reason
* Reason for message, uses the stack and message of the error if given.
* @param {Node | NodeLike | Position | Point | null | undefined} [place]
* Place in file where the message occurred.
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {VFileMessage}
* Message.
*/
message(
reason: string | Error | VFileMessage,
place?: Node | NodeLike | Position | Point | null | undefined,
origin?: string | null | undefined
): VFileMessage
/**
* Create an info message associated with the file.
*
* Its `fatal` is set to `null` and `file` is set to the current file path.
* Its added to `file.messages`.
*
* @param {string | Error | VFileMessage} reason
* Reason for message, uses the stack and message of the error if given.
* @param {Node | NodeLike | Position | Point | null | undefined} [place]
* Place in file where the message occurred.
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {VFileMessage}
* Message.
*/
info(
reason: string | Error | VFileMessage,
place?: Node | NodeLike | Position | Point | null | undefined,
origin?: string | null | undefined
): VFileMessage
/**
* Create a fatal error associated with the file.
*
* Its `fatal` is set to `true` and `file` is set to the current file path.
* Its added to `file.messages`.
*
* > 👉 **Note**: a fatal error means that a file is no longer processable.
*
* @param {string | Error | VFileMessage} reason
* Reason for message, uses the stack and message of the error if given.
* @param {Node | NodeLike | Position | Point | null | undefined} [place]
* Place in file where the message occurred.
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {never}
* Message.
* @throws {VFileMessage}
* Message.
*/
fail(
reason: string | Error | VFileMessage,
place?: Node | NodeLike | Position | Point | null | undefined,
origin?: string | null | undefined
): never
}
export type Node = import('unist').Node
export type Position = import('unist').Position
export type Point = import('unist').Point
export type URL = import('./minurl.shared.js').URL
export type Data = import('../index.js').Data
export type Value = import('../index.js').Value
export type NodeLike = Record<string, unknown> & {
type: string
position?: Position | undefined
}
/**
* Encodings supported by the buffer class.
*
* This is a copy of the types from Node, copied to prevent Node globals from
* being needed.
* Copied from: <https://github.com/DefinitelyTyped/DefinitelyTyped/blob/90a4ec8/types/node/buffer.d.ts#L170>
*/
export type BufferEncoding =
| 'ascii'
| 'utf8'
| 'utf-8'
| 'utf16le'
| 'ucs2'
| 'ucs-2'
| 'base64'
| 'base64url'
| 'latin1'
| 'binary'
| 'hex'
/**
* Things that can be passed to the constructor.
*/
export type Compatible = Options | URL | Value | VFile
/**
* Set multiple values.
*/
export type VFileCoreOptions = {
/**
* Set `value`.
*/
value?: Value | null | undefined
/**
* Set `cwd`.
*/
cwd?: string | null | undefined
/**
* Set `history`.
*/
history?: Array<string> | null | undefined
/**
* Set `path`.
*/
path?: URL | string | null | undefined
/**
* Set `basename`.
*/
basename?: string | null | undefined
/**
* Set `stem`.
*/
stem?: string | null | undefined
/**
* Set `extname`.
*/
extname?: string | null | undefined
/**
* Set `dirname`.
*/
dirname?: string | null | undefined
/**
* Set `data`.
*/
data?: Data | null | undefined
}
/**
* Raw source map.
*
* See:
* <https://github.com/mozilla/source-map/blob/58819f0/source-map.d.ts#L15-L23>.
*/
export type Map = {
/**
* Which version of the source map spec this map is following.
*/
version: number
/**
* An array of URLs to the original source files.
*/
sources: Array<string>
/**
* An array of identifiers which can be referenced by individual mappings.
*/
names: Array<string>
/**
* The URL root from which all sources are relative.
*/
sourceRoot?: string | undefined
/**
* An array of contents of the original source files.
*/
sourcesContent?: Array<string> | undefined
/**
* A string of base64 VLQs which contain the actual mappings.
*/
mappings: string
/**
* The generated file this source map is associated with.
*/
file: string
}
/**
* Configuration.
*
* A bunch of keys that will be shallow copied over to the new file.
*/
export type Options = {
[key: string]: unknown
} & VFileCoreOptions
/**
* Configuration for reporters.
*/
export type ReporterSettings = Record<string, unknown>
/**
* Type for a reporter.
*/
export type Reporter<Settings extends ReporterSettings> = (
files: Array<VFile>,
options: Settings
) => string
import {VFileMessage} from 'vfile-message'

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

@ -0,0 +1,520 @@
/**
* @typedef {import('unist').Node} Node
* @typedef {import('unist').Position} Position
* @typedef {import('unist').Point} Point
* @typedef {import('./minurl.shared.js').URL} URL
* @typedef {import('../index.js').Data} Data
* @typedef {import('../index.js').Value} Value
*/
/**
* @typedef {Record<string, unknown> & {type: string, position?: Position | undefined}} NodeLike
*
* @typedef {'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex'} BufferEncoding
* Encodings supported by the buffer class.
*
* This is a copy of the types from Node, copied to prevent Node globals from
* being needed.
* Copied from: <https://github.com/DefinitelyTyped/DefinitelyTyped/blob/90a4ec8/types/node/buffer.d.ts#L170>
*
* @typedef {Options | URL | Value | VFile} Compatible
* Things that can be passed to the constructor.
*
* @typedef VFileCoreOptions
* Set multiple values.
* @property {Value | null | undefined} [value]
* Set `value`.
* @property {string | null | undefined} [cwd]
* Set `cwd`.
* @property {Array<string> | null | undefined} [history]
* Set `history`.
* @property {URL | string | null | undefined} [path]
* Set `path`.
* @property {string | null | undefined} [basename]
* Set `basename`.
* @property {string | null | undefined} [stem]
* Set `stem`.
* @property {string | null | undefined} [extname]
* Set `extname`.
* @property {string | null | undefined} [dirname]
* Set `dirname`.
* @property {Data | null | undefined} [data]
* Set `data`.
*
* @typedef Map
* Raw source map.
*
* See:
* <https://github.com/mozilla/source-map/blob/58819f0/source-map.d.ts#L15-L23>.
* @property {number} version
* Which version of the source map spec this map is following.
* @property {Array<string>} sources
* An array of URLs to the original source files.
* @property {Array<string>} names
* An array of identifiers which can be referenced by individual mappings.
* @property {string | undefined} [sourceRoot]
* The URL root from which all sources are relative.
* @property {Array<string> | undefined} [sourcesContent]
* An array of contents of the original source files.
* @property {string} mappings
* A string of base64 VLQs which contain the actual mappings.
* @property {string} file
* The generated file this source map is associated with.
*
* @typedef {{[key: string]: unknown} & VFileCoreOptions} Options
* Configuration.
*
* A bunch of keys that will be shallow copied over to the new file.
*
* @typedef {Record<string, unknown>} ReporterSettings
* Configuration for reporters.
*/
/**
* @template {ReporterSettings} Settings
* Options type.
* @callback Reporter
* Type for a reporter.
* @param {Array<VFile>} files
* Files to report.
* @param {Settings} options
* Configuration.
* @returns {string}
* Report.
*/
import bufferLike from 'is-buffer'
import {VFileMessage} from 'vfile-message'
import {path} from './minpath.js'
import {proc} from './minproc.js'
import {urlToPath, isUrl} from './minurl.js'
/**
* 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.
*
* @type {Array<'basename' | 'dirname' | 'extname' | 'history' | 'path' | 'stem'>}
*/
const order = ['history', 'path', 'basename', 'stem', 'extname', 'dirname']
export class VFile {
/**
* Create a new virtual file.
*
* `options` is treated as:
*
* * `string` or `Buffer` `{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 (typeof value === 'string' || buffer(value)) {
options = {value}
} else if (isUrl(value)) {
options = {path: value}
} else {
options = value
}
/**
* Place to store custom information (default: `{}`).
*
* Its OK to store custom data directly on the file but moving it to
* `data` is recommended.
*
* @type {Data}
*/
this.data = {}
/**
* List of messages associated with the file.
*
* @type {Array<VFileMessage>}
*/
this.messages = []
/**
* List of filepaths the file moved between.
*
* The first is the original path and the last is the current path.
*
* @type {Array<string>}
*/
this.history = []
/**
* Base of `path` (default: `process.cwd()` or `'/'` in browsers).
*
* @type {string}
*/
this.cwd = proc.cwd()
/* eslint-disable no-unused-expressions */
/**
* Raw value.
*
* @type {Value}
*/
this.value
// The below are non-standard, they are “well-known”.
// As in, used in several tools.
/**
* Whether a file was saved to disk.
*
* This is used by vfile reporters.
*
* @type {boolean}
*/
this.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.
*
* @type {unknown}
*/
this.result
/**
* Source map.
*
* This type is equivalent to the `RawSourceMap` type from the `source-map`
* module.
*
* @type {Map | null | undefined}
*/
this.map
/* eslint-enable no-unused-expressions */
// Set path related properties in the correct order.
let index = -1
while (++index < order.length) {
const prop = order[index]
// Note: we specifically use `in` instead of `hasOwnProperty` to accept
// `vfile`s too.
if (
prop in options &&
options[prop] !== undefined &&
options[prop] !== null
) {
// @ts-expect-error: TS doesnt understand basic reality.
this[prop] = prop === 'history' ? [...options[prop]] : options[prop]
}
}
/** @type {string} */
let prop
// Set non-path related properties.
for (prop in options) {
// @ts-expect-error: fine to set other things.
if (!order.includes(prop)) {
// @ts-expect-error: fine to set other things.
this[prop] = options[prop]
}
}
}
/**
* Get the full path (example: `'~/index.min.js'`).
*
* @returns {string}
*/
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 {string | URL} path
*/
set path(path) {
if (isUrl(path)) {
path = urlToPath(path)
}
assertNonEmpty(path, 'path')
if (this.path !== path) {
this.history.push(path)
}
}
/**
* Get the parent path (example: `'~'`).
*/
get dirname() {
return typeof this.path === 'string' ? path.dirname(this.path) : undefined
}
/**
* Set the parent path (example: `'~'`).
*
* Cannot be set if theres no `path` yet.
*/
set dirname(dirname) {
assertPath(this.basename, 'dirname')
this.path = path.join(dirname || '', this.basename)
}
/**
* Get the basename (including extname) (example: `'index.min.js'`).
*/
get basename() {
return typeof this.path === 'string' ? path.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).
*/
set basename(basename) {
assertNonEmpty(basename, 'basename')
assertPart(basename, 'basename')
this.path = path.join(this.dirname || '', basename)
}
/**
* Get the extname (including dot) (example: `'.js'`).
*/
get extname() {
return typeof this.path === 'string' ? path.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.
*/
set extname(extname) {
assertPart(extname, 'extname')
assertPath(this.dirname, 'extname')
if (extname) {
if (extname.charCodeAt(0) !== 46 /* `.` */) {
throw new Error('`extname` must start with `.`')
}
if (extname.includes('.', 1)) {
throw new Error('`extname` cannot contain multiple dots')
}
}
this.path = path.join(this.dirname, this.stem + (extname || ''))
}
/**
* Get the stem (basename w/o extname) (example: `'index.min'`).
*/
get stem() {
return typeof this.path === 'string'
? path.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).
*/
set stem(stem) {
assertNonEmpty(stem, 'stem')
assertPart(stem, 'stem')
this.path = path.join(this.dirname || '', stem + (this.extname || ''))
}
/**
* Serialize the file.
*
* @param {BufferEncoding | null | undefined} [encoding='utf8']
* Character encoding to understand `value` as when its a `Buffer`
* (default: `'utf8'`).
* @returns {string}
* Serialized file.
*/
toString(encoding) {
return (this.value || '').toString(encoding || undefined)
}
/**
* Create a warning message associated with the file.
*
* Its `fatal` is set to `false` and `file` is set to the current file path.
* Its added to `file.messages`.
*
* @param {string | Error | VFileMessage} reason
* Reason for message, uses the stack and message of the error if given.
* @param {Node | NodeLike | Position | Point | null | undefined} [place]
* Place in file where the message occurred.
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {VFileMessage}
* Message.
*/
message(reason, place, origin) {
const message = new VFileMessage(reason, place, origin)
if (this.path) {
message.name = this.path + ':' + message.name
message.file = this.path
}
message.fatal = false
this.messages.push(message)
return message
}
/**
* Create an info message associated with the file.
*
* Its `fatal` is set to `null` and `file` is set to the current file path.
* Its added to `file.messages`.
*
* @param {string | Error | VFileMessage} reason
* Reason for message, uses the stack and message of the error if given.
* @param {Node | NodeLike | Position | Point | null | undefined} [place]
* Place in file where the message occurred.
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {VFileMessage}
* Message.
*/
info(reason, place, origin) {
const message = this.message(reason, place, origin)
message.fatal = null
return message
}
/**
* Create a fatal error associated with the file.
*
* Its `fatal` is set to `true` and `file` is set to the current file path.
* Its added to `file.messages`.
*
* > 👉 **Note**: a fatal error means that a file is no longer processable.
*
* @param {string | Error | VFileMessage} reason
* Reason for message, uses the stack and message of the error if given.
* @param {Node | NodeLike | Position | Point | null | undefined} [place]
* Place in file where the message occurred.
* @param {string | null | undefined} [origin]
* Place in code where the message originates (example:
* `'my-package:my-rule'` or `'my-rule'`).
* @returns {never}
* Message.
* @throws {VFileMessage}
* Message.
*/
fail(reason, place, origin) {
const message = this.message(reason, place, origin)
message.fatal = true
throw message
}
}
/**
* 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 {void}
* Nothing.
*/
function assertPart(part, name) {
if (part && part.includes(path.sep)) {
throw new Error(
'`' + name + '` cannot be a path: did not expect `' + path.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 a buffer.
*
* @param {unknown} value
* thing.
* @returns {value is Buffer}
* Whether `value` is a Node.js buffer.
*/
function buffer(value) {
return bufferLike(value)
}

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

@ -0,0 +1,46 @@
export namespace path {
export {basename}
export {dirname}
export {extname}
export {join}
export const sep: string
}
/**
* Get the basename from a path.
*
* @param {string} path
* File path.
* @param {string | undefined} [ext]
* Extension to strip.
* @returns {string}
* Stem or basename.
*/
declare function basename(path: string, ext?: string | 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 {}

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

@ -0,0 +1,422 @@
// 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 path = {basename, dirname, extname, join, sep: '/'}
/* eslint-disable max-depth, complexity */
/**
* Get the basename from a path.
*
* @param {string} path
* File path.
* @param {string | undefined} [ext]
* Extension to strip.
* @returns {string}
* Stem or basename.
*/
function basename(path, ext) {
if (ext !== undefined && typeof ext !== '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 (ext === undefined || ext.length === 0 || ext.length > path.length) {
while (index--) {
if (path.charCodeAt(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 (ext === path) {
return ''
}
let firstNonSlashEnd = -1
let extIndex = ext.length - 1
while (index--) {
if (path.charCodeAt(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 (extIndex > -1) {
// Try to match the explicit extension.
if (path.charCodeAt(index) === ext.charCodeAt(extIndex--)) {
if (extIndex < 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
extIndex = -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.charCodeAt(index) === 47 /* `/` */) {
if (unmatchedSlash) {
end = index
break
}
} else if (!unmatchedSlash) {
// We saw the first non-path separator
unmatchedSlash = true
}
}
return end < 0
? path.charCodeAt(0) === 47 /* `/` */
? '/'
: '.'
: end === 1 && path.charCodeAt(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.charCodeAt(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.charCodeAt(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.charCodeAt(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.charCodeAt(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.charCodeAt(result.length - 1) !== 46 /* `.` */ ||
result.charCodeAt(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 */

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

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

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

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

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

@ -0,0 +1,5 @@
export namespace proc {
export {cwd}
}
declare function cwd(): string
export {}

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 proc = {cwd}
function cwd() {
return '/'
}

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

@ -0,0 +1 @@
export {default as proc} from 'process'

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

@ -0,0 +1 @@
export {default as proc} from 'process'

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

@ -0,0 +1,9 @@
/// <reference lib="dom" />
/**
* @param {string | URL} path
* File URL.
* @returns {string}
* File URL.
*/
export function urlToPath(path: string | URL): string
export {isUrl} from './minurl.shared.js'

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

@ -0,0 +1,78 @@
/// <reference lib="dom" />
import {isUrl} from './minurl.shared.js'
// See: <https://github.com/nodejs/node/blob/fcf8ba4/lib/internal/url.js>
/**
* @param {string | URL} 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.charCodeAt(index) === 37 /* `%` */ &&
pathname.charCodeAt(index + 1) === 50 /* `2` */
) {
const third = pathname.charCodeAt(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)
}
export {isUrl} from './minurl.shared.js'

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

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

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

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

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

@ -0,0 +1,42 @@
/**
* @typedef URL
* @property {string} hash
* @property {string} host
* @property {string} hostname
* @property {string} href
* @property {string} origin
* @property {string} password
* @property {string} pathname
* @property {string} port
* @property {string} protocol
* @property {string} search
* @property {any} searchParams
* @property {string} username
* @property {() => string} toString
* @property {() => string} toJSON
*/
/**
* Check if `fileUrlOrPath` looks like a URL.
*
* @param {unknown} fileUrlOrPath
* File path or URL.
* @returns {fileUrlOrPath is URL}
* Whether its a URL.
*/
export function isUrl(fileUrlOrPath: unknown): fileUrlOrPath is URL
export type URL = {
hash: string
host: string
hostname: string
href: string
origin: string
password: string
pathname: string
port: string
protocol: string
search: string
searchParams: any
username: string
toString: () => string
toJSON: () => string
}

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

@ -0,0 +1,37 @@
/**
* @typedef URL
* @property {string} hash
* @property {string} host
* @property {string} hostname
* @property {string} href
* @property {string} origin
* @property {string} password
* @property {string} pathname
* @property {string} port
* @property {string} protocol
* @property {string} search
* @property {any} searchParams
* @property {string} username
* @property {() => string} toString
* @property {() => string} toJSON
*/
/**
* Check if `fileUrlOrPath` looks like a URL.
*
* @param {unknown} fileUrlOrPath
* File path or URL.
* @returns {fileUrlOrPath is URL}
* Whether its a URL.
*/
// From: <https://github.com/nodejs/node/blob/fcf8ba4/lib/internal/url.js#L1501>
export function isUrl(fileUrlOrPath) {
return (
fileUrlOrPath !== null &&
typeof fileUrlOrPath === 'object' &&
// @ts-expect-error: indexable.
fileUrlOrPath.href &&
// @ts-expect-error: indexable.
fileUrlOrPath.origin
)
}

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.

111
node_modules/vfile/package.json generated vendored Normal file
View file

@ -0,0 +1,111 @@
{
"name": "vfile",
"version": "5.3.7",
"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",
"main": "index.js",
"types": "index.d.ts",
"browser": {
"./lib/minpath.js": "./lib/minpath.browser.js",
"./lib/minproc.js": "./lib/minproc.browser.js",
"./lib/minurl.js": "./lib/minurl.browser.js"
},
"react-native": {
"./lib/minpath.js": "./lib/minpath.browser.js",
"./lib/minproc.js": "./lib/minproc.browser.js",
"./lib/minurl.js": "./lib/minurl.browser.js"
},
"files": [
"lib/",
"index.d.ts",
"index.js"
],
"dependencies": {
"@types/unist": "^2.0.0",
"is-buffer": "^2.0.0",
"unist-util-stringify-position": "^3.0.0",
"vfile-message": "^3.0.0"
},
"devDependencies": {
"@types/node": "^18.0.0",
"c8": "^7.0.0",
"prettier": "^2.0.0",
"remark-cli": "^11.0.0",
"remark-preset-wooorm": "^9.0.0",
"type-coverage": "^2.0.0",
"typescript": "^4.0.0",
"xo": "^0.53.0"
},
"scripts": {
"prepack": "npm run build && npm run format",
"build": "tsc --build --clean && tsc --build && type-coverage",
"format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix",
"test-api": "node --conditions development test.js",
"test-coverage": "c8 --check-coverage --100 --reporter lcov npm run test-api",
"test": "npm run build && npm run format && npm run test-coverage"
},
"prettier": {
"tabWidth": 2,
"useTabs": false,
"singleQuote": true,
"bracketSpacing": false,
"semi": false,
"trailingComma": "none"
},
"xo": {
"prettier": true,
"rules": {
"unicorn/prefer-code-point": "off",
"unicorn/prefer-node-protocol": "off"
}
},
"remarkConfig": {
"plugins": [
"preset-wooorm",
[
"lint-no-html",
false
]
]
},
"typeCoverage": {
"atLeast": 100,
"detail": true,
"strict": true,
"ignoreCatch": true,
"#": "needed `any`s",
"ignoreFiles": [
"lib/minurl.shared.d.ts"
]
}
}

786
node_modules/vfile/readme.md generated vendored Normal file
View file

@ -0,0 +1,786 @@
<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][].
## 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.value`](#filevalue)
* [`file.cwd`](#filecwd)
* [`file.path`](#filepath)
* [`file.dirname`](#filedirname)
* [`file.basename`](#filebasename)
* [`file.extname`](#fileextname)
* [`file.stem`](#filestem)
* [`file.history`](#filehistory)
* [`file.messages`](#filemessages)
* [`file.data`](#filedata)
* [`VFile#toString(encoding?)`](#vfiletostringencoding)
* [`VFile#message(reason[, position][, origin])`](#vfilemessagereason-position-origin)
* [`VFile#info(reason[, position][, origin])`](#vfileinforeason-position-origin)
* [`VFile#fail(reason[, position][, origin])`](#vfilefailreason-position-origin)
* [`BufferEncoding`](#bufferencoding)
* [`Compatible`](#compatible)
* [`Data`](#data)
* [`DataMap`](#datamap)
* [`Map`](#map)
* [`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 14.14 and 16.0+), install with [npm][]:
```sh
npm install vfile
```
In Deno with [`esm.sh`][esmsh]:
```js
import {VFile} from 'https://esm.sh/vfile@5'
```
In browsers with [`esm.sh`][esmsh]:
```html
<script type="module">
import {VFile} from 'https://esm.sh/vfile@5?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`?', {
line: 1,
column: 8
})
console.log(file.messages)
```
Yields:
```txt
[
[~/index.text:1:8: Unexpected unknown word `braavo`, did you mean `bravo`?] {
reason: 'Unexpected unknown word `braavo`, did you mean `bravo`?',
line: 1,
column: 8,
source: null,
ruleId: null,
position: {start: [Object], end: [Object]},
file: '~/index.text',
fatal: false
}
]
```
## 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 [`Buffer`][buffer] — `{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(Buffer.from('exit 1'))
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.value`
Raw value ([`Buffer`][buffer], `string`, `null`).
### `file.cwd`
Base of `path` (`string`, default: `process.cwd()` or `'/'` in browsers).
### `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.dirname`
Get or set the parent path (`string?`, example: `'~'`).
Cannot be set if theres no `path` yet.
### `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.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.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.
### `file.history`
List of filepaths 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>`][message]).
### `file.data`
Place to store custom information (`Record<string, unknown>`, default: `{}`).
Its OK to store custom data directly on the file but moving it to `data` is
recommended.
### `VFile#toString(encoding?)`
Serialize the file.
###### Parameters
* `encoding` ([`BufferEncoding`][api-buffer-encoding], default: `'utf8'`)
— character encoding to understand `value` as when its a
[`Buffer`][buffer]
###### Returns
Serialized file (`string`).
### `VFile#message(reason[, position][, origin])`
Create a warning message associated with the file.
Its `fatal` is set to `false` and `file` is set to the current file path.
Its added to `file.messages`.
###### Parameters
* `reason` (`string` or `Error`)
— reason for message, uses the stack and message of the error if given
* `place` (`Node`, `Position`, or `Point`, optional)
— place in file where the message occurred
* `origin` (`string?`, optional, example: `'my-package:my-rule'` or `'my-rule'`)
— place in code where the message originates
###### Returns
Message ([`VFileMessage`][vmessage]).
### `VFile#info(reason[, position][, origin])`
Create an info message associated with the file.
Its `fatal` is set to `null` and `file` is set to the current file path.
Its added to `file.messages`.
###### Parameters
* `reason` (`string` or `Error`)
— reason for message, uses the stack and message of the error if given
* `place` (`Node`, `Position`, or `Point`, optional)
— place in file where the message occurred
* `origin` (`string?`, optional, example: `'my-package:my-rule'` or `'my-rule'`)
— place in code where the message originates
###### Returns
Message ([`VFileMessage`][vmessage]).
### `VFile#fail(reason[, position][, origin])`
Create a fatal error associated with the file.
Its `fatal` is set to `true` and `file` is set to the current file path.
Its added to `file.messages`.
> 👉 **Note**: a fatal error means that a file is no longer processable.
###### Parameters
* `reason` (`string` or `Error`)
— reason for message, uses the stack and message of the error if given
* `place` (`Node`, `Position`, or `Point`, optional)
— place in file where the message occurred
* `origin` (`string?`, optional, example: `'my-package:my-rule'` or `'my-rule'`)
— place in code where the message originates
###### Returns
Nothing (`never`).
###### Throws
Message ([`VFileMessage`][vmessage]).
### `BufferEncoding`
[Encodings][encoding] supported by the [buffer][] class (TypeScript type).
This is a copy of the types from Node.
###### Type
```ts
type BufferEncoding =
| 'ascii'
| 'utf8'
| 'utf-8'
| 'utf16le'
| 'ucs2'
| 'ucs-2'
| 'base64'
| 'base64url'
| 'latin1'
| 'binary'
| 'hex'
```
### `Compatible`
Things that can be passed to the constructor (TypeScript type).
###### Type
```ts
type Compatible = Options | URL | Value | VFile
```
### `Data`
Custom information (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
### `Options`
An object with arbitrary fields and the following known fields (TypeScript
type).
###### Fields
* `value` ([`Value`][api-value], optional)
— set `value`
* `cwd` (`string`, optional)
— set `cwd`
* `history` (`Array<string>`, optional)
— set `history`
* `path` (`URL | string`, optional)
— set `path`
* `basename` (`string`, optional)
— set `basename`
* `stem` (`string`, optional)
— set `stem`
* `extname` (`string`, optional)
— set `extname`
* `dirname` (`string`, optional)
— set `dirname`
* `data` ([`Data`][api-data], optional)
— set `data`
### `Reporter`
Type for a reporter (TypeScript type).
###### Type
```ts
type Reporter<Settings extends 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 `Buffer` structure.
###### Type
```ts
type Value = string | Buffer
```
### Well-known
The following fields are considered “non-standard”, but they are allowed, and
some utilities use them:
* `stored` (`boolean`)
— whether a file was saved to disk; this is used by vfile reporters
* `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
* `map` ([`Map`][api-map])
— source map; this type is equivalent to the `RawSourceMap` type from the
`source-map` module
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 filepath 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
[`BufferEncoding`][api-buffer-encoding],
[`Compatible`][api-compatible],
[`Data`][api-data],
[`DataMap`][api-data-map],
[`Map`][api-map],
[`Options`][api-options],
[`Reporter`][api-reporter],
[`ReporterSettings`][api-reporter-settings], and
[`Value`][api-value].
## Compatibility
Projects maintained by the unified collective are compatible with all maintained
versions of Node.js.
As of now, that is Node.js 14.14+ and 16.0+.
Our projects sometimes work with older versions, but this is not guaranteed.
## 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://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>
<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/bundlephobia/minzip/vfile.svg
[size]: https://bundlephobia.com/result?p=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
[messages]: #filemessages
[message]: #vfilemessagereason-position-origin
[encoding]: https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
[buffer]: https://nodejs.org/api/buffer.html
[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]: #vfileoptions
[api-buffer-encoding]: #bufferencoding
[api-compatible]: #compatible
[api-data]: #data
[api-data-map]: #datamap
[api-map]: #map
[api-options]: #options
[api-reporter]: #reporter
[api-reporter-settings]: #reportersettings
[api-value]: #value