123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /**
- * @fileoverview Virtual file
- * @author Nicholas C. Zakas
- */
- "use strict";
- //-----------------------------------------------------------------------------
- // Type Definitions
- //-----------------------------------------------------------------------------
- /** @typedef {import("@eslint/core").File} File */
- //------------------------------------------------------------------------------
- // Helpers
- //------------------------------------------------------------------------------
- /**
- * Determines if a given value has a byte order mark (BOM).
- * @param {string|Uint8Array} value The value to check.
- * @returns {boolean} `true` if the value has a BOM, `false` otherwise.
- */
- function hasUnicodeBOM(value) {
- return typeof value === "string"
- ? value.charCodeAt(0) === 0xFEFF
- : value[0] === 0xEF && value[1] === 0xBB && value[2] === 0xBF;
- }
- /**
- * Strips Unicode BOM from the given value.
- * @param {string|Uint8Array} value The value to remove the BOM from.
- * @returns {string|Uint8Array} The stripped value.
- */
- function stripUnicodeBOM(value) {
- if (!hasUnicodeBOM(value)) {
- return value;
- }
- if (typeof value === "string") {
- /*
- * Check Unicode BOM.
- * In JavaScript, string data is stored as UTF-16, so BOM is 0xFEFF.
- * http://www.ecma-international.org/ecma-262/6.0/#sec-unicode-format-control-characters
- */
- return value.slice(1);
- }
- /*
- * In a Uint8Array, the BOM is represented by three bytes: 0xEF, 0xBB, and 0xBF,
- * so we can just remove the first three bytes.
- */
- return value.slice(3);
- }
- //------------------------------------------------------------------------------
- // Exports
- //------------------------------------------------------------------------------
- /**
- * Represents a virtual file inside of ESLint.
- * @implements {File}
- */
- class VFile {
- /**
- * The file path including any processor-created virtual path.
- * @type {string}
- * @readonly
- */
- path;
- /**
- * The file path on disk.
- * @type {string}
- * @readonly
- */
- physicalPath;
- /**
- * The file contents.
- * @type {string|Uint8Array}
- * @readonly
- */
- body;
- /**
- * The raw body of the file, including a BOM if present.
- * @type {string|Uint8Array}
- * @readonly
- */
- rawBody;
- /**
- * Indicates whether the file has a byte order mark (BOM).
- * @type {boolean}
- * @readonly
- */
- bom;
- /**
- * Creates a new instance.
- * @param {string} path The file path.
- * @param {string|Uint8Array} body The file contents.
- * @param {Object} [options] Additional options.
- * @param {string} [options.physicalPath] The file path on disk.
- */
- constructor(path, body, { physicalPath } = {}) {
- this.path = path;
- this.physicalPath = physicalPath ?? path;
- this.bom = hasUnicodeBOM(body);
- this.body = stripUnicodeBOM(body);
- this.rawBody = body;
- }
- }
- module.exports = { VFile };
|