Compare commits
	
		
			2 commits
		
	
	
		
			3ad11b070a
			...
			6286699b52
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
							
							
								
									
								
								 | 
						6286699b52 | ||
| 
							
							
								
									
								
								 | 
						ea4980a5d7 | 
| 
						 | 
				
			
			@ -274,36 +274,37 @@ def get_location_for_date(
 | 
			
		|||
                            get_country(acc.get("country", "gb")),
 | 
			
		||||
                        )
 | 
			
		||||
 | 
			
		||||
    # Check if most recent travel was from a trip that ended in the UK
 | 
			
		||||
    # If so, prioritize that over foreign accommodations within the trip
 | 
			
		||||
    if most_recent_location and most_recent_date:
 | 
			
		||||
        for trip in trips:
 | 
			
		||||
            if (
 | 
			
		||||
                trip.end
 | 
			
		||||
                and trip.end < target_date
 | 
			
		||||
                and trip.start <= most_recent_date <= trip.end
 | 
			
		||||
            ):
 | 
			
		||||
                # The most recent travel was within a trip that has since ended
 | 
			
		||||
                locations = trip.locations()
 | 
			
		||||
                if locations:
 | 
			
		||||
                    final_city, final_country = locations[-1]
 | 
			
		||||
                    # If trip ended in UK, you should be home now
 | 
			
		||||
                    if (
 | 
			
		||||
                        hasattr(final_country, "alpha_2")
 | 
			
		||||
                        and final_country.alpha_2 == "GB"
 | 
			
		||||
                    ):
 | 
			
		||||
                        return ("Bristol", get_country("gb"))
 | 
			
		||||
    # Check for recent trips that have ended - prioritize this over individual travel data
 | 
			
		||||
    # This handles cases where you're traveling home after a trip (e.g. stopovers, connections)
 | 
			
		||||
    for trip in trips:
 | 
			
		||||
        if trip.end and trip.end < target_date:
 | 
			
		||||
            locations = trip.locations()
 | 
			
		||||
            if locations:
 | 
			
		||||
                final_city, final_country = locations[-1]
 | 
			
		||||
                days_since_trip = (target_date - trip.end).days
 | 
			
		||||
                
 | 
			
		||||
                # If trip ended in UK, you should be home now
 | 
			
		||||
                if (
 | 
			
		||||
                    hasattr(final_country, "alpha_2")
 | 
			
		||||
                    and final_country.alpha_2 == "GB"
 | 
			
		||||
                ):
 | 
			
		||||
                    return ("Bristol", get_country("gb"))
 | 
			
		||||
 | 
			
		||||
                    # For short European trips (ended >3 days ago), assume returned home
 | 
			
		||||
                    # if no subsequent travel data shows you're still abroad
 | 
			
		||||
                    days_since_trip = (target_date - trip.end).days
 | 
			
		||||
                    if (
 | 
			
		||||
                        days_since_trip > 3
 | 
			
		||||
                        and hasattr(final_country, "alpha_2")
 | 
			
		||||
                        and final_country.alpha_2
 | 
			
		||||
                        in {"BE", "NL", "FR", "DE", "CH", "AT", "IT", "ES"}
 | 
			
		||||
                    ):
 | 
			
		||||
                        return ("Bristol", get_country("gb"))
 | 
			
		||||
                # For short trips to nearby countries or international trips
 | 
			
		||||
                # (ended >=1 day ago), assume returned home if no subsequent travel data
 | 
			
		||||
                if (
 | 
			
		||||
                    days_since_trip >= 1
 | 
			
		||||
                    and hasattr(final_country, "alpha_2")
 | 
			
		||||
                    and (
 | 
			
		||||
                        # European countries (close by rail/ferry)
 | 
			
		||||
                        final_country.alpha_2 in {"BE", "NL", "FR", "DE", "CH", "AT", "IT", "ES"}
 | 
			
		||||
                        # Nearby Balkan countries
 | 
			
		||||
                        or final_country.alpha_2 in {"GR", "AL", "XK", "HR", "SI", "MK", "BA", "ME", "RS", "BG", "RO"}
 | 
			
		||||
                        # International trips (assume return home after trip ends)
 | 
			
		||||
                        or final_country.alpha_2 in {"US", "CA", "IN", "JP", "CN", "AU", "NZ", "BR", "AR", "ZA"}
 | 
			
		||||
                    )
 | 
			
		||||
                ):
 | 
			
		||||
                    return ("Bristol", get_country("gb"))
 | 
			
		||||
 | 
			
		||||
    # Return most recent location or default to Bristol
 | 
			
		||||
    if most_recent_location:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										33
									
								
								check_weekends.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								check_weekends.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,33 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
"""Load YAML data to ensure validity."""
 | 
			
		||||
 | 
			
		||||
from datetime import date
 | 
			
		||||
 | 
			
		||||
import agenda
 | 
			
		||||
import agenda.conference
 | 
			
		||||
import agenda.data
 | 
			
		||||
import agenda.travel
 | 
			
		||||
import agenda.trip
 | 
			
		||||
 | 
			
		||||
config = __import__("config.default", fromlist=[""])
 | 
			
		||||
data_dir = config.PERSONAL_DATA
 | 
			
		||||
 | 
			
		||||
currencies = set(config.CURRENCIES + ["GBP"])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def list_weekends() -> None:
 | 
			
		||||
    today = date.today()
 | 
			
		||||
 | 
			
		||||
    start = date(today.year, 1, 1)
 | 
			
		||||
    trip_list = agenda.trip.build_trip_list(data_dir)
 | 
			
		||||
    busy_events = agenda.busy.get_busy_events(start, data_dir, trip_list)
 | 
			
		||||
 | 
			
		||||
    # pprint(busy_events)
 | 
			
		||||
 | 
			
		||||
    weekends = agenda.busy.weekends(start, busy_events)
 | 
			
		||||
 | 
			
		||||
    # pprint(weekends)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    list_weekends()
 | 
			
		||||
							
								
								
									
										38
									
								
								current_flight.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										38
									
								
								current_flight.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import datetime
 | 
			
		||||
import sys
 | 
			
		||||
import typing
 | 
			
		||||
 | 
			
		||||
from rich.pretty import pprint
 | 
			
		||||
 | 
			
		||||
import agenda.travel
 | 
			
		||||
from agenda.types import StrDict
 | 
			
		||||
 | 
			
		||||
config = __import__("config.default", fromlist=[""])
 | 
			
		||||
data_dir = config.PERSONAL_DATA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_flight(now: datetime.datetime) -> StrDict | None:
 | 
			
		||||
    """Flight."""
 | 
			
		||||
    bookings = agenda.travel.parse_yaml("flights", data_dir)
 | 
			
		||||
    for booking in bookings:
 | 
			
		||||
        for flight in typing.cast(list[StrDict], booking["flights"]):
 | 
			
		||||
            if (
 | 
			
		||||
                "depart" not in flight
 | 
			
		||||
                or "arrive" not in flight
 | 
			
		||||
                or not (flight["depart"] < now < flight["arrive"])
 | 
			
		||||
            ):
 | 
			
		||||
                continue
 | 
			
		||||
            return flight
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
now = datetime.datetime.now(tz=datetime.UTC)
 | 
			
		||||
flight = get_current_flight(now)
 | 
			
		||||
if not flight:
 | 
			
		||||
    print("not currently on a flight")
 | 
			
		||||
    sys.exit(0)
 | 
			
		||||
pprint(flight)
 | 
			
		||||
 | 
			
		||||
print(flight["arrive"] - now)
 | 
			
		||||
							
								
								
									
										34
									
								
								daily_location.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								daily_location.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
# import sys
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
from datetime import date, timedelta
 | 
			
		||||
 | 
			
		||||
from rich.pretty import pprint
 | 
			
		||||
 | 
			
		||||
import agenda.trip
 | 
			
		||||
 | 
			
		||||
# from rich.pretty import pprint
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
config = __import__("config.default", fromlist=[""])
 | 
			
		||||
data_dir = config.PERSONAL_DATA
 | 
			
		||||
 | 
			
		||||
start = date(2025, 1, 1)
 | 
			
		||||
end = date(2025, 3, 1)
 | 
			
		||||
 | 
			
		||||
trip_list = agenda.trip.build_trip_list(data_dir)
 | 
			
		||||
for trip in trip_list:
 | 
			
		||||
    if trip.end < start or trip.start > end:
 | 
			
		||||
        continue
 | 
			
		||||
    print((trip.start, trip.end, trip.title))
 | 
			
		||||
    pprint(trip)
 | 
			
		||||
    break
 | 
			
		||||
sys.exit(0)
 | 
			
		||||
 | 
			
		||||
days = (end - start).days
 | 
			
		||||
 | 
			
		||||
for day in range(days):
 | 
			
		||||
    d = start + timedelta(days=day)
 | 
			
		||||
    print(d)
 | 
			
		||||
							
								
								
									
										32
									
								
								dist/main.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								dist/main.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
/*
 | 
			
		||||
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 | 
			
		||||
 * This devtool is neither made for production nor for readable output files.
 | 
			
		||||
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 | 
			
		||||
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 | 
			
		||||
 * or disable the default devtool with "devtool: false".
 | 
			
		||||
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 | 
			
		||||
 */
 | 
			
		||||
/******/ (() => { // webpackBootstrap
 | 
			
		||||
/******/ 	var __webpack_modules__ = ({
 | 
			
		||||
 | 
			
		||||
/***/ "./frontend/index.js":
 | 
			
		||||
/*!***************************!*\
 | 
			
		||||
  !*** ./frontend/index.js ***!
 | 
			
		||||
  \***************************/
 | 
			
		||||
/***/ (() => {
 | 
			
		||||
 | 
			
		||||
eval("\n\n//# sourceURL=webpack://agenda/./frontend/index.js?");
 | 
			
		||||
 | 
			
		||||
/***/ })
 | 
			
		||||
 | 
			
		||||
/******/ 	});
 | 
			
		||||
/************************************************************************/
 | 
			
		||||
/******/ 	
 | 
			
		||||
/******/ 	// startup
 | 
			
		||||
/******/ 	// Load entry module and return exports
 | 
			
		||||
/******/ 	// This entry module can't be inlined because the eval devtool is used.
 | 
			
		||||
/******/ 	var __webpack_exports__ = {};
 | 
			
		||||
/******/ 	__webpack_modules__["./frontend/index.js"]();
 | 
			
		||||
/******/ 	
 | 
			
		||||
/******/ })()
 | 
			
		||||
;
 | 
			
		||||
							
								
								
									
										7
									
								
								get_skyfield_data.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										7
									
								
								get_skyfield_data.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
from skyfield.api import Loader
 | 
			
		||||
 | 
			
		||||
load = Loader("~/lib/data/skyfield")
 | 
			
		||||
planets = load('de421.bsp')
 | 
			
		||||
print('Ready')
 | 
			
		||||
							
								
								
									
										17
									
								
								how_many_business_flights.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										17
									
								
								how_many_business_flights.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import typing
 | 
			
		||||
 | 
			
		||||
from rich.pretty import pprint
 | 
			
		||||
 | 
			
		||||
import agenda.travel
 | 
			
		||||
from agenda.types import StrDict
 | 
			
		||||
 | 
			
		||||
config = __import__("config.default", fromlist=[""])
 | 
			
		||||
data_dir = config.PERSONAL_DATA
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bookings = agenda.travel.parse_yaml("flights", data_dir)
 | 
			
		||||
for booking in bookings:
 | 
			
		||||
    for flight in typing.cast(list[StrDict], booking["flights"]):
 | 
			
		||||
        pprint(flight)
 | 
			
		||||
							
								
								
									
										81
									
								
								list_trains.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										81
									
								
								list_trains.py
									
									
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,81 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import json
 | 
			
		||||
 | 
			
		||||
import agenda.travel
 | 
			
		||||
import agenda.trip
 | 
			
		||||
 | 
			
		||||
# from rich.pretty import pprint
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
config = __import__("config.default", fromlist=[""])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_rail_route_distances() -> agenda.travel.RouteDistances:
 | 
			
		||||
    """Rail journey route distances."""
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(config.DATA_DIR)
 | 
			
		||||
 | 
			
		||||
    trains = agenda.trip.load_trains(
 | 
			
		||||
        config.PERSONAL_DATA, route_distances=route_distances
 | 
			
		||||
    )
 | 
			
		||||
    for train in trains:
 | 
			
		||||
        for leg in train["legs"]:
 | 
			
		||||
            train_from, train_to = leg["from_station"], leg["to_station"]
 | 
			
		||||
            assert leg["from"] != leg["to"]
 | 
			
		||||
            s1, s2 = sorted((leg["from"], leg["to"]))
 | 
			
		||||
            if (s1, s2) in route_distances:
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            filename = train_from.get("routes", {}).get(train_to["uic"])
 | 
			
		||||
            if not filename:
 | 
			
		||||
                continue
 | 
			
		||||
            geojson = agenda.trip.read_geojson(
 | 
			
		||||
                config.PERSONAL_DATA, "train_routes/" + filename
 | 
			
		||||
            )
 | 
			
		||||
            dist = agenda.travel.train_leg_distance(json.loads(geojson))
 | 
			
		||||
            route_distances[(s1, s2)] = dist
 | 
			
		||||
 | 
			
		||||
    return route_distances
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_ferry_route_distances() -> agenda.travel.RouteDistances:
 | 
			
		||||
    """Rail journey route distances."""
 | 
			
		||||
    route_distances: agenda.travel.RouteDistances = {}
 | 
			
		||||
 | 
			
		||||
    items = agenda.trip.load_ferries(
 | 
			
		||||
        config.PERSONAL_DATA, route_distances=route_distances
 | 
			
		||||
    )
 | 
			
		||||
    for item in items:
 | 
			
		||||
        item_from, item_to = item["from_terminal"], item["to_terminal"]
 | 
			
		||||
        assert item["from"] != item["to"]
 | 
			
		||||
        s1, s2 = sorted((item["from"], item["to"]))
 | 
			
		||||
        if (s1, s2) in route_distances:
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        filename = item_from.get("routes", {}).get(item_to["name"])
 | 
			
		||||
        if not filename:
 | 
			
		||||
            continue
 | 
			
		||||
        geojson = agenda.trip.read_geojson(
 | 
			
		||||
            config.PERSONAL_DATA, "ferry_routes/" + filename
 | 
			
		||||
        )
 | 
			
		||||
        dist = agenda.travel.train_leg_distance(json.loads(geojson))
 | 
			
		||||
        route_distances[(s1, s2)] = dist
 | 
			
		||||
 | 
			
		||||
    return route_distances
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_flight_distances():
 | 
			
		||||
    flights = agenda.trip.load_flights(
 | 
			
		||||
        config.PERSONAL_DATA,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    for item in flights:
 | 
			
		||||
        # pprint(item)
 | 
			
		||||
        print(item["from"], item["to"], agenda.travel.flight_distance(item))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# route_distances = get_rail_route_distances()
 | 
			
		||||
route_distances = get_ferry_route_distances()
 | 
			
		||||
print(agenda.travel.route_distances_as_json(route_distances))
 | 
			
		||||
 | 
			
		||||
# get_flight_distances()
 | 
			
		||||
							
								
								
									
										255
									
								
								map.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										255
									
								
								map.html
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,255 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
<meta charset="utf-8">
 | 
			
		||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
 | 
			
		||||
<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
<title>Map</title>
 | 
			
		||||
 | 
			
		||||
 <link rel="stylesheet" href="static/leaflet/leaflet.css">
 | 
			
		||||
 | 
			
		||||
<style>
 | 
			
		||||
#map {
 | 
			
		||||
  height: 90vh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
<div id="map"></div>
 | 
			
		||||
 | 
			
		||||
<script src="static/leaflet/leaflet.js"></script>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
 | 
			
		||||
function emoji_icon(emoji) {
 | 
			
		||||
  var iconStyle = "<div style='background-color: white; border-radius: 50%; width: 30px; height: 30px; display: flex; justify-content: center; align-items: center; border: 1px solid black;'> <div style='font-size: 18px;'>" + emoji + "</div></div>";
 | 
			
		||||
 | 
			
		||||
  return L.divIcon({
 | 
			
		||||
    className: 'custom-div-icon',
 | 
			
		||||
    html: iconStyle,
 | 
			
		||||
    iconSize: [60, 60],
 | 
			
		||||
    iconAnchor: [15, 15],
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var icons = {
 | 
			
		||||
  "station": emoji_icon("🚉"),
 | 
			
		||||
  "airport": emoji_icon("✈️"),
 | 
			
		||||
  "ferry_terminal": emoji_icon("🚢"),
 | 
			
		||||
  "accommodation": emoji_icon("🏨"),
 | 
			
		||||
  "conference": emoji_icon("🎤"),
 | 
			
		||||
  "event": emoji_icon("🍷"),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function build_map(map_id, coordinates) {
 | 
			
		||||
    var map = L.map(map_id).fitBounds(coordinates.map(station => [station.latitude, station.longitude]));
 | 
			
		||||
 | 
			
		||||
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
 | 
			
		||||
        attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
 | 
			
		||||
    }).addTo(map);
 | 
			
		||||
 | 
			
		||||
    var markers = [];
 | 
			
		||||
    var offset_lines = [];
 | 
			
		||||
 | 
			
		||||
    function getIconBounds(latlng) {
 | 
			
		||||
        let iconSize = 30; // Assuming the icon size as a square
 | 
			
		||||
        if (!latlng) return null;
 | 
			
		||||
        let pixel = map.project(latlng, map.getZoom());
 | 
			
		||||
        let sw = map.unproject([pixel.x - iconSize / 2, pixel.y + iconSize / 2], map.getZoom());
 | 
			
		||||
        let ne = map.unproject([pixel.x + iconSize / 2, pixel.y - iconSize / 2], map.getZoom());
 | 
			
		||||
        return L.latLngBounds(sw, ne);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function calculateCentroid(markers) {
 | 
			
		||||
        let latSum = 0, lngSum = 0, count = 0;
 | 
			
		||||
        markers.forEach(marker => {
 | 
			
		||||
            latSum += marker.getLatLng().lat;
 | 
			
		||||
            lngSum += marker.getLatLng().lng;
 | 
			
		||||
            count++;
 | 
			
		||||
        });
 | 
			
		||||
        return count > 0 ? L.latLng(latSum / count, lngSum / count) : null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    coordinates.forEach(function(item, index) {
 | 
			
		||||
        let latlng = L.latLng(item.latitude, item.longitude);
 | 
			
		||||
        let marker = L.marker(latlng, { icon: icons[item.type] }).addTo(map);
 | 
			
		||||
        marker.bindPopup(item.name);
 | 
			
		||||
        markers.push(marker);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Function to detect and group overlapping markers
 | 
			
		||||
    function getOverlappingGroups() {
 | 
			
		||||
        let groups = [];
 | 
			
		||||
        let visited = new Set();
 | 
			
		||||
 | 
			
		||||
        markers.forEach((marker, index) => {
 | 
			
		||||
            if (visited.has(marker)) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            let group = [];
 | 
			
		||||
            let markerBounds = getIconBounds(marker.getLatLng());
 | 
			
		||||
 | 
			
		||||
            markers.forEach((otherMarker) => {
 | 
			
		||||
                if (marker !== otherMarker && markerBounds.intersects(getIconBounds(otherMarker.getLatLng()))) {
 | 
			
		||||
                    group.push(otherMarker);
 | 
			
		||||
                    visited.add(otherMarker);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            if (group.length > 0) {
 | 
			
		||||
                group.push(marker); // Add the original marker to the group
 | 
			
		||||
                groups.push(group);
 | 
			
		||||
                visited.add(marker);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        return groups;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function displaceMarkers(group, zoom) {
 | 
			
		||||
        const markerPixelSize = 30; // Width/height of the marker in pixels
 | 
			
		||||
        let map = group[0]._map; // Assuming all markers are on the same map
 | 
			
		||||
 | 
			
		||||
        let centroid = calculateCentroid(group);
 | 
			
		||||
        let centroidPoint = map.project(centroid, zoom);
 | 
			
		||||
 | 
			
		||||
        const radius = markerPixelSize * 0.75; // Set radius for even distribution
 | 
			
		||||
        const angleIncrement = (2 * Math.PI) / group.length; // Evenly space markers
 | 
			
		||||
 | 
			
		||||
        group.forEach((marker, index) => {
 | 
			
		||||
            let angle = index * angleIncrement;
 | 
			
		||||
            let newX = centroidPoint.x + radius * Math.cos(angle);
 | 
			
		||||
            let newY = centroidPoint.y + radius * Math.sin(angle);
 | 
			
		||||
            let newPoint = L.point(newX, newY);
 | 
			
		||||
            let newLatLng = map.unproject(newPoint, zoom);
 | 
			
		||||
 | 
			
		||||
            // Store original position for polyline
 | 
			
		||||
            let originalPos = marker.getLatLng();
 | 
			
		||||
            marker.setLatLng(newLatLng);
 | 
			
		||||
 | 
			
		||||
            marker.polyline = L.polyline([originalPos, newLatLng], {color: 'red', weight: 2}).addTo(map);
 | 
			
		||||
            offset_lines.push(marker.polyline);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    map.on('zoomend', function() {
 | 
			
		||||
        markers.forEach((marker, index) => {
 | 
			
		||||
            marker.setLatLng([coordinates[index].latitude, coordinates[index].longitude]); // Reset position on zoom
 | 
			
		||||
            if (marker.polyline) {
 | 
			
		||||
                map.removeLayer(marker.polyline);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        offset_lines.forEach(polyline => {
 | 
			
		||||
            map.removeLayer(polyline);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let overlappingGroups = getOverlappingGroups();
 | 
			
		||||
        // console.log(overlappingGroups); // Process or display groups as needed
 | 
			
		||||
 | 
			
		||||
        overlappingGroups.forEach(group => displaceMarkers(group, map.getZoom()));
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    let overlappingGroups = getOverlappingGroups();
 | 
			
		||||
    // console.log(overlappingGroups); // Process or display groups as needed
 | 
			
		||||
 | 
			
		||||
    overlappingGroups.forEach(group => displaceMarkers(group, map.getZoom()));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return map;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var coordinates = [
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 59.4412616,
 | 
			
		||||
        "longitude": 24.7538922,
 | 
			
		||||
        "name": "Citybox Tallinn City Center",
 | 
			
		||||
        "type": "accommodation"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 60.16269,
 | 
			
		||||
        "longitude": 24.946768,
 | 
			
		||||
        "name": "Bob W Koti Ullanlinna",
 | 
			
		||||
        "type": "accommodation"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 59.43374,
 | 
			
		||||
        "longitude": 24.76893,
 | 
			
		||||
        "name": "Wikimedia Hackathon",
 | 
			
		||||
        "type": "conference"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 51.47192,
 | 
			
		||||
        "longitude": -0.45431,
 | 
			
		||||
        "name": "Heathrow Central",
 | 
			
		||||
        "type": "station"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 51.516014,
 | 
			
		||||
        "longitude": -0.176049,
 | 
			
		||||
        "name": "London Paddington",
 | 
			
		||||
        "type": "station"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 51.449093,
 | 
			
		||||
        "longitude": -2.581349,
 | 
			
		||||
        "name": "Bristol Temple Meads",
 | 
			
		||||
        "type": "station"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 51.3827,
 | 
			
		||||
        "longitude": -2.7191,
 | 
			
		||||
        "name": "Bristol Airport",
 | 
			
		||||
        "type": "airport"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 52.3081,
 | 
			
		||||
        "longitude": 4.764169,
 | 
			
		||||
        "name": "Amsterdam Airport Schiphol",
 | 
			
		||||
        "type": "airport"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 59.416389,
 | 
			
		||||
        "longitude": 24.799167,
 | 
			
		||||
        "name": "Tallinn Airport",
 | 
			
		||||
        "type": "airport"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 60.31722,
 | 
			
		||||
        "longitude": 24.96333,
 | 
			
		||||
        "name": "Helsinki Airport",
 | 
			
		||||
        "type": "airport"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 51.4775,
 | 
			
		||||
        "longitude": -0.461389,
 | 
			
		||||
        "name": "Heathrow Airport",
 | 
			
		||||
        "type": "airport"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 59.4435,
 | 
			
		||||
        "longitude": 24.77,
 | 
			
		||||
        "name": "Tallinn D-Terminal",
 | 
			
		||||
        "type": "ferry_terminal"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
        "latitude": 60.1496,
 | 
			
		||||
        "longitude": 24.9146,
 | 
			
		||||
        "name": "Helsinki West Terminal 2",
 | 
			
		||||
        "type": "ferry_terminal"
 | 
			
		||||
    }
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
build_map("map", coordinates);
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
  <script src="static/bootstrap5/js/bootstrap.bundle.min.js"></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/acorn
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/acorn
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../acorn/bin/acorn
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/browserslist
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/browserslist
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../browserslist/cli.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/envinfo
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/envinfo
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../envinfo/dist/cli.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/eslint
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/eslint
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../eslint/bin/eslint.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/flat
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/flat
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../flat/cli.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/import-local-fixture
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/import-local-fixture
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../import-local/fixtures/cli.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/js-yaml
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/js-yaml
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../js-yaml/bin/js-yaml.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/node-which
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/node-which
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../which/bin/node-which
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/resolve
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/resolve
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../resolve/bin/resolve
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/terser
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/terser
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../terser/bin/terser
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/update-browserslist-db
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/update-browserslist-db
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../update-browserslist-db/cli.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/webpack
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/webpack
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../webpack/bin/webpack.js
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/.bin/webpack-cli
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								node_modules/.bin/webpack-cli
									
									
									
										generated
									
									
										vendored
									
									
										Symbolic link
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
../webpack-cli/bin/cli.js
 | 
			
		||||
							
								
								
									
										2691
									
								
								node_modules/.package-lock.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2691
									
								
								node_modules/.package-lock.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										21
									
								
								node_modules/@discoveryjs/json-ext/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								node_modules/@discoveryjs/json-ext/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2020 Roman Dvornov <rdvornov@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.
 | 
			
		||||
							
								
								
									
										256
									
								
								node_modules/@discoveryjs/json-ext/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								node_modules/@discoveryjs/json-ext/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,256 @@
 | 
			
		|||
# json-ext
 | 
			
		||||
 | 
			
		||||
[](https://www.npmjs.com/package/@discoveryjs/json-ext)
 | 
			
		||||
[](https://github.com/discoveryjs/json-ext/actions/workflows/ci.yml)
 | 
			
		||||
[](https://coveralls.io/github/discoveryjs/json-ext?)
 | 
			
		||||
[](https://www.npmjs.com/package/@discoveryjs/json-ext)
 | 
			
		||||
 | 
			
		||||
A set of utilities that extend the use of JSON. Designed to be fast and memory efficient
 | 
			
		||||
 | 
			
		||||
Features:
 | 
			
		||||
 | 
			
		||||
- [x] `parseChunked()` – Parse JSON that comes by chunks (e.g. FS readable stream or fetch response stream)
 | 
			
		||||
- [x] `stringifyStream()` – Stringify stream (Node.js)
 | 
			
		||||
- [x] `stringifyInfo()` – Get estimated size and other facts of JSON.stringify() without converting a value to string
 | 
			
		||||
- [ ] **TBD** Support for circular references
 | 
			
		||||
- [ ] **TBD** Binary representation [branch](https://github.com/discoveryjs/json-ext/tree/binary)
 | 
			
		||||
- [ ] **TBD** WHATWG [Streams](https://streams.spec.whatwg.org/) support
 | 
			
		||||
 | 
			
		||||
## Install
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
npm install @discoveryjs/json-ext
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## API
 | 
			
		||||
 | 
			
		||||
- [parseChunked(chunkEmitter)](#parsechunkedchunkemitter)
 | 
			
		||||
- [stringifyStream(value[, replacer[, space]])](#stringifystreamvalue-replacer-space)
 | 
			
		||||
- [stringifyInfo(value[, replacer[, space[, options]]])](#stringifyinfovalue-replacer-space-options)
 | 
			
		||||
    - [Options](#options)
 | 
			
		||||
        - [async](#async)
 | 
			
		||||
        - [continueOnCircular](#continueoncircular)
 | 
			
		||||
- [version](#version)
 | 
			
		||||
 | 
			
		||||
### parseChunked(chunkEmitter)
 | 
			
		||||
 | 
			
		||||
Works the same as [`JSON.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) but takes `chunkEmitter` instead of string and returns [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).
 | 
			
		||||
 | 
			
		||||
> NOTE: `reviver` parameter is not supported yet, but will be added in next releases.
 | 
			
		||||
> NOTE: WHATWG streams aren't supported yet
 | 
			
		||||
 | 
			
		||||
When to use:
 | 
			
		||||
- It's required to avoid freezing the main thread during big JSON parsing, since this process can be distributed in time
 | 
			
		||||
- Huge JSON needs to be parsed (e.g. >500MB on Node.js)
 | 
			
		||||
- Needed to reduce memory pressure. `JSON.parse()` needs to receive the entire JSON before parsing it. With `parseChunked()` you may parse JSON as first bytes of it comes. This approach helps to avoid storing a huge string in the memory at a single time point and following GC.
 | 
			
		||||
 | 
			
		||||
[Benchmark](https://github.com/discoveryjs/json-ext/tree/master/benchmarks#parse-chunked)
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const { parseChunked } = require('@discoveryjs/json-ext');
 | 
			
		||||
 | 
			
		||||
// as a regular Promise
 | 
			
		||||
parseChunked(chunkEmitter)
 | 
			
		||||
    .then(data => {
 | 
			
		||||
        /* data is parsed JSON */
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
// using await (keep in mind that not every runtime has a support for top level await)
 | 
			
		||||
const data = await parseChunked(chunkEmitter);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Parameter `chunkEmitter` can be:
 | 
			
		||||
- [`ReadableStream`](https://nodejs.org/dist/latest-v14.x/docs/api/stream.html#stream_readable_streams) (Node.js only)
 | 
			
		||||
```js
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const { parseChunked } = require('@discoveryjs/json-ext');
 | 
			
		||||
 | 
			
		||||
parseChunked(fs.createReadStream('path/to/file.json'))
 | 
			
		||||
```
 | 
			
		||||
- Generator, async generator or function that returns iterable (chunks). Chunk might be a `string`, `Uint8Array` or `Buffer` (Node.js only):
 | 
			
		||||
```js
 | 
			
		||||
const { parseChunked } = require('@discoveryjs/json-ext');
 | 
			
		||||
const encoder = new TextEncoder();
 | 
			
		||||
 | 
			
		||||
// generator
 | 
			
		||||
parseChunked(function*() {
 | 
			
		||||
    yield '{ "hello":';
 | 
			
		||||
    yield Buffer.from(' "wor');    // Node.js only
 | 
			
		||||
    yield encoder.encode('ld" }'); // returns Uint8Array(5) [ 108, 100, 34, 32, 125 ]
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// async generator
 | 
			
		||||
parseChunked(async function*() {
 | 
			
		||||
    for await (const chunk of someAsyncSource) {
 | 
			
		||||
        yield chunk;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
// function that returns iterable
 | 
			
		||||
parseChunked(() => ['{ "hello":', ' "world"}'])
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Using with [fetch()](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API):
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
async function loadData(url) {
 | 
			
		||||
    const response = await fetch(url);
 | 
			
		||||
    const reader = response.body.getReader();
 | 
			
		||||
 | 
			
		||||
    return parseChunked(async function*() {
 | 
			
		||||
        while (true) {
 | 
			
		||||
            const { done, value } = await reader.read();
 | 
			
		||||
 | 
			
		||||
            if (done) {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            yield value;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
loadData('https://example.com/data.json')
 | 
			
		||||
    .then(data => {
 | 
			
		||||
        /* data is parsed JSON */
 | 
			
		||||
    })
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### stringifyStream(value[, replacer[, space]])
 | 
			
		||||
 | 
			
		||||
Works the same as [`JSON.stringify()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify), but returns an instance of [`ReadableStream`](https://nodejs.org/dist/latest-v14.x/docs/api/stream.html#stream_readable_streams) instead of string.
 | 
			
		||||
 | 
			
		||||
> NOTE: WHATWG Streams aren't supported yet, so function available for Node.js only for now
 | 
			
		||||
 | 
			
		||||
Departs from JSON.stringify():
 | 
			
		||||
- Outputs `null` when `JSON.stringify()` returns `undefined` (since streams may not emit `undefined`)
 | 
			
		||||
- A promise is resolving and the resulting value is stringifying as a regular one
 | 
			
		||||
- A stream in non-object mode is piping to output as is
 | 
			
		||||
- A stream in object mode is piping to output as an array of objects
 | 
			
		||||
 | 
			
		||||
When to use:
 | 
			
		||||
- Huge JSON needs to be generated (e.g. >500MB on Node.js)
 | 
			
		||||
- Needed to reduce memory pressure. `JSON.stringify()` needs to generate the entire JSON before send or write it to somewhere. With `stringifyStream()` you may send a result to somewhere as first bytes of the result appears. This approach helps to avoid storing a huge string in the memory at a single time point.
 | 
			
		||||
- The object being serialized contains Promises or Streams (see Usage for examples)
 | 
			
		||||
 | 
			
		||||
[Benchmark](https://github.com/discoveryjs/json-ext/tree/master/benchmarks#stream-stringifying)
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const { stringifyStream } = require('@discoveryjs/json-ext');
 | 
			
		||||
 | 
			
		||||
// handle events
 | 
			
		||||
stringifyStream(data)
 | 
			
		||||
    .on('data', chunk => console.log(chunk))
 | 
			
		||||
    .on('error', error => consold.error(error))
 | 
			
		||||
    .on('finish', () => console.log('DONE!'));
 | 
			
		||||
 | 
			
		||||
// pipe into a stream
 | 
			
		||||
stringifyStream(data)
 | 
			
		||||
    .pipe(writableStream);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Using Promise or ReadableStream in serializing object:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const { stringifyStream } = require('@discoveryjs/json-ext');
 | 
			
		||||
 | 
			
		||||
// output will be
 | 
			
		||||
// {"name":"example","willSerializeResolvedValue":42,"fromFile":[1, 2, 3],"at":{"any":{"level":"promise!"}}}
 | 
			
		||||
stringifyStream({
 | 
			
		||||
    name: 'example',
 | 
			
		||||
    willSerializeResolvedValue: Promise.resolve(42),
 | 
			
		||||
    fromFile: fs.createReadStream('path/to/file.json'), // support file content is "[1, 2, 3]", it'll be inserted as it
 | 
			
		||||
    at: {
 | 
			
		||||
        any: {
 | 
			
		||||
            level: new Promise(resolve => setTimeout(() => resolve('promise!'), 100))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// in case several async requests are used in object, it's prefered
 | 
			
		||||
// to put fastest requests first, because in this case
 | 
			
		||||
stringifyStream({
 | 
			
		||||
    foo: fetch('http://example.com/request_takes_2s').then(req => req.json()),
 | 
			
		||||
    bar: fetch('http://example.com/request_takes_5s').then(req => req.json())
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Using with [`WritableStream`](https://nodejs.org/dist/latest-v14.x/docs/api/stream.html#stream_writable_streams) (Node.js only):
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const { stringifyStream } = require('@discoveryjs/json-ext');
 | 
			
		||||
 | 
			
		||||
// pipe into a console
 | 
			
		||||
stringifyStream(data)
 | 
			
		||||
    .pipe(process.stdout);
 | 
			
		||||
 | 
			
		||||
// pipe into a file
 | 
			
		||||
stringifyStream(data)
 | 
			
		||||
    .pipe(fs.createWriteStream('path/to/file.json'));
 | 
			
		||||
 | 
			
		||||
// wrapping into a Promise
 | 
			
		||||
new Promise((resolve, reject) => {
 | 
			
		||||
    stringifyStream(data)
 | 
			
		||||
        .on('error', reject)
 | 
			
		||||
        .pipe(stream)
 | 
			
		||||
        .on('error', reject)
 | 
			
		||||
        .on('finish', resolve);
 | 
			
		||||
});
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### stringifyInfo(value[, replacer[, space[, options]]])
 | 
			
		||||
 | 
			
		||||
`value`, `replacer` and `space` arguments are the same as for `JSON.stringify()`.
 | 
			
		||||
 | 
			
		||||
Result is an object:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
{
 | 
			
		||||
    minLength: Number,  // minimal bytes when values is stringified
 | 
			
		||||
    circular: [...],    // list of circular references
 | 
			
		||||
    duplicate: [...],   // list of objects that occur more than once
 | 
			
		||||
    async: [...]        // list of async values, i.e. promises and streams
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const { stringifyInfo } = require('@discoveryjs/json-ext');
 | 
			
		||||
 | 
			
		||||
console.log(
 | 
			
		||||
    stringifyInfo({ test: true }).minLength
 | 
			
		||||
);
 | 
			
		||||
// > 13
 | 
			
		||||
// that equals '{"test":true}'.length
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Options
 | 
			
		||||
 | 
			
		||||
##### async
 | 
			
		||||
 | 
			
		||||
Type: `Boolean`  
 | 
			
		||||
Default: `false`
 | 
			
		||||
 | 
			
		||||
Collect async values (promises and streams) or not.
 | 
			
		||||
 | 
			
		||||
##### continueOnCircular
 | 
			
		||||
 | 
			
		||||
Type: `Boolean`  
 | 
			
		||||
Default: `false`
 | 
			
		||||
 | 
			
		||||
Stop collecting info for a value or not whenever circular reference is found. Setting option to `true` allows to find all circular references.
 | 
			
		||||
 | 
			
		||||
### version
 | 
			
		||||
 | 
			
		||||
The version of library, e.g. `"0.3.1"`.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
MIT
 | 
			
		||||
							
								
								
									
										791
									
								
								node_modules/@discoveryjs/json-ext/dist/json-ext.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										791
									
								
								node_modules/@discoveryjs/json-ext/dist/json-ext.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,791 @@
 | 
			
		|||
(function (global, factory) {
 | 
			
		||||
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
 | 
			
		||||
    typeof define === 'function' && define.amd ? define(factory) :
 | 
			
		||||
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.jsonExt = factory());
 | 
			
		||||
})(this, (function () { 'use strict';
 | 
			
		||||
 | 
			
		||||
    var version = "0.5.7";
 | 
			
		||||
 | 
			
		||||
    const PrimitiveType = 1;
 | 
			
		||||
    const ObjectType = 2;
 | 
			
		||||
    const ArrayType = 3;
 | 
			
		||||
    const PromiseType = 4;
 | 
			
		||||
    const ReadableStringType = 5;
 | 
			
		||||
    const ReadableObjectType = 6;
 | 
			
		||||
    // https://tc39.es/ecma262/#table-json-single-character-escapes
 | 
			
		||||
    const escapableCharCodeSubstitution$1 = { // JSON Single Character Escape Sequences
 | 
			
		||||
        0x08: '\\b',
 | 
			
		||||
        0x09: '\\t',
 | 
			
		||||
        0x0a: '\\n',
 | 
			
		||||
        0x0c: '\\f',
 | 
			
		||||
        0x0d: '\\r',
 | 
			
		||||
        0x22: '\\\"',
 | 
			
		||||
        0x5c: '\\\\'
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    function isLeadingSurrogate$1(code) {
 | 
			
		||||
        return code >= 0xD800 && code <= 0xDBFF;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function isTrailingSurrogate$1(code) {
 | 
			
		||||
        return code >= 0xDC00 && code <= 0xDFFF;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function isReadableStream$1(value) {
 | 
			
		||||
        return (
 | 
			
		||||
            typeof value.pipe === 'function' &&
 | 
			
		||||
            typeof value._read === 'function' &&
 | 
			
		||||
            typeof value._readableState === 'object' && value._readableState !== null
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function replaceValue$1(holder, key, value, replacer) {
 | 
			
		||||
        if (value && typeof value.toJSON === 'function') {
 | 
			
		||||
            value = value.toJSON();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (replacer !== null) {
 | 
			
		||||
            value = replacer.call(holder, String(key), value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (typeof value) {
 | 
			
		||||
            case 'function':
 | 
			
		||||
            case 'symbol':
 | 
			
		||||
                value = undefined;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case 'object':
 | 
			
		||||
                if (value !== null) {
 | 
			
		||||
                    const cls = value.constructor;
 | 
			
		||||
                    if (cls === String || cls === Number || cls === Boolean) {
 | 
			
		||||
                        value = value.valueOf();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getTypeNative$1(value) {
 | 
			
		||||
        if (value === null || typeof value !== 'object') {
 | 
			
		||||
            return PrimitiveType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Array.isArray(value)) {
 | 
			
		||||
            return ArrayType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ObjectType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function getTypeAsync$1(value) {
 | 
			
		||||
        if (value === null || typeof value !== 'object') {
 | 
			
		||||
            return PrimitiveType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (typeof value.then === 'function') {
 | 
			
		||||
            return PromiseType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (isReadableStream$1(value)) {
 | 
			
		||||
            return value._readableState.objectMode ? ReadableObjectType : ReadableStringType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Array.isArray(value)) {
 | 
			
		||||
            return ArrayType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ObjectType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function normalizeReplacer$1(replacer) {
 | 
			
		||||
        if (typeof replacer === 'function') {
 | 
			
		||||
            return replacer;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Array.isArray(replacer)) {
 | 
			
		||||
            const allowlist = new Set(replacer
 | 
			
		||||
                .map(item => {
 | 
			
		||||
                    const cls = item && item.constructor;
 | 
			
		||||
                    return cls === String || cls === Number ? String(item) : null;
 | 
			
		||||
                })
 | 
			
		||||
                .filter(item => typeof item === 'string')
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            return [...allowlist];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function normalizeSpace$1(space) {
 | 
			
		||||
        if (typeof space === 'number') {
 | 
			
		||||
            if (!Number.isFinite(space) || space < 1) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return ' '.repeat(Math.min(space, 10));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (typeof space === 'string') {
 | 
			
		||||
            return space.slice(0, 10) || false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var utils = {
 | 
			
		||||
        escapableCharCodeSubstitution: escapableCharCodeSubstitution$1,
 | 
			
		||||
        isLeadingSurrogate: isLeadingSurrogate$1,
 | 
			
		||||
        isTrailingSurrogate: isTrailingSurrogate$1,
 | 
			
		||||
        type: {
 | 
			
		||||
            PRIMITIVE: PrimitiveType,
 | 
			
		||||
            PROMISE: PromiseType,
 | 
			
		||||
            ARRAY: ArrayType,
 | 
			
		||||
            OBJECT: ObjectType,
 | 
			
		||||
            STRING_STREAM: ReadableStringType,
 | 
			
		||||
            OBJECT_STREAM: ReadableObjectType
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        isReadableStream: isReadableStream$1,
 | 
			
		||||
        replaceValue: replaceValue$1,
 | 
			
		||||
        getTypeNative: getTypeNative$1,
 | 
			
		||||
        getTypeAsync: getTypeAsync$1,
 | 
			
		||||
        normalizeReplacer: normalizeReplacer$1,
 | 
			
		||||
        normalizeSpace: normalizeSpace$1
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const {
 | 
			
		||||
        normalizeReplacer,
 | 
			
		||||
        normalizeSpace,
 | 
			
		||||
        replaceValue,
 | 
			
		||||
        getTypeNative,
 | 
			
		||||
        getTypeAsync,
 | 
			
		||||
        isLeadingSurrogate,
 | 
			
		||||
        isTrailingSurrogate,
 | 
			
		||||
        escapableCharCodeSubstitution,
 | 
			
		||||
        type: {
 | 
			
		||||
            PRIMITIVE,
 | 
			
		||||
            OBJECT,
 | 
			
		||||
            ARRAY,
 | 
			
		||||
            PROMISE,
 | 
			
		||||
            STRING_STREAM,
 | 
			
		||||
            OBJECT_STREAM
 | 
			
		||||
        }
 | 
			
		||||
    } = utils;
 | 
			
		||||
    const charLength2048 = Array.from({ length: 2048 }).map((_, code) => {
 | 
			
		||||
        if (escapableCharCodeSubstitution.hasOwnProperty(code)) {
 | 
			
		||||
            return 2; // \X
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (code < 0x20) {
 | 
			
		||||
            return 6; // \uXXXX
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return code < 128 ? 1 : 2; // UTF8 bytes
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function stringLength(str) {
 | 
			
		||||
        let len = 0;
 | 
			
		||||
        let prevLeadingSurrogate = false;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < str.length; i++) {
 | 
			
		||||
            const code = str.charCodeAt(i);
 | 
			
		||||
 | 
			
		||||
            if (code < 2048) {
 | 
			
		||||
                len += charLength2048[code];
 | 
			
		||||
            } else if (isLeadingSurrogate(code)) {
 | 
			
		||||
                len += 6; // \uXXXX since no pair with trailing surrogate yet
 | 
			
		||||
                prevLeadingSurrogate = true;
 | 
			
		||||
                continue;
 | 
			
		||||
            } else if (isTrailingSurrogate(code)) {
 | 
			
		||||
                len = prevLeadingSurrogate
 | 
			
		||||
                    ? len - 2  // surrogate pair (4 bytes), since we calculate prev leading surrogate as 6 bytes, substruct 2 bytes
 | 
			
		||||
                    : len + 6; // \uXXXX
 | 
			
		||||
            } else {
 | 
			
		||||
                len += 3; // code >= 2048 is 3 bytes length for UTF8
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            prevLeadingSurrogate = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return len + 2; // +2 for quotes
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function primitiveLength(value) {
 | 
			
		||||
        switch (typeof value) {
 | 
			
		||||
            case 'string':
 | 
			
		||||
                return stringLength(value);
 | 
			
		||||
 | 
			
		||||
            case 'number':
 | 
			
		||||
                return Number.isFinite(value) ? String(value).length : 4 /* null */;
 | 
			
		||||
 | 
			
		||||
            case 'boolean':
 | 
			
		||||
                return value ? 4 /* true */ : 5 /* false */;
 | 
			
		||||
 | 
			
		||||
            case 'undefined':
 | 
			
		||||
            case 'object':
 | 
			
		||||
                return 4; /* null */
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
                return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function spaceLength(space) {
 | 
			
		||||
        space = normalizeSpace(space);
 | 
			
		||||
        return typeof space === 'string' ? space.length : 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var stringifyInfo = function jsonStringifyInfo(value, replacer, space, options) {
 | 
			
		||||
        function walk(holder, key, value) {
 | 
			
		||||
            if (stop) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            value = replaceValue(holder, key, value, replacer);
 | 
			
		||||
 | 
			
		||||
            let type = getType(value);
 | 
			
		||||
 | 
			
		||||
            // check for circular structure
 | 
			
		||||
            if (type !== PRIMITIVE && stack.has(value)) {
 | 
			
		||||
                circular.add(value);
 | 
			
		||||
                length += 4; // treat as null
 | 
			
		||||
 | 
			
		||||
                if (!options.continueOnCircular) {
 | 
			
		||||
                    stop = true;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switch (type) {
 | 
			
		||||
                case PRIMITIVE:
 | 
			
		||||
                    if (value !== undefined || Array.isArray(holder)) {
 | 
			
		||||
                        length += primitiveLength(value);
 | 
			
		||||
                    } else if (holder === root) {
 | 
			
		||||
                        length += 9; // FIXME: that's the length of undefined, should we normalize behaviour to convert it to null?
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case OBJECT: {
 | 
			
		||||
                    if (visited.has(value)) {
 | 
			
		||||
                        duplicate.add(value);
 | 
			
		||||
                        length += visited.get(value);
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    const valueLength = length;
 | 
			
		||||
                    let entries = 0;
 | 
			
		||||
 | 
			
		||||
                    length += 2; // {}
 | 
			
		||||
 | 
			
		||||
                    stack.add(value);
 | 
			
		||||
 | 
			
		||||
                    for (const key in value) {
 | 
			
		||||
                        if (hasOwnProperty.call(value, key) && (allowlist === null || allowlist.has(key))) {
 | 
			
		||||
                            const prevLength = length;
 | 
			
		||||
                            walk(value, key, value[key]);
 | 
			
		||||
 | 
			
		||||
                            if (prevLength !== length) {
 | 
			
		||||
                                // value is printed
 | 
			
		||||
                                length += stringLength(key) + 1; // "key":
 | 
			
		||||
                                entries++;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (entries > 1) {
 | 
			
		||||
                        length += entries - 1; // commas
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    stack.delete(value);
 | 
			
		||||
 | 
			
		||||
                    if (space > 0 && entries > 0) {
 | 
			
		||||
                        length += (1 + (stack.size + 1) * space + 1) * entries; // for each key-value: \n{space}
 | 
			
		||||
                        length += 1 + stack.size * space; // for }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    visited.set(value, length - valueLength);
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                case ARRAY: {
 | 
			
		||||
                    if (visited.has(value)) {
 | 
			
		||||
                        duplicate.add(value);
 | 
			
		||||
                        length += visited.get(value);
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    const valueLength = length;
 | 
			
		||||
 | 
			
		||||
                    length += 2; // []
 | 
			
		||||
 | 
			
		||||
                    stack.add(value);
 | 
			
		||||
 | 
			
		||||
                    for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                        walk(value, i, value[i]);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (value.length > 1) {
 | 
			
		||||
                        length += value.length - 1; // commas
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    stack.delete(value);
 | 
			
		||||
 | 
			
		||||
                    if (space > 0 && value.length > 0) {
 | 
			
		||||
                        length += (1 + (stack.size + 1) * space) * value.length; // for each element: \n{space}
 | 
			
		||||
                        length += 1 + stack.size * space; // for ]
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    visited.set(value, length - valueLength);
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                case PROMISE:
 | 
			
		||||
                case STRING_STREAM:
 | 
			
		||||
                    async.add(value);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case OBJECT_STREAM:
 | 
			
		||||
                    length += 2; // []
 | 
			
		||||
                    async.add(value);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let allowlist = null;
 | 
			
		||||
        replacer = normalizeReplacer(replacer);
 | 
			
		||||
 | 
			
		||||
        if (Array.isArray(replacer)) {
 | 
			
		||||
            allowlist = new Set(replacer);
 | 
			
		||||
            replacer = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        space = spaceLength(space);
 | 
			
		||||
        options = options || {};
 | 
			
		||||
 | 
			
		||||
        const visited = new Map();
 | 
			
		||||
        const stack = new Set();
 | 
			
		||||
        const duplicate = new Set();
 | 
			
		||||
        const circular = new Set();
 | 
			
		||||
        const async = new Set();
 | 
			
		||||
        const getType = options.async ? getTypeAsync : getTypeNative;
 | 
			
		||||
        const root = { '': value };
 | 
			
		||||
        let stop = false;
 | 
			
		||||
        let length = 0;
 | 
			
		||||
 | 
			
		||||
        walk(root, '', value);
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            minLength: isNaN(length) ? Infinity : length,
 | 
			
		||||
            circular: [...circular],
 | 
			
		||||
            duplicate: [...duplicate],
 | 
			
		||||
            async: [...async]
 | 
			
		||||
        };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    var stringifyStreamBrowser = () => {
 | 
			
		||||
        throw new Error('Method is not supported');
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    var textDecoderBrowser = TextDecoder;
 | 
			
		||||
 | 
			
		||||
    const { isReadableStream } = utils;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    const STACK_OBJECT = 1;
 | 
			
		||||
    const STACK_ARRAY = 2;
 | 
			
		||||
    const decoder = new textDecoderBrowser();
 | 
			
		||||
 | 
			
		||||
    function isObject(value) {
 | 
			
		||||
        return value !== null && typeof value === 'object';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function adjustPosition(error, parser) {
 | 
			
		||||
        if (error.name === 'SyntaxError' && parser.jsonParseOffset) {
 | 
			
		||||
            error.message = error.message.replace(/at position (\d+)/, (_, pos) =>
 | 
			
		||||
                'at position ' + (Number(pos) + parser.jsonParseOffset)
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return error;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function append(array, elements) {
 | 
			
		||||
        // Note: Avoid to use array.push(...elements) since it may lead to
 | 
			
		||||
        // "RangeError: Maximum call stack size exceeded" for a long arrays
 | 
			
		||||
        const initialLength = array.length;
 | 
			
		||||
        array.length += elements.length;
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < elements.length; i++) {
 | 
			
		||||
            array[initialLength + i] = elements[i];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var parseChunked = function(chunkEmitter) {
 | 
			
		||||
        let parser = new ChunkParser();
 | 
			
		||||
 | 
			
		||||
        if (isObject(chunkEmitter) && isReadableStream(chunkEmitter)) {
 | 
			
		||||
            return new Promise((resolve, reject) => {
 | 
			
		||||
                chunkEmitter
 | 
			
		||||
                    .on('data', chunk => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            parser.push(chunk);
 | 
			
		||||
                        } catch (e) {
 | 
			
		||||
                            reject(adjustPosition(e, parser));
 | 
			
		||||
                            parser = null;
 | 
			
		||||
                        }
 | 
			
		||||
                    })
 | 
			
		||||
                    .on('error', (e) => {
 | 
			
		||||
                        parser = null;
 | 
			
		||||
                        reject(e);
 | 
			
		||||
                    })
 | 
			
		||||
                    .on('end', () => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            resolve(parser.finish());
 | 
			
		||||
                        } catch (e) {
 | 
			
		||||
                            reject(adjustPosition(e, parser));
 | 
			
		||||
                        } finally {
 | 
			
		||||
                            parser = null;
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (typeof chunkEmitter === 'function') {
 | 
			
		||||
            const iterator = chunkEmitter();
 | 
			
		||||
 | 
			
		||||
            if (isObject(iterator) && (Symbol.iterator in iterator || Symbol.asyncIterator in iterator)) {
 | 
			
		||||
                return new Promise(async (resolve, reject) => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        for await (const chunk of iterator) {
 | 
			
		||||
                            parser.push(chunk);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        resolve(parser.finish());
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        reject(adjustPosition(e, parser));
 | 
			
		||||
                    } finally {
 | 
			
		||||
                        parser = null;
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new Error(
 | 
			
		||||
            'Chunk emitter should be readable stream, generator, ' +
 | 
			
		||||
            'async generator or function returning an iterable object'
 | 
			
		||||
        );
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    class ChunkParser {
 | 
			
		||||
        constructor() {
 | 
			
		||||
            this.value = undefined;
 | 
			
		||||
            this.valueStack = null;
 | 
			
		||||
 | 
			
		||||
            this.stack = new Array(100);
 | 
			
		||||
            this.lastFlushDepth = 0;
 | 
			
		||||
            this.flushDepth = 0;
 | 
			
		||||
            this.stateString = false;
 | 
			
		||||
            this.stateStringEscape = false;
 | 
			
		||||
            this.pendingByteSeq = null;
 | 
			
		||||
            this.pendingChunk = null;
 | 
			
		||||
            this.chunkOffset = 0;
 | 
			
		||||
            this.jsonParseOffset = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        parseAndAppend(fragment, wrap) {
 | 
			
		||||
            // Append new entries or elements
 | 
			
		||||
            if (this.stack[this.lastFlushDepth - 1] === STACK_OBJECT) {
 | 
			
		||||
                if (wrap) {
 | 
			
		||||
                    this.jsonParseOffset--;
 | 
			
		||||
                    fragment = '{' + fragment + '}';
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                Object.assign(this.valueStack.value, JSON.parse(fragment));
 | 
			
		||||
            } else {
 | 
			
		||||
                if (wrap) {
 | 
			
		||||
                    this.jsonParseOffset--;
 | 
			
		||||
                    fragment = '[' + fragment + ']';
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                append(this.valueStack.value, JSON.parse(fragment));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        prepareAddition(fragment) {
 | 
			
		||||
            const { value } = this.valueStack;
 | 
			
		||||
            const expectComma = Array.isArray(value)
 | 
			
		||||
                ? value.length !== 0
 | 
			
		||||
                : Object.keys(value).length !== 0;
 | 
			
		||||
 | 
			
		||||
            if (expectComma) {
 | 
			
		||||
                // Skip a comma at the beginning of fragment, otherwise it would
 | 
			
		||||
                // fail to parse
 | 
			
		||||
                if (fragment[0] === ',') {
 | 
			
		||||
                    this.jsonParseOffset++;
 | 
			
		||||
                    return fragment.slice(1);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // When value (an object or array) is not empty and a fragment
 | 
			
		||||
                // doesn't start with a comma, a single valid fragment starting
 | 
			
		||||
                // is a closing bracket. If it's not, a prefix is adding to fail
 | 
			
		||||
                // parsing. Otherwise, the sequence of chunks can be successfully
 | 
			
		||||
                // parsed, although it should not, e.g. ["[{}", "{}]"]
 | 
			
		||||
                if (fragment[0] !== '}' && fragment[0] !== ']') {
 | 
			
		||||
                    this.jsonParseOffset -= 3;
 | 
			
		||||
                    return '[[]' + fragment;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return fragment;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        flush(chunk, start, end) {
 | 
			
		||||
            let fragment = chunk.slice(start, end);
 | 
			
		||||
 | 
			
		||||
            // Save position correction an error in JSON.parse() if any
 | 
			
		||||
            this.jsonParseOffset = this.chunkOffset + start;
 | 
			
		||||
 | 
			
		||||
            // Prepend pending chunk if any
 | 
			
		||||
            if (this.pendingChunk !== null) {
 | 
			
		||||
                fragment = this.pendingChunk + fragment;
 | 
			
		||||
                this.jsonParseOffset -= this.pendingChunk.length;
 | 
			
		||||
                this.pendingChunk = null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.flushDepth === this.lastFlushDepth) {
 | 
			
		||||
                // Depth didn't changed, so it's a root value or entry/element set
 | 
			
		||||
                if (this.flushDepth > 0) {
 | 
			
		||||
                    this.parseAndAppend(this.prepareAddition(fragment), true);
 | 
			
		||||
                } else {
 | 
			
		||||
                    // That's an entire value on a top level
 | 
			
		||||
                    this.value = JSON.parse(fragment);
 | 
			
		||||
                    this.valueStack = {
 | 
			
		||||
                        value: this.value,
 | 
			
		||||
                        prev: null
 | 
			
		||||
                    };
 | 
			
		||||
                }
 | 
			
		||||
            } else if (this.flushDepth > this.lastFlushDepth) {
 | 
			
		||||
                // Add missed closing brackets/parentheses
 | 
			
		||||
                for (let i = this.flushDepth - 1; i >= this.lastFlushDepth; i--) {
 | 
			
		||||
                    fragment += this.stack[i] === STACK_OBJECT ? '}' : ']';
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (this.lastFlushDepth === 0) {
 | 
			
		||||
                    // That's a root value
 | 
			
		||||
                    this.value = JSON.parse(fragment);
 | 
			
		||||
                    this.valueStack = {
 | 
			
		||||
                        value: this.value,
 | 
			
		||||
                        prev: null
 | 
			
		||||
                    };
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.parseAndAppend(this.prepareAddition(fragment), true);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Move down to the depths to the last object/array, which is current now
 | 
			
		||||
                for (let i = this.lastFlushDepth || 1; i < this.flushDepth; i++) {
 | 
			
		||||
                    let value = this.valueStack.value;
 | 
			
		||||
 | 
			
		||||
                    if (this.stack[i - 1] === STACK_OBJECT) {
 | 
			
		||||
                        // find last entry
 | 
			
		||||
                        let key;
 | 
			
		||||
                        // eslint-disable-next-line curly
 | 
			
		||||
                        for (key in value);
 | 
			
		||||
                        value = value[key];
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // last element
 | 
			
		||||
                        value = value[value.length - 1];
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    this.valueStack = {
 | 
			
		||||
                        value,
 | 
			
		||||
                        prev: this.valueStack
 | 
			
		||||
                    };
 | 
			
		||||
                }
 | 
			
		||||
            } else /* this.flushDepth < this.lastFlushDepth */ {
 | 
			
		||||
                fragment = this.prepareAddition(fragment);
 | 
			
		||||
 | 
			
		||||
                // Add missed opening brackets/parentheses
 | 
			
		||||
                for (let i = this.lastFlushDepth - 1; i >= this.flushDepth; i--) {
 | 
			
		||||
                    this.jsonParseOffset--;
 | 
			
		||||
                    fragment = (this.stack[i] === STACK_OBJECT ? '{' : '[') + fragment;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this.parseAndAppend(fragment, false);
 | 
			
		||||
 | 
			
		||||
                for (let i = this.lastFlushDepth - 1; i >= this.flushDepth; i--) {
 | 
			
		||||
                    this.valueStack = this.valueStack.prev;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.lastFlushDepth = this.flushDepth;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        push(chunk) {
 | 
			
		||||
            if (typeof chunk !== 'string') {
 | 
			
		||||
                // Suppose chunk is Buffer or Uint8Array
 | 
			
		||||
 | 
			
		||||
                // Prepend uncompleted byte sequence if any
 | 
			
		||||
                if (this.pendingByteSeq !== null) {
 | 
			
		||||
                    const origRawChunk = chunk;
 | 
			
		||||
                    chunk = new Uint8Array(this.pendingByteSeq.length + origRawChunk.length);
 | 
			
		||||
                    chunk.set(this.pendingByteSeq);
 | 
			
		||||
                    chunk.set(origRawChunk, this.pendingByteSeq.length);
 | 
			
		||||
                    this.pendingByteSeq = null;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // In case Buffer/Uint8Array, an input is encoded in UTF8
 | 
			
		||||
                // Seek for parts of uncompleted UTF8 symbol on the ending
 | 
			
		||||
                // This makes sense only if we expect more chunks and last char is not multi-bytes
 | 
			
		||||
                if (chunk[chunk.length - 1] > 127) {
 | 
			
		||||
                    for (let seqLength = 0; seqLength < chunk.length; seqLength++) {
 | 
			
		||||
                        const byte = chunk[chunk.length - 1 - seqLength];
 | 
			
		||||
 | 
			
		||||
                        // 10xxxxxx - 2nd, 3rd or 4th byte
 | 
			
		||||
                        // 110xxxxx – first byte of 2-byte sequence
 | 
			
		||||
                        // 1110xxxx - first byte of 3-byte sequence
 | 
			
		||||
                        // 11110xxx - first byte of 4-byte sequence
 | 
			
		||||
                        if (byte >> 6 === 3) {
 | 
			
		||||
                            seqLength++;
 | 
			
		||||
 | 
			
		||||
                            // If the sequence is really incomplete, then preserve it
 | 
			
		||||
                            // for the future chunk and cut off it from the current chunk
 | 
			
		||||
                            if ((seqLength !== 4 && byte >> 3 === 0b11110) ||
 | 
			
		||||
                                (seqLength !== 3 && byte >> 4 === 0b1110) ||
 | 
			
		||||
                                (seqLength !== 2 && byte >> 5 === 0b110)) {
 | 
			
		||||
                                this.pendingByteSeq = chunk.slice(chunk.length - seqLength);
 | 
			
		||||
                                chunk = chunk.slice(0, -seqLength);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Convert chunk to a string, since single decode per chunk
 | 
			
		||||
                // is much effective than decode multiple small substrings
 | 
			
		||||
                chunk = decoder.decode(chunk);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const chunkLength = chunk.length;
 | 
			
		||||
            let lastFlushPoint = 0;
 | 
			
		||||
            let flushPoint = 0;
 | 
			
		||||
 | 
			
		||||
            // Main scan loop
 | 
			
		||||
            scan: for (let i = 0; i < chunkLength; i++) {
 | 
			
		||||
                if (this.stateString) {
 | 
			
		||||
                    for (; i < chunkLength; i++) {
 | 
			
		||||
                        if (this.stateStringEscape) {
 | 
			
		||||
                            this.stateStringEscape = false;
 | 
			
		||||
                        } else {
 | 
			
		||||
                            switch (chunk.charCodeAt(i)) {
 | 
			
		||||
                                case 0x22: /* " */
 | 
			
		||||
                                    this.stateString = false;
 | 
			
		||||
                                    continue scan;
 | 
			
		||||
 | 
			
		||||
                                case 0x5C: /* \ */
 | 
			
		||||
                                    this.stateStringEscape = true;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                switch (chunk.charCodeAt(i)) {
 | 
			
		||||
                    case 0x22: /* " */
 | 
			
		||||
                        this.stateString = true;
 | 
			
		||||
                        this.stateStringEscape = false;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case 0x2C: /* , */
 | 
			
		||||
                        flushPoint = i;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case 0x7B: /* { */
 | 
			
		||||
                        // Open an object
 | 
			
		||||
                        flushPoint = i + 1;
 | 
			
		||||
                        this.stack[this.flushDepth++] = STACK_OBJECT;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case 0x5B: /* [ */
 | 
			
		||||
                        // Open an array
 | 
			
		||||
                        flushPoint = i + 1;
 | 
			
		||||
                        this.stack[this.flushDepth++] = STACK_ARRAY;
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case 0x5D: /* ] */
 | 
			
		||||
                    case 0x7D: /* } */
 | 
			
		||||
                        // Close an object or array
 | 
			
		||||
                        flushPoint = i + 1;
 | 
			
		||||
                        this.flushDepth--;
 | 
			
		||||
 | 
			
		||||
                        if (this.flushDepth < this.lastFlushDepth) {
 | 
			
		||||
                            this.flush(chunk, lastFlushPoint, flushPoint);
 | 
			
		||||
                            lastFlushPoint = flushPoint;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
 | 
			
		||||
                    case 0x09: /* \t */
 | 
			
		||||
                    case 0x0A: /* \n */
 | 
			
		||||
                    case 0x0D: /* \r */
 | 
			
		||||
                    case 0x20: /* space */
 | 
			
		||||
                        // Move points forward when they points on current position and it's a whitespace
 | 
			
		||||
                        if (lastFlushPoint === i) {
 | 
			
		||||
                            lastFlushPoint++;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (flushPoint === i) {
 | 
			
		||||
                            flushPoint++;
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (flushPoint > lastFlushPoint) {
 | 
			
		||||
                this.flush(chunk, lastFlushPoint, flushPoint);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Produce pendingChunk if something left
 | 
			
		||||
            if (flushPoint < chunkLength) {
 | 
			
		||||
                if (this.pendingChunk !== null) {
 | 
			
		||||
                    // When there is already a pending chunk then no flush happened,
 | 
			
		||||
                    // appending entire chunk to pending one
 | 
			
		||||
                    this.pendingChunk += chunk;
 | 
			
		||||
                } else {
 | 
			
		||||
                    // Create a pending chunk, it will start with non-whitespace since
 | 
			
		||||
                    // flushPoint was moved forward away from whitespaces on scan
 | 
			
		||||
                    this.pendingChunk = chunk.slice(flushPoint, chunkLength);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.chunkOffset += chunkLength;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        finish() {
 | 
			
		||||
            if (this.pendingChunk !== null) {
 | 
			
		||||
                this.flush('', 0, 0);
 | 
			
		||||
                this.pendingChunk = null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return this.value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var src = {
 | 
			
		||||
        version: version,
 | 
			
		||||
        stringifyInfo: stringifyInfo,
 | 
			
		||||
        stringifyStream: stringifyStreamBrowser,
 | 
			
		||||
        parseChunked: parseChunked
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    return src;
 | 
			
		||||
 | 
			
		||||
}));
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@discoveryjs/json-ext/dist/json-ext.min.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@discoveryjs/json-ext/dist/json-ext.min.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@discoveryjs/json-ext/dist/version.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@discoveryjs/json-ext/dist/version.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
module.exports = "0.5.7";
 | 
			
		||||
							
								
								
									
										31
									
								
								node_modules/@discoveryjs/json-ext/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								node_modules/@discoveryjs/json-ext/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
declare module '@discoveryjs/json-ext' {
 | 
			
		||||
    import { Readable } from 'stream';
 | 
			
		||||
 | 
			
		||||
    type TReplacer =
 | 
			
		||||
        | ((this: any, key: string, value: any) => any)
 | 
			
		||||
        | string[]
 | 
			
		||||
        | number[]
 | 
			
		||||
        | null;
 | 
			
		||||
    type TSpace = string | number | null;
 | 
			
		||||
    type TChunk = string | Buffer | Uint8Array;
 | 
			
		||||
 | 
			
		||||
    export function parseChunked(input: Readable): Promise<any>;
 | 
			
		||||
    export function parseChunked(input: () => (Iterable<TChunk> | AsyncIterable<TChunk>)): Promise<any>;
 | 
			
		||||
 | 
			
		||||
    export function stringifyStream(value: any, replacer?: TReplacer, space?: TSpace): Readable;
 | 
			
		||||
 | 
			
		||||
    export function stringifyInfo(
 | 
			
		||||
        value: any,
 | 
			
		||||
        replacer?: TReplacer,
 | 
			
		||||
        space?: TSpace,
 | 
			
		||||
        options?: {
 | 
			
		||||
            async?: boolean;
 | 
			
		||||
            continueOnCircular?: boolean;
 | 
			
		||||
        }
 | 
			
		||||
    ): {
 | 
			
		||||
        minLength: number;
 | 
			
		||||
        circular: any[];
 | 
			
		||||
        duplicate: any[];
 | 
			
		||||
        async: any[];
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										56
									
								
								node_modules/@discoveryjs/json-ext/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								node_modules/@discoveryjs/json-ext/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
{
 | 
			
		||||
    "name": "@discoveryjs/json-ext",
 | 
			
		||||
    "version": "0.5.7",
 | 
			
		||||
    "description": "A set of utilities that extend the use of JSON",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "json",
 | 
			
		||||
        "utils",
 | 
			
		||||
        "stream",
 | 
			
		||||
        "async",
 | 
			
		||||
        "promise",
 | 
			
		||||
        "stringify",
 | 
			
		||||
        "info"
 | 
			
		||||
    ],
 | 
			
		||||
    "author": "Roman Dvornov <rdvornov@gmail.com> (https://github.com/lahmatiy)",
 | 
			
		||||
    "license": "MIT",
 | 
			
		||||
    "repository": "discoveryjs/json-ext",
 | 
			
		||||
    "main": "./src/index",
 | 
			
		||||
    "browser": {
 | 
			
		||||
        "./src/stringify-stream.js": "./src/stringify-stream-browser.js",
 | 
			
		||||
        "./src/text-decoder.js": "./src/text-decoder-browser.js",
 | 
			
		||||
        "./src/version.js": "./dist/version.js"
 | 
			
		||||
    },
 | 
			
		||||
    "types": "./index.d.ts",
 | 
			
		||||
    "scripts": {
 | 
			
		||||
        "test": "mocha --reporter progress",
 | 
			
		||||
        "lint": "eslint src test",
 | 
			
		||||
        "lint-and-test": "npm run lint && npm test",
 | 
			
		||||
        "build": "rollup --config",
 | 
			
		||||
        "test:all": "npm run test:src && npm run test:dist",
 | 
			
		||||
        "test:src": "npm test",
 | 
			
		||||
        "test:dist": "cross-env MODE=dist npm test && cross-env MODE=dist-min npm test",
 | 
			
		||||
        "build-and-test": "npm run build && npm run test:dist",
 | 
			
		||||
        "coverage": "c8 --reporter=lcovonly npm test",
 | 
			
		||||
        "prepublishOnly": "npm run lint && npm test && npm run build-and-test"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@rollup/plugin-commonjs": "^15.1.0",
 | 
			
		||||
        "@rollup/plugin-json": "^4.1.0",
 | 
			
		||||
        "@rollup/plugin-node-resolve": "^9.0.0",
 | 
			
		||||
        "c8": "^7.10.0",
 | 
			
		||||
        "chalk": "^4.1.0",
 | 
			
		||||
        "cross-env": "^7.0.3",
 | 
			
		||||
        "eslint": "^8.10.0",
 | 
			
		||||
        "mocha": "^8.4.0",
 | 
			
		||||
        "rollup": "^2.28.2",
 | 
			
		||||
        "rollup-plugin-terser": "^7.0.2"
 | 
			
		||||
    },
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": ">=10.0.0"
 | 
			
		||||
    },
 | 
			
		||||
    "files": [
 | 
			
		||||
        "dist",
 | 
			
		||||
        "src",
 | 
			
		||||
        "index.d.ts"
 | 
			
		||||
    ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								node_modules/@discoveryjs/json-ext/src/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								node_modules/@discoveryjs/json-ext/src/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
module.exports = {
 | 
			
		||||
    version: require('./version'),
 | 
			
		||||
    stringifyInfo: require('./stringify-info'),
 | 
			
		||||
    stringifyStream: require('./stringify-stream'),
 | 
			
		||||
    parseChunked: require('./parse-chunked')
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										384
									
								
								node_modules/@discoveryjs/json-ext/src/parse-chunked.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								node_modules/@discoveryjs/json-ext/src/parse-chunked.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,384 @@
 | 
			
		|||
const { isReadableStream } = require('./utils');
 | 
			
		||||
const TextDecoder = require('./text-decoder');
 | 
			
		||||
 | 
			
		||||
const STACK_OBJECT = 1;
 | 
			
		||||
const STACK_ARRAY = 2;
 | 
			
		||||
const decoder = new TextDecoder();
 | 
			
		||||
 | 
			
		||||
function isObject(value) {
 | 
			
		||||
    return value !== null && typeof value === 'object';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function adjustPosition(error, parser) {
 | 
			
		||||
    if (error.name === 'SyntaxError' && parser.jsonParseOffset) {
 | 
			
		||||
        error.message = error.message.replace(/at position (\d+)/, (_, pos) =>
 | 
			
		||||
            'at position ' + (Number(pos) + parser.jsonParseOffset)
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function append(array, elements) {
 | 
			
		||||
    // Note: Avoid to use array.push(...elements) since it may lead to
 | 
			
		||||
    // "RangeError: Maximum call stack size exceeded" for a long arrays
 | 
			
		||||
    const initialLength = array.length;
 | 
			
		||||
    array.length += elements.length;
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < elements.length; i++) {
 | 
			
		||||
        array[initialLength + i] = elements[i];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = function(chunkEmitter) {
 | 
			
		||||
    let parser = new ChunkParser();
 | 
			
		||||
 | 
			
		||||
    if (isObject(chunkEmitter) && isReadableStream(chunkEmitter)) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            chunkEmitter
 | 
			
		||||
                .on('data', chunk => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        parser.push(chunk);
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        reject(adjustPosition(e, parser));
 | 
			
		||||
                        parser = null;
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .on('error', (e) => {
 | 
			
		||||
                    parser = null;
 | 
			
		||||
                    reject(e);
 | 
			
		||||
                })
 | 
			
		||||
                .on('end', () => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        resolve(parser.finish());
 | 
			
		||||
                    } catch (e) {
 | 
			
		||||
                        reject(adjustPosition(e, parser));
 | 
			
		||||
                    } finally {
 | 
			
		||||
                        parser = null;
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof chunkEmitter === 'function') {
 | 
			
		||||
        const iterator = chunkEmitter();
 | 
			
		||||
 | 
			
		||||
        if (isObject(iterator) && (Symbol.iterator in iterator || Symbol.asyncIterator in iterator)) {
 | 
			
		||||
            return new Promise(async (resolve, reject) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    for await (const chunk of iterator) {
 | 
			
		||||
                        parser.push(chunk);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    resolve(parser.finish());
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    reject(adjustPosition(e, parser));
 | 
			
		||||
                } finally {
 | 
			
		||||
                    parser = null;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    throw new Error(
 | 
			
		||||
        'Chunk emitter should be readable stream, generator, ' +
 | 
			
		||||
        'async generator or function returning an iterable object'
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ChunkParser {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        this.value = undefined;
 | 
			
		||||
        this.valueStack = null;
 | 
			
		||||
 | 
			
		||||
        this.stack = new Array(100);
 | 
			
		||||
        this.lastFlushDepth = 0;
 | 
			
		||||
        this.flushDepth = 0;
 | 
			
		||||
        this.stateString = false;
 | 
			
		||||
        this.stateStringEscape = false;
 | 
			
		||||
        this.pendingByteSeq = null;
 | 
			
		||||
        this.pendingChunk = null;
 | 
			
		||||
        this.chunkOffset = 0;
 | 
			
		||||
        this.jsonParseOffset = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    parseAndAppend(fragment, wrap) {
 | 
			
		||||
        // Append new entries or elements
 | 
			
		||||
        if (this.stack[this.lastFlushDepth - 1] === STACK_OBJECT) {
 | 
			
		||||
            if (wrap) {
 | 
			
		||||
                this.jsonParseOffset--;
 | 
			
		||||
                fragment = '{' + fragment + '}';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Object.assign(this.valueStack.value, JSON.parse(fragment));
 | 
			
		||||
        } else {
 | 
			
		||||
            if (wrap) {
 | 
			
		||||
                this.jsonParseOffset--;
 | 
			
		||||
                fragment = '[' + fragment + ']';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            append(this.valueStack.value, JSON.parse(fragment));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    prepareAddition(fragment) {
 | 
			
		||||
        const { value } = this.valueStack;
 | 
			
		||||
        const expectComma = Array.isArray(value)
 | 
			
		||||
            ? value.length !== 0
 | 
			
		||||
            : Object.keys(value).length !== 0;
 | 
			
		||||
 | 
			
		||||
        if (expectComma) {
 | 
			
		||||
            // Skip a comma at the beginning of fragment, otherwise it would
 | 
			
		||||
            // fail to parse
 | 
			
		||||
            if (fragment[0] === ',') {
 | 
			
		||||
                this.jsonParseOffset++;
 | 
			
		||||
                return fragment.slice(1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // When value (an object or array) is not empty and a fragment
 | 
			
		||||
            // doesn't start with a comma, a single valid fragment starting
 | 
			
		||||
            // is a closing bracket. If it's not, a prefix is adding to fail
 | 
			
		||||
            // parsing. Otherwise, the sequence of chunks can be successfully
 | 
			
		||||
            // parsed, although it should not, e.g. ["[{}", "{}]"]
 | 
			
		||||
            if (fragment[0] !== '}' && fragment[0] !== ']') {
 | 
			
		||||
                this.jsonParseOffset -= 3;
 | 
			
		||||
                return '[[]' + fragment;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return fragment;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    flush(chunk, start, end) {
 | 
			
		||||
        let fragment = chunk.slice(start, end);
 | 
			
		||||
 | 
			
		||||
        // Save position correction an error in JSON.parse() if any
 | 
			
		||||
        this.jsonParseOffset = this.chunkOffset + start;
 | 
			
		||||
 | 
			
		||||
        // Prepend pending chunk if any
 | 
			
		||||
        if (this.pendingChunk !== null) {
 | 
			
		||||
            fragment = this.pendingChunk + fragment;
 | 
			
		||||
            this.jsonParseOffset -= this.pendingChunk.length;
 | 
			
		||||
            this.pendingChunk = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this.flushDepth === this.lastFlushDepth) {
 | 
			
		||||
            // Depth didn't changed, so it's a root value or entry/element set
 | 
			
		||||
            if (this.flushDepth > 0) {
 | 
			
		||||
                this.parseAndAppend(this.prepareAddition(fragment), true);
 | 
			
		||||
            } else {
 | 
			
		||||
                // That's an entire value on a top level
 | 
			
		||||
                this.value = JSON.parse(fragment);
 | 
			
		||||
                this.valueStack = {
 | 
			
		||||
                    value: this.value,
 | 
			
		||||
                    prev: null
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
        } else if (this.flushDepth > this.lastFlushDepth) {
 | 
			
		||||
            // Add missed closing brackets/parentheses
 | 
			
		||||
            for (let i = this.flushDepth - 1; i >= this.lastFlushDepth; i--) {
 | 
			
		||||
                fragment += this.stack[i] === STACK_OBJECT ? '}' : ']';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (this.lastFlushDepth === 0) {
 | 
			
		||||
                // That's a root value
 | 
			
		||||
                this.value = JSON.parse(fragment);
 | 
			
		||||
                this.valueStack = {
 | 
			
		||||
                    value: this.value,
 | 
			
		||||
                    prev: null
 | 
			
		||||
                };
 | 
			
		||||
            } else {
 | 
			
		||||
                this.parseAndAppend(this.prepareAddition(fragment), true);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Move down to the depths to the last object/array, which is current now
 | 
			
		||||
            for (let i = this.lastFlushDepth || 1; i < this.flushDepth; i++) {
 | 
			
		||||
                let value = this.valueStack.value;
 | 
			
		||||
 | 
			
		||||
                if (this.stack[i - 1] === STACK_OBJECT) {
 | 
			
		||||
                    // find last entry
 | 
			
		||||
                    let key;
 | 
			
		||||
                    // eslint-disable-next-line curly
 | 
			
		||||
                    for (key in value);
 | 
			
		||||
                    value = value[key];
 | 
			
		||||
                } else {
 | 
			
		||||
                    // last element
 | 
			
		||||
                    value = value[value.length - 1];
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this.valueStack = {
 | 
			
		||||
                    value,
 | 
			
		||||
                    prev: this.valueStack
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
        } else /* this.flushDepth < this.lastFlushDepth */ {
 | 
			
		||||
            fragment = this.prepareAddition(fragment);
 | 
			
		||||
 | 
			
		||||
            // Add missed opening brackets/parentheses
 | 
			
		||||
            for (let i = this.lastFlushDepth - 1; i >= this.flushDepth; i--) {
 | 
			
		||||
                this.jsonParseOffset--;
 | 
			
		||||
                fragment = (this.stack[i] === STACK_OBJECT ? '{' : '[') + fragment;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this.parseAndAppend(fragment, false);
 | 
			
		||||
 | 
			
		||||
            for (let i = this.lastFlushDepth - 1; i >= this.flushDepth; i--) {
 | 
			
		||||
                this.valueStack = this.valueStack.prev;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.lastFlushDepth = this.flushDepth;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    push(chunk) {
 | 
			
		||||
        if (typeof chunk !== 'string') {
 | 
			
		||||
            // Suppose chunk is Buffer or Uint8Array
 | 
			
		||||
 | 
			
		||||
            // Prepend uncompleted byte sequence if any
 | 
			
		||||
            if (this.pendingByteSeq !== null) {
 | 
			
		||||
                const origRawChunk = chunk;
 | 
			
		||||
                chunk = new Uint8Array(this.pendingByteSeq.length + origRawChunk.length);
 | 
			
		||||
                chunk.set(this.pendingByteSeq);
 | 
			
		||||
                chunk.set(origRawChunk, this.pendingByteSeq.length);
 | 
			
		||||
                this.pendingByteSeq = null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // In case Buffer/Uint8Array, an input is encoded in UTF8
 | 
			
		||||
            // Seek for parts of uncompleted UTF8 symbol on the ending
 | 
			
		||||
            // This makes sense only if we expect more chunks and last char is not multi-bytes
 | 
			
		||||
            if (chunk[chunk.length - 1] > 127) {
 | 
			
		||||
                for (let seqLength = 0; seqLength < chunk.length; seqLength++) {
 | 
			
		||||
                    const byte = chunk[chunk.length - 1 - seqLength];
 | 
			
		||||
 | 
			
		||||
                    // 10xxxxxx - 2nd, 3rd or 4th byte
 | 
			
		||||
                    // 110xxxxx – first byte of 2-byte sequence
 | 
			
		||||
                    // 1110xxxx - first byte of 3-byte sequence
 | 
			
		||||
                    // 11110xxx - first byte of 4-byte sequence
 | 
			
		||||
                    if (byte >> 6 === 3) {
 | 
			
		||||
                        seqLength++;
 | 
			
		||||
 | 
			
		||||
                        // If the sequence is really incomplete, then preserve it
 | 
			
		||||
                        // for the future chunk and cut off it from the current chunk
 | 
			
		||||
                        if ((seqLength !== 4 && byte >> 3 === 0b11110) ||
 | 
			
		||||
                            (seqLength !== 3 && byte >> 4 === 0b1110) ||
 | 
			
		||||
                            (seqLength !== 2 && byte >> 5 === 0b110)) {
 | 
			
		||||
                            this.pendingByteSeq = chunk.slice(chunk.length - seqLength);
 | 
			
		||||
                            chunk = chunk.slice(0, -seqLength);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Convert chunk to a string, since single decode per chunk
 | 
			
		||||
            // is much effective than decode multiple small substrings
 | 
			
		||||
            chunk = decoder.decode(chunk);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const chunkLength = chunk.length;
 | 
			
		||||
        let lastFlushPoint = 0;
 | 
			
		||||
        let flushPoint = 0;
 | 
			
		||||
 | 
			
		||||
        // Main scan loop
 | 
			
		||||
        scan: for (let i = 0; i < chunkLength; i++) {
 | 
			
		||||
            if (this.stateString) {
 | 
			
		||||
                for (; i < chunkLength; i++) {
 | 
			
		||||
                    if (this.stateStringEscape) {
 | 
			
		||||
                        this.stateStringEscape = false;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        switch (chunk.charCodeAt(i)) {
 | 
			
		||||
                            case 0x22: /* " */
 | 
			
		||||
                                this.stateString = false;
 | 
			
		||||
                                continue scan;
 | 
			
		||||
 | 
			
		||||
                            case 0x5C: /* \ */
 | 
			
		||||
                                this.stateStringEscape = true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switch (chunk.charCodeAt(i)) {
 | 
			
		||||
                case 0x22: /* " */
 | 
			
		||||
                    this.stateString = true;
 | 
			
		||||
                    this.stateStringEscape = false;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 0x2C: /* , */
 | 
			
		||||
                    flushPoint = i;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 0x7B: /* { */
 | 
			
		||||
                    // Open an object
 | 
			
		||||
                    flushPoint = i + 1;
 | 
			
		||||
                    this.stack[this.flushDepth++] = STACK_OBJECT;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 0x5B: /* [ */
 | 
			
		||||
                    // Open an array
 | 
			
		||||
                    flushPoint = i + 1;
 | 
			
		||||
                    this.stack[this.flushDepth++] = STACK_ARRAY;
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 0x5D: /* ] */
 | 
			
		||||
                case 0x7D: /* } */
 | 
			
		||||
                    // Close an object or array
 | 
			
		||||
                    flushPoint = i + 1;
 | 
			
		||||
                    this.flushDepth--;
 | 
			
		||||
 | 
			
		||||
                    if (this.flushDepth < this.lastFlushDepth) {
 | 
			
		||||
                        this.flush(chunk, lastFlushPoint, flushPoint);
 | 
			
		||||
                        lastFlushPoint = flushPoint;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case 0x09: /* \t */
 | 
			
		||||
                case 0x0A: /* \n */
 | 
			
		||||
                case 0x0D: /* \r */
 | 
			
		||||
                case 0x20: /* space */
 | 
			
		||||
                    // Move points forward when they points on current position and it's a whitespace
 | 
			
		||||
                    if (lastFlushPoint === i) {
 | 
			
		||||
                        lastFlushPoint++;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (flushPoint === i) {
 | 
			
		||||
                        flushPoint++;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (flushPoint > lastFlushPoint) {
 | 
			
		||||
            this.flush(chunk, lastFlushPoint, flushPoint);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Produce pendingChunk if something left
 | 
			
		||||
        if (flushPoint < chunkLength) {
 | 
			
		||||
            if (this.pendingChunk !== null) {
 | 
			
		||||
                // When there is already a pending chunk then no flush happened,
 | 
			
		||||
                // appending entire chunk to pending one
 | 
			
		||||
                this.pendingChunk += chunk;
 | 
			
		||||
            } else {
 | 
			
		||||
                // Create a pending chunk, it will start with non-whitespace since
 | 
			
		||||
                // flushPoint was moved forward away from whitespaces on scan
 | 
			
		||||
                this.pendingChunk = chunk.slice(flushPoint, chunkLength);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.chunkOffset += chunkLength;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    finish() {
 | 
			
		||||
        if (this.pendingChunk !== null) {
 | 
			
		||||
            this.flush('', 0, 0);
 | 
			
		||||
            this.pendingChunk = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.value;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										231
									
								
								node_modules/@discoveryjs/json-ext/src/stringify-info.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								node_modules/@discoveryjs/json-ext/src/stringify-info.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,231 @@
 | 
			
		|||
const {
 | 
			
		||||
    normalizeReplacer,
 | 
			
		||||
    normalizeSpace,
 | 
			
		||||
    replaceValue,
 | 
			
		||||
    getTypeNative,
 | 
			
		||||
    getTypeAsync,
 | 
			
		||||
    isLeadingSurrogate,
 | 
			
		||||
    isTrailingSurrogate,
 | 
			
		||||
    escapableCharCodeSubstitution,
 | 
			
		||||
    type: {
 | 
			
		||||
        PRIMITIVE,
 | 
			
		||||
        OBJECT,
 | 
			
		||||
        ARRAY,
 | 
			
		||||
        PROMISE,
 | 
			
		||||
        STRING_STREAM,
 | 
			
		||||
        OBJECT_STREAM
 | 
			
		||||
    }
 | 
			
		||||
} = require('./utils');
 | 
			
		||||
const charLength2048 = Array.from({ length: 2048 }).map((_, code) => {
 | 
			
		||||
    if (escapableCharCodeSubstitution.hasOwnProperty(code)) {
 | 
			
		||||
        return 2; // \X
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (code < 0x20) {
 | 
			
		||||
        return 6; // \uXXXX
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return code < 128 ? 1 : 2; // UTF8 bytes
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function stringLength(str) {
 | 
			
		||||
    let len = 0;
 | 
			
		||||
    let prevLeadingSurrogate = false;
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < str.length; i++) {
 | 
			
		||||
        const code = str.charCodeAt(i);
 | 
			
		||||
 | 
			
		||||
        if (code < 2048) {
 | 
			
		||||
            len += charLength2048[code];
 | 
			
		||||
        } else if (isLeadingSurrogate(code)) {
 | 
			
		||||
            len += 6; // \uXXXX since no pair with trailing surrogate yet
 | 
			
		||||
            prevLeadingSurrogate = true;
 | 
			
		||||
            continue;
 | 
			
		||||
        } else if (isTrailingSurrogate(code)) {
 | 
			
		||||
            len = prevLeadingSurrogate
 | 
			
		||||
                ? len - 2  // surrogate pair (4 bytes), since we calculate prev leading surrogate as 6 bytes, substruct 2 bytes
 | 
			
		||||
                : len + 6; // \uXXXX
 | 
			
		||||
        } else {
 | 
			
		||||
            len += 3; // code >= 2048 is 3 bytes length for UTF8
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        prevLeadingSurrogate = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return len + 2; // +2 for quotes
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function primitiveLength(value) {
 | 
			
		||||
    switch (typeof value) {
 | 
			
		||||
        case 'string':
 | 
			
		||||
            return stringLength(value);
 | 
			
		||||
 | 
			
		||||
        case 'number':
 | 
			
		||||
            return Number.isFinite(value) ? String(value).length : 4 /* null */;
 | 
			
		||||
 | 
			
		||||
        case 'boolean':
 | 
			
		||||
            return value ? 4 /* true */ : 5 /* false */;
 | 
			
		||||
 | 
			
		||||
        case 'undefined':
 | 
			
		||||
        case 'object':
 | 
			
		||||
            return 4; /* null */
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function spaceLength(space) {
 | 
			
		||||
    space = normalizeSpace(space);
 | 
			
		||||
    return typeof space === 'string' ? space.length : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = function jsonStringifyInfo(value, replacer, space, options) {
 | 
			
		||||
    function walk(holder, key, value) {
 | 
			
		||||
        if (stop) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        value = replaceValue(holder, key, value, replacer);
 | 
			
		||||
 | 
			
		||||
        let type = getType(value);
 | 
			
		||||
 | 
			
		||||
        // check for circular structure
 | 
			
		||||
        if (type !== PRIMITIVE && stack.has(value)) {
 | 
			
		||||
            circular.add(value);
 | 
			
		||||
            length += 4; // treat as null
 | 
			
		||||
 | 
			
		||||
            if (!options.continueOnCircular) {
 | 
			
		||||
                stop = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch (type) {
 | 
			
		||||
            case PRIMITIVE:
 | 
			
		||||
                if (value !== undefined || Array.isArray(holder)) {
 | 
			
		||||
                    length += primitiveLength(value);
 | 
			
		||||
                } else if (holder === root) {
 | 
			
		||||
                    length += 9; // FIXME: that's the length of undefined, should we normalize behaviour to convert it to null?
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case OBJECT: {
 | 
			
		||||
                if (visited.has(value)) {
 | 
			
		||||
                    duplicate.add(value);
 | 
			
		||||
                    length += visited.get(value);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const valueLength = length;
 | 
			
		||||
                let entries = 0;
 | 
			
		||||
 | 
			
		||||
                length += 2; // {}
 | 
			
		||||
 | 
			
		||||
                stack.add(value);
 | 
			
		||||
 | 
			
		||||
                for (const key in value) {
 | 
			
		||||
                    if (hasOwnProperty.call(value, key) && (allowlist === null || allowlist.has(key))) {
 | 
			
		||||
                        const prevLength = length;
 | 
			
		||||
                        walk(value, key, value[key]);
 | 
			
		||||
 | 
			
		||||
                        if (prevLength !== length) {
 | 
			
		||||
                            // value is printed
 | 
			
		||||
                            length += stringLength(key) + 1; // "key":
 | 
			
		||||
                            entries++;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (entries > 1) {
 | 
			
		||||
                    length += entries - 1; // commas
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                stack.delete(value);
 | 
			
		||||
 | 
			
		||||
                if (space > 0 && entries > 0) {
 | 
			
		||||
                    length += (1 + (stack.size + 1) * space + 1) * entries; // for each key-value: \n{space}
 | 
			
		||||
                    length += 1 + stack.size * space; // for }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                visited.set(value, length - valueLength);
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            case ARRAY: {
 | 
			
		||||
                if (visited.has(value)) {
 | 
			
		||||
                    duplicate.add(value);
 | 
			
		||||
                    length += visited.get(value);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const valueLength = length;
 | 
			
		||||
 | 
			
		||||
                length += 2; // []
 | 
			
		||||
 | 
			
		||||
                stack.add(value);
 | 
			
		||||
 | 
			
		||||
                for (let i = 0; i < value.length; i++) {
 | 
			
		||||
                    walk(value, i, value[i]);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (value.length > 1) {
 | 
			
		||||
                    length += value.length - 1; // commas
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                stack.delete(value);
 | 
			
		||||
 | 
			
		||||
                if (space > 0 && value.length > 0) {
 | 
			
		||||
                    length += (1 + (stack.size + 1) * space) * value.length; // for each element: \n{space}
 | 
			
		||||
                    length += 1 + stack.size * space; // for ]
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                visited.set(value, length - valueLength);
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            case PROMISE:
 | 
			
		||||
            case STRING_STREAM:
 | 
			
		||||
                async.add(value);
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case OBJECT_STREAM:
 | 
			
		||||
                length += 2; // []
 | 
			
		||||
                async.add(value);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let allowlist = null;
 | 
			
		||||
    replacer = normalizeReplacer(replacer);
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(replacer)) {
 | 
			
		||||
        allowlist = new Set(replacer);
 | 
			
		||||
        replacer = null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    space = spaceLength(space);
 | 
			
		||||
    options = options || {};
 | 
			
		||||
 | 
			
		||||
    const visited = new Map();
 | 
			
		||||
    const stack = new Set();
 | 
			
		||||
    const duplicate = new Set();
 | 
			
		||||
    const circular = new Set();
 | 
			
		||||
    const async = new Set();
 | 
			
		||||
    const getType = options.async ? getTypeAsync : getTypeNative;
 | 
			
		||||
    const root = { '': value };
 | 
			
		||||
    let stop = false;
 | 
			
		||||
    let length = 0;
 | 
			
		||||
 | 
			
		||||
    walk(root, '', value);
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        minLength: isNaN(length) ? Infinity : length,
 | 
			
		||||
        circular: [...circular],
 | 
			
		||||
        duplicate: [...duplicate],
 | 
			
		||||
        async: [...async]
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										3
									
								
								node_modules/@discoveryjs/json-ext/src/stringify-stream-browser.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								node_modules/@discoveryjs/json-ext/src/stringify-stream-browser.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
module.exports = () => {
 | 
			
		||||
    throw new Error('Method is not supported');
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										408
									
								
								node_modules/@discoveryjs/json-ext/src/stringify-stream.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										408
									
								
								node_modules/@discoveryjs/json-ext/src/stringify-stream.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,408 @@
 | 
			
		|||
const { Readable } = require('stream');
 | 
			
		||||
const {
 | 
			
		||||
    normalizeReplacer,
 | 
			
		||||
    normalizeSpace,
 | 
			
		||||
    replaceValue,
 | 
			
		||||
    getTypeAsync,
 | 
			
		||||
    type: {
 | 
			
		||||
        PRIMITIVE,
 | 
			
		||||
        OBJECT,
 | 
			
		||||
        ARRAY,
 | 
			
		||||
        PROMISE,
 | 
			
		||||
        STRING_STREAM,
 | 
			
		||||
        OBJECT_STREAM
 | 
			
		||||
    }
 | 
			
		||||
} = require('./utils');
 | 
			
		||||
const noop = () => {};
 | 
			
		||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
 | 
			
		||||
 | 
			
		||||
// TODO: Remove when drop support for Node.js 10
 | 
			
		||||
// Node.js 10 has no well-formed JSON.stringify()
 | 
			
		||||
// https://github.com/tc39/proposal-well-formed-stringify
 | 
			
		||||
// Adopted code from https://bugs.chromium.org/p/v8/issues/detail?id=7782#c12
 | 
			
		||||
const wellformedStringStringify = JSON.stringify('\ud800') === '"\\ud800"'
 | 
			
		||||
    ? JSON.stringify
 | 
			
		||||
    : s => JSON.stringify(s).replace(
 | 
			
		||||
        /\p{Surrogate}/gu,
 | 
			
		||||
        m => `\\u${m.charCodeAt(0).toString(16)}`
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
function push() {
 | 
			
		||||
    this.push(this._stack.value);
 | 
			
		||||
    this.popStack();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function pushPrimitive(value) {
 | 
			
		||||
    switch (typeof value) {
 | 
			
		||||
        case 'string':
 | 
			
		||||
            this.push(this.encodeString(value));
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 'number':
 | 
			
		||||
            this.push(Number.isFinite(value) ? this.encodeNumber(value) : 'null');
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 'boolean':
 | 
			
		||||
            this.push(value ? 'true' : 'false');
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 'undefined':
 | 
			
		||||
        case 'object': // typeof null === 'object'
 | 
			
		||||
            this.push('null');
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            this.destroy(new TypeError(`Do not know how to serialize a ${value.constructor && value.constructor.name || typeof value}`));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processObjectEntry(key) {
 | 
			
		||||
    const current = this._stack;
 | 
			
		||||
 | 
			
		||||
    if (!current.first) {
 | 
			
		||||
        current.first = true;
 | 
			
		||||
    } else {
 | 
			
		||||
        this.push(',');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.space) {
 | 
			
		||||
        this.push(`\n${this.space.repeat(this._depth)}${this.encodeString(key)}: `);
 | 
			
		||||
    } else {
 | 
			
		||||
        this.push(this.encodeString(key) + ':');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processObject() {
 | 
			
		||||
    const current = this._stack;
 | 
			
		||||
 | 
			
		||||
    // when no keys left, remove obj from stack
 | 
			
		||||
    if (current.index === current.keys.length) {
 | 
			
		||||
        if (this.space && current.first) {
 | 
			
		||||
            this.push(`\n${this.space.repeat(this._depth - 1)}}`);
 | 
			
		||||
        } else {
 | 
			
		||||
            this.push('}');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.popStack();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const key = current.keys[current.index];
 | 
			
		||||
 | 
			
		||||
    this.processValue(current.value, key, current.value[key], processObjectEntry);
 | 
			
		||||
    current.index++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processArrayItem(index) {
 | 
			
		||||
    if (index !== 0) {
 | 
			
		||||
        this.push(',');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.space) {
 | 
			
		||||
        this.push(`\n${this.space.repeat(this._depth)}`);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processArray() {
 | 
			
		||||
    const current = this._stack;
 | 
			
		||||
 | 
			
		||||
    if (current.index === current.value.length) {
 | 
			
		||||
        if (this.space && current.index > 0) {
 | 
			
		||||
            this.push(`\n${this.space.repeat(this._depth - 1)}]`);
 | 
			
		||||
        } else {
 | 
			
		||||
            this.push(']');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.popStack();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.processValue(current.value, current.index, current.value[current.index], processArrayItem);
 | 
			
		||||
    current.index++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createStreamReader(fn) {
 | 
			
		||||
    return function() {
 | 
			
		||||
        const current = this._stack;
 | 
			
		||||
        const data = current.value.read(this._readSize);
 | 
			
		||||
 | 
			
		||||
        if (data !== null) {
 | 
			
		||||
            current.first = false;
 | 
			
		||||
            fn.call(this, data, current);
 | 
			
		||||
        } else {
 | 
			
		||||
            if ((current.first && !current.value._readableState.reading) || current.ended) {
 | 
			
		||||
                this.popStack();
 | 
			
		||||
            } else {
 | 
			
		||||
                current.first = true;
 | 
			
		||||
                current.awaiting = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const processReadableObject = createStreamReader(function(data, current) {
 | 
			
		||||
    this.processValue(current.value, current.index, data, processArrayItem);
 | 
			
		||||
    current.index++;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const processReadableString = createStreamReader(function(data) {
 | 
			
		||||
    this.push(data);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
class JsonStringifyStream extends Readable {
 | 
			
		||||
    constructor(value, replacer, space) {
 | 
			
		||||
        super({
 | 
			
		||||
            autoDestroy: true
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.getKeys = Object.keys;
 | 
			
		||||
        this.replacer = normalizeReplacer(replacer);
 | 
			
		||||
 | 
			
		||||
        if (Array.isArray(this.replacer)) {
 | 
			
		||||
            const allowlist = this.replacer;
 | 
			
		||||
 | 
			
		||||
            this.getKeys = (value) => allowlist.filter(key => hasOwnProperty.call(value, key));
 | 
			
		||||
            this.replacer = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.space = normalizeSpace(space);
 | 
			
		||||
        this._depth = 0;
 | 
			
		||||
 | 
			
		||||
        this.error = null;
 | 
			
		||||
        this._processing = false;
 | 
			
		||||
        this._ended = false;
 | 
			
		||||
 | 
			
		||||
        this._readSize = 0;
 | 
			
		||||
        this._buffer = '';
 | 
			
		||||
 | 
			
		||||
        this._stack = null;
 | 
			
		||||
        this._visited = new WeakSet();
 | 
			
		||||
 | 
			
		||||
        this.pushStack({
 | 
			
		||||
            handler: () => {
 | 
			
		||||
                this.popStack();
 | 
			
		||||
                this.processValue({ '': value }, '', value, noop);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    encodeString(value) {
 | 
			
		||||
        if (/[^\x20-\uD799]|[\x22\x5c]/.test(value)) {
 | 
			
		||||
            return wellformedStringStringify(value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return '"' + value + '"';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    encodeNumber(value) {
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    processValue(holder, key, value, callback) {
 | 
			
		||||
        value = replaceValue(holder, key, value, this.replacer);
 | 
			
		||||
 | 
			
		||||
        let type = getTypeAsync(value);
 | 
			
		||||
 | 
			
		||||
        switch (type) {
 | 
			
		||||
            case PRIMITIVE:
 | 
			
		||||
                if (callback !== processObjectEntry || value !== undefined) {
 | 
			
		||||
                    callback.call(this, key);
 | 
			
		||||
                    pushPrimitive.call(this, value);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case OBJECT:
 | 
			
		||||
                callback.call(this, key);
 | 
			
		||||
 | 
			
		||||
                // check for circular structure
 | 
			
		||||
                if (this._visited.has(value)) {
 | 
			
		||||
                    return this.destroy(new TypeError('Converting circular structure to JSON'));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this._visited.add(value);
 | 
			
		||||
                this._depth++;
 | 
			
		||||
                this.push('{');
 | 
			
		||||
                this.pushStack({
 | 
			
		||||
                    handler: processObject,
 | 
			
		||||
                    value,
 | 
			
		||||
                    index: 0,
 | 
			
		||||
                    first: false,
 | 
			
		||||
                    keys: this.getKeys(value)
 | 
			
		||||
                });
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case ARRAY:
 | 
			
		||||
                callback.call(this, key);
 | 
			
		||||
 | 
			
		||||
                // check for circular structure
 | 
			
		||||
                if (this._visited.has(value)) {
 | 
			
		||||
                    return this.destroy(new TypeError('Converting circular structure to JSON'));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this._visited.add(value);
 | 
			
		||||
 | 
			
		||||
                this.push('[');
 | 
			
		||||
                this.pushStack({
 | 
			
		||||
                    handler: processArray,
 | 
			
		||||
                    value,
 | 
			
		||||
                    index: 0
 | 
			
		||||
                });
 | 
			
		||||
                this._depth++;
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case PROMISE:
 | 
			
		||||
                this.pushStack({
 | 
			
		||||
                    handler: noop,
 | 
			
		||||
                    awaiting: true
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                Promise.resolve(value)
 | 
			
		||||
                    .then(resolved => {
 | 
			
		||||
                        this.popStack();
 | 
			
		||||
                        this.processValue(holder, key, resolved, callback);
 | 
			
		||||
                        this.processStack();
 | 
			
		||||
                    })
 | 
			
		||||
                    .catch(error => {
 | 
			
		||||
                        this.destroy(error);
 | 
			
		||||
                    });
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case STRING_STREAM:
 | 
			
		||||
            case OBJECT_STREAM:
 | 
			
		||||
                callback.call(this, key);
 | 
			
		||||
 | 
			
		||||
                // TODO: Remove when drop support for Node.js 10
 | 
			
		||||
                // Used `_readableState.endEmitted` as fallback, since Node.js 10 has no `readableEnded` getter
 | 
			
		||||
                if (value.readableEnded || value._readableState.endEmitted) {
 | 
			
		||||
                    return this.destroy(new Error('Readable Stream has ended before it was serialized. All stream data have been lost'));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (value.readableFlowing) {
 | 
			
		||||
                    return this.destroy(new Error('Readable Stream is in flowing mode, data may have been lost. Trying to pause stream.'));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (type === OBJECT_STREAM) {
 | 
			
		||||
                    this.push('[');
 | 
			
		||||
                    this.pushStack({
 | 
			
		||||
                        handler: push,
 | 
			
		||||
                        value: this.space ? '\n' + this.space.repeat(this._depth) + ']' : ']'
 | 
			
		||||
                    });
 | 
			
		||||
                    this._depth++;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                const self = this.pushStack({
 | 
			
		||||
                    handler: type === OBJECT_STREAM ? processReadableObject : processReadableString,
 | 
			
		||||
                    value,
 | 
			
		||||
                    index: 0,
 | 
			
		||||
                    first: false,
 | 
			
		||||
                    ended: false,
 | 
			
		||||
                    awaiting: !value.readable || value.readableLength === 0
 | 
			
		||||
                });
 | 
			
		||||
                const continueProcessing = () => {
 | 
			
		||||
                    if (self.awaiting) {
 | 
			
		||||
                        self.awaiting = false;
 | 
			
		||||
                        this.processStack();
 | 
			
		||||
                    }
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                value.once('error', error => this.destroy(error));
 | 
			
		||||
                value.once('end', () => {
 | 
			
		||||
                    self.ended = true;
 | 
			
		||||
                    continueProcessing();
 | 
			
		||||
                });
 | 
			
		||||
                value.on('readable', continueProcessing);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pushStack(node) {
 | 
			
		||||
        node.prev = this._stack;
 | 
			
		||||
        return this._stack = node;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    popStack() {
 | 
			
		||||
        const { handler, value } = this._stack;
 | 
			
		||||
 | 
			
		||||
        if (handler === processObject || handler === processArray || handler === processReadableObject) {
 | 
			
		||||
            this._visited.delete(value);
 | 
			
		||||
            this._depth--;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._stack = this._stack.prev;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    processStack() {
 | 
			
		||||
        if (this._processing || this._ended) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            this._processing = true;
 | 
			
		||||
 | 
			
		||||
            while (this._stack !== null && !this._stack.awaiting) {
 | 
			
		||||
                this._stack.handler.call(this);
 | 
			
		||||
 | 
			
		||||
                if (!this._processing) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            this._processing = false;
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            this.destroy(error);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._stack === null && !this._ended) {
 | 
			
		||||
            this._finish();
 | 
			
		||||
            this.push(null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    push(data) {
 | 
			
		||||
        if (data !== null) {
 | 
			
		||||
            this._buffer += data;
 | 
			
		||||
 | 
			
		||||
            // check buffer overflow
 | 
			
		||||
            if (this._buffer.length < this._readSize) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // flush buffer
 | 
			
		||||
            data = this._buffer;
 | 
			
		||||
            this._buffer = '';
 | 
			
		||||
            this._processing = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        super.push(data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _read(size) {
 | 
			
		||||
        // start processing
 | 
			
		||||
        this._readSize = size || this.readableHighWaterMark;
 | 
			
		||||
        this.processStack();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _finish() {
 | 
			
		||||
        this._ended = true;
 | 
			
		||||
        this._processing = false;
 | 
			
		||||
        this._stack = null;
 | 
			
		||||
        this._visited = null;
 | 
			
		||||
 | 
			
		||||
        if (this._buffer && this._buffer.length) {
 | 
			
		||||
            super.push(this._buffer); // flush buffer
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._buffer = '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _destroy(error, cb) {
 | 
			
		||||
        this.error = this.error || error;
 | 
			
		||||
        this._finish();
 | 
			
		||||
        cb(error);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = function createJsonStringifyStream(value, replacer, space) {
 | 
			
		||||
    return new JsonStringifyStream(value, replacer, space);
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@discoveryjs/json-ext/src/text-decoder-browser.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@discoveryjs/json-ext/src/text-decoder-browser.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
module.exports = TextDecoder;
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@discoveryjs/json-ext/src/text-decoder.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@discoveryjs/json-ext/src/text-decoder.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
module.exports = require('util').TextDecoder;
 | 
			
		||||
							
								
								
									
										149
									
								
								node_modules/@discoveryjs/json-ext/src/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								node_modules/@discoveryjs/json-ext/src/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
const PrimitiveType = 1;
 | 
			
		||||
const ObjectType = 2;
 | 
			
		||||
const ArrayType = 3;
 | 
			
		||||
const PromiseType = 4;
 | 
			
		||||
const ReadableStringType = 5;
 | 
			
		||||
const ReadableObjectType = 6;
 | 
			
		||||
// https://tc39.es/ecma262/#table-json-single-character-escapes
 | 
			
		||||
const escapableCharCodeSubstitution = { // JSON Single Character Escape Sequences
 | 
			
		||||
    0x08: '\\b',
 | 
			
		||||
    0x09: '\\t',
 | 
			
		||||
    0x0a: '\\n',
 | 
			
		||||
    0x0c: '\\f',
 | 
			
		||||
    0x0d: '\\r',
 | 
			
		||||
    0x22: '\\\"',
 | 
			
		||||
    0x5c: '\\\\'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function isLeadingSurrogate(code) {
 | 
			
		||||
    return code >= 0xD800 && code <= 0xDBFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isTrailingSurrogate(code) {
 | 
			
		||||
    return code >= 0xDC00 && code <= 0xDFFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isReadableStream(value) {
 | 
			
		||||
    return (
 | 
			
		||||
        typeof value.pipe === 'function' &&
 | 
			
		||||
        typeof value._read === 'function' &&
 | 
			
		||||
        typeof value._readableState === 'object' && value._readableState !== null
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function replaceValue(holder, key, value, replacer) {
 | 
			
		||||
    if (value && typeof value.toJSON === 'function') {
 | 
			
		||||
        value = value.toJSON();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (replacer !== null) {
 | 
			
		||||
        value = replacer.call(holder, String(key), value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    switch (typeof value) {
 | 
			
		||||
        case 'function':
 | 
			
		||||
        case 'symbol':
 | 
			
		||||
            value = undefined;
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case 'object':
 | 
			
		||||
            if (value !== null) {
 | 
			
		||||
                const cls = value.constructor;
 | 
			
		||||
                if (cls === String || cls === Number || cls === Boolean) {
 | 
			
		||||
                    value = value.valueOf();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getTypeNative(value) {
 | 
			
		||||
    if (value === null || typeof value !== 'object') {
 | 
			
		||||
        return PrimitiveType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(value)) {
 | 
			
		||||
        return ArrayType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ObjectType;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getTypeAsync(value) {
 | 
			
		||||
    if (value === null || typeof value !== 'object') {
 | 
			
		||||
        return PrimitiveType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof value.then === 'function') {
 | 
			
		||||
        return PromiseType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (isReadableStream(value)) {
 | 
			
		||||
        return value._readableState.objectMode ? ReadableObjectType : ReadableStringType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(value)) {
 | 
			
		||||
        return ArrayType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ObjectType;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function normalizeReplacer(replacer) {
 | 
			
		||||
    if (typeof replacer === 'function') {
 | 
			
		||||
        return replacer;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(replacer)) {
 | 
			
		||||
        const allowlist = new Set(replacer
 | 
			
		||||
            .map(item => {
 | 
			
		||||
                const cls = item && item.constructor;
 | 
			
		||||
                return cls === String || cls === Number ? String(item) : null;
 | 
			
		||||
            })
 | 
			
		||||
            .filter(item => typeof item === 'string')
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return [...allowlist];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function normalizeSpace(space) {
 | 
			
		||||
    if (typeof space === 'number') {
 | 
			
		||||
        if (!Number.isFinite(space) || space < 1) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ' '.repeat(Math.min(space, 10));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof space === 'string') {
 | 
			
		||||
        return space.slice(0, 10) || false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    escapableCharCodeSubstitution,
 | 
			
		||||
    isLeadingSurrogate,
 | 
			
		||||
    isTrailingSurrogate,
 | 
			
		||||
    type: {
 | 
			
		||||
        PRIMITIVE: PrimitiveType,
 | 
			
		||||
        PROMISE: PromiseType,
 | 
			
		||||
        ARRAY: ArrayType,
 | 
			
		||||
        OBJECT: ObjectType,
 | 
			
		||||
        STRING_STREAM: ReadableStringType,
 | 
			
		||||
        OBJECT_STREAM: ReadableObjectType
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    isReadableStream,
 | 
			
		||||
    replaceValue,
 | 
			
		||||
    getTypeNative,
 | 
			
		||||
    getTypeAsync,
 | 
			
		||||
    normalizeReplacer,
 | 
			
		||||
    normalizeSpace
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@discoveryjs/json-ext/src/version.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@discoveryjs/json-ext/src/version.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
module.exports = require('../package.json').version;
 | 
			
		||||
							
								
								
									
										21
									
								
								node_modules/@eslint-community/eslint-utils/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								node_modules/@eslint-community/eslint-utils/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2018 Toru Nagashima
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
							
								
								
									
										37
									
								
								node_modules/@eslint-community/eslint-utils/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								node_modules/@eslint-community/eslint-utils/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
# @eslint-community/eslint-utils
 | 
			
		||||
 | 
			
		||||
[](https://www.npmjs.com/package/@eslint-community/eslint-utils)
 | 
			
		||||
[](http://www.npmtrends.com/@eslint-community/eslint-utils)
 | 
			
		||||
[](https://github.com/eslint-community/eslint-utils/actions)
 | 
			
		||||
[](https://codecov.io/gh/eslint-community/eslint-utils)
 | 
			
		||||
 | 
			
		||||
## 🏁 Goal
 | 
			
		||||
 | 
			
		||||
This package provides utility functions and classes for make ESLint custom rules.
 | 
			
		||||
 | 
			
		||||
For examples:
 | 
			
		||||
 | 
			
		||||
-   [`getStaticValue`](https://eslint-community.github.io/eslint-utils/api/ast-utils.html#getstaticvalue) evaluates static value on AST.
 | 
			
		||||
-   [`ReferenceTracker`](https://eslint-community.github.io/eslint-utils/api/scope-utils.html#referencetracker-class) checks the members of modules/globals as handling assignments and destructuring.
 | 
			
		||||
 | 
			
		||||
## 📖 Usage
 | 
			
		||||
 | 
			
		||||
See [documentation](https://eslint-community.github.io/eslint-utils).
 | 
			
		||||
 | 
			
		||||
## 📰 Changelog
 | 
			
		||||
 | 
			
		||||
See [releases](https://github.com/eslint-community/eslint-utils/releases).
 | 
			
		||||
 | 
			
		||||
## ❤️ Contributing
 | 
			
		||||
 | 
			
		||||
Welcome contributing!
 | 
			
		||||
 | 
			
		||||
Please use GitHub's Issues/PRs.
 | 
			
		||||
 | 
			
		||||
### Development Tools
 | 
			
		||||
 | 
			
		||||
-   `npm test` runs tests and measures coverage.
 | 
			
		||||
-   `npm run clean` removes the coverage result of `npm test` command.
 | 
			
		||||
-   `npm run coverage` shows the coverage result of the last `npm test` command.
 | 
			
		||||
-   `npm run lint` runs ESLint.
 | 
			
		||||
-   `npm run watch` runs tests on each file change.
 | 
			
		||||
							
								
								
									
										2068
									
								
								node_modules/@eslint-community/eslint-utils/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2068
									
								
								node_modules/@eslint-community/eslint-utils/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint-community/eslint-utils/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint-community/eslint-utils/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2027
									
								
								node_modules/@eslint-community/eslint-utils/index.mjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2027
									
								
								node_modules/@eslint-community/eslint-utils/index.mjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint-community/eslint-utils/index.mjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint-community/eslint-utils/index.mjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										201
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,201 @@
 | 
			
		|||
                                 Apache License
 | 
			
		||||
                           Version 2.0, January 2004
 | 
			
		||||
                        http://www.apache.org/licenses/
 | 
			
		||||
 | 
			
		||||
   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
			
		||||
 | 
			
		||||
   1. Definitions.
 | 
			
		||||
 | 
			
		||||
      "License" shall mean the terms and conditions for use, reproduction,
 | 
			
		||||
      and distribution as defined by Sections 1 through 9 of this document.
 | 
			
		||||
 | 
			
		||||
      "Licensor" shall mean the copyright owner or entity authorized by
 | 
			
		||||
      the copyright owner that is granting the License.
 | 
			
		||||
 | 
			
		||||
      "Legal Entity" shall mean the union of the acting entity and all
 | 
			
		||||
      other entities that control, are controlled by, or are under common
 | 
			
		||||
      control with that entity. For the purposes of this definition,
 | 
			
		||||
      "control" means (i) the power, direct or indirect, to cause the
 | 
			
		||||
      direction or management of such entity, whether by contract or
 | 
			
		||||
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
			
		||||
      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
			
		||||
 | 
			
		||||
      "You" (or "Your") shall mean an individual or Legal Entity
 | 
			
		||||
      exercising permissions granted by this License.
 | 
			
		||||
 | 
			
		||||
      "Source" form shall mean the preferred form for making modifications,
 | 
			
		||||
      including but not limited to software source code, documentation
 | 
			
		||||
      source, and configuration files.
 | 
			
		||||
 | 
			
		||||
      "Object" form shall mean any form resulting from mechanical
 | 
			
		||||
      transformation or translation of a Source form, including but
 | 
			
		||||
      not limited to compiled object code, generated documentation,
 | 
			
		||||
      and conversions to other media types.
 | 
			
		||||
 | 
			
		||||
      "Work" shall mean the work of authorship, whether in Source or
 | 
			
		||||
      Object form, made available under the License, as indicated by a
 | 
			
		||||
      copyright notice that is included in or attached to the work
 | 
			
		||||
      (an example is provided in the Appendix below).
 | 
			
		||||
 | 
			
		||||
      "Derivative Works" shall mean any work, whether in Source or Object
 | 
			
		||||
      form, that is based on (or derived from) the Work and for which the
 | 
			
		||||
      editorial revisions, annotations, elaborations, or other modifications
 | 
			
		||||
      represent, as a whole, an original work of authorship. For the purposes
 | 
			
		||||
      of this License, Derivative Works shall not include works that remain
 | 
			
		||||
      separable from, or merely link (or bind by name) to the interfaces of,
 | 
			
		||||
      the Work and Derivative Works thereof.
 | 
			
		||||
 | 
			
		||||
      "Contribution" shall mean any work of authorship, including
 | 
			
		||||
      the original version of the Work and any modifications or additions
 | 
			
		||||
      to that Work or Derivative Works thereof, that is intentionally
 | 
			
		||||
      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
			
		||||
      or by an individual or Legal Entity authorized to submit on behalf of
 | 
			
		||||
      the copyright owner. For the purposes of this definition, "submitted"
 | 
			
		||||
      means any form of electronic, verbal, or written communication sent
 | 
			
		||||
      to the Licensor or its representatives, including but not limited to
 | 
			
		||||
      communication on electronic mailing lists, source code control systems,
 | 
			
		||||
      and issue tracking systems that are managed by, or on behalf of, the
 | 
			
		||||
      Licensor for the purpose of discussing and improving the Work, but
 | 
			
		||||
      excluding communication that is conspicuously marked or otherwise
 | 
			
		||||
      designated in writing by the copyright owner as "Not a Contribution."
 | 
			
		||||
 | 
			
		||||
      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
			
		||||
      on behalf of whom a Contribution has been received by Licensor and
 | 
			
		||||
      subsequently incorporated within the Work.
 | 
			
		||||
 | 
			
		||||
   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      copyright license to reproduce, prepare Derivative Works of,
 | 
			
		||||
      publicly display, publicly perform, sublicense, and distribute the
 | 
			
		||||
      Work and such Derivative Works in Source or Object form.
 | 
			
		||||
 | 
			
		||||
   3. Grant of Patent License. Subject to the terms and conditions of
 | 
			
		||||
      this License, each Contributor hereby grants to You a perpetual,
 | 
			
		||||
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
			
		||||
      (except as stated in this section) patent license to make, have made,
 | 
			
		||||
      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
			
		||||
      where such license applies only to those patent claims licensable
 | 
			
		||||
      by such Contributor that are necessarily infringed by their
 | 
			
		||||
      Contribution(s) alone or by combination of their Contribution(s)
 | 
			
		||||
      with the Work to which such Contribution(s) was submitted. If You
 | 
			
		||||
      institute patent litigation against any entity (including a
 | 
			
		||||
      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
			
		||||
      or a Contribution incorporated within the Work constitutes direct
 | 
			
		||||
      or contributory patent infringement, then any patent licenses
 | 
			
		||||
      granted to You under this License for that Work shall terminate
 | 
			
		||||
      as of the date such litigation is filed.
 | 
			
		||||
 | 
			
		||||
   4. Redistribution. You may reproduce and distribute copies of the
 | 
			
		||||
      Work or Derivative Works thereof in any medium, with or without
 | 
			
		||||
      modifications, and in Source or Object form, provided that You
 | 
			
		||||
      meet the following conditions:
 | 
			
		||||
 | 
			
		||||
      (a) You must give any other recipients of the Work or
 | 
			
		||||
          Derivative Works a copy of this License; and
 | 
			
		||||
 | 
			
		||||
      (b) You must cause any modified files to carry prominent notices
 | 
			
		||||
          stating that You changed the files; and
 | 
			
		||||
 | 
			
		||||
      (c) You must retain, in the Source form of any Derivative Works
 | 
			
		||||
          that You distribute, all copyright, patent, trademark, and
 | 
			
		||||
          attribution notices from the Source form of the Work,
 | 
			
		||||
          excluding those notices that do not pertain to any part of
 | 
			
		||||
          the Derivative Works; and
 | 
			
		||||
 | 
			
		||||
      (d) If the Work includes a "NOTICE" text file as part of its
 | 
			
		||||
          distribution, then any Derivative Works that You distribute must
 | 
			
		||||
          include a readable copy of the attribution notices contained
 | 
			
		||||
          within such NOTICE file, excluding those notices that do not
 | 
			
		||||
          pertain to any part of the Derivative Works, in at least one
 | 
			
		||||
          of the following places: within a NOTICE text file distributed
 | 
			
		||||
          as part of the Derivative Works; within the Source form or
 | 
			
		||||
          documentation, if provided along with the Derivative Works; or,
 | 
			
		||||
          within a display generated by the Derivative Works, if and
 | 
			
		||||
          wherever such third-party notices normally appear. The contents
 | 
			
		||||
          of the NOTICE file are for informational purposes only and
 | 
			
		||||
          do not modify the License. You may add Your own attribution
 | 
			
		||||
          notices within Derivative Works that You distribute, alongside
 | 
			
		||||
          or as an addendum to the NOTICE text from the Work, provided
 | 
			
		||||
          that such additional attribution notices cannot be construed
 | 
			
		||||
          as modifying the License.
 | 
			
		||||
 | 
			
		||||
      You may add Your own copyright statement to Your modifications and
 | 
			
		||||
      may provide additional or different license terms and conditions
 | 
			
		||||
      for use, reproduction, or distribution of Your modifications, or
 | 
			
		||||
      for any such Derivative Works as a whole, provided Your use,
 | 
			
		||||
      reproduction, and distribution of the Work otherwise complies with
 | 
			
		||||
      the conditions stated in this License.
 | 
			
		||||
 | 
			
		||||
   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
			
		||||
      any Contribution intentionally submitted for inclusion in the Work
 | 
			
		||||
      by You to the Licensor shall be under the terms and conditions of
 | 
			
		||||
      this License, without any additional terms or conditions.
 | 
			
		||||
      Notwithstanding the above, nothing herein shall supersede or modify
 | 
			
		||||
      the terms of any separate license agreement you may have executed
 | 
			
		||||
      with Licensor regarding such Contributions.
 | 
			
		||||
 | 
			
		||||
   6. Trademarks. This License does not grant permission to use the trade
 | 
			
		||||
      names, trademarks, service marks, or product names of the Licensor,
 | 
			
		||||
      except as required for reasonable and customary use in describing the
 | 
			
		||||
      origin of the Work and reproducing the content of the NOTICE file.
 | 
			
		||||
 | 
			
		||||
   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
			
		||||
      agreed to in writing, Licensor provides the Work (and each
 | 
			
		||||
      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
			
		||||
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
			
		||||
      implied, including, without limitation, any warranties or conditions
 | 
			
		||||
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
			
		||||
      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
			
		||||
      appropriateness of using or redistributing the Work and assume any
 | 
			
		||||
      risks associated with Your exercise of permissions under this License.
 | 
			
		||||
 | 
			
		||||
   8. Limitation of Liability. In no event and under no legal theory,
 | 
			
		||||
      whether in tort (including negligence), contract, or otherwise,
 | 
			
		||||
      unless required by applicable law (such as deliberate and grossly
 | 
			
		||||
      negligent acts) or agreed to in writing, shall any Contributor be
 | 
			
		||||
      liable to You for damages, including any direct, indirect, special,
 | 
			
		||||
      incidental, or consequential damages of any character arising as a
 | 
			
		||||
      result of this License or out of the use or inability to use the
 | 
			
		||||
      Work (including but not limited to damages for loss of goodwill,
 | 
			
		||||
      work stoppage, computer failure or malfunction, or any and all
 | 
			
		||||
      other commercial damages or losses), even if such Contributor
 | 
			
		||||
      has been advised of the possibility of such damages.
 | 
			
		||||
 | 
			
		||||
   9. Accepting Warranty or Additional Liability. While redistributing
 | 
			
		||||
      the Work or Derivative Works thereof, You may choose to offer,
 | 
			
		||||
      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
			
		||||
      or other liability obligations and/or rights consistent with this
 | 
			
		||||
      License. However, in accepting such obligations, You may act only
 | 
			
		||||
      on Your own behalf and on Your sole responsibility, not on behalf
 | 
			
		||||
      of any other Contributor, and only if You agree to indemnify,
 | 
			
		||||
      defend, and hold each Contributor harmless for any liability
 | 
			
		||||
      incurred by, or claims asserted against, such Contributor by reason
 | 
			
		||||
      of your accepting any such warranty or additional liability.
 | 
			
		||||
 | 
			
		||||
   END OF TERMS AND CONDITIONS
 | 
			
		||||
 | 
			
		||||
   APPENDIX: How to apply the Apache License to your work.
 | 
			
		||||
 | 
			
		||||
      To apply the Apache License to your work, attach the following
 | 
			
		||||
      boilerplate notice, with the fields enclosed by brackets "{}"
 | 
			
		||||
      replaced with your own identifying information. (Don't include
 | 
			
		||||
      the brackets!)  The text should be enclosed in the appropriate
 | 
			
		||||
      comment syntax for the file format. We also recommend that a
 | 
			
		||||
      file or class name and description of purpose be included on the
 | 
			
		||||
      same "printed page" as the copyright notice for easier
 | 
			
		||||
      identification within third-party archives.
 | 
			
		||||
 | 
			
		||||
   Copyright contributors
 | 
			
		||||
 | 
			
		||||
   Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
   you may not use this file except in compliance with the License.
 | 
			
		||||
   You may obtain a copy of the License at
 | 
			
		||||
 | 
			
		||||
       http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
   distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
   See the License for the specific language governing permissions and
 | 
			
		||||
   limitations under the License.
 | 
			
		||||
							
								
								
									
										105
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,105 @@
 | 
			
		|||
# eslint-visitor-keys
 | 
			
		||||
 | 
			
		||||
[](https://www.npmjs.com/package/eslint-visitor-keys)
 | 
			
		||||
[](http://www.npmtrends.com/eslint-visitor-keys)
 | 
			
		||||
[](https://github.com/eslint/eslint-visitor-keys/actions)
 | 
			
		||||
 | 
			
		||||
Constants and utilities about visitor keys to traverse AST.
 | 
			
		||||
 | 
			
		||||
## 💿 Installation
 | 
			
		||||
 | 
			
		||||
Use [npm] to install.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
$ npm install eslint-visitor-keys
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Requirements
 | 
			
		||||
 | 
			
		||||
- [Node.js] `^12.22.0`, `^14.17.0`, or `>=16.0.0`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 📖 Usage
 | 
			
		||||
 | 
			
		||||
To use in an ESM file:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import * as evk from "eslint-visitor-keys"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To use in a CommonJS file:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const evk = require("eslint-visitor-keys")
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### evk.KEYS
 | 
			
		||||
 | 
			
		||||
> type: `{ [type: string]: string[] | undefined }`
 | 
			
		||||
 | 
			
		||||
Visitor keys. This keys are frozen.
 | 
			
		||||
 | 
			
		||||
This is an object. Keys are the type of [ESTree] nodes. Their values are an array of property names which have child nodes.
 | 
			
		||||
 | 
			
		||||
For example:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
console.log(evk.KEYS.AssignmentExpression) // → ["left", "right"]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### evk.getKeys(node)
 | 
			
		||||
 | 
			
		||||
> type: `(node: object) => string[]`
 | 
			
		||||
 | 
			
		||||
Get the visitor keys of a given AST node.
 | 
			
		||||
 | 
			
		||||
This is similar to `Object.keys(node)` of ES Standard, but some keys are excluded: `parent`, `leadingComments`, `trailingComments`, and names which start with `_`.
 | 
			
		||||
 | 
			
		||||
This will be used to traverse unknown nodes.
 | 
			
		||||
 | 
			
		||||
For example:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const node = {
 | 
			
		||||
    type: "AssignmentExpression",
 | 
			
		||||
    left: { type: "Identifier", name: "foo" },
 | 
			
		||||
    right: { type: "Literal", value: 0 }
 | 
			
		||||
}
 | 
			
		||||
console.log(evk.getKeys(node)) // → ["type", "left", "right"]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### evk.unionWith(additionalKeys)
 | 
			
		||||
 | 
			
		||||
> type: `(additionalKeys: object) => { [type: string]: string[] | undefined }`
 | 
			
		||||
 | 
			
		||||
Make the union set with `evk.KEYS` and the given keys.
 | 
			
		||||
 | 
			
		||||
- The order of keys is, `additionalKeys` is at first, then `evk.KEYS` is concatenated after that.
 | 
			
		||||
- It removes duplicated keys as keeping the first one.
 | 
			
		||||
 | 
			
		||||
For example:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
console.log(evk.unionWith({
 | 
			
		||||
    MethodDefinition: ["decorators"]
 | 
			
		||||
})) // → { ..., MethodDefinition: ["decorators", "key", "value"], ... }
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## 📰 Change log
 | 
			
		||||
 | 
			
		||||
See [GitHub releases](https://github.com/eslint/eslint-visitor-keys/releases).
 | 
			
		||||
 | 
			
		||||
## 🍻 Contributing
 | 
			
		||||
 | 
			
		||||
Welcome. See [ESLint contribution guidelines](https://eslint.org/docs/developer-guide/contributing/).
 | 
			
		||||
 | 
			
		||||
### Development commands
 | 
			
		||||
 | 
			
		||||
- `npm test` runs tests and measures code coverage.
 | 
			
		||||
- `npm run lint` checks source codes with ESLint.
 | 
			
		||||
- `npm run test:open-coverage` opens the code coverage report of the previous test with your default browser.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[npm]: https://www.npmjs.com/
 | 
			
		||||
[Node.js]: https://nodejs.org/
 | 
			
		||||
[ESTree]: https://github.com/estree/estree
 | 
			
		||||
							
								
								
									
										384
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/eslint-visitor-keys.cjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/eslint-visitor-keys.cjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,384 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, '__esModule', { value: true });
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @type {VisitorKeys}
 | 
			
		||||
 */
 | 
			
		||||
const KEYS = {
 | 
			
		||||
    ArrayExpression: [
 | 
			
		||||
        "elements"
 | 
			
		||||
    ],
 | 
			
		||||
    ArrayPattern: [
 | 
			
		||||
        "elements"
 | 
			
		||||
    ],
 | 
			
		||||
    ArrowFunctionExpression: [
 | 
			
		||||
        "params",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    AssignmentExpression: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    AssignmentPattern: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    AwaitExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    BinaryExpression: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    BlockStatement: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    BreakStatement: [
 | 
			
		||||
        "label"
 | 
			
		||||
    ],
 | 
			
		||||
    CallExpression: [
 | 
			
		||||
        "callee",
 | 
			
		||||
        "arguments"
 | 
			
		||||
    ],
 | 
			
		||||
    CatchClause: [
 | 
			
		||||
        "param",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ChainExpression: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    ClassBody: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ClassDeclaration: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "superClass",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ClassExpression: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "superClass",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ConditionalExpression: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "consequent",
 | 
			
		||||
        "alternate"
 | 
			
		||||
    ],
 | 
			
		||||
    ContinueStatement: [
 | 
			
		||||
        "label"
 | 
			
		||||
    ],
 | 
			
		||||
    DebuggerStatement: [],
 | 
			
		||||
    DoWhileStatement: [
 | 
			
		||||
        "body",
 | 
			
		||||
        "test"
 | 
			
		||||
    ],
 | 
			
		||||
    EmptyStatement: [],
 | 
			
		||||
    ExperimentalRestProperty: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    ExperimentalSpreadProperty: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportAllDeclaration: [
 | 
			
		||||
        "exported",
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportDefaultDeclaration: [
 | 
			
		||||
        "declaration"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportNamedDeclaration: [
 | 
			
		||||
        "declaration",
 | 
			
		||||
        "specifiers",
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportSpecifier: [
 | 
			
		||||
        "exported",
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    ExpressionStatement: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    ForInStatement: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ForOfStatement: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ForStatement: [
 | 
			
		||||
        "init",
 | 
			
		||||
        "test",
 | 
			
		||||
        "update",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    FunctionDeclaration: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "params",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    FunctionExpression: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "params",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Identifier: [],
 | 
			
		||||
    IfStatement: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "consequent",
 | 
			
		||||
        "alternate"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportDeclaration: [
 | 
			
		||||
        "specifiers",
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportDefaultSpecifier: [
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportExpression: [
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportNamespaceSpecifier: [
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportSpecifier: [
 | 
			
		||||
        "imported",
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXAttribute: [
 | 
			
		||||
        "name",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXClosingElement: [
 | 
			
		||||
        "name"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXClosingFragment: [],
 | 
			
		||||
    JSXElement: [
 | 
			
		||||
        "openingElement",
 | 
			
		||||
        "children",
 | 
			
		||||
        "closingElement"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXEmptyExpression: [],
 | 
			
		||||
    JSXExpressionContainer: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXFragment: [
 | 
			
		||||
        "openingFragment",
 | 
			
		||||
        "children",
 | 
			
		||||
        "closingFragment"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXIdentifier: [],
 | 
			
		||||
    JSXMemberExpression: [
 | 
			
		||||
        "object",
 | 
			
		||||
        "property"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXNamespacedName: [
 | 
			
		||||
        "namespace",
 | 
			
		||||
        "name"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXOpeningElement: [
 | 
			
		||||
        "name",
 | 
			
		||||
        "attributes"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXOpeningFragment: [],
 | 
			
		||||
    JSXSpreadAttribute: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXSpreadChild: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXText: [],
 | 
			
		||||
    LabeledStatement: [
 | 
			
		||||
        "label",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Literal: [],
 | 
			
		||||
    LogicalExpression: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    MemberExpression: [
 | 
			
		||||
        "object",
 | 
			
		||||
        "property"
 | 
			
		||||
    ],
 | 
			
		||||
    MetaProperty: [
 | 
			
		||||
        "meta",
 | 
			
		||||
        "property"
 | 
			
		||||
    ],
 | 
			
		||||
    MethodDefinition: [
 | 
			
		||||
        "key",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    NewExpression: [
 | 
			
		||||
        "callee",
 | 
			
		||||
        "arguments"
 | 
			
		||||
    ],
 | 
			
		||||
    ObjectExpression: [
 | 
			
		||||
        "properties"
 | 
			
		||||
    ],
 | 
			
		||||
    ObjectPattern: [
 | 
			
		||||
        "properties"
 | 
			
		||||
    ],
 | 
			
		||||
    PrivateIdentifier: [],
 | 
			
		||||
    Program: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Property: [
 | 
			
		||||
        "key",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    PropertyDefinition: [
 | 
			
		||||
        "key",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    RestElement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    ReturnStatement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    SequenceExpression: [
 | 
			
		||||
        "expressions"
 | 
			
		||||
    ],
 | 
			
		||||
    SpreadElement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    StaticBlock: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Super: [],
 | 
			
		||||
    SwitchCase: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "consequent"
 | 
			
		||||
    ],
 | 
			
		||||
    SwitchStatement: [
 | 
			
		||||
        "discriminant",
 | 
			
		||||
        "cases"
 | 
			
		||||
    ],
 | 
			
		||||
    TaggedTemplateExpression: [
 | 
			
		||||
        "tag",
 | 
			
		||||
        "quasi"
 | 
			
		||||
    ],
 | 
			
		||||
    TemplateElement: [],
 | 
			
		||||
    TemplateLiteral: [
 | 
			
		||||
        "quasis",
 | 
			
		||||
        "expressions"
 | 
			
		||||
    ],
 | 
			
		||||
    ThisExpression: [],
 | 
			
		||||
    ThrowStatement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    TryStatement: [
 | 
			
		||||
        "block",
 | 
			
		||||
        "handler",
 | 
			
		||||
        "finalizer"
 | 
			
		||||
    ],
 | 
			
		||||
    UnaryExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    UpdateExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    VariableDeclaration: [
 | 
			
		||||
        "declarations"
 | 
			
		||||
    ],
 | 
			
		||||
    VariableDeclarator: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "init"
 | 
			
		||||
    ],
 | 
			
		||||
    WhileStatement: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    WithStatement: [
 | 
			
		||||
        "object",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    YieldExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Types.
 | 
			
		||||
const NODE_TYPES = Object.keys(KEYS);
 | 
			
		||||
 | 
			
		||||
// Freeze the keys.
 | 
			
		||||
for (const type of NODE_TYPES) {
 | 
			
		||||
    Object.freeze(KEYS[type]);
 | 
			
		||||
}
 | 
			
		||||
Object.freeze(KEYS);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 * See LICENSE file in root directory for full license.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {import('./visitor-keys.js').VisitorKeys} VisitorKeys
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// List to ignore keys.
 | 
			
		||||
const KEY_BLACKLIST = new Set([
 | 
			
		||||
    "parent",
 | 
			
		||||
    "leadingComments",
 | 
			
		||||
    "trailingComments"
 | 
			
		||||
]);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check whether a given key should be used or not.
 | 
			
		||||
 * @param {string} key The key to check.
 | 
			
		||||
 * @returns {boolean} `true` if the key should be used.
 | 
			
		||||
 */
 | 
			
		||||
function filterKey(key) {
 | 
			
		||||
    return !KEY_BLACKLIST.has(key) && key[0] !== "_";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get visitor keys of a given node.
 | 
			
		||||
 * @param {object} node The AST node to get keys.
 | 
			
		||||
 * @returns {readonly string[]} Visitor keys of the node.
 | 
			
		||||
 */
 | 
			
		||||
function getKeys(node) {
 | 
			
		||||
    return Object.keys(node).filter(filterKey);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Disable valid-jsdoc rule because it reports syntax error on the type of @returns.
 | 
			
		||||
// eslint-disable-next-line valid-jsdoc
 | 
			
		||||
/**
 | 
			
		||||
 * Make the union set with `KEYS` and given keys.
 | 
			
		||||
 * @param {VisitorKeys} additionalKeys The additional keys.
 | 
			
		||||
 * @returns {VisitorKeys} The union set.
 | 
			
		||||
 */
 | 
			
		||||
function unionWith(additionalKeys) {
 | 
			
		||||
    const retv = /** @type {{
 | 
			
		||||
        [type: string]: ReadonlyArray<string>
 | 
			
		||||
    }} */ (Object.assign({}, KEYS));
 | 
			
		||||
 | 
			
		||||
    for (const type of Object.keys(additionalKeys)) {
 | 
			
		||||
        if (Object.prototype.hasOwnProperty.call(retv, type)) {
 | 
			
		||||
            const keys = new Set(additionalKeys[type]);
 | 
			
		||||
 | 
			
		||||
            for (const key of retv[type]) {
 | 
			
		||||
                keys.add(key);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            retv[type] = Object.freeze(Array.from(keys));
 | 
			
		||||
        } else {
 | 
			
		||||
            retv[type] = Object.freeze(Array.from(additionalKeys[type]));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Object.freeze(retv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exports.KEYS = KEYS;
 | 
			
		||||
exports.getKeys = getKeys;
 | 
			
		||||
exports.unionWith = unionWith;
 | 
			
		||||
							
								
								
									
										27
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/eslint-visitor-keys.d.cts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/eslint-visitor-keys.d.cts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
type VisitorKeys$1 = {
 | 
			
		||||
    readonly [type: string]: readonly string[];
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * @type {VisitorKeys}
 | 
			
		||||
 */
 | 
			
		||||
declare const KEYS: VisitorKeys$1;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get visitor keys of a given node.
 | 
			
		||||
 * @param {object} node The AST node to get keys.
 | 
			
		||||
 * @returns {readonly string[]} Visitor keys of the node.
 | 
			
		||||
 */
 | 
			
		||||
declare function getKeys(node: object): readonly string[];
 | 
			
		||||
/**
 | 
			
		||||
 * Make the union set with `KEYS` and given keys.
 | 
			
		||||
 * @param {VisitorKeys} additionalKeys The additional keys.
 | 
			
		||||
 * @returns {VisitorKeys} The union set.
 | 
			
		||||
 */
 | 
			
		||||
declare function unionWith(additionalKeys: VisitorKeys): VisitorKeys;
 | 
			
		||||
 | 
			
		||||
type VisitorKeys = VisitorKeys$1;
 | 
			
		||||
 | 
			
		||||
export { KEYS, VisitorKeys, getKeys, unionWith };
 | 
			
		||||
							
								
								
									
										16
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
/**
 | 
			
		||||
 * Get visitor keys of a given node.
 | 
			
		||||
 * @param {object} node The AST node to get keys.
 | 
			
		||||
 * @returns {readonly string[]} Visitor keys of the node.
 | 
			
		||||
 */
 | 
			
		||||
export function getKeys(node: object): readonly string[];
 | 
			
		||||
/**
 | 
			
		||||
 * Make the union set with `KEYS` and given keys.
 | 
			
		||||
 * @param {VisitorKeys} additionalKeys The additional keys.
 | 
			
		||||
 * @returns {VisitorKeys} The union set.
 | 
			
		||||
 */
 | 
			
		||||
export function unionWith(additionalKeys: VisitorKeys): VisitorKeys;
 | 
			
		||||
export { KEYS };
 | 
			
		||||
export type VisitorKeys = import('./visitor-keys.js').VisitorKeys;
 | 
			
		||||
import KEYS from "./visitor-keys.js";
 | 
			
		||||
//# sourceMappingURL=index.d.ts.map
 | 
			
		||||
							
								
								
									
										12
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/visitor-keys.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/dist/visitor-keys.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
export default KEYS;
 | 
			
		||||
export type VisitorKeys = {
 | 
			
		||||
    readonly [type: string]: readonly string[];
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * @type {VisitorKeys}
 | 
			
		||||
 */
 | 
			
		||||
declare const KEYS: VisitorKeys;
 | 
			
		||||
//# sourceMappingURL=visitor-keys.d.ts.map
 | 
			
		||||
							
								
								
									
										65
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 * See LICENSE file in root directory for full license.
 | 
			
		||||
 */
 | 
			
		||||
import KEYS from "./visitor-keys.js";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {import('./visitor-keys.js').VisitorKeys} VisitorKeys
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// List to ignore keys.
 | 
			
		||||
const KEY_BLACKLIST = new Set([
 | 
			
		||||
    "parent",
 | 
			
		||||
    "leadingComments",
 | 
			
		||||
    "trailingComments"
 | 
			
		||||
]);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check whether a given key should be used or not.
 | 
			
		||||
 * @param {string} key The key to check.
 | 
			
		||||
 * @returns {boolean} `true` if the key should be used.
 | 
			
		||||
 */
 | 
			
		||||
function filterKey(key) {
 | 
			
		||||
    return !KEY_BLACKLIST.has(key) && key[0] !== "_";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get visitor keys of a given node.
 | 
			
		||||
 * @param {object} node The AST node to get keys.
 | 
			
		||||
 * @returns {readonly string[]} Visitor keys of the node.
 | 
			
		||||
 */
 | 
			
		||||
export function getKeys(node) {
 | 
			
		||||
    return Object.keys(node).filter(filterKey);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Disable valid-jsdoc rule because it reports syntax error on the type of @returns.
 | 
			
		||||
// eslint-disable-next-line valid-jsdoc
 | 
			
		||||
/**
 | 
			
		||||
 * Make the union set with `KEYS` and given keys.
 | 
			
		||||
 * @param {VisitorKeys} additionalKeys The additional keys.
 | 
			
		||||
 * @returns {VisitorKeys} The union set.
 | 
			
		||||
 */
 | 
			
		||||
export function unionWith(additionalKeys) {
 | 
			
		||||
    const retv = /** @type {{
 | 
			
		||||
        [type: string]: ReadonlyArray<string>
 | 
			
		||||
    }} */ (Object.assign({}, KEYS));
 | 
			
		||||
 | 
			
		||||
    for (const type of Object.keys(additionalKeys)) {
 | 
			
		||||
        if (Object.prototype.hasOwnProperty.call(retv, type)) {
 | 
			
		||||
            const keys = new Set(additionalKeys[type]);
 | 
			
		||||
 | 
			
		||||
            for (const key of retv[type]) {
 | 
			
		||||
                keys.add(key);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            retv[type] = Object.freeze(Array.from(keys));
 | 
			
		||||
        } else {
 | 
			
		||||
            retv[type] = Object.freeze(Array.from(additionalKeys[type]));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Object.freeze(retv);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { KEYS };
 | 
			
		||||
							
								
								
									
										315
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/lib/visitor-keys.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										315
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/lib/visitor-keys.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,315 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @type {VisitorKeys}
 | 
			
		||||
 */
 | 
			
		||||
const KEYS = {
 | 
			
		||||
    ArrayExpression: [
 | 
			
		||||
        "elements"
 | 
			
		||||
    ],
 | 
			
		||||
    ArrayPattern: [
 | 
			
		||||
        "elements"
 | 
			
		||||
    ],
 | 
			
		||||
    ArrowFunctionExpression: [
 | 
			
		||||
        "params",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    AssignmentExpression: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    AssignmentPattern: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    AwaitExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    BinaryExpression: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    BlockStatement: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    BreakStatement: [
 | 
			
		||||
        "label"
 | 
			
		||||
    ],
 | 
			
		||||
    CallExpression: [
 | 
			
		||||
        "callee",
 | 
			
		||||
        "arguments"
 | 
			
		||||
    ],
 | 
			
		||||
    CatchClause: [
 | 
			
		||||
        "param",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ChainExpression: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    ClassBody: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ClassDeclaration: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "superClass",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ClassExpression: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "superClass",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ConditionalExpression: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "consequent",
 | 
			
		||||
        "alternate"
 | 
			
		||||
    ],
 | 
			
		||||
    ContinueStatement: [
 | 
			
		||||
        "label"
 | 
			
		||||
    ],
 | 
			
		||||
    DebuggerStatement: [],
 | 
			
		||||
    DoWhileStatement: [
 | 
			
		||||
        "body",
 | 
			
		||||
        "test"
 | 
			
		||||
    ],
 | 
			
		||||
    EmptyStatement: [],
 | 
			
		||||
    ExperimentalRestProperty: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    ExperimentalSpreadProperty: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportAllDeclaration: [
 | 
			
		||||
        "exported",
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportDefaultDeclaration: [
 | 
			
		||||
        "declaration"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportNamedDeclaration: [
 | 
			
		||||
        "declaration",
 | 
			
		||||
        "specifiers",
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ExportSpecifier: [
 | 
			
		||||
        "exported",
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    ExpressionStatement: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    ForInStatement: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ForOfStatement: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    ForStatement: [
 | 
			
		||||
        "init",
 | 
			
		||||
        "test",
 | 
			
		||||
        "update",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    FunctionDeclaration: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "params",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    FunctionExpression: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "params",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Identifier: [],
 | 
			
		||||
    IfStatement: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "consequent",
 | 
			
		||||
        "alternate"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportDeclaration: [
 | 
			
		||||
        "specifiers",
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportDefaultSpecifier: [
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportExpression: [
 | 
			
		||||
        "source"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportNamespaceSpecifier: [
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    ImportSpecifier: [
 | 
			
		||||
        "imported",
 | 
			
		||||
        "local"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXAttribute: [
 | 
			
		||||
        "name",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXClosingElement: [
 | 
			
		||||
        "name"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXClosingFragment: [],
 | 
			
		||||
    JSXElement: [
 | 
			
		||||
        "openingElement",
 | 
			
		||||
        "children",
 | 
			
		||||
        "closingElement"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXEmptyExpression: [],
 | 
			
		||||
    JSXExpressionContainer: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXFragment: [
 | 
			
		||||
        "openingFragment",
 | 
			
		||||
        "children",
 | 
			
		||||
        "closingFragment"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXIdentifier: [],
 | 
			
		||||
    JSXMemberExpression: [
 | 
			
		||||
        "object",
 | 
			
		||||
        "property"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXNamespacedName: [
 | 
			
		||||
        "namespace",
 | 
			
		||||
        "name"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXOpeningElement: [
 | 
			
		||||
        "name",
 | 
			
		||||
        "attributes"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXOpeningFragment: [],
 | 
			
		||||
    JSXSpreadAttribute: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXSpreadChild: [
 | 
			
		||||
        "expression"
 | 
			
		||||
    ],
 | 
			
		||||
    JSXText: [],
 | 
			
		||||
    LabeledStatement: [
 | 
			
		||||
        "label",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Literal: [],
 | 
			
		||||
    LogicalExpression: [
 | 
			
		||||
        "left",
 | 
			
		||||
        "right"
 | 
			
		||||
    ],
 | 
			
		||||
    MemberExpression: [
 | 
			
		||||
        "object",
 | 
			
		||||
        "property"
 | 
			
		||||
    ],
 | 
			
		||||
    MetaProperty: [
 | 
			
		||||
        "meta",
 | 
			
		||||
        "property"
 | 
			
		||||
    ],
 | 
			
		||||
    MethodDefinition: [
 | 
			
		||||
        "key",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    NewExpression: [
 | 
			
		||||
        "callee",
 | 
			
		||||
        "arguments"
 | 
			
		||||
    ],
 | 
			
		||||
    ObjectExpression: [
 | 
			
		||||
        "properties"
 | 
			
		||||
    ],
 | 
			
		||||
    ObjectPattern: [
 | 
			
		||||
        "properties"
 | 
			
		||||
    ],
 | 
			
		||||
    PrivateIdentifier: [],
 | 
			
		||||
    Program: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Property: [
 | 
			
		||||
        "key",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    PropertyDefinition: [
 | 
			
		||||
        "key",
 | 
			
		||||
        "value"
 | 
			
		||||
    ],
 | 
			
		||||
    RestElement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    ReturnStatement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    SequenceExpression: [
 | 
			
		||||
        "expressions"
 | 
			
		||||
    ],
 | 
			
		||||
    SpreadElement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    StaticBlock: [
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    Super: [],
 | 
			
		||||
    SwitchCase: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "consequent"
 | 
			
		||||
    ],
 | 
			
		||||
    SwitchStatement: [
 | 
			
		||||
        "discriminant",
 | 
			
		||||
        "cases"
 | 
			
		||||
    ],
 | 
			
		||||
    TaggedTemplateExpression: [
 | 
			
		||||
        "tag",
 | 
			
		||||
        "quasi"
 | 
			
		||||
    ],
 | 
			
		||||
    TemplateElement: [],
 | 
			
		||||
    TemplateLiteral: [
 | 
			
		||||
        "quasis",
 | 
			
		||||
        "expressions"
 | 
			
		||||
    ],
 | 
			
		||||
    ThisExpression: [],
 | 
			
		||||
    ThrowStatement: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    TryStatement: [
 | 
			
		||||
        "block",
 | 
			
		||||
        "handler",
 | 
			
		||||
        "finalizer"
 | 
			
		||||
    ],
 | 
			
		||||
    UnaryExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    UpdateExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ],
 | 
			
		||||
    VariableDeclaration: [
 | 
			
		||||
        "declarations"
 | 
			
		||||
    ],
 | 
			
		||||
    VariableDeclarator: [
 | 
			
		||||
        "id",
 | 
			
		||||
        "init"
 | 
			
		||||
    ],
 | 
			
		||||
    WhileStatement: [
 | 
			
		||||
        "test",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    WithStatement: [
 | 
			
		||||
        "object",
 | 
			
		||||
        "body"
 | 
			
		||||
    ],
 | 
			
		||||
    YieldExpression: [
 | 
			
		||||
        "argument"
 | 
			
		||||
    ]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Types.
 | 
			
		||||
const NODE_TYPES = Object.keys(KEYS);
 | 
			
		||||
 | 
			
		||||
// Freeze the keys.
 | 
			
		||||
for (const type of NODE_TYPES) {
 | 
			
		||||
    Object.freeze(KEYS[type]);
 | 
			
		||||
}
 | 
			
		||||
Object.freeze(KEYS);
 | 
			
		||||
 | 
			
		||||
export default KEYS;
 | 
			
		||||
							
								
								
									
										74
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,74 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "eslint-visitor-keys",
 | 
			
		||||
  "version": "3.4.3",
 | 
			
		||||
  "description": "Constants and utilities about visitor keys to traverse AST.",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "main": "dist/eslint-visitor-keys.cjs",
 | 
			
		||||
  "types": "./dist/index.d.ts",
 | 
			
		||||
  "exports": {
 | 
			
		||||
    ".": [
 | 
			
		||||
      {
 | 
			
		||||
        "import": "./lib/index.js",
 | 
			
		||||
        "require": "./dist/eslint-visitor-keys.cjs"
 | 
			
		||||
      },
 | 
			
		||||
      "./dist/eslint-visitor-keys.cjs"
 | 
			
		||||
    ],
 | 
			
		||||
    "./package.json": "./package.json"
 | 
			
		||||
  },
 | 
			
		||||
  "files": [
 | 
			
		||||
    "dist/index.d.ts",
 | 
			
		||||
    "dist/visitor-keys.d.ts",
 | 
			
		||||
    "dist/eslint-visitor-keys.cjs",
 | 
			
		||||
    "dist/eslint-visitor-keys.d.cts",
 | 
			
		||||
    "lib"
 | 
			
		||||
  ],
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/estree": "^0.0.51",
 | 
			
		||||
    "@types/estree-jsx": "^0.0.1",
 | 
			
		||||
    "@typescript-eslint/parser": "^5.14.0",
 | 
			
		||||
    "c8": "^7.11.0",
 | 
			
		||||
    "chai": "^4.3.6",
 | 
			
		||||
    "eslint": "^7.29.0",
 | 
			
		||||
    "eslint-config-eslint": "^7.0.0",
 | 
			
		||||
    "eslint-plugin-jsdoc": "^35.4.0",
 | 
			
		||||
    "eslint-plugin-node": "^11.1.0",
 | 
			
		||||
    "eslint-release": "^3.2.0",
 | 
			
		||||
    "esquery": "^1.4.0",
 | 
			
		||||
    "json-diff": "^0.7.3",
 | 
			
		||||
    "mocha": "^9.2.1",
 | 
			
		||||
    "opener": "^1.5.2",
 | 
			
		||||
    "rollup": "^2.70.0",
 | 
			
		||||
    "rollup-plugin-dts": "^4.2.3",
 | 
			
		||||
    "tsd": "^0.19.1",
 | 
			
		||||
    "typescript": "^4.6.2"
 | 
			
		||||
  },
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "build": "npm run build:cjs && npm run build:types",
 | 
			
		||||
    "build:cjs": "rollup -c",
 | 
			
		||||
    "build:debug": "npm run build:cjs -- -m && npm run build:types",
 | 
			
		||||
    "build:keys": "node tools/build-keys-from-ts",
 | 
			
		||||
    "build:types": "tsc",
 | 
			
		||||
    "lint": "eslint .",
 | 
			
		||||
    "prepare": "npm run build",
 | 
			
		||||
    "release:generate:latest": "eslint-generate-release",
 | 
			
		||||
    "release:generate:alpha": "eslint-generate-prerelease alpha",
 | 
			
		||||
    "release:generate:beta": "eslint-generate-prerelease beta",
 | 
			
		||||
    "release:generate:rc": "eslint-generate-prerelease rc",
 | 
			
		||||
    "release:publish": "eslint-publish-release",
 | 
			
		||||
    "test": "mocha tests/lib/**/*.cjs && c8 mocha tests/lib/**/*.js && npm run test:types",
 | 
			
		||||
    "test:open-coverage": "c8 report --reporter lcov && opener coverage/lcov-report/index.html",
 | 
			
		||||
    "test:types": "tsd"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": "eslint/eslint-visitor-keys",
 | 
			
		||||
  "funding": "https://opencollective.com/eslint",
 | 
			
		||||
  "keywords": [],
 | 
			
		||||
  "author": "Toru Nagashima (https://github.com/mysticatea)",
 | 
			
		||||
  "license": "Apache-2.0",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/eslint/eslint-visitor-keys/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/eslint/eslint-visitor-keys#readme"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								node_modules/@eslint-community/eslint-utils/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								node_modules/@eslint-community/eslint-utils/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
{
 | 
			
		||||
    "name": "@eslint-community/eslint-utils",
 | 
			
		||||
    "version": "4.4.0",
 | 
			
		||||
    "description": "Utilities for ESLint plugins.",
 | 
			
		||||
    "keywords": [
 | 
			
		||||
        "eslint"
 | 
			
		||||
    ],
 | 
			
		||||
    "homepage": "https://github.com/eslint-community/eslint-utils#readme",
 | 
			
		||||
    "bugs": {
 | 
			
		||||
        "url": "https://github.com/eslint-community/eslint-utils/issues"
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
        "url": "https://github.com/eslint-community/eslint-utils"
 | 
			
		||||
    },
 | 
			
		||||
    "license": "MIT",
 | 
			
		||||
    "author": "Toru Nagashima",
 | 
			
		||||
    "sideEffects": false,
 | 
			
		||||
    "exports": {
 | 
			
		||||
        ".": {
 | 
			
		||||
            "import": "./index.mjs",
 | 
			
		||||
            "require": "./index.js"
 | 
			
		||||
        },
 | 
			
		||||
        "./package.json": "./package.json"
 | 
			
		||||
    },
 | 
			
		||||
    "main": "index",
 | 
			
		||||
    "module": "index.mjs",
 | 
			
		||||
    "files": [
 | 
			
		||||
        "index.*"
 | 
			
		||||
    ],
 | 
			
		||||
    "scripts": {
 | 
			
		||||
        "prebuild": "npm run -s clean",
 | 
			
		||||
        "build": "rollup -c",
 | 
			
		||||
        "clean": "rimraf .nyc_output coverage index.*",
 | 
			
		||||
        "coverage": "opener ./coverage/lcov-report/index.html",
 | 
			
		||||
        "docs:build": "vitepress build docs",
 | 
			
		||||
        "docs:watch": "vitepress dev docs",
 | 
			
		||||
        "format": "npm run -s format:prettier -- --write",
 | 
			
		||||
        "format:prettier": "prettier .",
 | 
			
		||||
        "format:check": "npm run -s format:prettier -- --check",
 | 
			
		||||
        "lint": "eslint .",
 | 
			
		||||
        "test": "c8 mocha --reporter dot \"test/*.mjs\"",
 | 
			
		||||
        "preversion": "npm test && npm run -s build",
 | 
			
		||||
        "postversion": "git push && git push --tags",
 | 
			
		||||
        "prewatch": "npm run -s clean",
 | 
			
		||||
        "watch": "warun \"{src,test}/**/*.mjs\" -- npm run -s test:mocha"
 | 
			
		||||
    },
 | 
			
		||||
    "dependencies": {
 | 
			
		||||
        "eslint-visitor-keys": "^3.3.0"
 | 
			
		||||
    },
 | 
			
		||||
    "devDependencies": {
 | 
			
		||||
        "@eslint-community/eslint-plugin-mysticatea": "^15.2.0",
 | 
			
		||||
        "c8": "^7.12.0",
 | 
			
		||||
        "dot-prop": "^6.0.1",
 | 
			
		||||
        "eslint": "^8.28.0",
 | 
			
		||||
        "mocha": "^9.2.2",
 | 
			
		||||
        "npm-run-all": "^4.1.5",
 | 
			
		||||
        "opener": "^1.5.2",
 | 
			
		||||
        "prettier": "2.8.4",
 | 
			
		||||
        "rimraf": "^3.0.2",
 | 
			
		||||
        "rollup": "^2.79.1",
 | 
			
		||||
        "rollup-plugin-sourcemaps": "^0.6.3",
 | 
			
		||||
        "semver": "^7.3.8",
 | 
			
		||||
        "vitepress": "^1.0.0-alpha.40",
 | 
			
		||||
        "warun": "^1.0.0"
 | 
			
		||||
    },
 | 
			
		||||
    "peerDependencies": {
 | 
			
		||||
        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
 | 
			
		||||
    },
 | 
			
		||||
    "engines": {
 | 
			
		||||
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								node_modules/@eslint-community/regexpp/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								node_modules/@eslint-community/regexpp/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2018 Toru Nagashima
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
							
								
								
									
										177
									
								
								node_modules/@eslint-community/regexpp/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								node_modules/@eslint-community/regexpp/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,177 @@
 | 
			
		|||
# @eslint-community/regexpp
 | 
			
		||||
 | 
			
		||||
[](https://www.npmjs.com/package/@eslint-community/regexpp)
 | 
			
		||||
[](http://www.npmtrends.com/@eslint-community/regexpp)
 | 
			
		||||
[](https://github.com/eslint-community/regexpp/actions)
 | 
			
		||||
[](https://codecov.io/gh/eslint-community/regexpp)
 | 
			
		||||
 | 
			
		||||
A regular expression parser for ECMAScript.
 | 
			
		||||
 | 
			
		||||
## 💿 Installation
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
$ npm install @eslint-community/regexpp
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- require Node@^12.0.0 || ^14.0.0 || >=16.0.0.
 | 
			
		||||
 | 
			
		||||
## 📖 Usage
 | 
			
		||||
 | 
			
		||||
```ts
 | 
			
		||||
import {
 | 
			
		||||
    AST,
 | 
			
		||||
    RegExpParser,
 | 
			
		||||
    RegExpValidator,
 | 
			
		||||
    RegExpVisitor,
 | 
			
		||||
    parseRegExpLiteral,
 | 
			
		||||
    validateRegExpLiteral,
 | 
			
		||||
    visitRegExpAST
 | 
			
		||||
} from "@eslint-community/regexpp"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### parseRegExpLiteral(source, options?)
 | 
			
		||||
 | 
			
		||||
Parse a given regular expression literal then make AST object.
 | 
			
		||||
 | 
			
		||||
This is equivalent to `new RegExpParser(options).parseLiteral(source)`.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string | RegExp`) The source code to parse.
 | 
			
		||||
    - `options?` ([`RegExpParser.Options`]) The options to parse.
 | 
			
		||||
- **Return:**
 | 
			
		||||
    - The AST of the regular expression.
 | 
			
		||||
 | 
			
		||||
### validateRegExpLiteral(source, options?)
 | 
			
		||||
 | 
			
		||||
Validate a given regular expression literal.
 | 
			
		||||
 | 
			
		||||
This is equivalent to `new RegExpValidator(options).validateLiteral(source)`.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to validate.
 | 
			
		||||
    - `options?` ([`RegExpValidator.Options`]) The options to validate.
 | 
			
		||||
 | 
			
		||||
### visitRegExpAST(ast, handlers)
 | 
			
		||||
 | 
			
		||||
Visit each node of a given AST.
 | 
			
		||||
 | 
			
		||||
This is equivalent to `new RegExpVisitor(handlers).visit(ast)`.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `ast` ([`AST.Node`]) The AST to visit.
 | 
			
		||||
    - `handlers` ([`RegExpVisitor.Handlers`]) The callbacks.
 | 
			
		||||
 | 
			
		||||
### RegExpParser
 | 
			
		||||
 | 
			
		||||
#### new RegExpParser(options?)
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `options?` ([`RegExpParser.Options`]) The options to parse.
 | 
			
		||||
 | 
			
		||||
#### parser.parseLiteral(source, start?, end?)
 | 
			
		||||
 | 
			
		||||
Parse a regular expression literal.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to parse. E.g. `"/abc/g"`.
 | 
			
		||||
    - `start?` (`number`) The start index in the source code. Default is `0`.
 | 
			
		||||
    - `end?` (`number`) The end index in the source code. Default is `source.length`.
 | 
			
		||||
- **Return:**
 | 
			
		||||
    - The AST of the regular expression.
 | 
			
		||||
 | 
			
		||||
#### parser.parsePattern(source, start?, end?, flags?)
 | 
			
		||||
 | 
			
		||||
Parse a regular expression pattern.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to parse. E.g. `"abc"`.
 | 
			
		||||
    - `start?` (`number`) The start index in the source code. Default is `0`.
 | 
			
		||||
    - `end?` (`number`) The end index in the source code. Default is `source.length`.
 | 
			
		||||
    - `flags?` (`{ unicode?: boolean, unicodeSets?: boolean }`) The flags to enable Unicode mode, and Unicode Set mode.
 | 
			
		||||
- **Return:**
 | 
			
		||||
    - The AST of the regular expression pattern.
 | 
			
		||||
 | 
			
		||||
#### parser.parseFlags(source, start?, end?)
 | 
			
		||||
 | 
			
		||||
Parse a regular expression flags.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to parse. E.g. `"gim"`.
 | 
			
		||||
    - `start?` (`number`) The start index in the source code. Default is `0`.
 | 
			
		||||
    - `end?` (`number`) The end index in the source code. Default is `source.length`.
 | 
			
		||||
- **Return:**
 | 
			
		||||
    - The AST of the regular expression flags.
 | 
			
		||||
 | 
			
		||||
### RegExpValidator
 | 
			
		||||
 | 
			
		||||
#### new RegExpValidator(options)
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `options` ([`RegExpValidator.Options`]) The options to validate.
 | 
			
		||||
 | 
			
		||||
#### validator.validateLiteral(source, start, end)
 | 
			
		||||
 | 
			
		||||
Validate a regular expression literal.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to validate.
 | 
			
		||||
    - `start?` (`number`) The start index in the source code. Default is `0`.
 | 
			
		||||
    - `end?` (`number`) The end index in the source code. Default is `source.length`.
 | 
			
		||||
 | 
			
		||||
#### validator.validatePattern(source, start, end, flags)
 | 
			
		||||
 | 
			
		||||
Validate a regular expression pattern.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to validate.
 | 
			
		||||
    - `start?` (`number`) The start index in the source code. Default is `0`.
 | 
			
		||||
    - `end?` (`number`) The end index in the source code. Default is `source.length`.
 | 
			
		||||
    - `flags?` (`{ unicode?: boolean, unicodeSets?: boolean }`) The flags to enable Unicode mode, and Unicode Set mode.
 | 
			
		||||
 | 
			
		||||
#### validator.validateFlags(source, start, end)
 | 
			
		||||
 | 
			
		||||
Validate a regular expression flags.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `source` (`string`) The source code to validate.
 | 
			
		||||
    - `start?` (`number`) The start index in the source code. Default is `0`.
 | 
			
		||||
    - `end?` (`number`) The end index in the source code. Default is `source.length`.
 | 
			
		||||
 | 
			
		||||
### RegExpVisitor
 | 
			
		||||
 | 
			
		||||
#### new RegExpVisitor(handlers)
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `handlers` ([`RegExpVisitor.Handlers`]) The callbacks.
 | 
			
		||||
 | 
			
		||||
#### visitor.visit(ast)
 | 
			
		||||
 | 
			
		||||
Validate a regular expression literal.
 | 
			
		||||
 | 
			
		||||
- **Parameters:**
 | 
			
		||||
    - `ast` ([`AST.Node`]) The AST to visit.
 | 
			
		||||
 | 
			
		||||
## 📰 Changelog
 | 
			
		||||
 | 
			
		||||
- [GitHub Releases](https://github.com/eslint-community/regexpp/releases)
 | 
			
		||||
 | 
			
		||||
## 🍻 Contributing
 | 
			
		||||
 | 
			
		||||
Welcome contributing!
 | 
			
		||||
 | 
			
		||||
Please use GitHub's Issues/PRs.
 | 
			
		||||
 | 
			
		||||
### Development Tools
 | 
			
		||||
 | 
			
		||||
- `npm test` runs tests and measures coverage.
 | 
			
		||||
- `npm run build` compiles TypeScript source code to `index.js`, `index.js.map`, and `index.d.ts`.
 | 
			
		||||
- `npm run clean` removes the temporary files which are created by `npm test` and `npm run build`.
 | 
			
		||||
- `npm run lint` runs ESLint.
 | 
			
		||||
- `npm run update:test` updates test fixtures.
 | 
			
		||||
- `npm run update:ids` updates `src/unicode/ids.ts`.
 | 
			
		||||
- `npm run watch` runs tests with `--watch` option.
 | 
			
		||||
 | 
			
		||||
[`AST.Node`]: src/ast.ts#L4
 | 
			
		||||
[`RegExpParser.Options`]: src/parser.ts#L743
 | 
			
		||||
[`RegExpValidator.Options`]: src/validator.ts#L220
 | 
			
		||||
[`RegExpVisitor.Handlers`]: src/visitor.ts#L291
 | 
			
		||||
							
								
								
									
										1065
									
								
								node_modules/@eslint-community/regexpp/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1065
									
								
								node_modules/@eslint-community/regexpp/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										2747
									
								
								node_modules/@eslint-community/regexpp/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2747
									
								
								node_modules/@eslint-community/regexpp/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint-community/regexpp/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint-community/regexpp/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2737
									
								
								node_modules/@eslint-community/regexpp/index.mjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2737
									
								
								node_modules/@eslint-community/regexpp/index.mjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint-community/regexpp/index.mjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint-community/regexpp/index.mjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										93
									
								
								node_modules/@eslint-community/regexpp/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								node_modules/@eslint-community/regexpp/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,93 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "@eslint-community/regexpp",
 | 
			
		||||
  "version": "4.10.0",
 | 
			
		||||
  "description": "Regular expression parser for ECMAScript.",
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "regexp",
 | 
			
		||||
    "regular",
 | 
			
		||||
    "expression",
 | 
			
		||||
    "parser",
 | 
			
		||||
    "validator",
 | 
			
		||||
    "ast",
 | 
			
		||||
    "abstract",
 | 
			
		||||
    "syntax",
 | 
			
		||||
    "tree",
 | 
			
		||||
    "ecmascript",
 | 
			
		||||
    "es2015",
 | 
			
		||||
    "es2016",
 | 
			
		||||
    "es2017",
 | 
			
		||||
    "es2018",
 | 
			
		||||
    "es2019",
 | 
			
		||||
    "es2020",
 | 
			
		||||
    "es2021",
 | 
			
		||||
    "annexB"
 | 
			
		||||
  ],
 | 
			
		||||
  "homepage": "https://github.com/eslint-community/regexpp#readme",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/eslint-community/regexpp/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "https://github.com/eslint-community/regexpp"
 | 
			
		||||
  },
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "author": "Toru Nagashima",
 | 
			
		||||
  "exports": {
 | 
			
		||||
    ".": {
 | 
			
		||||
      "types": "./index.d.ts",
 | 
			
		||||
      "import": "./index.mjs",
 | 
			
		||||
      "default": "./index.js"
 | 
			
		||||
    },
 | 
			
		||||
    "./package.json": "./package.json"
 | 
			
		||||
  },
 | 
			
		||||
  "main": "index",
 | 
			
		||||
  "files": [
 | 
			
		||||
    "index.*"
 | 
			
		||||
  ],
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "prebuild": "npm run -s clean",
 | 
			
		||||
    "build": "run-s build:*",
 | 
			
		||||
    "build:tsc": "tsc --module es2015",
 | 
			
		||||
    "build:rollup": "rollup -c",
 | 
			
		||||
    "build:dts": "npm run -s build:tsc -- --removeComments false && dts-bundle --name @eslint-community/regexpp --main .temp/index.d.ts --out ../index.d.ts && prettier --write index.d.ts",
 | 
			
		||||
    "clean": "rimraf .temp index.*",
 | 
			
		||||
    "lint": "eslint . --ext .ts",
 | 
			
		||||
    "test": "nyc _mocha \"test/*.ts\" --reporter dot --timeout 10000",
 | 
			
		||||
    "debug": "mocha --require ts-node/register/transpile-only \"test/*.ts\" --reporter dot --timeout 10000",
 | 
			
		||||
    "update:test": "ts-node scripts/update-fixtures.ts",
 | 
			
		||||
    "update:unicode": "run-s update:unicode:*",
 | 
			
		||||
    "update:unicode:ids": "ts-node scripts/update-unicode-ids.ts",
 | 
			
		||||
    "update:unicode:props": "ts-node scripts/update-unicode-properties.ts",
 | 
			
		||||
    "update:test262:extract": "ts-node -T scripts/extract-test262.ts",
 | 
			
		||||
    "preversion": "npm test && npm run -s build",
 | 
			
		||||
    "postversion": "git push && git push --tags",
 | 
			
		||||
    "prewatch": "npm run -s clean",
 | 
			
		||||
    "watch": "_mocha \"test/*.ts\" --require ts-node/register --reporter dot --timeout 10000 --watch-extensions ts --watch --growl"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {},
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@eslint-community/eslint-plugin-mysticatea": "^15.5.1",
 | 
			
		||||
    "@rollup/plugin-node-resolve": "^14.1.0",
 | 
			
		||||
    "@types/eslint": "^8.44.3",
 | 
			
		||||
    "@types/jsdom": "^16.2.15",
 | 
			
		||||
    "@types/mocha": "^9.1.1",
 | 
			
		||||
    "@types/node": "^12.20.55",
 | 
			
		||||
    "dts-bundle": "^0.7.3",
 | 
			
		||||
    "eslint": "^8.50.0",
 | 
			
		||||
    "js-tokens": "^8.0.2",
 | 
			
		||||
    "jsdom": "^19.0.0",
 | 
			
		||||
    "mocha": "^9.2.2",
 | 
			
		||||
    "npm-run-all": "^4.1.5",
 | 
			
		||||
    "nyc": "^14.1.1",
 | 
			
		||||
    "rimraf": "^3.0.2",
 | 
			
		||||
    "rollup": "^2.79.1",
 | 
			
		||||
    "rollup-plugin-sourcemaps": "^0.6.3",
 | 
			
		||||
    "test262": "git+https://github.com/tc39/test262.git",
 | 
			
		||||
    "test262-stream": "^1.4.0",
 | 
			
		||||
    "ts-node": "^10.9.1",
 | 
			
		||||
    "typescript": "~5.0.2"
 | 
			
		||||
  },
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								node_modules/@eslint/eslintrc/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								node_modules/@eslint/eslintrc/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
Copyright OpenJS Foundation and other contributors, <www.openjsf.org>
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
							
								
								
									
										126
									
								
								node_modules/@eslint/eslintrc/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								node_modules/@eslint/eslintrc/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,126 @@
 | 
			
		|||
# ESLintRC Library
 | 
			
		||||
 | 
			
		||||
This repository contains the legacy ESLintRC configuration file format for ESLint. This package is not intended for use outside of the ESLint ecosystem. It is ESLint-specific and not intended for use in other programs.
 | 
			
		||||
 | 
			
		||||
**Note:** This package is frozen except for critical bug fixes as ESLint moves to a new config system.
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
You can install the package as follows:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
npm install @eslint/eslintrc --save-dev
 | 
			
		||||
 | 
			
		||||
# or
 | 
			
		||||
 | 
			
		||||
yarn add @eslint/eslintrc -D
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Usage (ESM)
 | 
			
		||||
 | 
			
		||||
The primary class in this package is `FlatCompat`, which is a utility to translate ESLintRC-style configs into flat configs. Here's how you use it inside of your `eslint.config.js` file:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
import { FlatCompat } from "@eslint/eslintrc";
 | 
			
		||||
import js from "@eslint/js";
 | 
			
		||||
import path from "path";
 | 
			
		||||
import { fileURLToPath } from "url";
 | 
			
		||||
 | 
			
		||||
// mimic CommonJS variables -- not needed if using CommonJS
 | 
			
		||||
const __filename = fileURLToPath(import.meta.url);
 | 
			
		||||
const __dirname = path.dirname(__filename);
 | 
			
		||||
 | 
			
		||||
const compat = new FlatCompat({
 | 
			
		||||
    baseDirectory: __dirname,                  // optional; default: process.cwd()
 | 
			
		||||
    resolvePluginsRelativeTo: __dirname,       // optional
 | 
			
		||||
    recommendedConfig: js.configs.recommended, // optional unless you're using "eslint:recommended"
 | 
			
		||||
    allConfig: js.configs.all,                 // optional unless you're using "eslint:all"
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default [
 | 
			
		||||
 | 
			
		||||
    // mimic ESLintRC-style extends
 | 
			
		||||
    ...compat.extends("standard", "example"),
 | 
			
		||||
 | 
			
		||||
    // mimic environments
 | 
			
		||||
    ...compat.env({
 | 
			
		||||
        es2020: true,
 | 
			
		||||
        node: true
 | 
			
		||||
    }),
 | 
			
		||||
 | 
			
		||||
    // mimic plugins
 | 
			
		||||
    ...compat.plugins("airbnb", "react"),
 | 
			
		||||
 | 
			
		||||
    // translate an entire config
 | 
			
		||||
    ...compat.config({
 | 
			
		||||
        plugins: ["airbnb", "react"],
 | 
			
		||||
        extends: "standard",
 | 
			
		||||
        env: {
 | 
			
		||||
            es2020: true,
 | 
			
		||||
            node: true
 | 
			
		||||
        },
 | 
			
		||||
        rules: {
 | 
			
		||||
            semi: "error"
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Usage (CommonJS)
 | 
			
		||||
 | 
			
		||||
Using `FlatCompat` in CommonJS files is similar to ESM, but you'll use `require()` and `module.exports` instead of `import` and `export`. Here's how you use it inside of your `eslint.config.js` CommonJS file:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
const { FlatCompat } = require("@eslint/eslintrc");
 | 
			
		||||
const js = require("@eslint/js");
 | 
			
		||||
 | 
			
		||||
const compat = new FlatCompat({
 | 
			
		||||
    baseDirectory: __dirname,                  // optional; default: process.cwd()
 | 
			
		||||
    resolvePluginsRelativeTo: __dirname,       // optional
 | 
			
		||||
    recommendedConfig: js.configs.recommended, // optional unless using "eslint:recommended"
 | 
			
		||||
    allConfig: js.configs.all,                 // optional unless using "eslint:all"
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
module.exports = [
 | 
			
		||||
 | 
			
		||||
    // mimic ESLintRC-style extends
 | 
			
		||||
    ...compat.extends("standard", "example"),
 | 
			
		||||
 | 
			
		||||
    // mimic environments
 | 
			
		||||
    ...compat.env({
 | 
			
		||||
        es2020: true,
 | 
			
		||||
        node: true
 | 
			
		||||
    }),
 | 
			
		||||
 | 
			
		||||
    // mimic plugins
 | 
			
		||||
    ...compat.plugins("airbnb", "react"),
 | 
			
		||||
 | 
			
		||||
    // translate an entire config
 | 
			
		||||
    ...compat.config({
 | 
			
		||||
        plugins: ["airbnb", "react"],
 | 
			
		||||
        extends: "standard",
 | 
			
		||||
        env: {
 | 
			
		||||
            es2020: true,
 | 
			
		||||
            node: true
 | 
			
		||||
        },
 | 
			
		||||
        rules: {
 | 
			
		||||
            semi: "error"
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Troubleshooting
 | 
			
		||||
 | 
			
		||||
**TypeError: Missing parameter 'recommendedConfig' in FlatCompat constructor**
 | 
			
		||||
 | 
			
		||||
The `recommendedConfig` option is required when any config uses `eslint:recommended`, including any config in an `extends` clause. To fix this, follow the example above using `@eslint/js` to provide the `eslint:recommended` config.
 | 
			
		||||
 | 
			
		||||
**TypeError: Missing parameter 'allConfig' in FlatCompat constructor**
 | 
			
		||||
 | 
			
		||||
The `allConfig` option is required when any config uses `eslint:all`, including any config in an `extends` clause. To fix this, follow the example above using `@eslint/js` to provide the `eslint:all` config.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
MIT License
 | 
			
		||||
							
								
								
									
										79
									
								
								node_modules/@eslint/eslintrc/conf/config-schema.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								node_modules/@eslint/eslintrc/conf/config-schema.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Defines a schema for configs.
 | 
			
		||||
 * @author Sylvan Mably
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const baseConfigProperties = {
 | 
			
		||||
    $schema: { type: "string" },
 | 
			
		||||
    env: { type: "object" },
 | 
			
		||||
    extends: { $ref: "#/definitions/stringOrStrings" },
 | 
			
		||||
    globals: { type: "object" },
 | 
			
		||||
    overrides: {
 | 
			
		||||
        type: "array",
 | 
			
		||||
        items: { $ref: "#/definitions/overrideConfig" },
 | 
			
		||||
        additionalItems: false
 | 
			
		||||
    },
 | 
			
		||||
    parser: { type: ["string", "null"] },
 | 
			
		||||
    parserOptions: { type: "object" },
 | 
			
		||||
    plugins: { type: "array" },
 | 
			
		||||
    processor: { type: "string" },
 | 
			
		||||
    rules: { type: "object" },
 | 
			
		||||
    settings: { type: "object" },
 | 
			
		||||
    noInlineConfig: { type: "boolean" },
 | 
			
		||||
    reportUnusedDisableDirectives: { type: "boolean" },
 | 
			
		||||
 | 
			
		||||
    ecmaFeatures: { type: "object" } // deprecated; logs a warning when used
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const configSchema = {
 | 
			
		||||
    definitions: {
 | 
			
		||||
        stringOrStrings: {
 | 
			
		||||
            oneOf: [
 | 
			
		||||
                { type: "string" },
 | 
			
		||||
                {
 | 
			
		||||
                    type: "array",
 | 
			
		||||
                    items: { type: "string" },
 | 
			
		||||
                    additionalItems: false
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        stringOrStringsRequired: {
 | 
			
		||||
            oneOf: [
 | 
			
		||||
                { type: "string" },
 | 
			
		||||
                {
 | 
			
		||||
                    type: "array",
 | 
			
		||||
                    items: { type: "string" },
 | 
			
		||||
                    additionalItems: false,
 | 
			
		||||
                    minItems: 1
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Config at top-level.
 | 
			
		||||
        objectConfig: {
 | 
			
		||||
            type: "object",
 | 
			
		||||
            properties: {
 | 
			
		||||
                root: { type: "boolean" },
 | 
			
		||||
                ignorePatterns: { $ref: "#/definitions/stringOrStrings" },
 | 
			
		||||
                ...baseConfigProperties
 | 
			
		||||
            },
 | 
			
		||||
            additionalProperties: false
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
        // Config in `overrides`.
 | 
			
		||||
        overrideConfig: {
 | 
			
		||||
            type: "object",
 | 
			
		||||
            properties: {
 | 
			
		||||
                excludedFiles: { $ref: "#/definitions/stringOrStrings" },
 | 
			
		||||
                files: { $ref: "#/definitions/stringOrStringsRequired" },
 | 
			
		||||
                ...baseConfigProperties
 | 
			
		||||
            },
 | 
			
		||||
            required: ["files"],
 | 
			
		||||
            additionalProperties: false
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    $ref: "#/definitions/objectConfig"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default configSchema;
 | 
			
		||||
							
								
								
									
										215
									
								
								node_modules/@eslint/eslintrc/conf/environments.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								node_modules/@eslint/eslintrc/conf/environments.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,215 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Defines environment settings and globals.
 | 
			
		||||
 * @author Elan Shanker
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import globals from "globals";
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the object that has difference.
 | 
			
		||||
 * @param {Record<string,boolean>} current The newer object.
 | 
			
		||||
 * @param {Record<string,boolean>} prev The older object.
 | 
			
		||||
 * @returns {Record<string,boolean>} The difference object.
 | 
			
		||||
 */
 | 
			
		||||
function getDiff(current, prev) {
 | 
			
		||||
    const retv = {};
 | 
			
		||||
 | 
			
		||||
    for (const [key, value] of Object.entries(current)) {
 | 
			
		||||
        if (!Object.hasOwnProperty.call(prev, key)) {
 | 
			
		||||
            retv[key] = value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return retv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const newGlobals2015 = getDiff(globals.es2015, globals.es5); // 19 variables such as Promise, Map, ...
 | 
			
		||||
const newGlobals2017 = {
 | 
			
		||||
    Atomics: false,
 | 
			
		||||
    SharedArrayBuffer: false
 | 
			
		||||
};
 | 
			
		||||
const newGlobals2020 = {
 | 
			
		||||
    BigInt: false,
 | 
			
		||||
    BigInt64Array: false,
 | 
			
		||||
    BigUint64Array: false,
 | 
			
		||||
    globalThis: false
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const newGlobals2021 = {
 | 
			
		||||
    AggregateError: false,
 | 
			
		||||
    FinalizationRegistry: false,
 | 
			
		||||
    WeakRef: false
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/** @type {Map<string, import("../lib/shared/types").Environment>} */
 | 
			
		||||
export default new Map(Object.entries({
 | 
			
		||||
 | 
			
		||||
    // Language
 | 
			
		||||
    builtin: {
 | 
			
		||||
        globals: globals.es5
 | 
			
		||||
    },
 | 
			
		||||
    es6: {
 | 
			
		||||
        globals: newGlobals2015,
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 6
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2015: {
 | 
			
		||||
        globals: newGlobals2015,
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 6
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2016: {
 | 
			
		||||
        globals: newGlobals2015,
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 7
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2017: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 8
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2018: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 9
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2019: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 10
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2020: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 11
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2021: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020, ...newGlobals2021 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 12
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2022: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020, ...newGlobals2021 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 13
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2023: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020, ...newGlobals2021 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 14
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    es2024: {
 | 
			
		||||
        globals: { ...newGlobals2015, ...newGlobals2017, ...newGlobals2020, ...newGlobals2021 },
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaVersion: 15
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Platforms
 | 
			
		||||
    browser: {
 | 
			
		||||
        globals: globals.browser
 | 
			
		||||
    },
 | 
			
		||||
    node: {
 | 
			
		||||
        globals: globals.node,
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaFeatures: {
 | 
			
		||||
                globalReturn: true
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    "shared-node-browser": {
 | 
			
		||||
        globals: globals["shared-node-browser"]
 | 
			
		||||
    },
 | 
			
		||||
    worker: {
 | 
			
		||||
        globals: globals.worker
 | 
			
		||||
    },
 | 
			
		||||
    serviceworker: {
 | 
			
		||||
        globals: globals.serviceworker
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    // Frameworks
 | 
			
		||||
    commonjs: {
 | 
			
		||||
        globals: globals.commonjs,
 | 
			
		||||
        parserOptions: {
 | 
			
		||||
            ecmaFeatures: {
 | 
			
		||||
                globalReturn: true
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    amd: {
 | 
			
		||||
        globals: globals.amd
 | 
			
		||||
    },
 | 
			
		||||
    mocha: {
 | 
			
		||||
        globals: globals.mocha
 | 
			
		||||
    },
 | 
			
		||||
    jasmine: {
 | 
			
		||||
        globals: globals.jasmine
 | 
			
		||||
    },
 | 
			
		||||
    jest: {
 | 
			
		||||
        globals: globals.jest
 | 
			
		||||
    },
 | 
			
		||||
    phantomjs: {
 | 
			
		||||
        globals: globals.phantomjs
 | 
			
		||||
    },
 | 
			
		||||
    jquery: {
 | 
			
		||||
        globals: globals.jquery
 | 
			
		||||
    },
 | 
			
		||||
    qunit: {
 | 
			
		||||
        globals: globals.qunit
 | 
			
		||||
    },
 | 
			
		||||
    prototypejs: {
 | 
			
		||||
        globals: globals.prototypejs
 | 
			
		||||
    },
 | 
			
		||||
    shelljs: {
 | 
			
		||||
        globals: globals.shelljs
 | 
			
		||||
    },
 | 
			
		||||
    meteor: {
 | 
			
		||||
        globals: globals.meteor
 | 
			
		||||
    },
 | 
			
		||||
    mongo: {
 | 
			
		||||
        globals: globals.mongo
 | 
			
		||||
    },
 | 
			
		||||
    protractor: {
 | 
			
		||||
        globals: globals.protractor
 | 
			
		||||
    },
 | 
			
		||||
    applescript: {
 | 
			
		||||
        globals: globals.applescript
 | 
			
		||||
    },
 | 
			
		||||
    nashorn: {
 | 
			
		||||
        globals: globals.nashorn
 | 
			
		||||
    },
 | 
			
		||||
    atomtest: {
 | 
			
		||||
        globals: globals.atomtest
 | 
			
		||||
    },
 | 
			
		||||
    embertest: {
 | 
			
		||||
        globals: globals.embertest
 | 
			
		||||
    },
 | 
			
		||||
    webextensions: {
 | 
			
		||||
        globals: globals.webextensions
 | 
			
		||||
    },
 | 
			
		||||
    greasemonkey: {
 | 
			
		||||
        globals: globals.greasemonkey
 | 
			
		||||
    }
 | 
			
		||||
}));
 | 
			
		||||
							
								
								
									
										1143
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1143
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc-universal.cjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										4370
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc.cjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4370
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc.cjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc.cjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint/eslintrc/dist/eslintrc.cjs.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										532
									
								
								node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								node_modules/@eslint/eslintrc/lib/cascading-config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,532 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `CascadingConfigArrayFactory` class.
 | 
			
		||||
 *
 | 
			
		||||
 * `CascadingConfigArrayFactory` class has a responsibility:
 | 
			
		||||
 *
 | 
			
		||||
 * 1. Handles cascading of config files.
 | 
			
		||||
 *
 | 
			
		||||
 * It provides two methods:
 | 
			
		||||
 *
 | 
			
		||||
 * - `getConfigArrayForFile(filePath)`
 | 
			
		||||
 *     Get the corresponded configuration of a given file. This method doesn't
 | 
			
		||||
 *     throw even if the given file didn't exist.
 | 
			
		||||
 * - `clearCache()`
 | 
			
		||||
 *     Clear the internal cache. You have to call this method when
 | 
			
		||||
 *     `additionalPluginPool` was updated if `baseConfig` or `cliConfig` depends
 | 
			
		||||
 *     on the additional plugins. (`CLIEngine#addPlugin()` method calls this.)
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import debugOrig from "debug";
 | 
			
		||||
import os from "os";
 | 
			
		||||
import path from "path";
 | 
			
		||||
 | 
			
		||||
import { ConfigArrayFactory } from "./config-array-factory.js";
 | 
			
		||||
import {
 | 
			
		||||
    ConfigArray,
 | 
			
		||||
    ConfigDependency,
 | 
			
		||||
    IgnorePattern
 | 
			
		||||
} from "./config-array/index.js";
 | 
			
		||||
import ConfigValidator from "./shared/config-validator.js";
 | 
			
		||||
import { emitDeprecationWarning } from "./shared/deprecation-warnings.js";
 | 
			
		||||
 | 
			
		||||
const debug = debugOrig("eslintrc:cascading-config-array-factory");
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Define types for VSCode IntelliSense.
 | 
			
		||||
/** @typedef {import("./shared/types").ConfigData} ConfigData */
 | 
			
		||||
/** @typedef {import("./shared/types").Parser} Parser */
 | 
			
		||||
/** @typedef {import("./shared/types").Plugin} Plugin */
 | 
			
		||||
/** @typedef {import("./shared/types").Rule} Rule */
 | 
			
		||||
/** @typedef {ReturnType<ConfigArrayFactory["create"]>} ConfigArray */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} CascadingConfigArrayFactoryOptions
 | 
			
		||||
 * @property {Map<string,Plugin>} [additionalPluginPool] The map for additional plugins.
 | 
			
		||||
 * @property {ConfigData} [baseConfig] The config by `baseConfig` option.
 | 
			
		||||
 * @property {ConfigData} [cliConfig] The config by CLI options (`--env`, `--global`, `--ignore-pattern`, `--parser`, `--parser-options`, `--plugin`, and `--rule`). CLI options overwrite the setting in config files.
 | 
			
		||||
 * @property {string} [cwd] The base directory to start lookup.
 | 
			
		||||
 * @property {string} [ignorePath] The path to the alternative file of `.eslintignore`.
 | 
			
		||||
 * @property {string[]} [rulePaths] The value of `--rulesdir` option.
 | 
			
		||||
 * @property {string} [specificConfigPath] The value of `--config` option.
 | 
			
		||||
 * @property {boolean} [useEslintrc] if `false` then it doesn't load config files.
 | 
			
		||||
 * @property {Function} loadRules The function to use to load rules.
 | 
			
		||||
 * @property {Map<string,Rule>} builtInRules The rules that are built in to ESLint.
 | 
			
		||||
 * @property {Object} [resolver=ModuleResolver] The module resolver object.
 | 
			
		||||
 * @property {string} eslintAllPath The path to the definitions for eslint:all.
 | 
			
		||||
 * @property {Function} getEslintAllConfig Returns the config data for eslint:all.
 | 
			
		||||
 * @property {string} eslintRecommendedPath The path to the definitions for eslint:recommended.
 | 
			
		||||
 * @property {Function} getEslintRecommendedConfig Returns the config data for eslint:recommended.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} CascadingConfigArrayFactoryInternalSlots
 | 
			
		||||
 * @property {ConfigArray} baseConfigArray The config array of `baseConfig` option.
 | 
			
		||||
 * @property {ConfigData} baseConfigData The config data of `baseConfig` option. This is used to reset `baseConfigArray`.
 | 
			
		||||
 * @property {ConfigArray} cliConfigArray The config array of CLI options.
 | 
			
		||||
 * @property {ConfigData} cliConfigData The config data of CLI options. This is used to reset `cliConfigArray`.
 | 
			
		||||
 * @property {ConfigArrayFactory} configArrayFactory The factory for config arrays.
 | 
			
		||||
 * @property {Map<string, ConfigArray>} configCache The cache from directory paths to config arrays.
 | 
			
		||||
 * @property {string} cwd The base directory to start lookup.
 | 
			
		||||
 * @property {WeakMap<ConfigArray, ConfigArray>} finalizeCache The cache from config arrays to finalized config arrays.
 | 
			
		||||
 * @property {string} [ignorePath] The path to the alternative file of `.eslintignore`.
 | 
			
		||||
 * @property {string[]|null} rulePaths The value of `--rulesdir` option. This is used to reset `baseConfigArray`.
 | 
			
		||||
 * @property {string|null} specificConfigPath The value of `--config` option. This is used to reset `cliConfigArray`.
 | 
			
		||||
 * @property {boolean} useEslintrc if `false` then it doesn't load config files.
 | 
			
		||||
 * @property {Function} loadRules The function to use to load rules.
 | 
			
		||||
 * @property {Map<string,Rule>} builtInRules The rules that are built in to ESLint.
 | 
			
		||||
 * @property {Object} [resolver=ModuleResolver] The module resolver object.
 | 
			
		||||
 * @property {string} eslintAllPath The path to the definitions for eslint:all.
 | 
			
		||||
 * @property {Function} getEslintAllConfig Returns the config data for eslint:all.
 | 
			
		||||
 * @property {string} eslintRecommendedPath The path to the definitions for eslint:recommended.
 | 
			
		||||
 * @property {Function} getEslintRecommendedConfig Returns the config data for eslint:recommended.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @type {WeakMap<CascadingConfigArrayFactory, CascadingConfigArrayFactoryInternalSlots>} */
 | 
			
		||||
const internalSlotsMap = new WeakMap();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create the config array from `baseConfig` and `rulePaths`.
 | 
			
		||||
 * @param {CascadingConfigArrayFactoryInternalSlots} slots The slots.
 | 
			
		||||
 * @returns {ConfigArray} The config array of the base configs.
 | 
			
		||||
 */
 | 
			
		||||
function createBaseConfigArray({
 | 
			
		||||
    configArrayFactory,
 | 
			
		||||
    baseConfigData,
 | 
			
		||||
    rulePaths,
 | 
			
		||||
    cwd,
 | 
			
		||||
    loadRules
 | 
			
		||||
}) {
 | 
			
		||||
    const baseConfigArray = configArrayFactory.create(
 | 
			
		||||
        baseConfigData,
 | 
			
		||||
        { name: "BaseConfig" }
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Create the config array element for the default ignore patterns.
 | 
			
		||||
     * This element has `ignorePattern` property that ignores the default
 | 
			
		||||
     * patterns in the current working directory.
 | 
			
		||||
     */
 | 
			
		||||
    baseConfigArray.unshift(configArrayFactory.create(
 | 
			
		||||
        { ignorePatterns: IgnorePattern.DefaultPatterns },
 | 
			
		||||
        { name: "DefaultIgnorePattern" }
 | 
			
		||||
    )[0]);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
     * Load rules `--rulesdir` option as a pseudo plugin.
 | 
			
		||||
     * Use a pseudo plugin to define rules of `--rulesdir`, so we can validate
 | 
			
		||||
     * the rule's options with only information in the config array.
 | 
			
		||||
     */
 | 
			
		||||
    if (rulePaths && rulePaths.length > 0) {
 | 
			
		||||
        baseConfigArray.push({
 | 
			
		||||
            type: "config",
 | 
			
		||||
            name: "--rulesdir",
 | 
			
		||||
            filePath: "",
 | 
			
		||||
            plugins: {
 | 
			
		||||
                "": new ConfigDependency({
 | 
			
		||||
                    definition: {
 | 
			
		||||
                        rules: rulePaths.reduce(
 | 
			
		||||
                            (map, rulesPath) => Object.assign(
 | 
			
		||||
                                map,
 | 
			
		||||
                                loadRules(rulesPath, cwd)
 | 
			
		||||
                            ),
 | 
			
		||||
                            {}
 | 
			
		||||
                        )
 | 
			
		||||
                    },
 | 
			
		||||
                    filePath: "",
 | 
			
		||||
                    id: "",
 | 
			
		||||
                    importerName: "--rulesdir",
 | 
			
		||||
                    importerPath: ""
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return baseConfigArray;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create the config array from CLI options.
 | 
			
		||||
 * @param {CascadingConfigArrayFactoryInternalSlots} slots The slots.
 | 
			
		||||
 * @returns {ConfigArray} The config array of the base configs.
 | 
			
		||||
 */
 | 
			
		||||
function createCLIConfigArray({
 | 
			
		||||
    cliConfigData,
 | 
			
		||||
    configArrayFactory,
 | 
			
		||||
    cwd,
 | 
			
		||||
    ignorePath,
 | 
			
		||||
    specificConfigPath
 | 
			
		||||
}) {
 | 
			
		||||
    const cliConfigArray = configArrayFactory.create(
 | 
			
		||||
        cliConfigData,
 | 
			
		||||
        { name: "CLIOptions" }
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    cliConfigArray.unshift(
 | 
			
		||||
        ...(ignorePath
 | 
			
		||||
            ? configArrayFactory.loadESLintIgnore(ignorePath)
 | 
			
		||||
            : configArrayFactory.loadDefaultESLintIgnore())
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if (specificConfigPath) {
 | 
			
		||||
        cliConfigArray.unshift(
 | 
			
		||||
            ...configArrayFactory.loadFile(
 | 
			
		||||
                specificConfigPath,
 | 
			
		||||
                { name: "--config", basePath: cwd }
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return cliConfigArray;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The error type when there are files matched by a glob, but all of them have been ignored.
 | 
			
		||||
 */
 | 
			
		||||
class ConfigurationNotFoundError extends Error {
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line jsdoc/require-description
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {string} directoryPath The directory path.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(directoryPath) {
 | 
			
		||||
        super(`No ESLint configuration found in ${directoryPath}.`);
 | 
			
		||||
        this.messageTemplate = "no-config-found";
 | 
			
		||||
        this.messageData = { directoryPath };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class provides the functionality that enumerates every file which is
 | 
			
		||||
 * matched by given glob patterns and that configuration.
 | 
			
		||||
 */
 | 
			
		||||
class CascadingConfigArrayFactory {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialize this enumerator.
 | 
			
		||||
     * @param {CascadingConfigArrayFactoryOptions} options The options.
 | 
			
		||||
     */
 | 
			
		||||
    constructor({
 | 
			
		||||
        additionalPluginPool = new Map(),
 | 
			
		||||
        baseConfig: baseConfigData = null,
 | 
			
		||||
        cliConfig: cliConfigData = null,
 | 
			
		||||
        cwd = process.cwd(),
 | 
			
		||||
        ignorePath,
 | 
			
		||||
        resolvePluginsRelativeTo,
 | 
			
		||||
        rulePaths = [],
 | 
			
		||||
        specificConfigPath = null,
 | 
			
		||||
        useEslintrc = true,
 | 
			
		||||
        builtInRules = new Map(),
 | 
			
		||||
        loadRules,
 | 
			
		||||
        resolver,
 | 
			
		||||
        eslintRecommendedPath,
 | 
			
		||||
        getEslintRecommendedConfig,
 | 
			
		||||
        eslintAllPath,
 | 
			
		||||
        getEslintAllConfig
 | 
			
		||||
    } = {}) {
 | 
			
		||||
        const configArrayFactory = new ConfigArrayFactory({
 | 
			
		||||
            additionalPluginPool,
 | 
			
		||||
            cwd,
 | 
			
		||||
            resolvePluginsRelativeTo,
 | 
			
		||||
            builtInRules,
 | 
			
		||||
            resolver,
 | 
			
		||||
            eslintRecommendedPath,
 | 
			
		||||
            getEslintRecommendedConfig,
 | 
			
		||||
            eslintAllPath,
 | 
			
		||||
            getEslintAllConfig
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        internalSlotsMap.set(this, {
 | 
			
		||||
            baseConfigArray: createBaseConfigArray({
 | 
			
		||||
                baseConfigData,
 | 
			
		||||
                configArrayFactory,
 | 
			
		||||
                cwd,
 | 
			
		||||
                rulePaths,
 | 
			
		||||
                loadRules
 | 
			
		||||
            }),
 | 
			
		||||
            baseConfigData,
 | 
			
		||||
            cliConfigArray: createCLIConfigArray({
 | 
			
		||||
                cliConfigData,
 | 
			
		||||
                configArrayFactory,
 | 
			
		||||
                cwd,
 | 
			
		||||
                ignorePath,
 | 
			
		||||
                specificConfigPath
 | 
			
		||||
            }),
 | 
			
		||||
            cliConfigData,
 | 
			
		||||
            configArrayFactory,
 | 
			
		||||
            configCache: new Map(),
 | 
			
		||||
            cwd,
 | 
			
		||||
            finalizeCache: new WeakMap(),
 | 
			
		||||
            ignorePath,
 | 
			
		||||
            rulePaths,
 | 
			
		||||
            specificConfigPath,
 | 
			
		||||
            useEslintrc,
 | 
			
		||||
            builtInRules,
 | 
			
		||||
            loadRules
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The path to the current working directory.
 | 
			
		||||
     * This is used by tests.
 | 
			
		||||
     * @type {string}
 | 
			
		||||
     */
 | 
			
		||||
    get cwd() {
 | 
			
		||||
        const { cwd } = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        return cwd;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the config array of a given file.
 | 
			
		||||
     * If `filePath` was not given, it returns the config which contains only
 | 
			
		||||
     * `baseConfigData` and `cliConfigData`.
 | 
			
		||||
     * @param {string} [filePath] The file path to a file.
 | 
			
		||||
     * @param {Object} [options] The options.
 | 
			
		||||
     * @param {boolean} [options.ignoreNotFoundError] If `true` then it doesn't throw `ConfigurationNotFoundError`.
 | 
			
		||||
     * @returns {ConfigArray} The config array of the file.
 | 
			
		||||
     */
 | 
			
		||||
    getConfigArrayForFile(filePath, { ignoreNotFoundError = false } = {}) {
 | 
			
		||||
        const {
 | 
			
		||||
            baseConfigArray,
 | 
			
		||||
            cliConfigArray,
 | 
			
		||||
            cwd
 | 
			
		||||
        } = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        if (!filePath) {
 | 
			
		||||
            return new ConfigArray(...baseConfigArray, ...cliConfigArray);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const directoryPath = path.dirname(path.resolve(cwd, filePath));
 | 
			
		||||
 | 
			
		||||
        debug(`Load config files for ${directoryPath}.`);
 | 
			
		||||
 | 
			
		||||
        return this._finalizeConfigArray(
 | 
			
		||||
            this._loadConfigInAncestors(directoryPath),
 | 
			
		||||
            directoryPath,
 | 
			
		||||
            ignoreNotFoundError
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Set the config data to override all configs.
 | 
			
		||||
     * Require to call `clearCache()` method after this method is called.
 | 
			
		||||
     * @param {ConfigData} configData The config data to override all configs.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    setOverrideConfig(configData) {
 | 
			
		||||
        const slots = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        slots.cliConfigData = configData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Clear config cache.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    clearCache() {
 | 
			
		||||
        const slots = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        slots.baseConfigArray = createBaseConfigArray(slots);
 | 
			
		||||
        slots.cliConfigArray = createCLIConfigArray(slots);
 | 
			
		||||
        slots.configCache.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Load and normalize config files from the ancestor directories.
 | 
			
		||||
     * @param {string} directoryPath The path to a leaf directory.
 | 
			
		||||
     * @param {boolean} configsExistInSubdirs `true` if configurations exist in subdirectories.
 | 
			
		||||
     * @returns {ConfigArray} The loaded config.
 | 
			
		||||
     * @private
 | 
			
		||||
     */
 | 
			
		||||
    _loadConfigInAncestors(directoryPath, configsExistInSubdirs = false) {
 | 
			
		||||
        const {
 | 
			
		||||
            baseConfigArray,
 | 
			
		||||
            configArrayFactory,
 | 
			
		||||
            configCache,
 | 
			
		||||
            cwd,
 | 
			
		||||
            useEslintrc
 | 
			
		||||
        } = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        if (!useEslintrc) {
 | 
			
		||||
            return baseConfigArray;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let configArray = configCache.get(directoryPath);
 | 
			
		||||
 | 
			
		||||
        // Hit cache.
 | 
			
		||||
        if (configArray) {
 | 
			
		||||
            debug(`Cache hit: ${directoryPath}.`);
 | 
			
		||||
            return configArray;
 | 
			
		||||
        }
 | 
			
		||||
        debug(`No cache found: ${directoryPath}.`);
 | 
			
		||||
 | 
			
		||||
        const homePath = os.homedir();
 | 
			
		||||
 | 
			
		||||
        // Consider this is root.
 | 
			
		||||
        if (directoryPath === homePath && cwd !== homePath) {
 | 
			
		||||
            debug("Stop traversing because of considered root.");
 | 
			
		||||
            if (configsExistInSubdirs) {
 | 
			
		||||
                const filePath = ConfigArrayFactory.getPathToConfigFileInDirectory(directoryPath);
 | 
			
		||||
 | 
			
		||||
                if (filePath) {
 | 
			
		||||
                    emitDeprecationWarning(
 | 
			
		||||
                        filePath,
 | 
			
		||||
                        "ESLINT_PERSONAL_CONFIG_SUPPRESS"
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return this._cacheConfig(directoryPath, baseConfigArray);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Load the config on this directory.
 | 
			
		||||
        try {
 | 
			
		||||
            configArray = configArrayFactory.loadInDirectory(directoryPath);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            /* istanbul ignore next */
 | 
			
		||||
            if (error.code === "EACCES") {
 | 
			
		||||
                debug("Stop traversing because of 'EACCES' error.");
 | 
			
		||||
                return this._cacheConfig(directoryPath, baseConfigArray);
 | 
			
		||||
            }
 | 
			
		||||
            throw error;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (configArray.length > 0 && configArray.isRoot()) {
 | 
			
		||||
            debug("Stop traversing because of 'root:true'.");
 | 
			
		||||
            configArray.unshift(...baseConfigArray);
 | 
			
		||||
            return this._cacheConfig(directoryPath, configArray);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Load from the ancestors and merge it.
 | 
			
		||||
        const parentPath = path.dirname(directoryPath);
 | 
			
		||||
        const parentConfigArray = parentPath && parentPath !== directoryPath
 | 
			
		||||
            ? this._loadConfigInAncestors(
 | 
			
		||||
                parentPath,
 | 
			
		||||
                configsExistInSubdirs || configArray.length > 0
 | 
			
		||||
            )
 | 
			
		||||
            : baseConfigArray;
 | 
			
		||||
 | 
			
		||||
        if (configArray.length > 0) {
 | 
			
		||||
            configArray.unshift(...parentConfigArray);
 | 
			
		||||
        } else {
 | 
			
		||||
            configArray = parentConfigArray;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Cache and return.
 | 
			
		||||
        return this._cacheConfig(directoryPath, configArray);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Freeze and cache a given config.
 | 
			
		||||
     * @param {string} directoryPath The path to a directory as a cache key.
 | 
			
		||||
     * @param {ConfigArray} configArray The config array as a cache value.
 | 
			
		||||
     * @returns {ConfigArray} The `configArray` (frozen).
 | 
			
		||||
     */
 | 
			
		||||
    _cacheConfig(directoryPath, configArray) {
 | 
			
		||||
        const { configCache } = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        Object.freeze(configArray);
 | 
			
		||||
        configCache.set(directoryPath, configArray);
 | 
			
		||||
 | 
			
		||||
        return configArray;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finalize a given config array.
 | 
			
		||||
     * Concatenate `--config` and other CLI options.
 | 
			
		||||
     * @param {ConfigArray} configArray The parent config array.
 | 
			
		||||
     * @param {string} directoryPath The path to the leaf directory to find config files.
 | 
			
		||||
     * @param {boolean} ignoreNotFoundError If `true` then it doesn't throw `ConfigurationNotFoundError`.
 | 
			
		||||
     * @returns {ConfigArray} The loaded config.
 | 
			
		||||
     * @private
 | 
			
		||||
     */
 | 
			
		||||
    _finalizeConfigArray(configArray, directoryPath, ignoreNotFoundError) {
 | 
			
		||||
        const {
 | 
			
		||||
            cliConfigArray,
 | 
			
		||||
            configArrayFactory,
 | 
			
		||||
            finalizeCache,
 | 
			
		||||
            useEslintrc,
 | 
			
		||||
            builtInRules
 | 
			
		||||
        } = internalSlotsMap.get(this);
 | 
			
		||||
 | 
			
		||||
        let finalConfigArray = finalizeCache.get(configArray);
 | 
			
		||||
 | 
			
		||||
        if (!finalConfigArray) {
 | 
			
		||||
            finalConfigArray = configArray;
 | 
			
		||||
 | 
			
		||||
            // Load the personal config if there are no regular config files.
 | 
			
		||||
            if (
 | 
			
		||||
                useEslintrc &&
 | 
			
		||||
                configArray.every(c => !c.filePath) &&
 | 
			
		||||
                cliConfigArray.every(c => !c.filePath) // `--config` option can be a file.
 | 
			
		||||
            ) {
 | 
			
		||||
                const homePath = os.homedir();
 | 
			
		||||
 | 
			
		||||
                debug("Loading the config file of the home directory:", homePath);
 | 
			
		||||
 | 
			
		||||
                const personalConfigArray = configArrayFactory.loadInDirectory(
 | 
			
		||||
                    homePath,
 | 
			
		||||
                    { name: "PersonalConfig" }
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
                if (
 | 
			
		||||
                    personalConfigArray.length > 0 &&
 | 
			
		||||
                    !directoryPath.startsWith(homePath)
 | 
			
		||||
                ) {
 | 
			
		||||
                    const lastElement =
 | 
			
		||||
                        personalConfigArray[personalConfigArray.length - 1];
 | 
			
		||||
 | 
			
		||||
                    emitDeprecationWarning(
 | 
			
		||||
                        lastElement.filePath,
 | 
			
		||||
                        "ESLINT_PERSONAL_CONFIG_LOAD"
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                finalConfigArray = finalConfigArray.concat(personalConfigArray);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Apply CLI options.
 | 
			
		||||
            if (cliConfigArray.length > 0) {
 | 
			
		||||
                finalConfigArray = finalConfigArray.concat(cliConfigArray);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Validate rule settings and environments.
 | 
			
		||||
            const validator = new ConfigValidator({
 | 
			
		||||
                builtInRules
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            validator.validateConfigArray(finalConfigArray);
 | 
			
		||||
 | 
			
		||||
            // Cache it.
 | 
			
		||||
            Object.freeze(finalConfigArray);
 | 
			
		||||
            finalizeCache.set(configArray, finalConfigArray);
 | 
			
		||||
 | 
			
		||||
            debug(
 | 
			
		||||
                "Configuration was determined: %o on %s",
 | 
			
		||||
                finalConfigArray,
 | 
			
		||||
                directoryPath
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // At least one element (the default ignore patterns) exists.
 | 
			
		||||
        if (!ignoreNotFoundError && useEslintrc && finalConfigArray.length <= 1) {
 | 
			
		||||
            throw new ConfigurationNotFoundError(directoryPath);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return finalConfigArray;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export { CascadingConfigArrayFactory };
 | 
			
		||||
							
								
								
									
										1151
									
								
								node_modules/@eslint/eslintrc/lib/config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1151
									
								
								node_modules/@eslint/eslintrc/lib/config-array-factory.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										510
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-array.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										510
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-array.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,510 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `ConfigArray` class.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArray` class expresses the full of a configuration. It has the entry
 | 
			
		||||
 * config file, base config files that were extended, loaded parsers, and loaded
 | 
			
		||||
 * plugins.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArray` class provides three properties and two methods.
 | 
			
		||||
 *
 | 
			
		||||
 * - `pluginEnvironments`
 | 
			
		||||
 * - `pluginProcessors`
 | 
			
		||||
 * - `pluginRules`
 | 
			
		||||
 *      The `Map` objects that contain the members of all plugins that this
 | 
			
		||||
 *      config array contains. Those map objects don't have mutation methods.
 | 
			
		||||
 *      Those keys are the member ID such as `pluginId/memberName`.
 | 
			
		||||
 * - `isRoot()`
 | 
			
		||||
 *      If `true` then this configuration has `root:true` property.
 | 
			
		||||
 * - `extractConfig(filePath)`
 | 
			
		||||
 *      Extract the final configuration for a given file. This means merging
 | 
			
		||||
 *      every config array element which that `criteria` property matched. The
 | 
			
		||||
 *      `filePath` argument must be an absolute path.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArrayFactory` provides the loading logic of config files.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import { ExtractedConfig } from "./extracted-config.js";
 | 
			
		||||
import { IgnorePattern } from "./ignore-pattern.js";
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Define types for VSCode IntelliSense.
 | 
			
		||||
/** @typedef {import("../../shared/types").Environment} Environment */
 | 
			
		||||
/** @typedef {import("../../shared/types").GlobalConf} GlobalConf */
 | 
			
		||||
/** @typedef {import("../../shared/types").RuleConf} RuleConf */
 | 
			
		||||
/** @typedef {import("../../shared/types").Rule} Rule */
 | 
			
		||||
/** @typedef {import("../../shared/types").Plugin} Plugin */
 | 
			
		||||
/** @typedef {import("../../shared/types").Processor} Processor */
 | 
			
		||||
/** @typedef {import("./config-dependency").DependentParser} DependentParser */
 | 
			
		||||
/** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */
 | 
			
		||||
/** @typedef {import("./override-tester")["OverrideTester"]} OverrideTester */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} ConfigArrayElement
 | 
			
		||||
 * @property {string} name The name of this config element.
 | 
			
		||||
 * @property {string} filePath The path to the source file of this config element.
 | 
			
		||||
 * @property {InstanceType<OverrideTester>|null} criteria The tester for the `files` and `excludedFiles` of this config element.
 | 
			
		||||
 * @property {Record<string, boolean>|undefined} env The environment settings.
 | 
			
		||||
 * @property {Record<string, GlobalConf>|undefined} globals The global variable settings.
 | 
			
		||||
 * @property {IgnorePattern|undefined} ignorePattern The ignore patterns.
 | 
			
		||||
 * @property {boolean|undefined} noInlineConfig The flag that disables directive comments.
 | 
			
		||||
 * @property {DependentParser|undefined} parser The parser loader.
 | 
			
		||||
 * @property {Object|undefined} parserOptions The parser options.
 | 
			
		||||
 * @property {Record<string, DependentPlugin>|undefined} plugins The plugin loaders.
 | 
			
		||||
 * @property {string|undefined} processor The processor name to refer plugin's processor.
 | 
			
		||||
 * @property {boolean|undefined} reportUnusedDisableDirectives The flag to report unused `eslint-disable` comments.
 | 
			
		||||
 * @property {boolean|undefined} root The flag to express root.
 | 
			
		||||
 * @property {Record<string, RuleConf>|undefined} rules The rule settings
 | 
			
		||||
 * @property {Object|undefined} settings The shared settings.
 | 
			
		||||
 * @property {"config" | "ignore" | "implicit-processor"} type The element type.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} ConfigArrayInternalSlots
 | 
			
		||||
 * @property {Map<string, ExtractedConfig>} cache The cache to extract configs.
 | 
			
		||||
 * @property {ReadonlyMap<string, Environment>|null} envMap The map from environment ID to environment definition.
 | 
			
		||||
 * @property {ReadonlyMap<string, Processor>|null} processorMap The map from processor ID to environment definition.
 | 
			
		||||
 * @property {ReadonlyMap<string, Rule>|null} ruleMap The map from rule ID to rule definition.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @type {WeakMap<ConfigArray, ConfigArrayInternalSlots>} */
 | 
			
		||||
const internalSlotsMap = new class extends WeakMap {
 | 
			
		||||
    get(key) {
 | 
			
		||||
        let value = super.get(key);
 | 
			
		||||
 | 
			
		||||
        if (!value) {
 | 
			
		||||
            value = {
 | 
			
		||||
                cache: new Map(),
 | 
			
		||||
                envMap: null,
 | 
			
		||||
                processorMap: null,
 | 
			
		||||
                ruleMap: null
 | 
			
		||||
            };
 | 
			
		||||
            super.set(key, value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
}();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the indices which are matched to a given file.
 | 
			
		||||
 * @param {ConfigArrayElement[]} elements The elements.
 | 
			
		||||
 * @param {string} filePath The path to a target file.
 | 
			
		||||
 * @returns {number[]} The indices.
 | 
			
		||||
 */
 | 
			
		||||
function getMatchedIndices(elements, filePath) {
 | 
			
		||||
    const indices = [];
 | 
			
		||||
 | 
			
		||||
    for (let i = elements.length - 1; i >= 0; --i) {
 | 
			
		||||
        const element = elements[i];
 | 
			
		||||
 | 
			
		||||
        if (!element.criteria || (filePath && element.criteria.test(filePath))) {
 | 
			
		||||
            indices.push(i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return indices;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check if a value is a non-null object.
 | 
			
		||||
 * @param {any} x The value to check.
 | 
			
		||||
 * @returns {boolean} `true` if the value is a non-null object.
 | 
			
		||||
 */
 | 
			
		||||
function isNonNullObject(x) {
 | 
			
		||||
    return typeof x === "object" && x !== null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Merge two objects.
 | 
			
		||||
 *
 | 
			
		||||
 * Assign every property values of `y` to `x` if `x` doesn't have the property.
 | 
			
		||||
 * If `x`'s property value is an object, it does recursive.
 | 
			
		||||
 * @param {Object} target The destination to merge
 | 
			
		||||
 * @param {Object|undefined} source The source to merge.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function mergeWithoutOverwrite(target, source) {
 | 
			
		||||
    if (!isNonNullObject(source)) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const key of Object.keys(source)) {
 | 
			
		||||
        if (key === "__proto__") {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (isNonNullObject(target[key])) {
 | 
			
		||||
            mergeWithoutOverwrite(target[key], source[key]);
 | 
			
		||||
        } else if (target[key] === void 0) {
 | 
			
		||||
            if (isNonNullObject(source[key])) {
 | 
			
		||||
                target[key] = Array.isArray(source[key]) ? [] : {};
 | 
			
		||||
                mergeWithoutOverwrite(target[key], source[key]);
 | 
			
		||||
            } else if (source[key] !== void 0) {
 | 
			
		||||
                target[key] = source[key];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The error for plugin conflicts.
 | 
			
		||||
 */
 | 
			
		||||
class PluginConflictError extends Error {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialize this error object.
 | 
			
		||||
     * @param {string} pluginId The plugin ID.
 | 
			
		||||
     * @param {{filePath:string, importerName:string}[]} plugins The resolved plugins.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(pluginId, plugins) {
 | 
			
		||||
        super(`Plugin "${pluginId}" was conflicted between ${plugins.map(p => `"${p.importerName}"`).join(" and ")}.`);
 | 
			
		||||
        this.messageTemplate = "plugin-conflict";
 | 
			
		||||
        this.messageData = { pluginId, plugins };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Merge plugins.
 | 
			
		||||
 * `target`'s definition is prior to `source`'s.
 | 
			
		||||
 * @param {Record<string, DependentPlugin>} target The destination to merge
 | 
			
		||||
 * @param {Record<string, DependentPlugin>|undefined} source The source to merge.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function mergePlugins(target, source) {
 | 
			
		||||
    if (!isNonNullObject(source)) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const key of Object.keys(source)) {
 | 
			
		||||
        if (key === "__proto__") {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        const targetValue = target[key];
 | 
			
		||||
        const sourceValue = source[key];
 | 
			
		||||
 | 
			
		||||
        // Adopt the plugin which was found at first.
 | 
			
		||||
        if (targetValue === void 0) {
 | 
			
		||||
            if (sourceValue.error) {
 | 
			
		||||
                throw sourceValue.error;
 | 
			
		||||
            }
 | 
			
		||||
            target[key] = sourceValue;
 | 
			
		||||
        } else if (sourceValue.filePath !== targetValue.filePath) {
 | 
			
		||||
            throw new PluginConflictError(key, [
 | 
			
		||||
                {
 | 
			
		||||
                    filePath: targetValue.filePath,
 | 
			
		||||
                    importerName: targetValue.importerName
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    filePath: sourceValue.filePath,
 | 
			
		||||
                    importerName: sourceValue.importerName
 | 
			
		||||
                }
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Merge rule configs.
 | 
			
		||||
 * `target`'s definition is prior to `source`'s.
 | 
			
		||||
 * @param {Record<string, Array>} target The destination to merge
 | 
			
		||||
 * @param {Record<string, RuleConf>|undefined} source The source to merge.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function mergeRuleConfigs(target, source) {
 | 
			
		||||
    if (!isNonNullObject(source)) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const key of Object.keys(source)) {
 | 
			
		||||
        if (key === "__proto__") {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        const targetDef = target[key];
 | 
			
		||||
        const sourceDef = source[key];
 | 
			
		||||
 | 
			
		||||
        // Adopt the rule config which was found at first.
 | 
			
		||||
        if (targetDef === void 0) {
 | 
			
		||||
            if (Array.isArray(sourceDef)) {
 | 
			
		||||
                target[key] = [...sourceDef];
 | 
			
		||||
            } else {
 | 
			
		||||
                target[key] = [sourceDef];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        /*
 | 
			
		||||
         * If the first found rule config is severity only and the current rule
 | 
			
		||||
         * config has options, merge the severity and the options.
 | 
			
		||||
         */
 | 
			
		||||
        } else if (
 | 
			
		||||
            targetDef.length === 1 &&
 | 
			
		||||
            Array.isArray(sourceDef) &&
 | 
			
		||||
            sourceDef.length >= 2
 | 
			
		||||
        ) {
 | 
			
		||||
            targetDef.push(...sourceDef.slice(1));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create the extracted config.
 | 
			
		||||
 * @param {ConfigArray} instance The config elements.
 | 
			
		||||
 * @param {number[]} indices The indices to use.
 | 
			
		||||
 * @returns {ExtractedConfig} The extracted config.
 | 
			
		||||
 */
 | 
			
		||||
function createConfig(instance, indices) {
 | 
			
		||||
    const config = new ExtractedConfig();
 | 
			
		||||
    const ignorePatterns = [];
 | 
			
		||||
 | 
			
		||||
    // Merge elements.
 | 
			
		||||
    for (const index of indices) {
 | 
			
		||||
        const element = instance[index];
 | 
			
		||||
 | 
			
		||||
        // Adopt the parser which was found at first.
 | 
			
		||||
        if (!config.parser && element.parser) {
 | 
			
		||||
            if (element.parser.error) {
 | 
			
		||||
                throw element.parser.error;
 | 
			
		||||
            }
 | 
			
		||||
            config.parser = element.parser;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Adopt the processor which was found at first.
 | 
			
		||||
        if (!config.processor && element.processor) {
 | 
			
		||||
            config.processor = element.processor;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Adopt the noInlineConfig which was found at first.
 | 
			
		||||
        if (config.noInlineConfig === void 0 && element.noInlineConfig !== void 0) {
 | 
			
		||||
            config.noInlineConfig = element.noInlineConfig;
 | 
			
		||||
            config.configNameOfNoInlineConfig = element.name;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Adopt the reportUnusedDisableDirectives which was found at first.
 | 
			
		||||
        if (config.reportUnusedDisableDirectives === void 0 && element.reportUnusedDisableDirectives !== void 0) {
 | 
			
		||||
            config.reportUnusedDisableDirectives = element.reportUnusedDisableDirectives;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Collect ignorePatterns
 | 
			
		||||
        if (element.ignorePattern) {
 | 
			
		||||
            ignorePatterns.push(element.ignorePattern);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Merge others.
 | 
			
		||||
        mergeWithoutOverwrite(config.env, element.env);
 | 
			
		||||
        mergeWithoutOverwrite(config.globals, element.globals);
 | 
			
		||||
        mergeWithoutOverwrite(config.parserOptions, element.parserOptions);
 | 
			
		||||
        mergeWithoutOverwrite(config.settings, element.settings);
 | 
			
		||||
        mergePlugins(config.plugins, element.plugins);
 | 
			
		||||
        mergeRuleConfigs(config.rules, element.rules);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Create the predicate function for ignore patterns.
 | 
			
		||||
    if (ignorePatterns.length > 0) {
 | 
			
		||||
        config.ignores = IgnorePattern.createIgnore(ignorePatterns.reverse());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return config;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Collect definitions.
 | 
			
		||||
 * @template T, U
 | 
			
		||||
 * @param {string} pluginId The plugin ID for prefix.
 | 
			
		||||
 * @param {Record<string,T>} defs The definitions to collect.
 | 
			
		||||
 * @param {Map<string, U>} map The map to output.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function collect(pluginId, defs, map) {
 | 
			
		||||
    if (defs) {
 | 
			
		||||
        const prefix = pluginId && `${pluginId}/`;
 | 
			
		||||
 | 
			
		||||
        for (const [key, value] of Object.entries(defs)) {
 | 
			
		||||
            map.set(`${prefix}${key}`, value);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Delete the mutation methods from a given map.
 | 
			
		||||
 * @param {Map<any, any>} map The map object to delete.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function deleteMutationMethods(map) {
 | 
			
		||||
    Object.defineProperties(map, {
 | 
			
		||||
        clear: { configurable: true, value: void 0 },
 | 
			
		||||
        delete: { configurable: true, value: void 0 },
 | 
			
		||||
        set: { configurable: true, value: void 0 }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array.
 | 
			
		||||
 * @param {ConfigArrayElement[]} elements The config elements.
 | 
			
		||||
 * @param {ConfigArrayInternalSlots} slots The internal slots.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function initPluginMemberMaps(elements, slots) {
 | 
			
		||||
    const processed = new Set();
 | 
			
		||||
 | 
			
		||||
    slots.envMap = new Map();
 | 
			
		||||
    slots.processorMap = new Map();
 | 
			
		||||
    slots.ruleMap = new Map();
 | 
			
		||||
 | 
			
		||||
    for (const element of elements) {
 | 
			
		||||
        if (!element.plugins) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (const [pluginId, value] of Object.entries(element.plugins)) {
 | 
			
		||||
            const plugin = value.definition;
 | 
			
		||||
 | 
			
		||||
            if (!plugin || processed.has(pluginId)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            processed.add(pluginId);
 | 
			
		||||
 | 
			
		||||
            collect(pluginId, plugin.environments, slots.envMap);
 | 
			
		||||
            collect(pluginId, plugin.processors, slots.processorMap);
 | 
			
		||||
            collect(pluginId, plugin.rules, slots.ruleMap);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    deleteMutationMethods(slots.envMap);
 | 
			
		||||
    deleteMutationMethods(slots.processorMap);
 | 
			
		||||
    deleteMutationMethods(slots.ruleMap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create `envMap`, `processorMap`, `ruleMap` with the plugins in the config array.
 | 
			
		||||
 * @param {ConfigArray} instance The config elements.
 | 
			
		||||
 * @returns {ConfigArrayInternalSlots} The extracted config.
 | 
			
		||||
 */
 | 
			
		||||
function ensurePluginMemberMaps(instance) {
 | 
			
		||||
    const slots = internalSlotsMap.get(instance);
 | 
			
		||||
 | 
			
		||||
    if (!slots.ruleMap) {
 | 
			
		||||
        initPluginMemberMaps(instance, slots);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return slots;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The Config Array.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArray` instance contains all settings, parsers, and plugins.
 | 
			
		||||
 * You need to call `ConfigArray#extractConfig(filePath)` method in order to
 | 
			
		||||
 * extract, merge and get only the config data which is related to an arbitrary
 | 
			
		||||
 * file.
 | 
			
		||||
 * @extends {Array<ConfigArrayElement>}
 | 
			
		||||
 */
 | 
			
		||||
class ConfigArray extends Array {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the plugin environments.
 | 
			
		||||
     * The returned map cannot be mutated.
 | 
			
		||||
     * @type {ReadonlyMap<string, Environment>} The plugin environments.
 | 
			
		||||
     */
 | 
			
		||||
    get pluginEnvironments() {
 | 
			
		||||
        return ensurePluginMemberMaps(this).envMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the plugin processors.
 | 
			
		||||
     * The returned map cannot be mutated.
 | 
			
		||||
     * @type {ReadonlyMap<string, Processor>} The plugin processors.
 | 
			
		||||
     */
 | 
			
		||||
    get pluginProcessors() {
 | 
			
		||||
        return ensurePluginMemberMaps(this).processorMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get the plugin rules.
 | 
			
		||||
     * The returned map cannot be mutated.
 | 
			
		||||
     * @returns {ReadonlyMap<string, Rule>} The plugin rules.
 | 
			
		||||
     */
 | 
			
		||||
    get pluginRules() {
 | 
			
		||||
        return ensurePluginMemberMaps(this).ruleMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if this config has `root` flag.
 | 
			
		||||
     * @returns {boolean} `true` if this config array is root.
 | 
			
		||||
     */
 | 
			
		||||
    isRoot() {
 | 
			
		||||
        for (let i = this.length - 1; i >= 0; --i) {
 | 
			
		||||
            const root = this[i].root;
 | 
			
		||||
 | 
			
		||||
            if (typeof root === "boolean") {
 | 
			
		||||
                return root;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Extract the config data which is related to a given file.
 | 
			
		||||
     * @param {string} filePath The absolute path to the target file.
 | 
			
		||||
     * @returns {ExtractedConfig} The extracted config data.
 | 
			
		||||
     */
 | 
			
		||||
    extractConfig(filePath) {
 | 
			
		||||
        const { cache } = internalSlotsMap.get(this);
 | 
			
		||||
        const indices = getMatchedIndices(this, filePath);
 | 
			
		||||
        const cacheKey = indices.join(",");
 | 
			
		||||
 | 
			
		||||
        if (!cache.has(cacheKey)) {
 | 
			
		||||
            cache.set(cacheKey, createConfig(this, indices));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return cache.get(cacheKey);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if a given path is an additional lint target.
 | 
			
		||||
     * @param {string} filePath The absolute path to the target file.
 | 
			
		||||
     * @returns {boolean} `true` if the file is an additional lint target.
 | 
			
		||||
     */
 | 
			
		||||
    isAdditionalTargetPath(filePath) {
 | 
			
		||||
        for (const { criteria, type } of this) {
 | 
			
		||||
            if (
 | 
			
		||||
                type === "config" &&
 | 
			
		||||
                criteria &&
 | 
			
		||||
                !criteria.endsWithWildcard &&
 | 
			
		||||
                criteria.test(filePath)
 | 
			
		||||
            ) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the used extracted configs.
 | 
			
		||||
 * CLIEngine will use this method to collect used deprecated rules.
 | 
			
		||||
 * @param {ConfigArray} instance The config array object to get.
 | 
			
		||||
 * @returns {ExtractedConfig[]} The used extracted configs.
 | 
			
		||||
 * @private
 | 
			
		||||
 */
 | 
			
		||||
function getUsedExtractedConfigs(instance) {
 | 
			
		||||
    const { cache } = internalSlotsMap.get(instance);
 | 
			
		||||
 | 
			
		||||
    return Array.from(cache.values());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    ConfigArray,
 | 
			
		||||
    getUsedExtractedConfigs
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										124
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								node_modules/@eslint/eslintrc/lib/config-array/config-dependency.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,124 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `ConfigDependency` class.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigDependency` class expresses a loaded parser or plugin.
 | 
			
		||||
 *
 | 
			
		||||
 * If the parser or plugin was loaded successfully, it has `definition` property
 | 
			
		||||
 * and `filePath` property. Otherwise, it has `error` property.
 | 
			
		||||
 *
 | 
			
		||||
 * When `JSON.stringify()` converted a `ConfigDependency` object to a JSON, it
 | 
			
		||||
 * omits `definition` property.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArrayFactory` creates `ConfigDependency` objects when it loads parsers
 | 
			
		||||
 * or plugins.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import util from "util";
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The class is to store parsers or plugins.
 | 
			
		||||
 * This class hides the loaded object from `JSON.stringify()` and `console.log`.
 | 
			
		||||
 * @template T
 | 
			
		||||
 */
 | 
			
		||||
class ConfigDependency {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialize this instance.
 | 
			
		||||
     * @param {Object} data The dependency data.
 | 
			
		||||
     * @param {T} [data.definition] The dependency if the loading succeeded.
 | 
			
		||||
     * @param {T} [data.original] The original, non-normalized dependency if the loading succeeded.
 | 
			
		||||
     * @param {Error} [data.error] The error object if the loading failed.
 | 
			
		||||
     * @param {string} [data.filePath] The actual path to the dependency if the loading succeeded.
 | 
			
		||||
     * @param {string} data.id The ID of this dependency.
 | 
			
		||||
     * @param {string} data.importerName The name of the config file which loads this dependency.
 | 
			
		||||
     * @param {string} data.importerPath The path to the config file which loads this dependency.
 | 
			
		||||
     */
 | 
			
		||||
    constructor({
 | 
			
		||||
        definition = null,
 | 
			
		||||
        original = null,
 | 
			
		||||
        error = null,
 | 
			
		||||
        filePath = null,
 | 
			
		||||
        id,
 | 
			
		||||
        importerName,
 | 
			
		||||
        importerPath
 | 
			
		||||
    }) {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The loaded dependency if the loading succeeded.
 | 
			
		||||
         * @type {T|null}
 | 
			
		||||
         */
 | 
			
		||||
        this.definition = definition;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The original dependency as loaded directly from disk if the loading succeeded.
 | 
			
		||||
         * @type {T|null}
 | 
			
		||||
         */
 | 
			
		||||
        this.original = original;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The error object if the loading failed.
 | 
			
		||||
         * @type {Error|null}
 | 
			
		||||
         */
 | 
			
		||||
        this.error = error;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The loaded dependency if the loading succeeded.
 | 
			
		||||
         * @type {string|null}
 | 
			
		||||
         */
 | 
			
		||||
        this.filePath = filePath;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The ID of this dependency.
 | 
			
		||||
         * @type {string}
 | 
			
		||||
         */
 | 
			
		||||
        this.id = id;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The name of the config file which loads this dependency.
 | 
			
		||||
         * @type {string}
 | 
			
		||||
         */
 | 
			
		||||
        this.importerName = importerName;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The path to the config file which loads this dependency.
 | 
			
		||||
         * @type {string}
 | 
			
		||||
         */
 | 
			
		||||
        this.importerPath = importerPath;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line jsdoc/require-description
 | 
			
		||||
    /**
 | 
			
		||||
     * @returns {Object} a JSON compatible object.
 | 
			
		||||
     */
 | 
			
		||||
    toJSON() {
 | 
			
		||||
        const obj = this[util.inspect.custom]();
 | 
			
		||||
 | 
			
		||||
        // Display `error.message` (`Error#message` is unenumerable).
 | 
			
		||||
        if (obj.error instanceof Error) {
 | 
			
		||||
            obj.error = { ...obj.error, message: obj.error.message };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return obj;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line jsdoc/require-description
 | 
			
		||||
    /**
 | 
			
		||||
     * @returns {Object} an object to display by `console.log()`.
 | 
			
		||||
     */
 | 
			
		||||
    [util.inspect.custom]() {
 | 
			
		||||
        const {
 | 
			
		||||
            definition: _ignore1, // eslint-disable-line no-unused-vars
 | 
			
		||||
            original: _ignore2, // eslint-disable-line no-unused-vars
 | 
			
		||||
            ...obj
 | 
			
		||||
        } = this;
 | 
			
		||||
 | 
			
		||||
        return obj;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @typedef {ConfigDependency<import("../../shared/types").Parser>} DependentParser */
 | 
			
		||||
/** @typedef {ConfigDependency<import("../../shared/types").Plugin>} DependentPlugin */
 | 
			
		||||
 | 
			
		||||
export { ConfigDependency };
 | 
			
		||||
							
								
								
									
										145
									
								
								node_modules/@eslint/eslintrc/lib/config-array/extracted-config.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								node_modules/@eslint/eslintrc/lib/config-array/extracted-config.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,145 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `ExtractedConfig` class.
 | 
			
		||||
 *
 | 
			
		||||
 * `ExtractedConfig` class expresses a final configuration for a specific file.
 | 
			
		||||
 *
 | 
			
		||||
 * It provides one method.
 | 
			
		||||
 *
 | 
			
		||||
 * - `toCompatibleObjectAsConfigFileContent()`
 | 
			
		||||
 *      Convert this configuration to the compatible object as the content of
 | 
			
		||||
 *      config files. It converts the loaded parser and plugins to strings.
 | 
			
		||||
 *      `CLIEngine#getConfigForFile(filePath)` method uses this method.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArray#extractConfig(filePath)` creates a `ExtractedConfig` instance.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { IgnorePattern } from "./ignore-pattern.js";
 | 
			
		||||
 | 
			
		||||
// For VSCode intellisense
 | 
			
		||||
/** @typedef {import("../../shared/types").ConfigData} ConfigData */
 | 
			
		||||
/** @typedef {import("../../shared/types").GlobalConf} GlobalConf */
 | 
			
		||||
/** @typedef {import("../../shared/types").SeverityConf} SeverityConf */
 | 
			
		||||
/** @typedef {import("./config-dependency").DependentParser} DependentParser */
 | 
			
		||||
/** @typedef {import("./config-dependency").DependentPlugin} DependentPlugin */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check if `xs` starts with `ys`.
 | 
			
		||||
 * @template T
 | 
			
		||||
 * @param {T[]} xs The array to check.
 | 
			
		||||
 * @param {T[]} ys The array that may be the first part of `xs`.
 | 
			
		||||
 * @returns {boolean} `true` if `xs` starts with `ys`.
 | 
			
		||||
 */
 | 
			
		||||
function startsWith(xs, ys) {
 | 
			
		||||
    return xs.length >= ys.length && ys.every((y, i) => y === xs[i]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The class for extracted config data.
 | 
			
		||||
 */
 | 
			
		||||
class ExtractedConfig {
 | 
			
		||||
    constructor() {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The config name what `noInlineConfig` setting came from.
 | 
			
		||||
         * @type {string}
 | 
			
		||||
         */
 | 
			
		||||
        this.configNameOfNoInlineConfig = "";
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Environments.
 | 
			
		||||
         * @type {Record<string, boolean>}
 | 
			
		||||
         */
 | 
			
		||||
        this.env = {};
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Global variables.
 | 
			
		||||
         * @type {Record<string, GlobalConf>}
 | 
			
		||||
         */
 | 
			
		||||
        this.globals = {};
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The glob patterns that ignore to lint.
 | 
			
		||||
         * @type {(((filePath:string, dot?:boolean) => boolean) & { basePath:string; patterns:string[] }) | undefined}
 | 
			
		||||
         */
 | 
			
		||||
        this.ignores = void 0;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The flag that disables directive comments.
 | 
			
		||||
         * @type {boolean|undefined}
 | 
			
		||||
         */
 | 
			
		||||
        this.noInlineConfig = void 0;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Parser definition.
 | 
			
		||||
         * @type {DependentParser|null}
 | 
			
		||||
         */
 | 
			
		||||
        this.parser = null;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Options for the parser.
 | 
			
		||||
         * @type {Object}
 | 
			
		||||
         */
 | 
			
		||||
        this.parserOptions = {};
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Plugin definitions.
 | 
			
		||||
         * @type {Record<string, DependentPlugin>}
 | 
			
		||||
         */
 | 
			
		||||
        this.plugins = {};
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Processor ID.
 | 
			
		||||
         * @type {string|null}
 | 
			
		||||
         */
 | 
			
		||||
        this.processor = null;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The flag that reports unused `eslint-disable` directive comments.
 | 
			
		||||
         * @type {boolean|undefined}
 | 
			
		||||
         */
 | 
			
		||||
        this.reportUnusedDisableDirectives = void 0;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Rule settings.
 | 
			
		||||
         * @type {Record<string, [SeverityConf, ...any[]]>}
 | 
			
		||||
         */
 | 
			
		||||
        this.rules = {};
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Shared settings.
 | 
			
		||||
         * @type {Object}
 | 
			
		||||
         */
 | 
			
		||||
        this.settings = {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Convert this config to the compatible object as a config file content.
 | 
			
		||||
     * @returns {ConfigData} The converted object.
 | 
			
		||||
     */
 | 
			
		||||
    toCompatibleObjectAsConfigFileContent() {
 | 
			
		||||
        const {
 | 
			
		||||
            /* eslint-disable no-unused-vars */
 | 
			
		||||
            configNameOfNoInlineConfig: _ignore1,
 | 
			
		||||
            processor: _ignore2,
 | 
			
		||||
            /* eslint-enable no-unused-vars */
 | 
			
		||||
            ignores,
 | 
			
		||||
            ...config
 | 
			
		||||
        } = this;
 | 
			
		||||
 | 
			
		||||
        config.parser = config.parser && config.parser.filePath;
 | 
			
		||||
        config.plugins = Object.keys(config.plugins).filter(Boolean).reverse();
 | 
			
		||||
        config.ignorePatterns = ignores ? ignores.patterns : [];
 | 
			
		||||
 | 
			
		||||
        // Strip the default patterns from `ignorePatterns`.
 | 
			
		||||
        if (startsWith(config.ignorePatterns, IgnorePattern.DefaultPatterns)) {
 | 
			
		||||
            config.ignorePatterns =
 | 
			
		||||
                config.ignorePatterns.slice(IgnorePattern.DefaultPatterns.length);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return config;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { ExtractedConfig };
 | 
			
		||||
							
								
								
									
										238
									
								
								node_modules/@eslint/eslintrc/lib/config-array/ignore-pattern.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								node_modules/@eslint/eslintrc/lib/config-array/ignore-pattern.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,238 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `IgnorePattern` class.
 | 
			
		||||
 *
 | 
			
		||||
 * `IgnorePattern` class has the set of glob patterns and the base path.
 | 
			
		||||
 *
 | 
			
		||||
 * It provides two static methods.
 | 
			
		||||
 *
 | 
			
		||||
 * - `IgnorePattern.createDefaultIgnore(cwd)`
 | 
			
		||||
 *      Create the default predicate function.
 | 
			
		||||
 * - `IgnorePattern.createIgnore(ignorePatterns)`
 | 
			
		||||
 *      Create the predicate function from multiple `IgnorePattern` objects.
 | 
			
		||||
 *
 | 
			
		||||
 * It provides two properties and a method.
 | 
			
		||||
 *
 | 
			
		||||
 * - `patterns`
 | 
			
		||||
 *      The glob patterns that ignore to lint.
 | 
			
		||||
 * - `basePath`
 | 
			
		||||
 *      The base path of the glob patterns. If absolute paths existed in the
 | 
			
		||||
 *      glob patterns, those are handled as relative paths to the base path.
 | 
			
		||||
 * - `getPatternsRelativeTo(basePath)`
 | 
			
		||||
 *      Get `patterns` as modified for a given base path. It modifies the
 | 
			
		||||
 *      absolute paths in the patterns as prepending the difference of two base
 | 
			
		||||
 *      paths.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArrayFactory` creates `IgnorePattern` objects when it processes
 | 
			
		||||
 * `ignorePatterns` properties.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import assert from "assert";
 | 
			
		||||
import path from "path";
 | 
			
		||||
import ignore from "ignore";
 | 
			
		||||
import debugOrig from "debug";
 | 
			
		||||
 | 
			
		||||
const debug = debugOrig("eslintrc:ignore-pattern");
 | 
			
		||||
 | 
			
		||||
/** @typedef {ReturnType<import("ignore").default>} Ignore */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the path to the common ancestor directory of given paths.
 | 
			
		||||
 * @param {string[]} sourcePaths The paths to calculate the common ancestor.
 | 
			
		||||
 * @returns {string} The path to the common ancestor directory.
 | 
			
		||||
 */
 | 
			
		||||
function getCommonAncestorPath(sourcePaths) {
 | 
			
		||||
    let result = sourcePaths[0];
 | 
			
		||||
 | 
			
		||||
    for (let i = 1; i < sourcePaths.length; ++i) {
 | 
			
		||||
        const a = result;
 | 
			
		||||
        const b = sourcePaths[i];
 | 
			
		||||
 | 
			
		||||
        // Set the shorter one (it's the common ancestor if one includes the other).
 | 
			
		||||
        result = a.length < b.length ? a : b;
 | 
			
		||||
 | 
			
		||||
        // Set the common ancestor.
 | 
			
		||||
        for (let j = 0, lastSepPos = 0; j < a.length && j < b.length; ++j) {
 | 
			
		||||
            if (a[j] !== b[j]) {
 | 
			
		||||
                result = a.slice(0, lastSepPos);
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            if (a[j] === path.sep) {
 | 
			
		||||
                lastSepPos = j;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let resolvedResult = result || path.sep;
 | 
			
		||||
 | 
			
		||||
    // if Windows common ancestor is root of drive must have trailing slash to be absolute.
 | 
			
		||||
    if (resolvedResult && resolvedResult.endsWith(":") && process.platform === "win32") {
 | 
			
		||||
        resolvedResult += path.sep;
 | 
			
		||||
    }
 | 
			
		||||
    return resolvedResult;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Make relative path.
 | 
			
		||||
 * @param {string} from The source path to get relative path.
 | 
			
		||||
 * @param {string} to The destination path to get relative path.
 | 
			
		||||
 * @returns {string} The relative path.
 | 
			
		||||
 */
 | 
			
		||||
function relative(from, to) {
 | 
			
		||||
    const relPath = path.relative(from, to);
 | 
			
		||||
 | 
			
		||||
    if (path.sep === "/") {
 | 
			
		||||
        return relPath;
 | 
			
		||||
    }
 | 
			
		||||
    return relPath.split(path.sep).join("/");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the trailing slash if existed.
 | 
			
		||||
 * @param {string} filePath The path to check.
 | 
			
		||||
 * @returns {string} The trailing slash if existed.
 | 
			
		||||
 */
 | 
			
		||||
function dirSuffix(filePath) {
 | 
			
		||||
    const isDir = (
 | 
			
		||||
        filePath.endsWith(path.sep) ||
 | 
			
		||||
        (process.platform === "win32" && filePath.endsWith("/"))
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return isDir ? "/" : "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const DefaultPatterns = Object.freeze(["/**/node_modules/*"]);
 | 
			
		||||
const DotPatterns = Object.freeze([".*", "!.eslintrc.*", "!../"]);
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
class IgnorePattern {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The default patterns.
 | 
			
		||||
     * @type {string[]}
 | 
			
		||||
     */
 | 
			
		||||
    static get DefaultPatterns() {
 | 
			
		||||
        return DefaultPatterns;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create the default predicate function.
 | 
			
		||||
     * @param {string} cwd The current working directory.
 | 
			
		||||
     * @returns {((filePath:string, dot:boolean) => boolean) & {basePath:string; patterns:string[]}}
 | 
			
		||||
     * The preficate function.
 | 
			
		||||
     * The first argument is an absolute path that is checked.
 | 
			
		||||
     * The second argument is the flag to not ignore dotfiles.
 | 
			
		||||
     * If the predicate function returned `true`, it means the path should be ignored.
 | 
			
		||||
     */
 | 
			
		||||
    static createDefaultIgnore(cwd) {
 | 
			
		||||
        return this.createIgnore([new IgnorePattern(DefaultPatterns, cwd)]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create the predicate function from multiple `IgnorePattern` objects.
 | 
			
		||||
     * @param {IgnorePattern[]} ignorePatterns The list of ignore patterns.
 | 
			
		||||
     * @returns {((filePath:string, dot?:boolean) => boolean) & {basePath:string; patterns:string[]}}
 | 
			
		||||
     * The preficate function.
 | 
			
		||||
     * The first argument is an absolute path that is checked.
 | 
			
		||||
     * The second argument is the flag to not ignore dotfiles.
 | 
			
		||||
     * If the predicate function returned `true`, it means the path should be ignored.
 | 
			
		||||
     */
 | 
			
		||||
    static createIgnore(ignorePatterns) {
 | 
			
		||||
        debug("Create with: %o", ignorePatterns);
 | 
			
		||||
 | 
			
		||||
        const basePath = getCommonAncestorPath(ignorePatterns.map(p => p.basePath));
 | 
			
		||||
        const patterns = [].concat(
 | 
			
		||||
            ...ignorePatterns.map(p => p.getPatternsRelativeTo(basePath))
 | 
			
		||||
        );
 | 
			
		||||
        const ig = ignore({ allowRelativePaths: true }).add([...DotPatterns, ...patterns]);
 | 
			
		||||
        const dotIg = ignore({ allowRelativePaths: true }).add(patterns);
 | 
			
		||||
 | 
			
		||||
        debug("  processed: %o", { basePath, patterns });
 | 
			
		||||
 | 
			
		||||
        return Object.assign(
 | 
			
		||||
            (filePath, dot = false) => {
 | 
			
		||||
                assert(path.isAbsolute(filePath), "'filePath' should be an absolute path.");
 | 
			
		||||
                const relPathRaw = relative(basePath, filePath);
 | 
			
		||||
                const relPath = relPathRaw && (relPathRaw + dirSuffix(filePath));
 | 
			
		||||
                const adoptedIg = dot ? dotIg : ig;
 | 
			
		||||
                const result = relPath !== "" && adoptedIg.ignores(relPath);
 | 
			
		||||
 | 
			
		||||
                debug("Check", { filePath, dot, relativePath: relPath, result });
 | 
			
		||||
                return result;
 | 
			
		||||
            },
 | 
			
		||||
            { basePath, patterns }
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialize a new `IgnorePattern` instance.
 | 
			
		||||
     * @param {string[]} patterns The glob patterns that ignore to lint.
 | 
			
		||||
     * @param {string} basePath The base path of `patterns`.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(patterns, basePath) {
 | 
			
		||||
        assert(path.isAbsolute(basePath), "'basePath' should be an absolute path.");
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The glob patterns that ignore to lint.
 | 
			
		||||
         * @type {string[]}
 | 
			
		||||
         */
 | 
			
		||||
        this.patterns = patterns;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * The base path of `patterns`.
 | 
			
		||||
         * @type {string}
 | 
			
		||||
         */
 | 
			
		||||
        this.basePath = basePath;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * If `true` then patterns which don't start with `/` will match the paths to the outside of `basePath`. Defaults to `false`.
 | 
			
		||||
         *
 | 
			
		||||
         * It's set `true` for `.eslintignore`, `package.json`, and `--ignore-path` for backward compatibility.
 | 
			
		||||
         * It's `false` as-is for `ignorePatterns` property in config files.
 | 
			
		||||
         * @type {boolean}
 | 
			
		||||
         */
 | 
			
		||||
        this.loose = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get `patterns` as modified for a given base path. It modifies the
 | 
			
		||||
     * absolute paths in the patterns as prepending the difference of two base
 | 
			
		||||
     * paths.
 | 
			
		||||
     * @param {string} newBasePath The base path.
 | 
			
		||||
     * @returns {string[]} Modifired patterns.
 | 
			
		||||
     */
 | 
			
		||||
    getPatternsRelativeTo(newBasePath) {
 | 
			
		||||
        assert(path.isAbsolute(newBasePath), "'newBasePath' should be an absolute path.");
 | 
			
		||||
        const { basePath, loose, patterns } = this;
 | 
			
		||||
 | 
			
		||||
        if (newBasePath === basePath) {
 | 
			
		||||
            return patterns;
 | 
			
		||||
        }
 | 
			
		||||
        const prefix = `/${relative(newBasePath, basePath)}`;
 | 
			
		||||
 | 
			
		||||
        return patterns.map(pattern => {
 | 
			
		||||
            const negative = pattern.startsWith("!");
 | 
			
		||||
            const head = negative ? "!" : "";
 | 
			
		||||
            const body = negative ? pattern.slice(1) : pattern;
 | 
			
		||||
 | 
			
		||||
            if (body.startsWith("/") || body.startsWith("../")) {
 | 
			
		||||
                return `${head}${prefix}${body}`;
 | 
			
		||||
            }
 | 
			
		||||
            return loose ? pattern : `${head}${prefix}/**/${body}`;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { IgnorePattern };
 | 
			
		||||
							
								
								
									
										19
									
								
								node_modules/@eslint/eslintrc/lib/config-array/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								node_modules/@eslint/eslintrc/lib/config-array/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `ConfigArray` class.
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { ConfigArray, getUsedExtractedConfigs } from "./config-array.js";
 | 
			
		||||
import { ConfigDependency } from "./config-dependency.js";
 | 
			
		||||
import { ExtractedConfig } from "./extracted-config.js";
 | 
			
		||||
import { IgnorePattern } from "./ignore-pattern.js";
 | 
			
		||||
import { OverrideTester } from "./override-tester.js";
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    ConfigArray,
 | 
			
		||||
    ConfigDependency,
 | 
			
		||||
    ExtractedConfig,
 | 
			
		||||
    IgnorePattern,
 | 
			
		||||
    OverrideTester,
 | 
			
		||||
    getUsedExtractedConfigs
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										225
									
								
								node_modules/@eslint/eslintrc/lib/config-array/override-tester.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								node_modules/@eslint/eslintrc/lib/config-array/override-tester.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,225 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview `OverrideTester` class.
 | 
			
		||||
 *
 | 
			
		||||
 * `OverrideTester` class handles `files` property and `excludedFiles` property
 | 
			
		||||
 * of `overrides` config.
 | 
			
		||||
 *
 | 
			
		||||
 * It provides one method.
 | 
			
		||||
 *
 | 
			
		||||
 * - `test(filePath)`
 | 
			
		||||
 *      Test if a file path matches the pair of `files` property and
 | 
			
		||||
 *      `excludedFiles` property. The `filePath` argument must be an absolute
 | 
			
		||||
 *      path.
 | 
			
		||||
 *
 | 
			
		||||
 * `ConfigArrayFactory` creates `OverrideTester` objects when it processes
 | 
			
		||||
 * `overrides` properties.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import assert from "assert";
 | 
			
		||||
import path from "path";
 | 
			
		||||
import util from "util";
 | 
			
		||||
import minimatch from "minimatch";
 | 
			
		||||
 | 
			
		||||
const { Minimatch } = minimatch;
 | 
			
		||||
 | 
			
		||||
const minimatchOpts = { dot: true, matchBase: true };
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} Pattern
 | 
			
		||||
 * @property {InstanceType<Minimatch>[] | null} includes The positive matchers.
 | 
			
		||||
 * @property {InstanceType<Minimatch>[] | null} excludes The negative matchers.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Normalize a given pattern to an array.
 | 
			
		||||
 * @param {string|string[]|undefined} patterns A glob pattern or an array of glob patterns.
 | 
			
		||||
 * @returns {string[]|null} Normalized patterns.
 | 
			
		||||
 * @private
 | 
			
		||||
 */
 | 
			
		||||
function normalizePatterns(patterns) {
 | 
			
		||||
    if (Array.isArray(patterns)) {
 | 
			
		||||
        return patterns.filter(Boolean);
 | 
			
		||||
    }
 | 
			
		||||
    if (typeof patterns === "string" && patterns) {
 | 
			
		||||
        return [patterns];
 | 
			
		||||
    }
 | 
			
		||||
    return [];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create the matchers of given patterns.
 | 
			
		||||
 * @param {string[]} patterns The patterns.
 | 
			
		||||
 * @returns {InstanceType<Minimatch>[] | null} The matchers.
 | 
			
		||||
 */
 | 
			
		||||
function toMatcher(patterns) {
 | 
			
		||||
    if (patterns.length === 0) {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
    return patterns.map(pattern => {
 | 
			
		||||
        if (/^\.[/\\]/u.test(pattern)) {
 | 
			
		||||
            return new Minimatch(
 | 
			
		||||
                pattern.slice(2),
 | 
			
		||||
 | 
			
		||||
                // `./*.js` should not match with `subdir/foo.js`
 | 
			
		||||
                { ...minimatchOpts, matchBase: false }
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        return new Minimatch(pattern, minimatchOpts);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert a given matcher to string.
 | 
			
		||||
 * @param {Pattern} matchers The matchers.
 | 
			
		||||
 * @returns {string} The string expression of the matcher.
 | 
			
		||||
 */
 | 
			
		||||
function patternToJson({ includes, excludes }) {
 | 
			
		||||
    return {
 | 
			
		||||
        includes: includes && includes.map(m => m.pattern),
 | 
			
		||||
        excludes: excludes && excludes.map(m => m.pattern)
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The class to test given paths are matched by the patterns.
 | 
			
		||||
 */
 | 
			
		||||
class OverrideTester {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Create a tester with given criteria.
 | 
			
		||||
     * If there are no criteria, returns `null`.
 | 
			
		||||
     * @param {string|string[]} files The glob patterns for included files.
 | 
			
		||||
     * @param {string|string[]} excludedFiles The glob patterns for excluded files.
 | 
			
		||||
     * @param {string} basePath The path to the base directory to test paths.
 | 
			
		||||
     * @returns {OverrideTester|null} The created instance or `null`.
 | 
			
		||||
     */
 | 
			
		||||
    static create(files, excludedFiles, basePath) {
 | 
			
		||||
        const includePatterns = normalizePatterns(files);
 | 
			
		||||
        const excludePatterns = normalizePatterns(excludedFiles);
 | 
			
		||||
        let endsWithWildcard = false;
 | 
			
		||||
 | 
			
		||||
        if (includePatterns.length === 0) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Rejects absolute paths or relative paths to parents.
 | 
			
		||||
        for (const pattern of includePatterns) {
 | 
			
		||||
            if (path.isAbsolute(pattern) || pattern.includes("..")) {
 | 
			
		||||
                throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`);
 | 
			
		||||
            }
 | 
			
		||||
            if (pattern.endsWith("*")) {
 | 
			
		||||
                endsWithWildcard = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        for (const pattern of excludePatterns) {
 | 
			
		||||
            if (path.isAbsolute(pattern) || pattern.includes("..")) {
 | 
			
		||||
                throw new Error(`Invalid override pattern (expected relative path not containing '..'): ${pattern}`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const includes = toMatcher(includePatterns);
 | 
			
		||||
        const excludes = toMatcher(excludePatterns);
 | 
			
		||||
 | 
			
		||||
        return new OverrideTester(
 | 
			
		||||
            [{ includes, excludes }],
 | 
			
		||||
            basePath,
 | 
			
		||||
            endsWithWildcard
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Combine two testers by logical and.
 | 
			
		||||
     * If either of the testers was `null`, returns the other tester.
 | 
			
		||||
     * The `basePath` property of the two must be the same value.
 | 
			
		||||
     * @param {OverrideTester|null} a A tester.
 | 
			
		||||
     * @param {OverrideTester|null} b Another tester.
 | 
			
		||||
     * @returns {OverrideTester|null} Combined tester.
 | 
			
		||||
     */
 | 
			
		||||
    static and(a, b) {
 | 
			
		||||
        if (!b) {
 | 
			
		||||
            return a && new OverrideTester(
 | 
			
		||||
                a.patterns,
 | 
			
		||||
                a.basePath,
 | 
			
		||||
                a.endsWithWildcard
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        if (!a) {
 | 
			
		||||
            return new OverrideTester(
 | 
			
		||||
                b.patterns,
 | 
			
		||||
                b.basePath,
 | 
			
		||||
                b.endsWithWildcard
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        assert.strictEqual(a.basePath, b.basePath);
 | 
			
		||||
        return new OverrideTester(
 | 
			
		||||
            a.patterns.concat(b.patterns),
 | 
			
		||||
            a.basePath,
 | 
			
		||||
            a.endsWithWildcard || b.endsWithWildcard
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Initialize this instance.
 | 
			
		||||
     * @param {Pattern[]} patterns The matchers.
 | 
			
		||||
     * @param {string} basePath The base path.
 | 
			
		||||
     * @param {boolean} endsWithWildcard If `true` then a pattern ends with `*`.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(patterns, basePath, endsWithWildcard = false) {
 | 
			
		||||
 | 
			
		||||
        /** @type {Pattern[]} */
 | 
			
		||||
        this.patterns = patterns;
 | 
			
		||||
 | 
			
		||||
        /** @type {string} */
 | 
			
		||||
        this.basePath = basePath;
 | 
			
		||||
 | 
			
		||||
        /** @type {boolean} */
 | 
			
		||||
        this.endsWithWildcard = endsWithWildcard;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Test if a given path is matched or not.
 | 
			
		||||
     * @param {string} filePath The absolute path to the target file.
 | 
			
		||||
     * @returns {boolean} `true` if the path was matched.
 | 
			
		||||
     */
 | 
			
		||||
    test(filePath) {
 | 
			
		||||
        if (typeof filePath !== "string" || !path.isAbsolute(filePath)) {
 | 
			
		||||
            throw new Error(`'filePath' should be an absolute path, but got ${filePath}.`);
 | 
			
		||||
        }
 | 
			
		||||
        const relativePath = path.relative(this.basePath, filePath);
 | 
			
		||||
 | 
			
		||||
        return this.patterns.every(({ includes, excludes }) => (
 | 
			
		||||
            (!includes || includes.some(m => m.match(relativePath))) &&
 | 
			
		||||
            (!excludes || !excludes.some(m => m.match(relativePath)))
 | 
			
		||||
        ));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line jsdoc/require-description
 | 
			
		||||
    /**
 | 
			
		||||
     * @returns {Object} a JSON compatible object.
 | 
			
		||||
     */
 | 
			
		||||
    toJSON() {
 | 
			
		||||
        if (this.patterns.length === 1) {
 | 
			
		||||
            return {
 | 
			
		||||
                ...patternToJson(this.patterns[0]),
 | 
			
		||||
                basePath: this.basePath
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
        return {
 | 
			
		||||
            AND: this.patterns.map(patternToJson),
 | 
			
		||||
            basePath: this.basePath
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line jsdoc/require-description
 | 
			
		||||
    /**
 | 
			
		||||
     * @returns {Object} an object to display by `console.log()`.
 | 
			
		||||
     */
 | 
			
		||||
    [util.inspect.custom]() {
 | 
			
		||||
        return this.toJSON();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { OverrideTester };
 | 
			
		||||
							
								
								
									
										318
									
								
								node_modules/@eslint/eslintrc/lib/flat-compat.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										318
									
								
								node_modules/@eslint/eslintrc/lib/flat-compat.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,318 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Compatibility class for flat config.
 | 
			
		||||
 * @author Nicholas C. Zakas
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import createDebug from "debug";
 | 
			
		||||
import path from "path";
 | 
			
		||||
 | 
			
		||||
import environments from "../conf/environments.js";
 | 
			
		||||
import { ConfigArrayFactory } from "./config-array-factory.js";
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/** @typedef {import("../../shared/types").Environment} Environment */
 | 
			
		||||
/** @typedef {import("../../shared/types").Processor} Processor */
 | 
			
		||||
 | 
			
		||||
const debug = createDebug("eslintrc:flat-compat");
 | 
			
		||||
const cafactory = Symbol("cafactory");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Translates an ESLintRC-style config object into a flag-config-style config
 | 
			
		||||
 * object.
 | 
			
		||||
 * @param {Object} eslintrcConfig An ESLintRC-style config object.
 | 
			
		||||
 * @param {Object} options Options to help translate the config.
 | 
			
		||||
 * @param {string} options.resolveConfigRelativeTo To the directory to resolve
 | 
			
		||||
 *      configs from.
 | 
			
		||||
 * @param {string} options.resolvePluginsRelativeTo The directory to resolve
 | 
			
		||||
 *      plugins from.
 | 
			
		||||
 * @param {ReadOnlyMap<string,Environment>} options.pluginEnvironments A map of plugin environment
 | 
			
		||||
 *      names to objects.
 | 
			
		||||
 * @param {ReadOnlyMap<string,Processor>} options.pluginProcessors A map of plugin processor
 | 
			
		||||
 *      names to objects.
 | 
			
		||||
 * @returns {Object} A flag-config-style config object.
 | 
			
		||||
 */
 | 
			
		||||
function translateESLintRC(eslintrcConfig, {
 | 
			
		||||
    resolveConfigRelativeTo,
 | 
			
		||||
    resolvePluginsRelativeTo,
 | 
			
		||||
    pluginEnvironments,
 | 
			
		||||
    pluginProcessors
 | 
			
		||||
}) {
 | 
			
		||||
 | 
			
		||||
    const flatConfig = {};
 | 
			
		||||
    const configs = [];
 | 
			
		||||
    const languageOptions = {};
 | 
			
		||||
    const linterOptions = {};
 | 
			
		||||
    const keysToCopy = ["settings", "rules", "processor"];
 | 
			
		||||
    const languageOptionsKeysToCopy = ["globals", "parser", "parserOptions"];
 | 
			
		||||
    const linterOptionsKeysToCopy = ["noInlineConfig", "reportUnusedDisableDirectives"];
 | 
			
		||||
 | 
			
		||||
    // copy over simple translations
 | 
			
		||||
    for (const key of keysToCopy) {
 | 
			
		||||
        if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") {
 | 
			
		||||
            flatConfig[key] = eslintrcConfig[key];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // copy over languageOptions
 | 
			
		||||
    for (const key of languageOptionsKeysToCopy) {
 | 
			
		||||
        if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") {
 | 
			
		||||
 | 
			
		||||
            // create the languageOptions key in the flat config
 | 
			
		||||
            flatConfig.languageOptions = languageOptions;
 | 
			
		||||
 | 
			
		||||
            if (key === "parser") {
 | 
			
		||||
                debug(`Resolving parser '${languageOptions[key]}' relative to ${resolveConfigRelativeTo}`);
 | 
			
		||||
 | 
			
		||||
                if (eslintrcConfig[key].error) {
 | 
			
		||||
                    throw eslintrcConfig[key].error;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                languageOptions[key] = eslintrcConfig[key].definition;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // clone any object values that are in the eslintrc config
 | 
			
		||||
            if (eslintrcConfig[key] && typeof eslintrcConfig[key] === "object") {
 | 
			
		||||
                languageOptions[key] = {
 | 
			
		||||
                    ...eslintrcConfig[key]
 | 
			
		||||
                };
 | 
			
		||||
            } else {
 | 
			
		||||
                languageOptions[key] = eslintrcConfig[key];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // copy over linterOptions
 | 
			
		||||
    for (const key of linterOptionsKeysToCopy) {
 | 
			
		||||
        if (key in eslintrcConfig && typeof eslintrcConfig[key] !== "undefined") {
 | 
			
		||||
            flatConfig.linterOptions = linterOptions;
 | 
			
		||||
            linterOptions[key] = eslintrcConfig[key];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // move ecmaVersion a level up
 | 
			
		||||
    if (languageOptions.parserOptions) {
 | 
			
		||||
 | 
			
		||||
        if ("ecmaVersion" in languageOptions.parserOptions) {
 | 
			
		||||
            languageOptions.ecmaVersion = languageOptions.parserOptions.ecmaVersion;
 | 
			
		||||
            delete languageOptions.parserOptions.ecmaVersion;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ("sourceType" in languageOptions.parserOptions) {
 | 
			
		||||
            languageOptions.sourceType = languageOptions.parserOptions.sourceType;
 | 
			
		||||
            delete languageOptions.parserOptions.sourceType;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // check to see if we even need parserOptions anymore and remove it if not
 | 
			
		||||
        if (Object.keys(languageOptions.parserOptions).length === 0) {
 | 
			
		||||
            delete languageOptions.parserOptions;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // overrides
 | 
			
		||||
    if (eslintrcConfig.criteria) {
 | 
			
		||||
        flatConfig.files = [absoluteFilePath => eslintrcConfig.criteria.test(absoluteFilePath)];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // translate plugins
 | 
			
		||||
    if (eslintrcConfig.plugins && typeof eslintrcConfig.plugins === "object") {
 | 
			
		||||
        debug(`Translating plugins: ${eslintrcConfig.plugins}`);
 | 
			
		||||
 | 
			
		||||
        flatConfig.plugins = {};
 | 
			
		||||
 | 
			
		||||
        for (const pluginName of Object.keys(eslintrcConfig.plugins)) {
 | 
			
		||||
 | 
			
		||||
            debug(`Translating plugin: ${pluginName}`);
 | 
			
		||||
            debug(`Resolving plugin '${pluginName} relative to ${resolvePluginsRelativeTo}`);
 | 
			
		||||
 | 
			
		||||
            const { original: plugin, error } = eslintrcConfig.plugins[pluginName];
 | 
			
		||||
 | 
			
		||||
            if (error) {
 | 
			
		||||
                throw error;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            flatConfig.plugins[pluginName] = plugin;
 | 
			
		||||
 | 
			
		||||
            // create a config for any processors
 | 
			
		||||
            if (plugin.processors) {
 | 
			
		||||
                for (const processorName of Object.keys(plugin.processors)) {
 | 
			
		||||
                    if (processorName.startsWith(".")) {
 | 
			
		||||
                        debug(`Assigning processor: ${pluginName}/${processorName}`);
 | 
			
		||||
 | 
			
		||||
                        configs.unshift({
 | 
			
		||||
                            files: [`**/*${processorName}`],
 | 
			
		||||
                            processor: pluginProcessors.get(`${pluginName}/${processorName}`)
 | 
			
		||||
                        });
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // translate env - must come after plugins
 | 
			
		||||
    if (eslintrcConfig.env && typeof eslintrcConfig.env === "object") {
 | 
			
		||||
        for (const envName of Object.keys(eslintrcConfig.env)) {
 | 
			
		||||
 | 
			
		||||
            // only add environments that are true
 | 
			
		||||
            if (eslintrcConfig.env[envName]) {
 | 
			
		||||
                debug(`Translating environment: ${envName}`);
 | 
			
		||||
 | 
			
		||||
                if (environments.has(envName)) {
 | 
			
		||||
 | 
			
		||||
                    // built-in environments should be defined first
 | 
			
		||||
                    configs.unshift(...translateESLintRC({
 | 
			
		||||
                        criteria: eslintrcConfig.criteria,
 | 
			
		||||
                        ...environments.get(envName)
 | 
			
		||||
                    }, {
 | 
			
		||||
                        resolveConfigRelativeTo,
 | 
			
		||||
                        resolvePluginsRelativeTo
 | 
			
		||||
                    }));
 | 
			
		||||
                } else if (pluginEnvironments.has(envName)) {
 | 
			
		||||
 | 
			
		||||
                    // if the environment comes from a plugin, it should come after the plugin config
 | 
			
		||||
                    configs.push(...translateESLintRC({
 | 
			
		||||
                        criteria: eslintrcConfig.criteria,
 | 
			
		||||
                        ...pluginEnvironments.get(envName)
 | 
			
		||||
                    }, {
 | 
			
		||||
                        resolveConfigRelativeTo,
 | 
			
		||||
                        resolvePluginsRelativeTo
 | 
			
		||||
                    }));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // only add if there are actually keys in the config
 | 
			
		||||
    if (Object.keys(flatConfig).length > 0) {
 | 
			
		||||
        configs.push(flatConfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return configs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Exports
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A compatibility class for working with configs.
 | 
			
		||||
 */
 | 
			
		||||
class FlatCompat {
 | 
			
		||||
 | 
			
		||||
    constructor({
 | 
			
		||||
        baseDirectory = process.cwd(),
 | 
			
		||||
        resolvePluginsRelativeTo = baseDirectory,
 | 
			
		||||
        recommendedConfig,
 | 
			
		||||
        allConfig
 | 
			
		||||
    } = {}) {
 | 
			
		||||
        this.baseDirectory = baseDirectory;
 | 
			
		||||
        this.resolvePluginsRelativeTo = resolvePluginsRelativeTo;
 | 
			
		||||
        this[cafactory] = new ConfigArrayFactory({
 | 
			
		||||
            cwd: baseDirectory,
 | 
			
		||||
            resolvePluginsRelativeTo,
 | 
			
		||||
            getEslintAllConfig: () => {
 | 
			
		||||
 | 
			
		||||
                if (!allConfig) {
 | 
			
		||||
                    throw new TypeError("Missing parameter 'allConfig' in FlatCompat constructor.");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return allConfig;
 | 
			
		||||
            },
 | 
			
		||||
            getEslintRecommendedConfig: () => {
 | 
			
		||||
 | 
			
		||||
                if (!recommendedConfig) {
 | 
			
		||||
                    throw new TypeError("Missing parameter 'recommendedConfig' in FlatCompat constructor.");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return recommendedConfig;
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Translates an ESLintRC-style config into a flag-config-style config.
 | 
			
		||||
     * @param {Object} eslintrcConfig The ESLintRC-style config object.
 | 
			
		||||
     * @returns {Object} A flag-config-style config object.
 | 
			
		||||
     */
 | 
			
		||||
    config(eslintrcConfig) {
 | 
			
		||||
        const eslintrcArray = this[cafactory].create(eslintrcConfig, {
 | 
			
		||||
            basePath: this.baseDirectory
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const flatArray = [];
 | 
			
		||||
        let hasIgnorePatterns = false;
 | 
			
		||||
 | 
			
		||||
        eslintrcArray.forEach(configData => {
 | 
			
		||||
            if (configData.type === "config") {
 | 
			
		||||
                hasIgnorePatterns = hasIgnorePatterns || configData.ignorePattern;
 | 
			
		||||
                flatArray.push(...translateESLintRC(configData, {
 | 
			
		||||
                    resolveConfigRelativeTo: path.join(this.baseDirectory, "__placeholder.js"),
 | 
			
		||||
                    resolvePluginsRelativeTo: path.join(this.resolvePluginsRelativeTo, "__placeholder.js"),
 | 
			
		||||
                    pluginEnvironments: eslintrcArray.pluginEnvironments,
 | 
			
		||||
                    pluginProcessors: eslintrcArray.pluginProcessors
 | 
			
		||||
                }));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // combine ignorePatterns to emulate ESLintRC behavior better
 | 
			
		||||
        if (hasIgnorePatterns) {
 | 
			
		||||
            flatArray.unshift({
 | 
			
		||||
                ignores: [filePath => {
 | 
			
		||||
 | 
			
		||||
                    // Compute the final config for this file.
 | 
			
		||||
                    // This filters config array elements by `files`/`excludedFiles` then merges the elements.
 | 
			
		||||
                    const finalConfig = eslintrcArray.extractConfig(filePath);
 | 
			
		||||
 | 
			
		||||
                    // Test the `ignorePattern` properties of the final config.
 | 
			
		||||
                    return Boolean(finalConfig.ignores) && finalConfig.ignores(filePath);
 | 
			
		||||
                }]
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return flatArray;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Translates the `env` section of an ESLintRC-style config.
 | 
			
		||||
     * @param {Object} envConfig The `env` section of an ESLintRC config.
 | 
			
		||||
     * @returns {Object[]} An array of flag-config objects representing the environments.
 | 
			
		||||
     */
 | 
			
		||||
    env(envConfig) {
 | 
			
		||||
        return this.config({
 | 
			
		||||
            env: envConfig
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Translates the `extends` section of an ESLintRC-style config.
 | 
			
		||||
     * @param {...string} configsToExtend The names of the configs to load.
 | 
			
		||||
     * @returns {Object[]} An array of flag-config objects representing the config.
 | 
			
		||||
     */
 | 
			
		||||
    extends(...configsToExtend) {
 | 
			
		||||
        return this.config({
 | 
			
		||||
            extends: configsToExtend
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Translates the `plugins` section of an ESLintRC-style config.
 | 
			
		||||
     * @param {...string} plugins The names of the plugins to load.
 | 
			
		||||
     * @returns {Object[]} An array of flag-config objects representing the plugins.
 | 
			
		||||
     */
 | 
			
		||||
    plugins(...plugins) {
 | 
			
		||||
        return this.config({
 | 
			
		||||
            plugins
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { FlatCompat };
 | 
			
		||||
							
								
								
									
										29
									
								
								node_modules/@eslint/eslintrc/lib/index-universal.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								node_modules/@eslint/eslintrc/lib/index-universal.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Package exports for @eslint/eslintrc
 | 
			
		||||
 * @author Nicholas C. Zakas
 | 
			
		||||
 */
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import * as ConfigOps from "./shared/config-ops.js";
 | 
			
		||||
import ConfigValidator from "./shared/config-validator.js";
 | 
			
		||||
import * as naming from "./shared/naming.js";
 | 
			
		||||
import environments from "../conf/environments.js";
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Exports
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const Legacy = {
 | 
			
		||||
    environments,
 | 
			
		||||
 | 
			
		||||
    // shared
 | 
			
		||||
    ConfigOps,
 | 
			
		||||
    ConfigValidator,
 | 
			
		||||
    naming
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    Legacy
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										56
									
								
								node_modules/@eslint/eslintrc/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								node_modules/@eslint/eslintrc/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Package exports for @eslint/eslintrc
 | 
			
		||||
 * @author Nicholas C. Zakas
 | 
			
		||||
 */
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
    ConfigArrayFactory,
 | 
			
		||||
    createContext as createConfigArrayFactoryContext
 | 
			
		||||
} from "./config-array-factory.js";
 | 
			
		||||
 | 
			
		||||
import { CascadingConfigArrayFactory } from "./cascading-config-array-factory.js";
 | 
			
		||||
import * as ModuleResolver from "./shared/relative-module-resolver.js";
 | 
			
		||||
import { ConfigArray, getUsedExtractedConfigs } from "./config-array/index.js";
 | 
			
		||||
import { ConfigDependency } from "./config-array/config-dependency.js";
 | 
			
		||||
import { ExtractedConfig } from "./config-array/extracted-config.js";
 | 
			
		||||
import { IgnorePattern } from "./config-array/ignore-pattern.js";
 | 
			
		||||
import { OverrideTester } from "./config-array/override-tester.js";
 | 
			
		||||
import * as ConfigOps from "./shared/config-ops.js";
 | 
			
		||||
import ConfigValidator from "./shared/config-validator.js";
 | 
			
		||||
import * as naming from "./shared/naming.js";
 | 
			
		||||
import { FlatCompat } from "./flat-compat.js";
 | 
			
		||||
import environments from "../conf/environments.js";
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Exports
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const Legacy = {
 | 
			
		||||
    ConfigArray,
 | 
			
		||||
    createConfigArrayFactoryContext,
 | 
			
		||||
    CascadingConfigArrayFactory,
 | 
			
		||||
    ConfigArrayFactory,
 | 
			
		||||
    ConfigDependency,
 | 
			
		||||
    ExtractedConfig,
 | 
			
		||||
    IgnorePattern,
 | 
			
		||||
    OverrideTester,
 | 
			
		||||
    getUsedExtractedConfigs,
 | 
			
		||||
    environments,
 | 
			
		||||
 | 
			
		||||
    // shared
 | 
			
		||||
    ConfigOps,
 | 
			
		||||
    ConfigValidator,
 | 
			
		||||
    ModuleResolver,
 | 
			
		||||
    naming
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
 | 
			
		||||
    Legacy,
 | 
			
		||||
 | 
			
		||||
    FlatCompat
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										191
									
								
								node_modules/@eslint/eslintrc/lib/shared/ajv.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								node_modules/@eslint/eslintrc/lib/shared/ajv.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,191 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview The instance of Ajv validator.
 | 
			
		||||
 * @author Evgeny Poberezkin
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import Ajv from "ajv";
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Helpers
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copied from ajv/lib/refs/json-schema-draft-04.json
 | 
			
		||||
 * The MIT License (MIT)
 | 
			
		||||
 * Copyright (c) 2015-2017 Evgeny Poberezkin
 | 
			
		||||
 */
 | 
			
		||||
const metaSchema = {
 | 
			
		||||
    id: "http://json-schema.org/draft-04/schema#",
 | 
			
		||||
    $schema: "http://json-schema.org/draft-04/schema#",
 | 
			
		||||
    description: "Core schema meta-schema",
 | 
			
		||||
    definitions: {
 | 
			
		||||
        schemaArray: {
 | 
			
		||||
            type: "array",
 | 
			
		||||
            minItems: 1,
 | 
			
		||||
            items: { $ref: "#" }
 | 
			
		||||
        },
 | 
			
		||||
        positiveInteger: {
 | 
			
		||||
            type: "integer",
 | 
			
		||||
            minimum: 0
 | 
			
		||||
        },
 | 
			
		||||
        positiveIntegerDefault0: {
 | 
			
		||||
            allOf: [{ $ref: "#/definitions/positiveInteger" }, { default: 0 }]
 | 
			
		||||
        },
 | 
			
		||||
        simpleTypes: {
 | 
			
		||||
            enum: ["array", "boolean", "integer", "null", "number", "object", "string"]
 | 
			
		||||
        },
 | 
			
		||||
        stringArray: {
 | 
			
		||||
            type: "array",
 | 
			
		||||
            items: { type: "string" },
 | 
			
		||||
            minItems: 1,
 | 
			
		||||
            uniqueItems: true
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    type: "object",
 | 
			
		||||
    properties: {
 | 
			
		||||
        id: {
 | 
			
		||||
            type: "string"
 | 
			
		||||
        },
 | 
			
		||||
        $schema: {
 | 
			
		||||
            type: "string"
 | 
			
		||||
        },
 | 
			
		||||
        title: {
 | 
			
		||||
            type: "string"
 | 
			
		||||
        },
 | 
			
		||||
        description: {
 | 
			
		||||
            type: "string"
 | 
			
		||||
        },
 | 
			
		||||
        default: { },
 | 
			
		||||
        multipleOf: {
 | 
			
		||||
            type: "number",
 | 
			
		||||
            minimum: 0,
 | 
			
		||||
            exclusiveMinimum: true
 | 
			
		||||
        },
 | 
			
		||||
        maximum: {
 | 
			
		||||
            type: "number"
 | 
			
		||||
        },
 | 
			
		||||
        exclusiveMaximum: {
 | 
			
		||||
            type: "boolean",
 | 
			
		||||
            default: false
 | 
			
		||||
        },
 | 
			
		||||
        minimum: {
 | 
			
		||||
            type: "number"
 | 
			
		||||
        },
 | 
			
		||||
        exclusiveMinimum: {
 | 
			
		||||
            type: "boolean",
 | 
			
		||||
            default: false
 | 
			
		||||
        },
 | 
			
		||||
        maxLength: { $ref: "#/definitions/positiveInteger" },
 | 
			
		||||
        minLength: { $ref: "#/definitions/positiveIntegerDefault0" },
 | 
			
		||||
        pattern: {
 | 
			
		||||
            type: "string",
 | 
			
		||||
            format: "regex"
 | 
			
		||||
        },
 | 
			
		||||
        additionalItems: {
 | 
			
		||||
            anyOf: [
 | 
			
		||||
                { type: "boolean" },
 | 
			
		||||
                { $ref: "#" }
 | 
			
		||||
            ],
 | 
			
		||||
            default: { }
 | 
			
		||||
        },
 | 
			
		||||
        items: {
 | 
			
		||||
            anyOf: [
 | 
			
		||||
                { $ref: "#" },
 | 
			
		||||
                { $ref: "#/definitions/schemaArray" }
 | 
			
		||||
            ],
 | 
			
		||||
            default: { }
 | 
			
		||||
        },
 | 
			
		||||
        maxItems: { $ref: "#/definitions/positiveInteger" },
 | 
			
		||||
        minItems: { $ref: "#/definitions/positiveIntegerDefault0" },
 | 
			
		||||
        uniqueItems: {
 | 
			
		||||
            type: "boolean",
 | 
			
		||||
            default: false
 | 
			
		||||
        },
 | 
			
		||||
        maxProperties: { $ref: "#/definitions/positiveInteger" },
 | 
			
		||||
        minProperties: { $ref: "#/definitions/positiveIntegerDefault0" },
 | 
			
		||||
        required: { $ref: "#/definitions/stringArray" },
 | 
			
		||||
        additionalProperties: {
 | 
			
		||||
            anyOf: [
 | 
			
		||||
                { type: "boolean" },
 | 
			
		||||
                { $ref: "#" }
 | 
			
		||||
            ],
 | 
			
		||||
            default: { }
 | 
			
		||||
        },
 | 
			
		||||
        definitions: {
 | 
			
		||||
            type: "object",
 | 
			
		||||
            additionalProperties: { $ref: "#" },
 | 
			
		||||
            default: { }
 | 
			
		||||
        },
 | 
			
		||||
        properties: {
 | 
			
		||||
            type: "object",
 | 
			
		||||
            additionalProperties: { $ref: "#" },
 | 
			
		||||
            default: { }
 | 
			
		||||
        },
 | 
			
		||||
        patternProperties: {
 | 
			
		||||
            type: "object",
 | 
			
		||||
            additionalProperties: { $ref: "#" },
 | 
			
		||||
            default: { }
 | 
			
		||||
        },
 | 
			
		||||
        dependencies: {
 | 
			
		||||
            type: "object",
 | 
			
		||||
            additionalProperties: {
 | 
			
		||||
                anyOf: [
 | 
			
		||||
                    { $ref: "#" },
 | 
			
		||||
                    { $ref: "#/definitions/stringArray" }
 | 
			
		||||
                ]
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        enum: {
 | 
			
		||||
            type: "array",
 | 
			
		||||
            minItems: 1,
 | 
			
		||||
            uniqueItems: true
 | 
			
		||||
        },
 | 
			
		||||
        type: {
 | 
			
		||||
            anyOf: [
 | 
			
		||||
                { $ref: "#/definitions/simpleTypes" },
 | 
			
		||||
                {
 | 
			
		||||
                    type: "array",
 | 
			
		||||
                    items: { $ref: "#/definitions/simpleTypes" },
 | 
			
		||||
                    minItems: 1,
 | 
			
		||||
                    uniqueItems: true
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        format: { type: "string" },
 | 
			
		||||
        allOf: { $ref: "#/definitions/schemaArray" },
 | 
			
		||||
        anyOf: { $ref: "#/definitions/schemaArray" },
 | 
			
		||||
        oneOf: { $ref: "#/definitions/schemaArray" },
 | 
			
		||||
        not: { $ref: "#" }
 | 
			
		||||
    },
 | 
			
		||||
    dependencies: {
 | 
			
		||||
        exclusiveMaximum: ["maximum"],
 | 
			
		||||
        exclusiveMinimum: ["minimum"]
 | 
			
		||||
    },
 | 
			
		||||
    default: { }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export default (additionalOptions = {}) => {
 | 
			
		||||
    const ajv = new Ajv({
 | 
			
		||||
        meta: false,
 | 
			
		||||
        useDefaults: true,
 | 
			
		||||
        validateSchema: false,
 | 
			
		||||
        missingRefs: "ignore",
 | 
			
		||||
        verbose: true,
 | 
			
		||||
        schemaId: "auto",
 | 
			
		||||
        ...additionalOptions
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    ajv.addMetaSchema(metaSchema);
 | 
			
		||||
    // eslint-disable-next-line no-underscore-dangle
 | 
			
		||||
    ajv._opts.defaultMeta = metaSchema.id;
 | 
			
		||||
 | 
			
		||||
    return ajv;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										135
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-ops.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-ops.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,135 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Config file operations. This file must be usable in the browser,
 | 
			
		||||
 * so no Node-specific code can be here.
 | 
			
		||||
 * @author Nicholas C. Zakas
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Private
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
const RULE_SEVERITY_STRINGS = ["off", "warn", "error"],
 | 
			
		||||
    RULE_SEVERITY = RULE_SEVERITY_STRINGS.reduce((map, value, index) => {
 | 
			
		||||
        map[value] = index;
 | 
			
		||||
        return map;
 | 
			
		||||
    }, {}),
 | 
			
		||||
    VALID_SEVERITIES = [0, 1, 2, "off", "warn", "error"];
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Normalizes the severity value of a rule's configuration to a number
 | 
			
		||||
 * @param {(number|string|[number, ...*]|[string, ...*])} ruleConfig A rule's configuration value, generally
 | 
			
		||||
 * received from the user. A valid config value is either 0, 1, 2, the string "off" (treated the same as 0),
 | 
			
		||||
 * the string "warn" (treated the same as 1), the string "error" (treated the same as 2), or an array
 | 
			
		||||
 * whose first element is one of the above values. Strings are matched case-insensitively.
 | 
			
		||||
 * @returns {(0|1|2)} The numeric severity value if the config value was valid, otherwise 0.
 | 
			
		||||
 */
 | 
			
		||||
function getRuleSeverity(ruleConfig) {
 | 
			
		||||
    const severityValue = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig;
 | 
			
		||||
 | 
			
		||||
    if (severityValue === 0 || severityValue === 1 || severityValue === 2) {
 | 
			
		||||
        return severityValue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof severityValue === "string") {
 | 
			
		||||
        return RULE_SEVERITY[severityValue.toLowerCase()] || 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Converts old-style severity settings (0, 1, 2) into new-style
 | 
			
		||||
 * severity settings (off, warn, error) for all rules. Assumption is that severity
 | 
			
		||||
 * values have already been validated as correct.
 | 
			
		||||
 * @param {Object} config The config object to normalize.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function normalizeToStrings(config) {
 | 
			
		||||
 | 
			
		||||
    if (config.rules) {
 | 
			
		||||
        Object.keys(config.rules).forEach(ruleId => {
 | 
			
		||||
            const ruleConfig = config.rules[ruleId];
 | 
			
		||||
 | 
			
		||||
            if (typeof ruleConfig === "number") {
 | 
			
		||||
                config.rules[ruleId] = RULE_SEVERITY_STRINGS[ruleConfig] || RULE_SEVERITY_STRINGS[0];
 | 
			
		||||
            } else if (Array.isArray(ruleConfig) && typeof ruleConfig[0] === "number") {
 | 
			
		||||
                ruleConfig[0] = RULE_SEVERITY_STRINGS[ruleConfig[0]] || RULE_SEVERITY_STRINGS[0];
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Determines if the severity for the given rule configuration represents an error.
 | 
			
		||||
 * @param {int|string|Array} ruleConfig The configuration for an individual rule.
 | 
			
		||||
 * @returns {boolean} True if the rule represents an error, false if not.
 | 
			
		||||
 */
 | 
			
		||||
function isErrorSeverity(ruleConfig) {
 | 
			
		||||
    return getRuleSeverity(ruleConfig) === 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Checks whether a given config has valid severity or not.
 | 
			
		||||
 * @param {number|string|Array} ruleConfig The configuration for an individual rule.
 | 
			
		||||
 * @returns {boolean} `true` if the configuration has valid severity.
 | 
			
		||||
 */
 | 
			
		||||
function isValidSeverity(ruleConfig) {
 | 
			
		||||
    let severity = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig;
 | 
			
		||||
 | 
			
		||||
    if (typeof severity === "string") {
 | 
			
		||||
        severity = severity.toLowerCase();
 | 
			
		||||
    }
 | 
			
		||||
    return VALID_SEVERITIES.indexOf(severity) !== -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Checks whether every rule of a given config has valid severity or not.
 | 
			
		||||
 * @param {Object} config The configuration for rules.
 | 
			
		||||
 * @returns {boolean} `true` if the configuration has valid severity.
 | 
			
		||||
 */
 | 
			
		||||
function isEverySeverityValid(config) {
 | 
			
		||||
    return Object.keys(config).every(ruleId => isValidSeverity(config[ruleId]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Normalizes a value for a global in a config
 | 
			
		||||
 * @param {(boolean|string|null)} configuredValue The value given for a global in configuration or in
 | 
			
		||||
 * a global directive comment
 | 
			
		||||
 * @returns {("readable"|"writeable"|"off")} The value normalized as a string
 | 
			
		||||
 * @throws Error if global value is invalid
 | 
			
		||||
 */
 | 
			
		||||
function normalizeConfigGlobal(configuredValue) {
 | 
			
		||||
    switch (configuredValue) {
 | 
			
		||||
        case "off":
 | 
			
		||||
            return "off";
 | 
			
		||||
 | 
			
		||||
        case true:
 | 
			
		||||
        case "true":
 | 
			
		||||
        case "writeable":
 | 
			
		||||
        case "writable":
 | 
			
		||||
            return "writable";
 | 
			
		||||
 | 
			
		||||
        case null:
 | 
			
		||||
        case false:
 | 
			
		||||
        case "false":
 | 
			
		||||
        case "readable":
 | 
			
		||||
        case "readonly":
 | 
			
		||||
            return "readonly";
 | 
			
		||||
 | 
			
		||||
        default:
 | 
			
		||||
            throw new Error(`'${configuredValue}' is not a valid configuration for a global (use 'readonly', 'writable', or 'off')`);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    getRuleSeverity,
 | 
			
		||||
    normalizeToStrings,
 | 
			
		||||
    isErrorSeverity,
 | 
			
		||||
    isValidSeverity,
 | 
			
		||||
    isEverySeverityValid,
 | 
			
		||||
    normalizeConfigGlobal
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										370
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-validator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										370
									
								
								node_modules/@eslint/eslintrc/lib/shared/config-validator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,370 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Validates configs.
 | 
			
		||||
 * @author Brandon Mills
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* eslint class-methods-use-this: "off" */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Typedefs
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/** @typedef {import("../shared/types").Rule} Rule */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import util from "util";
 | 
			
		||||
import * as ConfigOps from "./config-ops.js";
 | 
			
		||||
import { emitDeprecationWarning } from "./deprecation-warnings.js";
 | 
			
		||||
import ajvOrig from "./ajv.js";
 | 
			
		||||
import configSchema from "../../conf/config-schema.js";
 | 
			
		||||
import BuiltInEnvironments from "../../conf/environments.js";
 | 
			
		||||
 | 
			
		||||
const ajv = ajvOrig();
 | 
			
		||||
 | 
			
		||||
const ruleValidators = new WeakMap();
 | 
			
		||||
const noop = Function.prototype;
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Private
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
let validateSchema;
 | 
			
		||||
const severityMap = {
 | 
			
		||||
    error: 2,
 | 
			
		||||
    warn: 1,
 | 
			
		||||
    off: 0
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const validated = new WeakSet();
 | 
			
		||||
 | 
			
		||||
// JSON schema that disallows passing any options
 | 
			
		||||
const noOptionsSchema = Object.freeze({
 | 
			
		||||
    type: "array",
 | 
			
		||||
    minItems: 0,
 | 
			
		||||
    maxItems: 0
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Exports
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export default class ConfigValidator {
 | 
			
		||||
    constructor({ builtInRules = new Map() } = {}) {
 | 
			
		||||
        this.builtInRules = builtInRules;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a complete options schema for a rule.
 | 
			
		||||
     * @param {Rule} rule A rule object
 | 
			
		||||
     * @throws {TypeError} If `meta.schema` is specified but is not an array, object or `false`.
 | 
			
		||||
     * @returns {Object|null} JSON Schema for the rule's options.
 | 
			
		||||
     *      `null` if rule wasn't passed or its `meta.schema` is `false`.
 | 
			
		||||
     */
 | 
			
		||||
    getRuleOptionsSchema(rule) {
 | 
			
		||||
        if (!rule) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!rule.meta) {
 | 
			
		||||
            return { ...noOptionsSchema }; // default if `meta.schema` is not specified
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const schema = rule.meta.schema;
 | 
			
		||||
 | 
			
		||||
        if (typeof schema === "undefined") {
 | 
			
		||||
            return { ...noOptionsSchema }; // default if `meta.schema` is not specified
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // `schema:false` is an allowed explicit opt-out of options validation for the rule
 | 
			
		||||
        if (schema === false) {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (typeof schema !== "object" || schema === null) {
 | 
			
		||||
            throw new TypeError("Rule's `meta.schema` must be an array or object");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // ESLint-specific array form needs to be converted into a valid JSON Schema definition
 | 
			
		||||
        if (Array.isArray(schema)) {
 | 
			
		||||
            if (schema.length) {
 | 
			
		||||
                return {
 | 
			
		||||
                    type: "array",
 | 
			
		||||
                    items: schema,
 | 
			
		||||
                    minItems: 0,
 | 
			
		||||
                    maxItems: schema.length
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // `schema:[]` is an explicit way to specify that the rule does not accept any options
 | 
			
		||||
            return { ...noOptionsSchema };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // `schema:<object>` is assumed to be a valid JSON Schema definition
 | 
			
		||||
        return schema;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates a rule's severity and returns the severity value. Throws an error if the severity is invalid.
 | 
			
		||||
     * @param {options} options The given options for the rule.
 | 
			
		||||
     * @returns {number|string} The rule's severity value
 | 
			
		||||
     */
 | 
			
		||||
    validateRuleSeverity(options) {
 | 
			
		||||
        const severity = Array.isArray(options) ? options[0] : options;
 | 
			
		||||
        const normSeverity = typeof severity === "string" ? severityMap[severity.toLowerCase()] : severity;
 | 
			
		||||
 | 
			
		||||
        if (normSeverity === 0 || normSeverity === 1 || normSeverity === 2) {
 | 
			
		||||
            return normSeverity;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        throw new Error(`\tSeverity should be one of the following: 0 = off, 1 = warn, 2 = error (you passed '${util.inspect(severity).replace(/'/gu, "\"").replace(/\n/gu, "")}').\n`);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the non-severity options passed to a rule, based on its schema.
 | 
			
		||||
     * @param {{create: Function}} rule The rule to validate
 | 
			
		||||
     * @param {Array} localOptions The options for the rule, excluding severity
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateRuleSchema(rule, localOptions) {
 | 
			
		||||
        if (!ruleValidators.has(rule)) {
 | 
			
		||||
            try {
 | 
			
		||||
                const schema = this.getRuleOptionsSchema(rule);
 | 
			
		||||
 | 
			
		||||
                if (schema) {
 | 
			
		||||
                    ruleValidators.set(rule, ajv.compile(schema));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (err) {
 | 
			
		||||
                const errorWithCode = new Error(err.message, { cause: err });
 | 
			
		||||
 | 
			
		||||
                errorWithCode.code = "ESLINT_INVALID_RULE_OPTIONS_SCHEMA";
 | 
			
		||||
 | 
			
		||||
                throw errorWithCode;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const validateRule = ruleValidators.get(rule);
 | 
			
		||||
 | 
			
		||||
        if (validateRule) {
 | 
			
		||||
            validateRule(localOptions);
 | 
			
		||||
            if (validateRule.errors) {
 | 
			
		||||
                throw new Error(validateRule.errors.map(
 | 
			
		||||
                    error => `\tValue ${JSON.stringify(error.data)} ${error.message}.\n`
 | 
			
		||||
                ).join(""));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates a rule's options against its schema.
 | 
			
		||||
     * @param {{create: Function}|null} rule The rule that the config is being validated for
 | 
			
		||||
     * @param {string} ruleId The rule's unique name.
 | 
			
		||||
     * @param {Array|number} options The given options for the rule.
 | 
			
		||||
     * @param {string|null} source The name of the configuration source to report in any errors. If null or undefined,
 | 
			
		||||
     * no source is prepended to the message.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateRuleOptions(rule, ruleId, options, source = null) {
 | 
			
		||||
        try {
 | 
			
		||||
            const severity = this.validateRuleSeverity(options);
 | 
			
		||||
 | 
			
		||||
            if (severity !== 0) {
 | 
			
		||||
                this.validateRuleSchema(rule, Array.isArray(options) ? options.slice(1) : []);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (err) {
 | 
			
		||||
            let enhancedMessage = err.code === "ESLINT_INVALID_RULE_OPTIONS_SCHEMA"
 | 
			
		||||
                ? `Error while processing options validation schema of rule '${ruleId}': ${err.message}`
 | 
			
		||||
                : `Configuration for rule "${ruleId}" is invalid:\n${err.message}`;
 | 
			
		||||
 | 
			
		||||
            if (typeof source === "string") {
 | 
			
		||||
                enhancedMessage = `${source}:\n\t${enhancedMessage}`;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const enhancedError = new Error(enhancedMessage, { cause: err });
 | 
			
		||||
 | 
			
		||||
            if (err.code) {
 | 
			
		||||
                enhancedError.code = err.code;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw enhancedError;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates an environment object
 | 
			
		||||
     * @param {Object} environment The environment config object to validate.
 | 
			
		||||
     * @param {string} source The name of the configuration source to report in any errors.
 | 
			
		||||
     * @param {function(envId:string): Object} [getAdditionalEnv] A map from strings to loaded environments.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateEnvironment(
 | 
			
		||||
        environment,
 | 
			
		||||
        source,
 | 
			
		||||
        getAdditionalEnv = noop
 | 
			
		||||
    ) {
 | 
			
		||||
 | 
			
		||||
        // not having an environment is ok
 | 
			
		||||
        if (!environment) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Object.keys(environment).forEach(id => {
 | 
			
		||||
            const env = getAdditionalEnv(id) || BuiltInEnvironments.get(id) || null;
 | 
			
		||||
 | 
			
		||||
            if (!env) {
 | 
			
		||||
                const message = `${source}:\n\tEnvironment key "${id}" is unknown\n`;
 | 
			
		||||
 | 
			
		||||
                throw new Error(message);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates a rules config object
 | 
			
		||||
     * @param {Object} rulesConfig The rules config object to validate.
 | 
			
		||||
     * @param {string} source The name of the configuration source to report in any errors.
 | 
			
		||||
     * @param {function(ruleId:string): Object} getAdditionalRule A map from strings to loaded rules
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateRules(
 | 
			
		||||
        rulesConfig,
 | 
			
		||||
        source,
 | 
			
		||||
        getAdditionalRule = noop
 | 
			
		||||
    ) {
 | 
			
		||||
        if (!rulesConfig) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Object.keys(rulesConfig).forEach(id => {
 | 
			
		||||
            const rule = getAdditionalRule(id) || this.builtInRules.get(id) || null;
 | 
			
		||||
 | 
			
		||||
            this.validateRuleOptions(rule, id, rulesConfig[id], source);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates a `globals` section of a config file
 | 
			
		||||
     * @param {Object} globalsConfig The `globals` section
 | 
			
		||||
     * @param {string|null} source The name of the configuration source to report in the event of an error.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateGlobals(globalsConfig, source = null) {
 | 
			
		||||
        if (!globalsConfig) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Object.entries(globalsConfig)
 | 
			
		||||
            .forEach(([configuredGlobal, configuredValue]) => {
 | 
			
		||||
                try {
 | 
			
		||||
                    ConfigOps.normalizeConfigGlobal(configuredValue);
 | 
			
		||||
                } catch (err) {
 | 
			
		||||
                    throw new Error(`ESLint configuration of global '${configuredGlobal}' in ${source} is invalid:\n${err.message}`);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validate `processor` configuration.
 | 
			
		||||
     * @param {string|undefined} processorName The processor name.
 | 
			
		||||
     * @param {string} source The name of config file.
 | 
			
		||||
     * @param {function(id:string): Processor} getProcessor The getter of defined processors.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateProcessor(processorName, source, getProcessor) {
 | 
			
		||||
        if (processorName && !getProcessor(processorName)) {
 | 
			
		||||
            throw new Error(`ESLint configuration of processor in '${source}' is invalid: '${processorName}' was not found.`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Formats an array of schema validation errors.
 | 
			
		||||
     * @param {Array} errors An array of error messages to format.
 | 
			
		||||
     * @returns {string} Formatted error message
 | 
			
		||||
     */
 | 
			
		||||
    formatErrors(errors) {
 | 
			
		||||
        return errors.map(error => {
 | 
			
		||||
            if (error.keyword === "additionalProperties") {
 | 
			
		||||
                const formattedPropertyPath = error.dataPath.length ? `${error.dataPath.slice(1)}.${error.params.additionalProperty}` : error.params.additionalProperty;
 | 
			
		||||
 | 
			
		||||
                return `Unexpected top-level property "${formattedPropertyPath}"`;
 | 
			
		||||
            }
 | 
			
		||||
            if (error.keyword === "type") {
 | 
			
		||||
                const formattedField = error.dataPath.slice(1);
 | 
			
		||||
                const formattedExpectedType = Array.isArray(error.schema) ? error.schema.join("/") : error.schema;
 | 
			
		||||
                const formattedValue = JSON.stringify(error.data);
 | 
			
		||||
 | 
			
		||||
                return `Property "${formattedField}" is the wrong type (expected ${formattedExpectedType} but got \`${formattedValue}\`)`;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const field = error.dataPath[0] === "." ? error.dataPath.slice(1) : error.dataPath;
 | 
			
		||||
 | 
			
		||||
            return `"${field}" ${error.message}. Value: ${JSON.stringify(error.data)}`;
 | 
			
		||||
        }).map(message => `\t- ${message}.\n`).join("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates the top level properties of the config object.
 | 
			
		||||
     * @param {Object} config The config object to validate.
 | 
			
		||||
     * @param {string} source The name of the configuration source to report in any errors.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateConfigSchema(config, source = null) {
 | 
			
		||||
        validateSchema = validateSchema || ajv.compile(configSchema);
 | 
			
		||||
 | 
			
		||||
        if (!validateSchema(config)) {
 | 
			
		||||
            throw new Error(`ESLint configuration in ${source} is invalid:\n${this.formatErrors(validateSchema.errors)}`);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Object.hasOwnProperty.call(config, "ecmaFeatures")) {
 | 
			
		||||
            emitDeprecationWarning(source, "ESLINT_LEGACY_ECMAFEATURES");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validates an entire config object.
 | 
			
		||||
     * @param {Object} config The config object to validate.
 | 
			
		||||
     * @param {string} source The name of the configuration source to report in any errors.
 | 
			
		||||
     * @param {function(ruleId:string): Object} [getAdditionalRule] A map from strings to loaded rules.
 | 
			
		||||
     * @param {function(envId:string): Object} [getAdditionalEnv] A map from strings to loaded envs.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validate(config, source, getAdditionalRule, getAdditionalEnv) {
 | 
			
		||||
        this.validateConfigSchema(config, source);
 | 
			
		||||
        this.validateRules(config.rules, source, getAdditionalRule);
 | 
			
		||||
        this.validateEnvironment(config.env, source, getAdditionalEnv);
 | 
			
		||||
        this.validateGlobals(config.globals, source);
 | 
			
		||||
 | 
			
		||||
        for (const override of config.overrides || []) {
 | 
			
		||||
            this.validateRules(override.rules, source, getAdditionalRule);
 | 
			
		||||
            this.validateEnvironment(override.env, source, getAdditionalEnv);
 | 
			
		||||
            this.validateGlobals(config.globals, source);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Validate config array object.
 | 
			
		||||
     * @param {ConfigArray} configArray The config array to validate.
 | 
			
		||||
     * @returns {void}
 | 
			
		||||
     */
 | 
			
		||||
    validateConfigArray(configArray) {
 | 
			
		||||
        const getPluginEnv = Map.prototype.get.bind(configArray.pluginEnvironments);
 | 
			
		||||
        const getPluginProcessor = Map.prototype.get.bind(configArray.pluginProcessors);
 | 
			
		||||
        const getPluginRule = Map.prototype.get.bind(configArray.pluginRules);
 | 
			
		||||
 | 
			
		||||
        // Validate.
 | 
			
		||||
        for (const element of configArray) {
 | 
			
		||||
            if (validated.has(element)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            validated.add(element);
 | 
			
		||||
 | 
			
		||||
            this.validateEnvironment(element.env, element.name, getPluginEnv);
 | 
			
		||||
            this.validateGlobals(element.globals, element.name);
 | 
			
		||||
            this.validateProcessor(element.processor, element.name, getPluginProcessor);
 | 
			
		||||
            this.validateRules(element.rules, element.name, getPluginRule);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										63
									
								
								node_modules/@eslint/eslintrc/lib/shared/deprecation-warnings.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								node_modules/@eslint/eslintrc/lib/shared/deprecation-warnings.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Provide the function that emits deprecation warnings.
 | 
			
		||||
 * @author Toru Nagashima <http://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Requirements
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import path from "path";
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Private
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// Defitions for deprecation warnings.
 | 
			
		||||
const deprecationWarningMessages = {
 | 
			
		||||
    ESLINT_LEGACY_ECMAFEATURES:
 | 
			
		||||
        "The 'ecmaFeatures' config file property is deprecated and has no effect.",
 | 
			
		||||
    ESLINT_PERSONAL_CONFIG_LOAD:
 | 
			
		||||
        "'~/.eslintrc.*' config files have been deprecated. " +
 | 
			
		||||
        "Please use a config file per project or the '--config' option.",
 | 
			
		||||
    ESLINT_PERSONAL_CONFIG_SUPPRESS:
 | 
			
		||||
        "'~/.eslintrc.*' config files have been deprecated. " +
 | 
			
		||||
        "Please remove it or add 'root:true' to the config files in your " +
 | 
			
		||||
        "projects in order to avoid loading '~/.eslintrc.*' accidentally."
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const sourceFileErrorCache = new Set();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Emits a deprecation warning containing a given filepath. A new deprecation warning is emitted
 | 
			
		||||
 * for each unique file path, but repeated invocations with the same file path have no effect.
 | 
			
		||||
 * No warnings are emitted if the `--no-deprecation` or `--no-warnings` Node runtime flags are active.
 | 
			
		||||
 * @param {string} source The name of the configuration source to report the warning for.
 | 
			
		||||
 * @param {string} errorCode The warning message to show.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
function emitDeprecationWarning(source, errorCode) {
 | 
			
		||||
    const cacheKey = JSON.stringify({ source, errorCode });
 | 
			
		||||
 | 
			
		||||
    if (sourceFileErrorCache.has(cacheKey)) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    sourceFileErrorCache.add(cacheKey);
 | 
			
		||||
 | 
			
		||||
    const rel = path.relative(process.cwd(), source);
 | 
			
		||||
    const message = deprecationWarningMessages[errorCode];
 | 
			
		||||
 | 
			
		||||
    process.emitWarning(
 | 
			
		||||
        `${message} (found in "${rel}")`,
 | 
			
		||||
        "DeprecationWarning",
 | 
			
		||||
        errorCode
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    emitDeprecationWarning
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										96
									
								
								node_modules/@eslint/eslintrc/lib/shared/naming.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								node_modules/@eslint/eslintrc/lib/shared/naming.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,96 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Common helpers for naming of plugins, formatters and configs
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
const NAMESPACE_REGEX = /^@.*\//iu;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Brings package name to correct format based on prefix
 | 
			
		||||
 * @param {string} name The name of the package.
 | 
			
		||||
 * @param {string} prefix Can be either "eslint-plugin", "eslint-config" or "eslint-formatter"
 | 
			
		||||
 * @returns {string} Normalized name of the package
 | 
			
		||||
 * @private
 | 
			
		||||
 */
 | 
			
		||||
function normalizePackageName(name, prefix) {
 | 
			
		||||
    let normalizedName = name;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * On Windows, name can come in with Windows slashes instead of Unix slashes.
 | 
			
		||||
     * Normalize to Unix first to avoid errors later on.
 | 
			
		||||
     * https://github.com/eslint/eslint/issues/5644
 | 
			
		||||
     */
 | 
			
		||||
    if (normalizedName.includes("\\")) {
 | 
			
		||||
        normalizedName = normalizedName.replace(/\\/gu, "/");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (normalizedName.charAt(0) === "@") {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * it's a scoped package
 | 
			
		||||
         * package name is the prefix, or just a username
 | 
			
		||||
         */
 | 
			
		||||
        const scopedPackageShortcutRegex = new RegExp(`^(@[^/]+)(?:/(?:${prefix})?)?$`, "u"),
 | 
			
		||||
            scopedPackageNameRegex = new RegExp(`^${prefix}(-|$)`, "u");
 | 
			
		||||
 | 
			
		||||
        if (scopedPackageShortcutRegex.test(normalizedName)) {
 | 
			
		||||
            normalizedName = normalizedName.replace(scopedPackageShortcutRegex, `$1/${prefix}`);
 | 
			
		||||
        } else if (!scopedPackageNameRegex.test(normalizedName.split("/")[1])) {
 | 
			
		||||
 | 
			
		||||
            /**
 | 
			
		||||
             * for scoped packages, insert the prefix after the first / unless
 | 
			
		||||
             * the path is already @scope/eslint or @scope/eslint-xxx-yyy
 | 
			
		||||
             */
 | 
			
		||||
            normalizedName = normalizedName.replace(/^@([^/]+)\/(.*)$/u, `@$1/${prefix}-$2`);
 | 
			
		||||
        }
 | 
			
		||||
    } else if (!normalizedName.startsWith(`${prefix}-`)) {
 | 
			
		||||
        normalizedName = `${prefix}-${normalizedName}`;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return normalizedName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Removes the prefix from a fullname.
 | 
			
		||||
 * @param {string} fullname The term which may have the prefix.
 | 
			
		||||
 * @param {string} prefix The prefix to remove.
 | 
			
		||||
 * @returns {string} The term without prefix.
 | 
			
		||||
 */
 | 
			
		||||
function getShorthandName(fullname, prefix) {
 | 
			
		||||
    if (fullname[0] === "@") {
 | 
			
		||||
        let matchResult = new RegExp(`^(@[^/]+)/${prefix}$`, "u").exec(fullname);
 | 
			
		||||
 | 
			
		||||
        if (matchResult) {
 | 
			
		||||
            return matchResult[1];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        matchResult = new RegExp(`^(@[^/]+)/${prefix}-(.+)$`, "u").exec(fullname);
 | 
			
		||||
        if (matchResult) {
 | 
			
		||||
            return `${matchResult[1]}/${matchResult[2]}`;
 | 
			
		||||
        }
 | 
			
		||||
    } else if (fullname.startsWith(`${prefix}-`)) {
 | 
			
		||||
        return fullname.slice(prefix.length + 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fullname;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Gets the scope (namespace) of a term.
 | 
			
		||||
 * @param {string} term The term which may have the namespace.
 | 
			
		||||
 * @returns {string} The namespace of the term if it has one.
 | 
			
		||||
 */
 | 
			
		||||
function getNamespaceFromTerm(term) {
 | 
			
		||||
    const match = term.match(NAMESPACE_REGEX);
 | 
			
		||||
 | 
			
		||||
    return match ? match[0] : "";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
// Public Interface
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    normalizePackageName,
 | 
			
		||||
    getShorthandName,
 | 
			
		||||
    getNamespaceFromTerm
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										42
									
								
								node_modules/@eslint/eslintrc/lib/shared/relative-module-resolver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								node_modules/@eslint/eslintrc/lib/shared/relative-module-resolver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,42 @@
 | 
			
		|||
/**
 | 
			
		||||
 * Utility for resolving a module relative to another module
 | 
			
		||||
 * @author Teddy Katz
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import Module from "module";
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * `Module.createRequire` is added in v12.2.0. It supports URL as well.
 | 
			
		||||
 * We only support the case where the argument is a filepath, not a URL.
 | 
			
		||||
 */
 | 
			
		||||
const createRequire = Module.createRequire;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Resolves a Node module relative to another module
 | 
			
		||||
 * @param {string} moduleName The name of a Node module, or a path to a Node module.
 | 
			
		||||
 * @param {string} relativeToPath An absolute path indicating the module that `moduleName` should be resolved relative to. This must be
 | 
			
		||||
 * a file rather than a directory, but the file need not actually exist.
 | 
			
		||||
 * @returns {string} The absolute path that would result from calling `require.resolve(moduleName)` in a file located at `relativeToPath`
 | 
			
		||||
 */
 | 
			
		||||
function resolve(moduleName, relativeToPath) {
 | 
			
		||||
    try {
 | 
			
		||||
        return createRequire(relativeToPath).resolve(moduleName);
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
 | 
			
		||||
        // This `if` block is for older Node.js than 12.0.0. We can remove this block in the future.
 | 
			
		||||
        if (
 | 
			
		||||
            typeof error === "object" &&
 | 
			
		||||
            error !== null &&
 | 
			
		||||
            error.code === "MODULE_NOT_FOUND" &&
 | 
			
		||||
            !error.requireStack &&
 | 
			
		||||
            error.message.includes(moduleName)
 | 
			
		||||
        ) {
 | 
			
		||||
            error.message += `\nRequire stack:\n- ${relativeToPath}`;
 | 
			
		||||
        }
 | 
			
		||||
        throw error;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
    resolve
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										149
									
								
								node_modules/@eslint/eslintrc/lib/shared/types.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								node_modules/@eslint/eslintrc/lib/shared/types.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,149 @@
 | 
			
		|||
/**
 | 
			
		||||
 * @fileoverview Define common types for input completion.
 | 
			
		||||
 * @author Toru Nagashima <https://github.com/mysticatea>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @type {any} */
 | 
			
		||||
export default {};
 | 
			
		||||
 | 
			
		||||
/** @typedef {boolean | "off" | "readable" | "readonly" | "writable" | "writeable"} GlobalConf */
 | 
			
		||||
/** @typedef {0 | 1 | 2 | "off" | "warn" | "error"} SeverityConf */
 | 
			
		||||
/** @typedef {SeverityConf | [SeverityConf, ...any[]]} RuleConf */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} EcmaFeatures
 | 
			
		||||
 * @property {boolean} [globalReturn] Enabling `return` statements at the top-level.
 | 
			
		||||
 * @property {boolean} [jsx] Enabling JSX syntax.
 | 
			
		||||
 * @property {boolean} [impliedStrict] Enabling strict mode always.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} ParserOptions
 | 
			
		||||
 * @property {EcmaFeatures} [ecmaFeatures] The optional features.
 | 
			
		||||
 * @property {3|5|6|7|8|9|10|11|12|2015|2016|2017|2018|2019|2020|2021} [ecmaVersion] The ECMAScript version (or revision number).
 | 
			
		||||
 * @property {"script"|"module"} [sourceType] The source code type.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} ConfigData
 | 
			
		||||
 * @property {Record<string, boolean>} [env] The environment settings.
 | 
			
		||||
 * @property {string | string[]} [extends] The path to other config files or the package name of shareable configs.
 | 
			
		||||
 * @property {Record<string, GlobalConf>} [globals] The global variable settings.
 | 
			
		||||
 * @property {string | string[]} [ignorePatterns] The glob patterns that ignore to lint.
 | 
			
		||||
 * @property {boolean} [noInlineConfig] The flag that disables directive comments.
 | 
			
		||||
 * @property {OverrideConfigData[]} [overrides] The override settings per kind of files.
 | 
			
		||||
 * @property {string} [parser] The path to a parser or the package name of a parser.
 | 
			
		||||
 * @property {ParserOptions} [parserOptions] The parser options.
 | 
			
		||||
 * @property {string[]} [plugins] The plugin specifiers.
 | 
			
		||||
 * @property {string} [processor] The processor specifier.
 | 
			
		||||
 * @property {boolean} [reportUnusedDisableDirectives] The flag to report unused `eslint-disable` comments.
 | 
			
		||||
 * @property {boolean} [root] The root flag.
 | 
			
		||||
 * @property {Record<string, RuleConf>} [rules] The rule settings.
 | 
			
		||||
 * @property {Object} [settings] The shared settings.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} OverrideConfigData
 | 
			
		||||
 * @property {Record<string, boolean>} [env] The environment settings.
 | 
			
		||||
 * @property {string | string[]} [excludedFiles] The glob pattarns for excluded files.
 | 
			
		||||
 * @property {string | string[]} [extends] The path to other config files or the package name of shareable configs.
 | 
			
		||||
 * @property {string | string[]} files The glob patterns for target files.
 | 
			
		||||
 * @property {Record<string, GlobalConf>} [globals] The global variable settings.
 | 
			
		||||
 * @property {boolean} [noInlineConfig] The flag that disables directive comments.
 | 
			
		||||
 * @property {OverrideConfigData[]} [overrides] The override settings per kind of files.
 | 
			
		||||
 * @property {string} [parser] The path to a parser or the package name of a parser.
 | 
			
		||||
 * @property {ParserOptions} [parserOptions] The parser options.
 | 
			
		||||
 * @property {string[]} [plugins] The plugin specifiers.
 | 
			
		||||
 * @property {string} [processor] The processor specifier.
 | 
			
		||||
 * @property {boolean} [reportUnusedDisableDirectives] The flag to report unused `eslint-disable` comments.
 | 
			
		||||
 * @property {Record<string, RuleConf>} [rules] The rule settings.
 | 
			
		||||
 * @property {Object} [settings] The shared settings.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} ParseResult
 | 
			
		||||
 * @property {Object} ast The AST.
 | 
			
		||||
 * @property {ScopeManager} [scopeManager] The scope manager of the AST.
 | 
			
		||||
 * @property {Record<string, any>} [services] The services that the parser provides.
 | 
			
		||||
 * @property {Record<string, string[]>} [visitorKeys] The visitor keys of the AST.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} Parser
 | 
			
		||||
 * @property {(text:string, options:ParserOptions) => Object} parse The definition of global variables.
 | 
			
		||||
 * @property {(text:string, options:ParserOptions) => ParseResult} [parseForESLint] The parser options that will be enabled under this environment.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} Environment
 | 
			
		||||
 * @property {Record<string, GlobalConf>} [globals] The definition of global variables.
 | 
			
		||||
 * @property {ParserOptions} [parserOptions] The parser options that will be enabled under this environment.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} LintMessage
 | 
			
		||||
 * @property {number} column The 1-based column number.
 | 
			
		||||
 * @property {number} [endColumn] The 1-based column number of the end location.
 | 
			
		||||
 * @property {number} [endLine] The 1-based line number of the end location.
 | 
			
		||||
 * @property {boolean} fatal If `true` then this is a fatal error.
 | 
			
		||||
 * @property {{range:[number,number], text:string}} [fix] Information for autofix.
 | 
			
		||||
 * @property {number} line The 1-based line number.
 | 
			
		||||
 * @property {string} message The error message.
 | 
			
		||||
 * @property {string|null} ruleId The ID of the rule which makes this message.
 | 
			
		||||
 * @property {0|1|2} severity The severity of this message.
 | 
			
		||||
 * @property {Array<{desc?: string, messageId?: string, fix: {range: [number, number], text: string}}>} [suggestions] Information for suggestions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} SuggestionResult
 | 
			
		||||
 * @property {string} desc A short description.
 | 
			
		||||
 * @property {string} [messageId] Id referencing a message for the description.
 | 
			
		||||
 * @property {{ text: string, range: number[] }} fix fix result info
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} Processor
 | 
			
		||||
 * @property {(text:string, filename:string) => Array<string | { text:string, filename:string }>} [preprocess] The function to extract code blocks.
 | 
			
		||||
 * @property {(messagesList:LintMessage[][], filename:string) => LintMessage[]} [postprocess] The function to merge messages.
 | 
			
		||||
 * @property {boolean} [supportsAutofix] If `true` then it means the processor supports autofix.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} RuleMetaDocs
 | 
			
		||||
 * @property {string} category The category of the rule.
 | 
			
		||||
 * @property {string} description The description of the rule.
 | 
			
		||||
 * @property {boolean} recommended If `true` then the rule is included in `eslint:recommended` preset.
 | 
			
		||||
 * @property {string} url The URL of the rule documentation.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} RuleMeta
 | 
			
		||||
 * @property {boolean} [deprecated] If `true` then the rule has been deprecated.
 | 
			
		||||
 * @property {RuleMetaDocs} docs The document information of the rule.
 | 
			
		||||
 * @property {"code"|"whitespace"} [fixable] The autofix type.
 | 
			
		||||
 * @property {Record<string,string>} [messages] The messages the rule reports.
 | 
			
		||||
 * @property {string[]} [replacedBy] The IDs of the alternative rules.
 | 
			
		||||
 * @property {Array|Object} schema The option schema of the rule.
 | 
			
		||||
 * @property {"problem"|"suggestion"|"layout"} type The rule type.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} Rule
 | 
			
		||||
 * @property {Function} create The factory of the rule.
 | 
			
		||||
 * @property {RuleMeta} meta The meta data of the rule.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {Object} Plugin
 | 
			
		||||
 * @property {Record<string, ConfigData>} [configs] The definition of plugin configs.
 | 
			
		||||
 * @property {Record<string, Environment>} [environments] The definition of plugin environments.
 | 
			
		||||
 * @property {Record<string, Processor>} [processors] The definition of plugin processors.
 | 
			
		||||
 * @property {Record<string, Function | Rule>} [rules] The definition of plugin rules.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Information of deprecated rules.
 | 
			
		||||
 * @typedef {Object} DeprecatedRuleInfo
 | 
			
		||||
 * @property {string} ruleId The rule ID.
 | 
			
		||||
 * @property {string[]} replacedBy The rule IDs that replace this deprecated rule.
 | 
			
		||||
 */
 | 
			
		||||
							
								
								
									
										20
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/.tonic_example.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/.tonic_example.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
var Ajv = require('ajv');
 | 
			
		||||
var ajv = new Ajv({allErrors: true});
 | 
			
		||||
 | 
			
		||||
var schema = {
 | 
			
		||||
  "properties": {
 | 
			
		||||
    "foo": { "type": "string" },
 | 
			
		||||
    "bar": { "type": "number", "maximum": 3 }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var validate = ajv.compile(schema);
 | 
			
		||||
 | 
			
		||||
test({"foo": "abc", "bar": 2});
 | 
			
		||||
test({"foo": 2, "bar": 4});
 | 
			
		||||
 | 
			
		||||
function test(data) {
 | 
			
		||||
  var valid = validate(data);
 | 
			
		||||
  if (valid) console.log('Valid!');
 | 
			
		||||
  else console.log('Invalid: ' + ajv.errorsText(validate.errors));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
The MIT License (MIT)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2015-2017 Evgeny Poberezkin
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1497
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1497
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										7189
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/dist/ajv.bundle.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7189
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/dist/ajv.bundle.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										3
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/dist/ajv.min.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/dist/ajv.min.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/dist/ajv.min.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/dist/ajv.min.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										397
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/ajv.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/ajv.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,397 @@
 | 
			
		|||
declare var ajv: {
 | 
			
		||||
  (options?: ajv.Options): ajv.Ajv;
 | 
			
		||||
  new(options?: ajv.Options): ajv.Ajv;
 | 
			
		||||
  ValidationError: typeof AjvErrors.ValidationError;
 | 
			
		||||
  MissingRefError: typeof AjvErrors.MissingRefError;
 | 
			
		||||
  $dataMetaSchema: object;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare namespace AjvErrors {
 | 
			
		||||
  class ValidationError extends Error {
 | 
			
		||||
    constructor(errors: Array<ajv.ErrorObject>);
 | 
			
		||||
 | 
			
		||||
    message: string;
 | 
			
		||||
    errors: Array<ajv.ErrorObject>;
 | 
			
		||||
    ajv: true;
 | 
			
		||||
    validation: true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  class MissingRefError extends Error {
 | 
			
		||||
    constructor(baseId: string, ref: string, message?: string);
 | 
			
		||||
    static message: (baseId: string, ref: string) => string;
 | 
			
		||||
 | 
			
		||||
    message: string;
 | 
			
		||||
    missingRef: string;
 | 
			
		||||
    missingSchema: string;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare namespace ajv {
 | 
			
		||||
  type ValidationError = AjvErrors.ValidationError;
 | 
			
		||||
 | 
			
		||||
  type MissingRefError = AjvErrors.MissingRefError;
 | 
			
		||||
 | 
			
		||||
  interface Ajv {
 | 
			
		||||
    /**
 | 
			
		||||
    * Validate data using schema
 | 
			
		||||
    * Schema will be compiled and cached (using serialized JSON as key, [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize by default).
 | 
			
		||||
    * @param  {string|object|Boolean} schemaKeyRef key, ref or schema object
 | 
			
		||||
    * @param  {Any} data to be validated
 | 
			
		||||
    * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).
 | 
			
		||||
    */
 | 
			
		||||
    validate(schemaKeyRef: object | string | boolean, data: any): boolean | PromiseLike<any>;
 | 
			
		||||
    /**
 | 
			
		||||
    * Create validating function for passed schema.
 | 
			
		||||
    * @param  {object|Boolean} schema schema object
 | 
			
		||||
    * @return {Function} validating function
 | 
			
		||||
    */
 | 
			
		||||
    compile(schema: object | boolean): ValidateFunction;
 | 
			
		||||
    /**
 | 
			
		||||
    * Creates validating function for passed schema with asynchronous loading of missing schemas.
 | 
			
		||||
    * `loadSchema` option should be a function that accepts schema uri and node-style callback.
 | 
			
		||||
    * @this  Ajv
 | 
			
		||||
    * @param {object|Boolean} schema schema object
 | 
			
		||||
    * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped
 | 
			
		||||
    * @param {Function} callback optional node-style callback, it is always called with 2 parameters: error (or null) and validating function.
 | 
			
		||||
    * @return {PromiseLike<ValidateFunction>} validating function
 | 
			
		||||
    */
 | 
			
		||||
    compileAsync(schema: object | boolean, meta?: Boolean, callback?: (err: Error, validate: ValidateFunction) => any): PromiseLike<ValidateFunction>;
 | 
			
		||||
    /**
 | 
			
		||||
    * Adds schema to the instance.
 | 
			
		||||
    * @param {object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.
 | 
			
		||||
    * @param {string} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
 | 
			
		||||
    * @return {Ajv} this for method chaining
 | 
			
		||||
    */
 | 
			
		||||
    addSchema(schema: Array<object> | object, key?: string): Ajv;
 | 
			
		||||
    /**
 | 
			
		||||
    * Add schema that will be used to validate other schemas
 | 
			
		||||
    * options in META_IGNORE_OPTIONS are alway set to false
 | 
			
		||||
    * @param {object} schema schema object
 | 
			
		||||
    * @param {string} key optional schema key
 | 
			
		||||
    * @return {Ajv} this for method chaining
 | 
			
		||||
    */
 | 
			
		||||
    addMetaSchema(schema: object, key?: string): Ajv;
 | 
			
		||||
    /**
 | 
			
		||||
    * Validate schema
 | 
			
		||||
    * @param {object|Boolean} schema schema to validate
 | 
			
		||||
    * @return {Boolean} true if schema is valid
 | 
			
		||||
    */
 | 
			
		||||
    validateSchema(schema: object | boolean): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
    * Get compiled schema from the instance by `key` or `ref`.
 | 
			
		||||
    * @param  {string} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).
 | 
			
		||||
    * @return {Function} schema validating function (with property `schema`). Returns undefined if keyRef can't be resolved to an existing schema.
 | 
			
		||||
    */
 | 
			
		||||
    getSchema(keyRef: string): ValidateFunction | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
    * Remove cached schema(s).
 | 
			
		||||
    * If no parameter is passed all schemas but meta-schemas are removed.
 | 
			
		||||
    * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
 | 
			
		||||
    * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
 | 
			
		||||
    * @param  {string|object|RegExp|Boolean} schemaKeyRef key, ref, pattern to match key/ref or schema object
 | 
			
		||||
    * @return {Ajv} this for method chaining
 | 
			
		||||
    */
 | 
			
		||||
    removeSchema(schemaKeyRef?: object | string | RegExp | boolean): Ajv;
 | 
			
		||||
    /**
 | 
			
		||||
    * Add custom format
 | 
			
		||||
    * @param {string} name format name
 | 
			
		||||
    * @param {string|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)
 | 
			
		||||
    * @return {Ajv} this for method chaining
 | 
			
		||||
    */
 | 
			
		||||
    addFormat(name: string, format: FormatValidator | FormatDefinition): Ajv;
 | 
			
		||||
    /**
 | 
			
		||||
    * Define custom keyword
 | 
			
		||||
    * @this  Ajv
 | 
			
		||||
    * @param {string} keyword custom keyword, should be a valid identifier, should be different from all standard, custom and macro keywords.
 | 
			
		||||
    * @param {object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.
 | 
			
		||||
    * @return {Ajv} this for method chaining
 | 
			
		||||
    */
 | 
			
		||||
    addKeyword(keyword: string, definition: KeywordDefinition): Ajv;
 | 
			
		||||
    /**
 | 
			
		||||
    * Get keyword definition
 | 
			
		||||
    * @this  Ajv
 | 
			
		||||
    * @param {string} keyword pre-defined or custom keyword.
 | 
			
		||||
    * @return {object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise.
 | 
			
		||||
    */
 | 
			
		||||
    getKeyword(keyword: string): object | boolean;
 | 
			
		||||
    /**
 | 
			
		||||
    * Remove keyword
 | 
			
		||||
    * @this  Ajv
 | 
			
		||||
    * @param {string} keyword pre-defined or custom keyword.
 | 
			
		||||
    * @return {Ajv} this for method chaining
 | 
			
		||||
    */
 | 
			
		||||
    removeKeyword(keyword: string): Ajv;
 | 
			
		||||
    /**
 | 
			
		||||
    * Validate keyword
 | 
			
		||||
    * @this  Ajv
 | 
			
		||||
    * @param {object} definition keyword definition object
 | 
			
		||||
    * @param {boolean} throwError true to throw exception if definition is invalid
 | 
			
		||||
    * @return {boolean} validation result
 | 
			
		||||
    */
 | 
			
		||||
    validateKeyword(definition: KeywordDefinition, throwError: boolean): boolean;
 | 
			
		||||
    /**
 | 
			
		||||
    * Convert array of error message objects to string
 | 
			
		||||
    * @param  {Array<object>} errors optional array of validation errors, if not passed errors from the instance are used.
 | 
			
		||||
    * @param  {object} options optional options with properties `separator` and `dataVar`.
 | 
			
		||||
    * @return {string} human readable string with all errors descriptions
 | 
			
		||||
    */
 | 
			
		||||
    errorsText(errors?: Array<ErrorObject> | null, options?: ErrorsTextOptions): string;
 | 
			
		||||
    errors?: Array<ErrorObject> | null;
 | 
			
		||||
    _opts: Options;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface CustomLogger {
 | 
			
		||||
    log(...args: any[]): any;
 | 
			
		||||
    warn(...args: any[]): any;
 | 
			
		||||
    error(...args: any[]): any;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface ValidateFunction {
 | 
			
		||||
    (
 | 
			
		||||
      data: any,
 | 
			
		||||
      dataPath?: string,
 | 
			
		||||
      parentData?: object | Array<any>,
 | 
			
		||||
      parentDataProperty?: string | number,
 | 
			
		||||
      rootData?: object | Array<any>
 | 
			
		||||
    ): boolean | PromiseLike<any>;
 | 
			
		||||
    schema?: object | boolean;
 | 
			
		||||
    errors?: null | Array<ErrorObject>;
 | 
			
		||||
    refs?: object;
 | 
			
		||||
    refVal?: Array<any>;
 | 
			
		||||
    root?: ValidateFunction | object;
 | 
			
		||||
    $async?: true;
 | 
			
		||||
    source?: object;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface Options {
 | 
			
		||||
    $data?: boolean;
 | 
			
		||||
    allErrors?: boolean;
 | 
			
		||||
    verbose?: boolean;
 | 
			
		||||
    jsonPointers?: boolean;
 | 
			
		||||
    uniqueItems?: boolean;
 | 
			
		||||
    unicode?: boolean;
 | 
			
		||||
    format?: false | string;
 | 
			
		||||
    formats?: object;
 | 
			
		||||
    keywords?: object;
 | 
			
		||||
    unknownFormats?: true | string[] | 'ignore';
 | 
			
		||||
    schemas?: Array<object> | object;
 | 
			
		||||
    schemaId?: '$id' | 'id' | 'auto';
 | 
			
		||||
    missingRefs?: true | 'ignore' | 'fail';
 | 
			
		||||
    extendRefs?: true | 'ignore' | 'fail';
 | 
			
		||||
    loadSchema?: (uri: string, cb?: (err: Error, schema: object) => void) => PromiseLike<object | boolean>;
 | 
			
		||||
    removeAdditional?: boolean | 'all' | 'failing';
 | 
			
		||||
    useDefaults?: boolean | 'empty' | 'shared';
 | 
			
		||||
    coerceTypes?: boolean | 'array';
 | 
			
		||||
    strictDefaults?: boolean | 'log';
 | 
			
		||||
    strictKeywords?: boolean | 'log';
 | 
			
		||||
    strictNumbers?: boolean;
 | 
			
		||||
    async?: boolean | string;
 | 
			
		||||
    transpile?: string | ((code: string) => string);
 | 
			
		||||
    meta?: boolean | object;
 | 
			
		||||
    validateSchema?: boolean | 'log';
 | 
			
		||||
    addUsedSchema?: boolean;
 | 
			
		||||
    inlineRefs?: boolean | number;
 | 
			
		||||
    passContext?: boolean;
 | 
			
		||||
    loopRequired?: number;
 | 
			
		||||
    ownProperties?: boolean;
 | 
			
		||||
    multipleOfPrecision?: boolean | number;
 | 
			
		||||
    errorDataPath?: string,
 | 
			
		||||
    messages?: boolean;
 | 
			
		||||
    sourceCode?: boolean;
 | 
			
		||||
    processCode?: (code: string, schema: object) => string;
 | 
			
		||||
    cache?: object;
 | 
			
		||||
    logger?: CustomLogger | false;
 | 
			
		||||
    nullable?: boolean;
 | 
			
		||||
    serialize?: ((schema: object | boolean) => any) | false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  type FormatValidator = string | RegExp | ((data: string) => boolean | PromiseLike<any>);
 | 
			
		||||
  type NumberFormatValidator = ((data: number) => boolean | PromiseLike<any>);
 | 
			
		||||
 | 
			
		||||
  interface NumberFormatDefinition {
 | 
			
		||||
    type: "number",
 | 
			
		||||
    validate: NumberFormatValidator;
 | 
			
		||||
    compare?: (data1: number, data2: number) => number;
 | 
			
		||||
    async?: boolean;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface StringFormatDefinition {
 | 
			
		||||
    type?: "string",
 | 
			
		||||
    validate: FormatValidator;
 | 
			
		||||
    compare?: (data1: string, data2: string) => number;
 | 
			
		||||
    async?: boolean;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  type FormatDefinition = NumberFormatDefinition | StringFormatDefinition;
 | 
			
		||||
 | 
			
		||||
  interface KeywordDefinition {
 | 
			
		||||
    type?: string | Array<string>;
 | 
			
		||||
    async?: boolean;
 | 
			
		||||
    $data?: boolean;
 | 
			
		||||
    errors?: boolean | string;
 | 
			
		||||
    metaSchema?: object;
 | 
			
		||||
    // schema: false makes validate not to expect schema (ValidateFunction)
 | 
			
		||||
    schema?: boolean;
 | 
			
		||||
    statements?: boolean;
 | 
			
		||||
    dependencies?: Array<string>;
 | 
			
		||||
    modifying?: boolean;
 | 
			
		||||
    valid?: boolean;
 | 
			
		||||
    // one and only one of the following properties should be present
 | 
			
		||||
    validate?: SchemaValidateFunction | ValidateFunction;
 | 
			
		||||
    compile?: (schema: any, parentSchema: object, it: CompilationContext) => ValidateFunction;
 | 
			
		||||
    macro?: (schema: any, parentSchema: object, it: CompilationContext) => object | boolean;
 | 
			
		||||
    inline?: (it: CompilationContext, keyword: string, schema: any, parentSchema: object) => string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface CompilationContext {
 | 
			
		||||
    level: number;
 | 
			
		||||
    dataLevel: number;
 | 
			
		||||
    dataPathArr: string[];
 | 
			
		||||
    schema: any;
 | 
			
		||||
    schemaPath: string;
 | 
			
		||||
    baseId: string;
 | 
			
		||||
    async: boolean;
 | 
			
		||||
    opts: Options;
 | 
			
		||||
    formats: {
 | 
			
		||||
      [index: string]: FormatDefinition | undefined;
 | 
			
		||||
    };
 | 
			
		||||
    keywords: {
 | 
			
		||||
      [index: string]: KeywordDefinition | undefined;
 | 
			
		||||
    };
 | 
			
		||||
    compositeRule: boolean;
 | 
			
		||||
    validate: (schema: object) => boolean;
 | 
			
		||||
    util: {
 | 
			
		||||
      copy(obj: any, target?: any): any;
 | 
			
		||||
      toHash(source: string[]): { [index: string]: true | undefined };
 | 
			
		||||
      equal(obj: any, target: any): boolean;
 | 
			
		||||
      getProperty(str: string): string;
 | 
			
		||||
      schemaHasRules(schema: object, rules: any): string;
 | 
			
		||||
      escapeQuotes(str: string): string;
 | 
			
		||||
      toQuotedString(str: string): string;
 | 
			
		||||
      getData(jsonPointer: string, dataLevel: number, paths: string[]): string;
 | 
			
		||||
      escapeJsonPointer(str: string): string;
 | 
			
		||||
      unescapeJsonPointer(str: string): string;
 | 
			
		||||
      escapeFragment(str: string): string;
 | 
			
		||||
      unescapeFragment(str: string): string;
 | 
			
		||||
    };
 | 
			
		||||
    self: Ajv;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface SchemaValidateFunction {
 | 
			
		||||
    (
 | 
			
		||||
      schema: any,
 | 
			
		||||
      data: any,
 | 
			
		||||
      parentSchema?: object,
 | 
			
		||||
      dataPath?: string,
 | 
			
		||||
      parentData?: object | Array<any>,
 | 
			
		||||
      parentDataProperty?: string | number,
 | 
			
		||||
      rootData?: object | Array<any>
 | 
			
		||||
    ): boolean | PromiseLike<any>;
 | 
			
		||||
    errors?: Array<ErrorObject>;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface ErrorsTextOptions {
 | 
			
		||||
    separator?: string;
 | 
			
		||||
    dataVar?: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface ErrorObject {
 | 
			
		||||
    keyword: string;
 | 
			
		||||
    dataPath: string;
 | 
			
		||||
    schemaPath: string;
 | 
			
		||||
    params: ErrorParameters;
 | 
			
		||||
    // Added to validation errors of propertyNames keyword schema
 | 
			
		||||
    propertyName?: string;
 | 
			
		||||
    // Excluded if messages set to false.
 | 
			
		||||
    message?: string;
 | 
			
		||||
    // These are added with the `verbose` option.
 | 
			
		||||
    schema?: any;
 | 
			
		||||
    parentSchema?: object;
 | 
			
		||||
    data?: any;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  type ErrorParameters = RefParams | LimitParams | AdditionalPropertiesParams |
 | 
			
		||||
    DependenciesParams | FormatParams | ComparisonParams |
 | 
			
		||||
    MultipleOfParams | PatternParams | RequiredParams |
 | 
			
		||||
    TypeParams | UniqueItemsParams | CustomParams |
 | 
			
		||||
    PatternRequiredParams | PropertyNamesParams |
 | 
			
		||||
    IfParams | SwitchParams | NoParams | EnumParams;
 | 
			
		||||
 | 
			
		||||
  interface RefParams {
 | 
			
		||||
    ref: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface LimitParams {
 | 
			
		||||
    limit: number;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface AdditionalPropertiesParams {
 | 
			
		||||
    additionalProperty: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface DependenciesParams {
 | 
			
		||||
    property: string;
 | 
			
		||||
    missingProperty: string;
 | 
			
		||||
    depsCount: number;
 | 
			
		||||
    deps: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface FormatParams {
 | 
			
		||||
    format: string
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface ComparisonParams {
 | 
			
		||||
    comparison: string;
 | 
			
		||||
    limit: number | string;
 | 
			
		||||
    exclusive: boolean;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface MultipleOfParams {
 | 
			
		||||
    multipleOf: number;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface PatternParams {
 | 
			
		||||
    pattern: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface RequiredParams {
 | 
			
		||||
    missingProperty: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface TypeParams {
 | 
			
		||||
    type: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface UniqueItemsParams {
 | 
			
		||||
    i: number;
 | 
			
		||||
    j: number;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface CustomParams {
 | 
			
		||||
    keyword: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface PatternRequiredParams {
 | 
			
		||||
    missingPattern: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface PropertyNamesParams {
 | 
			
		||||
    propertyName: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface IfParams {
 | 
			
		||||
    failingKeyword: string;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface SwitchParams {
 | 
			
		||||
    caseIndex: number;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface NoParams { }
 | 
			
		||||
 | 
			
		||||
  interface EnumParams {
 | 
			
		||||
    allowedValues: Array<any>;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export = ajv;
 | 
			
		||||
							
								
								
									
										506
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/ajv.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										506
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/ajv.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,506 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
var compileSchema = require('./compile')
 | 
			
		||||
  , resolve = require('./compile/resolve')
 | 
			
		||||
  , Cache = require('./cache')
 | 
			
		||||
  , SchemaObject = require('./compile/schema_obj')
 | 
			
		||||
  , stableStringify = require('fast-json-stable-stringify')
 | 
			
		||||
  , formats = require('./compile/formats')
 | 
			
		||||
  , rules = require('./compile/rules')
 | 
			
		||||
  , $dataMetaSchema = require('./data')
 | 
			
		||||
  , util = require('./compile/util');
 | 
			
		||||
 | 
			
		||||
module.exports = Ajv;
 | 
			
		||||
 | 
			
		||||
Ajv.prototype.validate = validate;
 | 
			
		||||
Ajv.prototype.compile = compile;
 | 
			
		||||
Ajv.prototype.addSchema = addSchema;
 | 
			
		||||
Ajv.prototype.addMetaSchema = addMetaSchema;
 | 
			
		||||
Ajv.prototype.validateSchema = validateSchema;
 | 
			
		||||
Ajv.prototype.getSchema = getSchema;
 | 
			
		||||
Ajv.prototype.removeSchema = removeSchema;
 | 
			
		||||
Ajv.prototype.addFormat = addFormat;
 | 
			
		||||
Ajv.prototype.errorsText = errorsText;
 | 
			
		||||
 | 
			
		||||
Ajv.prototype._addSchema = _addSchema;
 | 
			
		||||
Ajv.prototype._compile = _compile;
 | 
			
		||||
 | 
			
		||||
Ajv.prototype.compileAsync = require('./compile/async');
 | 
			
		||||
var customKeyword = require('./keyword');
 | 
			
		||||
Ajv.prototype.addKeyword = customKeyword.add;
 | 
			
		||||
Ajv.prototype.getKeyword = customKeyword.get;
 | 
			
		||||
Ajv.prototype.removeKeyword = customKeyword.remove;
 | 
			
		||||
Ajv.prototype.validateKeyword = customKeyword.validate;
 | 
			
		||||
 | 
			
		||||
var errorClasses = require('./compile/error_classes');
 | 
			
		||||
Ajv.ValidationError = errorClasses.Validation;
 | 
			
		||||
Ajv.MissingRefError = errorClasses.MissingRef;
 | 
			
		||||
Ajv.$dataMetaSchema = $dataMetaSchema;
 | 
			
		||||
 | 
			
		||||
var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema';
 | 
			
		||||
 | 
			
		||||
var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ];
 | 
			
		||||
var META_SUPPORT_DATA = ['/properties'];
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Creates validator instance.
 | 
			
		||||
 * Usage: `Ajv(opts)`
 | 
			
		||||
 * @param {Object} opts optional options
 | 
			
		||||
 * @return {Object} ajv instance
 | 
			
		||||
 */
 | 
			
		||||
function Ajv(opts) {
 | 
			
		||||
  if (!(this instanceof Ajv)) return new Ajv(opts);
 | 
			
		||||
  opts = this._opts = util.copy(opts) || {};
 | 
			
		||||
  setLogger(this);
 | 
			
		||||
  this._schemas = {};
 | 
			
		||||
  this._refs = {};
 | 
			
		||||
  this._fragments = {};
 | 
			
		||||
  this._formats = formats(opts.format);
 | 
			
		||||
 | 
			
		||||
  this._cache = opts.cache || new Cache;
 | 
			
		||||
  this._loadingSchemas = {};
 | 
			
		||||
  this._compilations = [];
 | 
			
		||||
  this.RULES = rules();
 | 
			
		||||
  this._getId = chooseGetId(opts);
 | 
			
		||||
 | 
			
		||||
  opts.loopRequired = opts.loopRequired || Infinity;
 | 
			
		||||
  if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;
 | 
			
		||||
  if (opts.serialize === undefined) opts.serialize = stableStringify;
 | 
			
		||||
  this._metaOpts = getMetaSchemaOptions(this);
 | 
			
		||||
 | 
			
		||||
  if (opts.formats) addInitialFormats(this);
 | 
			
		||||
  if (opts.keywords) addInitialKeywords(this);
 | 
			
		||||
  addDefaultMetaSchema(this);
 | 
			
		||||
  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);
 | 
			
		||||
  if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}});
 | 
			
		||||
  addInitialSchemas(this);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Validate data using schema
 | 
			
		||||
 * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param  {String|Object} schemaKeyRef key, ref or schema object
 | 
			
		||||
 * @param  {Any} data to be validated
 | 
			
		||||
 * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).
 | 
			
		||||
 */
 | 
			
		||||
function validate(schemaKeyRef, data) {
 | 
			
		||||
  var v;
 | 
			
		||||
  if (typeof schemaKeyRef == 'string') {
 | 
			
		||||
    v = this.getSchema(schemaKeyRef);
 | 
			
		||||
    if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"');
 | 
			
		||||
  } else {
 | 
			
		||||
    var schemaObj = this._addSchema(schemaKeyRef);
 | 
			
		||||
    v = schemaObj.validate || this._compile(schemaObj);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var valid = v(data);
 | 
			
		||||
  if (v.$async !== true) this.errors = v.errors;
 | 
			
		||||
  return valid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create validating function for passed schema.
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param  {Object} schema schema object
 | 
			
		||||
 * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.
 | 
			
		||||
 * @return {Function} validating function
 | 
			
		||||
 */
 | 
			
		||||
function compile(schema, _meta) {
 | 
			
		||||
  var schemaObj = this._addSchema(schema, undefined, _meta);
 | 
			
		||||
  return schemaObj.validate || this._compile(schemaObj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Adds schema to the instance.
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.
 | 
			
		||||
 * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.
 | 
			
		||||
 * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.
 | 
			
		||||
 * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.
 | 
			
		||||
 * @return {Ajv} this for method chaining
 | 
			
		||||
 */
 | 
			
		||||
function addSchema(schema, key, _skipValidation, _meta) {
 | 
			
		||||
  if (Array.isArray(schema)){
 | 
			
		||||
    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta);
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
  var id = this._getId(schema);
 | 
			
		||||
  if (id !== undefined && typeof id != 'string')
 | 
			
		||||
    throw new Error('schema id must be string');
 | 
			
		||||
  key = resolve.normalizeId(key || id);
 | 
			
		||||
  checkUnique(this, key);
 | 
			
		||||
  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);
 | 
			
		||||
  return this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add schema that will be used to validate other schemas
 | 
			
		||||
 * options in META_IGNORE_OPTIONS are alway set to false
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param {Object} schema schema object
 | 
			
		||||
 * @param {String} key optional schema key
 | 
			
		||||
 * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema
 | 
			
		||||
 * @return {Ajv} this for method chaining
 | 
			
		||||
 */
 | 
			
		||||
function addMetaSchema(schema, key, skipValidation) {
 | 
			
		||||
  this.addSchema(schema, key, skipValidation, true);
 | 
			
		||||
  return this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Validate schema
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param {Object} schema schema to validate
 | 
			
		||||
 * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid
 | 
			
		||||
 * @return {Boolean} true if schema is valid
 | 
			
		||||
 */
 | 
			
		||||
function validateSchema(schema, throwOrLogError) {
 | 
			
		||||
  var $schema = schema.$schema;
 | 
			
		||||
  if ($schema !== undefined && typeof $schema != 'string')
 | 
			
		||||
    throw new Error('$schema must be a string');
 | 
			
		||||
  $schema = $schema || this._opts.defaultMeta || defaultMeta(this);
 | 
			
		||||
  if (!$schema) {
 | 
			
		||||
    this.logger.warn('meta-schema not available');
 | 
			
		||||
    this.errors = null;
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  var valid = this.validate($schema, schema);
 | 
			
		||||
  if (!valid && throwOrLogError) {
 | 
			
		||||
    var message = 'schema is invalid: ' + this.errorsText();
 | 
			
		||||
    if (this._opts.validateSchema == 'log') this.logger.error(message);
 | 
			
		||||
    else throw new Error(message);
 | 
			
		||||
  }
 | 
			
		||||
  return valid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function defaultMeta(self) {
 | 
			
		||||
  var meta = self._opts.meta;
 | 
			
		||||
  self._opts.defaultMeta = typeof meta == 'object'
 | 
			
		||||
                            ? self._getId(meta) || meta
 | 
			
		||||
                            : self.getSchema(META_SCHEMA_ID)
 | 
			
		||||
                              ? META_SCHEMA_ID
 | 
			
		||||
                              : undefined;
 | 
			
		||||
  return self._opts.defaultMeta;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get compiled schema from the instance by `key` or `ref`.
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).
 | 
			
		||||
 * @return {Function} schema validating function (with property `schema`).
 | 
			
		||||
 */
 | 
			
		||||
function getSchema(keyRef) {
 | 
			
		||||
  var schemaObj = _getSchemaObj(this, keyRef);
 | 
			
		||||
  switch (typeof schemaObj) {
 | 
			
		||||
    case 'object': return schemaObj.validate || this._compile(schemaObj);
 | 
			
		||||
    case 'string': return this.getSchema(schemaObj);
 | 
			
		||||
    case 'undefined': return _getSchemaFragment(this, keyRef);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function _getSchemaFragment(self, ref) {
 | 
			
		||||
  var res = resolve.schema.call(self, { schema: {} }, ref);
 | 
			
		||||
  if (res) {
 | 
			
		||||
    var schema = res.schema
 | 
			
		||||
      , root = res.root
 | 
			
		||||
      , baseId = res.baseId;
 | 
			
		||||
    var v = compileSchema.call(self, schema, root, undefined, baseId);
 | 
			
		||||
    self._fragments[ref] = new SchemaObject({
 | 
			
		||||
      ref: ref,
 | 
			
		||||
      fragment: true,
 | 
			
		||||
      schema: schema,
 | 
			
		||||
      root: root,
 | 
			
		||||
      baseId: baseId,
 | 
			
		||||
      validate: v
 | 
			
		||||
    });
 | 
			
		||||
    return v;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function _getSchemaObj(self, keyRef) {
 | 
			
		||||
  keyRef = resolve.normalizeId(keyRef);
 | 
			
		||||
  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Remove cached schema(s).
 | 
			
		||||
 * If no parameter is passed all schemas but meta-schemas are removed.
 | 
			
		||||
 * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.
 | 
			
		||||
 * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object
 | 
			
		||||
 * @return {Ajv} this for method chaining
 | 
			
		||||
 */
 | 
			
		||||
function removeSchema(schemaKeyRef) {
 | 
			
		||||
  if (schemaKeyRef instanceof RegExp) {
 | 
			
		||||
    _removeAllSchemas(this, this._schemas, schemaKeyRef);
 | 
			
		||||
    _removeAllSchemas(this, this._refs, schemaKeyRef);
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
  switch (typeof schemaKeyRef) {
 | 
			
		||||
    case 'undefined':
 | 
			
		||||
      _removeAllSchemas(this, this._schemas);
 | 
			
		||||
      _removeAllSchemas(this, this._refs);
 | 
			
		||||
      this._cache.clear();
 | 
			
		||||
      return this;
 | 
			
		||||
    case 'string':
 | 
			
		||||
      var schemaObj = _getSchemaObj(this, schemaKeyRef);
 | 
			
		||||
      if (schemaObj) this._cache.del(schemaObj.cacheKey);
 | 
			
		||||
      delete this._schemas[schemaKeyRef];
 | 
			
		||||
      delete this._refs[schemaKeyRef];
 | 
			
		||||
      return this;
 | 
			
		||||
    case 'object':
 | 
			
		||||
      var serialize = this._opts.serialize;
 | 
			
		||||
      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;
 | 
			
		||||
      this._cache.del(cacheKey);
 | 
			
		||||
      var id = this._getId(schemaKeyRef);
 | 
			
		||||
      if (id) {
 | 
			
		||||
        id = resolve.normalizeId(id);
 | 
			
		||||
        delete this._schemas[id];
 | 
			
		||||
        delete this._refs[id];
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  return this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function _removeAllSchemas(self, schemas, regex) {
 | 
			
		||||
  for (var keyRef in schemas) {
 | 
			
		||||
    var schemaObj = schemas[keyRef];
 | 
			
		||||
    if (!schemaObj.meta && (!regex || regex.test(keyRef))) {
 | 
			
		||||
      self._cache.del(schemaObj.cacheKey);
 | 
			
		||||
      delete schemas[keyRef];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* @this   Ajv */
 | 
			
		||||
function _addSchema(schema, skipValidation, meta, shouldAddSchema) {
 | 
			
		||||
  if (typeof schema != 'object' && typeof schema != 'boolean')
 | 
			
		||||
    throw new Error('schema should be object or boolean');
 | 
			
		||||
  var serialize = this._opts.serialize;
 | 
			
		||||
  var cacheKey = serialize ? serialize(schema) : schema;
 | 
			
		||||
  var cached = this._cache.get(cacheKey);
 | 
			
		||||
  if (cached) return cached;
 | 
			
		||||
 | 
			
		||||
  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;
 | 
			
		||||
 | 
			
		||||
  var id = resolve.normalizeId(this._getId(schema));
 | 
			
		||||
  if (id && shouldAddSchema) checkUnique(this, id);
 | 
			
		||||
 | 
			
		||||
  var willValidate = this._opts.validateSchema !== false && !skipValidation;
 | 
			
		||||
  var recursiveMeta;
 | 
			
		||||
  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))
 | 
			
		||||
    this.validateSchema(schema, true);
 | 
			
		||||
 | 
			
		||||
  var localRefs = resolve.ids.call(this, schema);
 | 
			
		||||
 | 
			
		||||
  var schemaObj = new SchemaObject({
 | 
			
		||||
    id: id,
 | 
			
		||||
    schema: schema,
 | 
			
		||||
    localRefs: localRefs,
 | 
			
		||||
    cacheKey: cacheKey,
 | 
			
		||||
    meta: meta
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj;
 | 
			
		||||
  this._cache.put(cacheKey, schemaObj);
 | 
			
		||||
 | 
			
		||||
  if (willValidate && recursiveMeta) this.validateSchema(schema, true);
 | 
			
		||||
 | 
			
		||||
  return schemaObj;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* @this   Ajv */
 | 
			
		||||
function _compile(schemaObj, root) {
 | 
			
		||||
  if (schemaObj.compiling) {
 | 
			
		||||
    schemaObj.validate = callValidate;
 | 
			
		||||
    callValidate.schema = schemaObj.schema;
 | 
			
		||||
    callValidate.errors = null;
 | 
			
		||||
    callValidate.root = root ? root : callValidate;
 | 
			
		||||
    if (schemaObj.schema.$async === true)
 | 
			
		||||
      callValidate.$async = true;
 | 
			
		||||
    return callValidate;
 | 
			
		||||
  }
 | 
			
		||||
  schemaObj.compiling = true;
 | 
			
		||||
 | 
			
		||||
  var currentOpts;
 | 
			
		||||
  if (schemaObj.meta) {
 | 
			
		||||
    currentOpts = this._opts;
 | 
			
		||||
    this._opts = this._metaOpts;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var v;
 | 
			
		||||
  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); }
 | 
			
		||||
  catch(e) {
 | 
			
		||||
    delete schemaObj.validate;
 | 
			
		||||
    throw e;
 | 
			
		||||
  }
 | 
			
		||||
  finally {
 | 
			
		||||
    schemaObj.compiling = false;
 | 
			
		||||
    if (schemaObj.meta) this._opts = currentOpts;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  schemaObj.validate = v;
 | 
			
		||||
  schemaObj.refs = v.refs;
 | 
			
		||||
  schemaObj.refVal = v.refVal;
 | 
			
		||||
  schemaObj.root = v.root;
 | 
			
		||||
  return v;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /* @this   {*} - custom context, see passContext option */
 | 
			
		||||
  function callValidate() {
 | 
			
		||||
    /* jshint validthis: true */
 | 
			
		||||
    var _validate = schemaObj.validate;
 | 
			
		||||
    var result = _validate.apply(this, arguments);
 | 
			
		||||
    callValidate.errors = _validate.errors;
 | 
			
		||||
    return result;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function chooseGetId(opts) {
 | 
			
		||||
  switch (opts.schemaId) {
 | 
			
		||||
    case 'auto': return _get$IdOrId;
 | 
			
		||||
    case 'id': return _getId;
 | 
			
		||||
    default: return _get$Id;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* @this   Ajv */
 | 
			
		||||
function _getId(schema) {
 | 
			
		||||
  if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);
 | 
			
		||||
  return schema.id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* @this   Ajv */
 | 
			
		||||
function _get$Id(schema) {
 | 
			
		||||
  if (schema.id) this.logger.warn('schema id ignored', schema.id);
 | 
			
		||||
  return schema.$id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function _get$IdOrId(schema) {
 | 
			
		||||
  if (schema.$id && schema.id && schema.$id != schema.id)
 | 
			
		||||
    throw new Error('schema $id is different from id');
 | 
			
		||||
  return schema.$id || schema.id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convert array of error message objects to string
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used.
 | 
			
		||||
 * @param  {Object} options optional options with properties `separator` and `dataVar`.
 | 
			
		||||
 * @return {String} human readable string with all errors descriptions
 | 
			
		||||
 */
 | 
			
		||||
function errorsText(errors, options) {
 | 
			
		||||
  errors = errors || this.errors;
 | 
			
		||||
  if (!errors) return 'No errors';
 | 
			
		||||
  options = options || {};
 | 
			
		||||
  var separator = options.separator === undefined ? ', ' : options.separator;
 | 
			
		||||
  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;
 | 
			
		||||
 | 
			
		||||
  var text = '';
 | 
			
		||||
  for (var i=0; i<errors.length; i++) {
 | 
			
		||||
    var e = errors[i];
 | 
			
		||||
    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;
 | 
			
		||||
  }
 | 
			
		||||
  return text.slice(0, -separator.length);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add custom format
 | 
			
		||||
 * @this   Ajv
 | 
			
		||||
 * @param {String} name format name
 | 
			
		||||
 * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)
 | 
			
		||||
 * @return {Ajv} this for method chaining
 | 
			
		||||
 */
 | 
			
		||||
function addFormat(name, format) {
 | 
			
		||||
  if (typeof format == 'string') format = new RegExp(format);
 | 
			
		||||
  this._formats[name] = format;
 | 
			
		||||
  return this;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function addDefaultMetaSchema(self) {
 | 
			
		||||
  var $dataSchema;
 | 
			
		||||
  if (self._opts.$data) {
 | 
			
		||||
    $dataSchema = require('./refs/data.json');
 | 
			
		||||
    self.addMetaSchema($dataSchema, $dataSchema.$id, true);
 | 
			
		||||
  }
 | 
			
		||||
  if (self._opts.meta === false) return;
 | 
			
		||||
  var metaSchema = require('./refs/json-schema-draft-07.json');
 | 
			
		||||
  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);
 | 
			
		||||
  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true);
 | 
			
		||||
  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function addInitialSchemas(self) {
 | 
			
		||||
  var optsSchemas = self._opts.schemas;
 | 
			
		||||
  if (!optsSchemas) return;
 | 
			
		||||
  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas);
 | 
			
		||||
  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function addInitialFormats(self) {
 | 
			
		||||
  for (var name in self._opts.formats) {
 | 
			
		||||
    var format = self._opts.formats[name];
 | 
			
		||||
    self.addFormat(name, format);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function addInitialKeywords(self) {
 | 
			
		||||
  for (var name in self._opts.keywords) {
 | 
			
		||||
    var keyword = self._opts.keywords[name];
 | 
			
		||||
    self.addKeyword(name, keyword);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function checkUnique(self, id) {
 | 
			
		||||
  if (self._schemas[id] || self._refs[id])
 | 
			
		||||
    throw new Error('schema with key or id "' + id + '" already exists');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function getMetaSchemaOptions(self) {
 | 
			
		||||
  var metaOpts = util.copy(self._opts);
 | 
			
		||||
  for (var i=0; i<META_IGNORE_OPTIONS.length; i++)
 | 
			
		||||
    delete metaOpts[META_IGNORE_OPTIONS[i]];
 | 
			
		||||
  return metaOpts;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function setLogger(self) {
 | 
			
		||||
  var logger = self._opts.logger;
 | 
			
		||||
  if (logger === false) {
 | 
			
		||||
    self.logger = {log: noop, warn: noop, error: noop};
 | 
			
		||||
  } else {
 | 
			
		||||
    if (logger === undefined) logger = console;
 | 
			
		||||
    if (!(typeof logger == 'object' && logger.log && logger.warn && logger.error))
 | 
			
		||||
      throw new Error('logger must implement log, warn and error methods');
 | 
			
		||||
    self.logger = logger;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function noop() {}
 | 
			
		||||
							
								
								
									
										26
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/cache.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/cache.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var Cache = module.exports = function Cache() {
 | 
			
		||||
  this._cache = {};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Cache.prototype.put = function Cache_put(key, value) {
 | 
			
		||||
  this._cache[key] = value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Cache.prototype.get = function Cache_get(key) {
 | 
			
		||||
  return this._cache[key];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Cache.prototype.del = function Cache_del(key) {
 | 
			
		||||
  delete this._cache[key];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Cache.prototype.clear = function Cache_clear() {
 | 
			
		||||
  this._cache = {};
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										90
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/compile/async.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/compile/async.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,90 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
var MissingRefError = require('./error_classes').MissingRef;
 | 
			
		||||
 | 
			
		||||
module.exports = compileAsync;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Creates validating function for passed schema with asynchronous loading of missing schemas.
 | 
			
		||||
 * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.
 | 
			
		||||
 * @this  Ajv
 | 
			
		||||
 * @param {Object}   schema schema object
 | 
			
		||||
 * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped
 | 
			
		||||
 * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.
 | 
			
		||||
 * @return {Promise} promise that resolves with a validating function.
 | 
			
		||||
 */
 | 
			
		||||
function compileAsync(schema, meta, callback) {
 | 
			
		||||
  /* eslint no-shadow: 0 */
 | 
			
		||||
  /* global Promise */
 | 
			
		||||
  /* jshint validthis: true */
 | 
			
		||||
  var self = this;
 | 
			
		||||
  if (typeof this._opts.loadSchema != 'function')
 | 
			
		||||
    throw new Error('options.loadSchema should be a function');
 | 
			
		||||
 | 
			
		||||
  if (typeof meta == 'function') {
 | 
			
		||||
    callback = meta;
 | 
			
		||||
    meta = undefined;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  var p = loadMetaSchemaOf(schema).then(function () {
 | 
			
		||||
    var schemaObj = self._addSchema(schema, undefined, meta);
 | 
			
		||||
    return schemaObj.validate || _compileAsync(schemaObj);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (callback) {
 | 
			
		||||
    p.then(
 | 
			
		||||
      function(v) { callback(null, v); },
 | 
			
		||||
      callback
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return p;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  function loadMetaSchemaOf(sch) {
 | 
			
		||||
    var $schema = sch.$schema;
 | 
			
		||||
    return $schema && !self.getSchema($schema)
 | 
			
		||||
            ? compileAsync.call(self, { $ref: $schema }, true)
 | 
			
		||||
            : Promise.resolve();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  function _compileAsync(schemaObj) {
 | 
			
		||||
    try { return self._compile(schemaObj); }
 | 
			
		||||
    catch(e) {
 | 
			
		||||
      if (e instanceof MissingRefError) return loadMissingSchema(e);
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    function loadMissingSchema(e) {
 | 
			
		||||
      var ref = e.missingSchema;
 | 
			
		||||
      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');
 | 
			
		||||
 | 
			
		||||
      var schemaPromise = self._loadingSchemas[ref];
 | 
			
		||||
      if (!schemaPromise) {
 | 
			
		||||
        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);
 | 
			
		||||
        schemaPromise.then(removePromise, removePromise);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return schemaPromise.then(function (sch) {
 | 
			
		||||
        if (!added(ref)) {
 | 
			
		||||
          return loadMetaSchemaOf(sch).then(function () {
 | 
			
		||||
            if (!added(ref)) self.addSchema(sch, ref, undefined, meta);
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
      }).then(function() {
 | 
			
		||||
        return _compileAsync(schemaObj);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      function removePromise() {
 | 
			
		||||
        delete self._loadingSchemas[ref];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      function added(ref) {
 | 
			
		||||
        return self._refs[ref] || self._schemas[ref];
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/compile/equal.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								node_modules/@eslint/eslintrc/node_modules/ajv/lib/compile/equal.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
 | 
			
		||||
// do NOT remove this file - it would break pre-compiled schemas
 | 
			
		||||
// https://github.com/ajv-validator/ajv/issues/889
 | 
			
		||||
module.exports = require('fast-deep-equal');
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue