Merge remote-tracking branch 'origin/main'
# Conflicts: # desktop_env/controllers/setup.py # desktop_env/evaluators/metrics/utils.py
This commit is contained in:
@@ -1,17 +1,18 @@
|
||||
import json
|
||||
import logging
|
||||
import os.path
|
||||
import time
|
||||
import os.path
|
||||
import traceback
|
||||
import uuid
|
||||
from typing import Any, Union
|
||||
|
||||
from typing import Dict, List
|
||||
from typing import Any, Union, Optional
|
||||
|
||||
import requests
|
||||
from playwright.sync_api import sync_playwright
|
||||
from requests_toolbelt.multipart.encoder import MultipartEncoder
|
||||
from desktop_env.evaluators.metrics.utils import compare_urls
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger("desktopenv.setup")
|
||||
|
||||
|
||||
@@ -47,6 +48,8 @@ class SetupController:
|
||||
assert hasattr(self, setup_function)
|
||||
getattr(self, setup_function)(**parameters)
|
||||
|
||||
logger.info("SETUP: %s(%s)", setup_function, str(parameters))
|
||||
|
||||
# self._download_setup(config)
|
||||
# self._change_wallpaper(config)
|
||||
# self._tidy_desktop(config) todo: implement this
|
||||
@@ -54,31 +57,31 @@ class SetupController:
|
||||
# can add other setup steps
|
||||
|
||||
# ZDY_COMMENT: merged with launch
|
||||
# def _command_setup(self, command: str):
|
||||
# """
|
||||
# Directly send a command into the virtual machine os for setting up.
|
||||
# """
|
||||
# payload = json.dumps({"command": command})
|
||||
# headers = {
|
||||
# 'Content-Type': 'application/json'
|
||||
# }
|
||||
# timeout = 5
|
||||
# timout_whitelist = ["vlc"]
|
||||
#
|
||||
# try:
|
||||
#
|
||||
# response = requests.post(self.http_server + "/execute", headers=headers, data=payload, timeout=timeout)
|
||||
# if response.status_code == 200:
|
||||
# print("Command executed successfully:", response.text)
|
||||
# else:
|
||||
# print("Failed to execute command. Status code:", response.status_code)
|
||||
# except requests.exceptions.Timeout as e:
|
||||
# if command in timout_whitelist:
|
||||
# print("Command executed successfully:", command)
|
||||
# else:
|
||||
# print("An error occurred while trying to execute the command:", e)
|
||||
# except requests.exceptions.RequestException as e:
|
||||
# print("An error occurred while trying to execute the command:", e)
|
||||
#def _command_setup(self, command: str):
|
||||
#"""
|
||||
#Directly send a command into the virtual machine os for setting up.
|
||||
#"""
|
||||
#payload = json.dumps({"command": command})
|
||||
#headers = {
|
||||
#'Content-Type': 'application/json'
|
||||
#}
|
||||
#timeout = 5
|
||||
#timout_whitelist = ["vlc"]
|
||||
#
|
||||
#try:
|
||||
#
|
||||
#response = requests.post(self.http_server + "/execute", headers=headers, data=payload, timeout=timeout)
|
||||
#if response.status_code == 200:
|
||||
#print("Command executed successfully:", response.text)
|
||||
#else:
|
||||
#print("Failed to execute command. Status code:", response.status_code)
|
||||
#except requests.exceptions.Timeout as e:
|
||||
#if command in timout_whitelist:
|
||||
#print("Command executed successfully:", command)
|
||||
#else:
|
||||
#print("An error occurred while trying to execute the command:", e)
|
||||
#except requests.exceptions.RequestException as e:
|
||||
#print("An error occurred while trying to execute the command:", e)
|
||||
|
||||
def _download_setup(self, files: List[Dict[str, str]]):
|
||||
"""
|
||||
@@ -221,35 +224,60 @@ class SetupController:
|
||||
except requests.exceptions.RequestException as e:
|
||||
logger.error("An error occurred while trying to send the request: %s", e)
|
||||
|
||||
def _execute_setup(self, command: List[str], stdout: str = "", stderr: str = ""):
|
||||
def _execute_setup( self, command: List[str]
|
||||
, stdout: str = "", stderr: str = ""
|
||||
, shell: bool = False, until: Optional[Dict[str, Any]] = None):
|
||||
if not command:
|
||||
raise Exception("Empty comman to launch.")
|
||||
|
||||
payload = json.dumps({"command": command})
|
||||
until: Dict[str, Any] = until or {}
|
||||
terminates: bool = False
|
||||
nb_failings = 0
|
||||
|
||||
payload = json.dumps({"command": command, "shell": shell})
|
||||
headers = {"Content-Type": "application/json"}
|
||||
|
||||
try:
|
||||
response = requests.post(self.http_server + "/setup" + "/execute", headers=headers, data=payload)
|
||||
if response.status_code == 200:
|
||||
results: Dict[str, str] = response.json()
|
||||
if stdout:
|
||||
with open(os.path.join(self.cache_dir, stdout), "w") as f:
|
||||
f.write(results["output"])
|
||||
if stderr:
|
||||
with open(os.path.join(self.cache_dir, stderr), "w") as f:
|
||||
f.write(results["error"])
|
||||
logger.info("Command executed successfully: %s -> %s"
|
||||
, " ".join(command)
|
||||
, response.text
|
||||
)
|
||||
else:
|
||||
logger.error("Failed to launch application. Status code: %s", response.text)
|
||||
except requests.exceptions.RequestException as e:
|
||||
logger.error("An error occurred while trying to send the request: %s", e)
|
||||
traceback.print_exc()
|
||||
while not terminates:
|
||||
try:
|
||||
response = requests.post(self.http_server_setup_root + "/execute", headers=headers, data=payload)
|
||||
if response.status_code == 200:
|
||||
results: Dict[str, str] = response.json()
|
||||
if stdout:
|
||||
with open(os.path.join(self.cache_dir, stdout), "w") as f:
|
||||
f.write(results["output"])
|
||||
if stderr:
|
||||
with open(os.path.join(self.cache_dir, stderr), "w") as f:
|
||||
f.write(results["error"])
|
||||
logger.info( "Command executed successfully: %s -> %s"
|
||||
, " ".join(command)
|
||||
, response.text
|
||||
)
|
||||
else:
|
||||
logger.error("Failed to launch application. Status code: %s", response.text)
|
||||
results = None
|
||||
nb_failings += 1
|
||||
except requests.exceptions.RequestException as e:
|
||||
logger.error("An error occurred while trying to send the request: %s", e)
|
||||
traceback.print_exc()
|
||||
|
||||
def _command_setup(self, command: List[str], stdout: str = "", stderr: str = ""):
|
||||
self._execute_setup(command, stdout, stderr)
|
||||
results = None
|
||||
nb_failings += 1
|
||||
|
||||
if len(until)==0:
|
||||
terminates = True
|
||||
elif results is not None:
|
||||
terminates = "returncode" in until and results["returncode"]==until["returncode"]\
|
||||
or "stdout" in until and until["stdout"] in results["output"]\
|
||||
or "stderr" in until and until["stderr"] in results["error"]
|
||||
terminates = terminates or nb_failings>=5
|
||||
if not terminates:
|
||||
time.sleep(0.3)
|
||||
|
||||
def _command_setup(self, command: List[str], **kwargs):
|
||||
self._execute_setup(command, **kwargs)
|
||||
|
||||
def _sleep_setup(self, seconds: float):
|
||||
time.sleep(seconds)
|
||||
|
||||
def _act_setup(self, action_seq: List[Union[Dict[str, Any], str]]):
|
||||
# TODO
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from .file import get_cloud_file, get_vm_file, get_cache_file
|
||||
from .misc import get_rule
|
||||
from .info import get_vm_screen_size, get_vm_window_size, get_vm_wallpaper
|
||||
from .misc import get_rule, get_accessibility_tree
|
||||
from .vlc import get_vlc_playing_info, get_vlc_config
|
||||
|
||||
@@ -10,3 +10,8 @@ from .table import check_sheet_list, check_xlsx_freeze, check_xlsx_zoom
|
||||
from .table import compare_table
|
||||
from .vlc import is_vlc_playing, is_vlc_recordings_folder, is_vlc_fullscreen, compare_images, compare_audios, \
|
||||
compare_videos
|
||||
|
||||
from .gimp import increase_saturation, decrease_brightness
|
||||
from .general import check_csv, check_accessibility_tree, check_list
|
||||
from .thunderbird import check_thunderbird_prefs, check_thunderbird_filter
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ from lxml.cssselect import CSSSelector
|
||||
from lxml.etree import _Element
|
||||
from rapidfuzz import fuzz
|
||||
|
||||
from .utils import _match_record
|
||||
|
||||
def exact_match(result, rules) -> float:
|
||||
expect = rules["expected"]
|
||||
@@ -27,11 +28,6 @@ def fuzzy_match(result, rules) -> float:
|
||||
|
||||
return fuzz.ratio(result, expect) / 100.
|
||||
|
||||
|
||||
def _match_record(pattern: Dict[str, str], item: Dict[str, str]) -> float:
|
||||
return all(k in item and item[k] == val for k, val in pattern.items())
|
||||
|
||||
|
||||
def check_csv(result: str, rules: Dict[str, List[Dict[str, str]]]) -> float:
|
||||
"""
|
||||
Args:
|
||||
@@ -46,6 +42,9 @@ def check_csv(result: str, rules: Dict[str, List[Dict[str, str]]]) -> float:
|
||||
float
|
||||
"""
|
||||
|
||||
if result is None:
|
||||
return 0.
|
||||
|
||||
expect_metrics = [False] * len(rules.get("expect", []))
|
||||
unexpect_metric = True
|
||||
with open(result) as f:
|
||||
@@ -72,6 +71,9 @@ def check_list(result: str, rules: Dict[str, List[str]]) -> float:
|
||||
float
|
||||
"""
|
||||
|
||||
if result is None:
|
||||
return 0.
|
||||
|
||||
expect_patterns: List[Pattern[str]] = [re.compile(ptt) for ptt in rules.get("expect", [])]
|
||||
unexpect_patterns: List[Pattern[str]] = [re.compile(ptt) for ptt in rules.get("unexpect", [])]
|
||||
|
||||
@@ -130,9 +132,10 @@ def check_accessibility_tree(result: str, rules: Dict[str, Any]) -> float:
|
||||
return 0.
|
||||
|
||||
if "text" in rules:
|
||||
match_func: Callable[[str], Number] = functools.partial(operator.eq if rules["exact"] else fuzz.ratio
|
||||
, rules["text"]
|
||||
)
|
||||
match_func: Callable[[str], Number] = functools.partial( operator.eq if rules["exact"]\
|
||||
else (lambda a, b: fuzz.ratio(a, b)/100.)
|
||||
, rules["text"]
|
||||
)
|
||||
match_score: Number = 0
|
||||
for elm in elements:
|
||||
match_score = max(match_score, match_func(elm.text or None))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import os
|
||||
|
||||
from PIL import Image, ImageChops, ImageStat
|
||||
|
||||
def get_gimp_export_path():
|
||||
# Path to GIMP's configuration file. This example assumes GIMP version 2.10.
|
||||
@@ -20,3 +20,52 @@ def get_gimp_export_path():
|
||||
# Handle the case where the configuration file is not found
|
||||
print("GIMP configuration file not found")
|
||||
return False
|
||||
|
||||
def increase_saturation(image1_path: str, image2_path: str) -> float:
|
||||
def calculate_saturation(image):
|
||||
# convert the image to HSV mode
|
||||
hsv_image = image.convert("HSV")
|
||||
|
||||
saturation_channel = hsv_image.split()[1]
|
||||
|
||||
# calculate the mean saturation level
|
||||
stat = ImageStat.Stat(saturation_channel)
|
||||
mean_saturation = stat.mean[0]
|
||||
|
||||
return mean_saturation
|
||||
|
||||
image1 = Image.open(image1_path)
|
||||
image2 = Image.open(image2_path)
|
||||
|
||||
# calculate the saturation level of each image
|
||||
saturation1 = calculate_saturation(image1)
|
||||
saturation2 = calculate_saturation(image2)
|
||||
|
||||
return 1 if saturation1 < saturation2 else 0
|
||||
|
||||
def decrease_brightness(image1_path: str, image2_path: str) -> float:
|
||||
def calculate_brightness(image):
|
||||
# Convert the image to grayscale mode
|
||||
grayscale_image = image.convert("L")
|
||||
|
||||
# Get the image data
|
||||
pixels = list(grayscale_image.getdata())
|
||||
|
||||
brightness = sum(pixels) / len(pixels)
|
||||
return brightness
|
||||
|
||||
image1 = Image.open(image1_path)
|
||||
image2 = Image.open(image2_path)
|
||||
|
||||
brightness1 = calculate_brightness(image1)
|
||||
brightness2 = calculate_brightness(image2)
|
||||
|
||||
return 1 if brightness1 > brightness2 else 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
image1_path = "../Downloads/1.png"
|
||||
image2_path = "../Downloads/edited_darker.png"
|
||||
|
||||
decrease_brightness(image1_path, image2_path)
|
||||
|
||||
increase_saturation(image1_path, image2_path)
|
||||
|
||||
@@ -1,53 +1,210 @@
|
||||
#from playwright.sync_api import sync_playwright, Browser
|
||||
#from marionette_driver.marionette import Marionette
|
||||
#import marionette
|
||||
#import pyatspi
|
||||
from typing import List, Pattern, Dict, Match, Tuple
|
||||
from typing import Union, Any, Optional, Iterable, TypeVar, Callable
|
||||
|
||||
import lxml.etree
|
||||
from lxml.cssselect import CSSSelector
|
||||
from lxml.etree import _Element
|
||||
import re
|
||||
import functools
|
||||
import operator
|
||||
import json
|
||||
from .utils import _match_record
|
||||
|
||||
from typing import List
|
||||
import logging
|
||||
logger = logging.getLogger("desktopenv.metric.thunderbird")
|
||||
|
||||
V = TypeVar("Value")
|
||||
|
||||
def _match_pref(value: Any, rule: Dict[str, Union[str, Any]]) -> bool:
|
||||
# function _match_pref {{{ #
|
||||
if rule["method"].startswith("re"):
|
||||
flags: List[str] = rule["method"].split(".")[1:]
|
||||
flags: Iterable[re.RegexFlag] = (getattr(re, fl) for fl in flags)
|
||||
flag: re.RegexFlag = functools.reduce(operator.or_, flags, re.RegexFlag(0))
|
||||
logger.debug("REFLAG: %s", repr(flag))
|
||||
|
||||
match_: Optional[Match[str]] = re.search(rule["ref"], value, flag)
|
||||
return match_ is not None
|
||||
if rule["method"] in { "eq", "ne"
|
||||
, "le", "lt"
|
||||
, "ge", "gt"
|
||||
}:
|
||||
return getattr(operator, rule["method"])(value, rule["ref"])
|
||||
raise NotImplementedError()
|
||||
# }}} function _match_pref #
|
||||
|
||||
_pref_pattern: Pattern[str] = re.compile(r'^user_pref\("(?P<key>(?:[^"]|\\")+)\", (?P<val>.+)\);$');
|
||||
def check_thunderbird_prefs(result: str, rule: Dict[str, Dict[str, Dict[str, Any]]]):
|
||||
"""
|
||||
Args:
|
||||
result (str): path to result file
|
||||
rule (Dict[str, Dict[str, Dict[str, Any]]]): dict like
|
||||
{
|
||||
"expect": {
|
||||
str: {
|
||||
"method": str
|
||||
"ref": something
|
||||
}
|
||||
}
|
||||
"unexpect": {
|
||||
str: {
|
||||
"method": str
|
||||
"ref": something
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Returns:
|
||||
float
|
||||
"""
|
||||
|
||||
if result is None:
|
||||
return 0.
|
||||
|
||||
expect_rules = rule.get("expect", {})
|
||||
unexpect_rules = rule.get("unexpect", {})
|
||||
|
||||
expect_metrics = {k: False for k in expect_rules}
|
||||
unexpect_metric = True
|
||||
with open(result) as f:
|
||||
for l in f:
|
||||
match_: Match[str] = _pref_pattern.match(l.strip())
|
||||
if match_ is None:
|
||||
continue
|
||||
|
||||
key: str = match_.group("key")
|
||||
#value: str = match_.group("val")
|
||||
#if value in {"true", "false"}:
|
||||
#value = value.title()
|
||||
#value: V = eval(value)
|
||||
value = json.loads(match_.group("val"))
|
||||
if key in expect_rules:
|
||||
logger.debug("K: %s, V: %s", key, repr(value))
|
||||
expect_metrics[key] = _match_pref(value, expect_rules[key])
|
||||
elif key in unexpect_rules:
|
||||
unexpect_metric = unexpect_metric and not _match_pref(value, unexpect_rules[key])
|
||||
|
||||
return float(all(expect_metrics.values()) and unexpect_metric)
|
||||
|
||||
_value_processor: Callable[[str], str] = lambda val: val.replace("\\\"", "\"").replace("\\\\", "\\")
|
||||
#_condition_pattern: Pattern[str] = re.compile(r'(?P<type>AND|OR) \((?P<key>[\w ]+),(?P<rel>[\w ' + '\'' + r']+),(?:"(?P<val2>(?:[^"]|\")+)"|(?P<val1>[^)]+))\)')
|
||||
_condition_pattern: Pattern[str] = re.compile(r'(?:AND|OR) \((?:[\w ]+),(?:[\w ' + '\'' + r']+),(?:"(?:(?:[^"]|\")+)"|(?:[^)]+))\)')
|
||||
def check_thunderbird_filter(result: str, rules: Dict[str, List[Dict[str, str]]]) -> float:
|
||||
"""
|
||||
Args:
|
||||
result (str): path to filter def file
|
||||
rules (Dict[str, List[Dict[str, str]]]): dict like
|
||||
{
|
||||
"expect": [{key: value}]
|
||||
"unexpect": [{key: value}]
|
||||
}
|
||||
|
||||
Returns:
|
||||
float
|
||||
"""
|
||||
|
||||
if result is None:
|
||||
return 0.
|
||||
|
||||
# read filter def file
|
||||
# a filter:
|
||||
# {
|
||||
# "name": "Name",
|
||||
# "enabled": "yes" | "no",
|
||||
# "type": "17",
|
||||
# "action": "Move to folder" | ...,
|
||||
# "actionValue": ...,
|
||||
# "condition": [...]
|
||||
# }
|
||||
filters: List[Dict[str, Union[str, List[str]]]] = []
|
||||
with open(result) as f:
|
||||
for l in f:
|
||||
if l.startswith("name="):
|
||||
filter_: Dict[str, Union[str, List[str]]] = {}
|
||||
filter_["name"] = _value_processor(l[6:-2])
|
||||
elif l.startswith("enabled="):
|
||||
filter_["enabled"] = _value_processor(l[9:-2])
|
||||
elif l.startswith("type="):
|
||||
filter_["type"] = _value_processor(l[6:-2])
|
||||
elif l.startswith("action="):
|
||||
filter_["action"] = _value_processor(l[8:-2])
|
||||
elif l.startswith("actionValue="):
|
||||
filter_["actionValue"] = _value_processor(l[13:-2])
|
||||
elif l.startswith("condition="):
|
||||
condition_str: str = _value_processor(l[11:-2])
|
||||
logger.debug("FILTER CONDITION: %s", condition_str)
|
||||
|
||||
conditions: List[str] =\
|
||||
_condition_pattern.findall(condition_str)
|
||||
logger.debug("FILTER CONDITIONS: %s", repr(conditions))
|
||||
|
||||
filter_["condition"] = conditions
|
||||
logger.debug("FILTER %s", repr(filter_))
|
||||
filters.append(filter_)
|
||||
|
||||
expect_metrics = [False] * len(rules.get("expect", []))
|
||||
unexpect_metric = True
|
||||
for flt in filters:
|
||||
for i, r in enumerate(rules.get("expect", [])):
|
||||
expect_metrics[i] = expect_metrics[i] or _match_record(r, flt)
|
||||
unexpect_metric = unexpect_metric and not any(_match_record(r, flt) for r in rules.get("unexpect", []))
|
||||
return float(all(expect_metrics) and unexpect_metric)
|
||||
|
||||
if __name__ == "__main__":
|
||||
#with sync_playwright() as plwr:
|
||||
#while True:
|
||||
##try:
|
||||
#thunderbird: Browser = plwr.firefox.connect("http://127.0.0.1:6000", timeout=60)
|
||||
#break
|
||||
##except:
|
||||
##pass
|
||||
#for ctx in thunderbird.contexts:
|
||||
#for p in ctx.pages:
|
||||
#print(p.url)
|
||||
|
||||
#thunderbird = Marionette()
|
||||
#print(thunderbird.start_session())
|
||||
#print(thunderbird.chrome_window_handles)
|
||||
#print(thunderbird.window_handles)
|
||||
#print(thunderbird.current_chrome_window_handle)
|
||||
#thunderbird.set_context(Marionette.CONTEXT_CONTENT)
|
||||
#print(thunderbird.current_window_handle)
|
||||
#thunderbird.switch_to_window(thunderbird.chrome_window_handles[0])
|
||||
#thunderbird.switch_to_default_content()
|
||||
#thunderbird.switch_to_frame()
|
||||
#print(thunderbird.get_url())
|
||||
#print(thunderbird.get_window_type())
|
||||
#thunderbird.fullscreen()
|
||||
#print(thunderbird.close())
|
||||
|
||||
#registry = pyatspi.Registry.get_default()
|
||||
#registry
|
||||
import lxml.etree
|
||||
from lxml.cssselect import CSSSelector
|
||||
from lxml.etree import _Element
|
||||
|
||||
#xml = "../../任务数据/Thunderbird/vertical-card-view.xml"
|
||||
xml = "../../任务数据/Thunderbird/vertical-table-view.xml"
|
||||
at: _Element = lxml.etree.parse(xml)
|
||||
#xml = "../../任务数据/Thunderbird/vertical-table-view.xml"
|
||||
#at: _Element = lxml.etree.parse(xml)
|
||||
|
||||
#elements: List[_Element] = CSSSelector('application[name=Thunderbird] page-tab-list')(at) # page tab tags
|
||||
#elements: List[_Element] = CSSSelector('application[name=Thunderbird] panel>scroll-pane>internal-frame>panel[name$="anonym-x2024@outlook.com"]')(at) # email tag page
|
||||
#elements: List[_Element] = CSSSelector('application[name=Thunderbird] panel>scroll-pane>internal-frame>panel[name$="anonym-x2024@outlook.com"]>section:nth-child(3)')(at) # email tag page
|
||||
#elements: List[_Element] = CSSSelector('application[name=Thunderbird] panel>scroll-pane>internal-frame>panel[name$="anonym-x2024@outlook.com"]>section[attr|id=threadPane]>section[attr|id="threadTree"]>table[attr|class="tree-table"]>section[attr|class~="tree-table-header"]>table-row>column-header[name=Subject]>push-button', namespaces={"attr": "uri:deskat:attributes.at-spi.gnome.org"})(at) # table view, column header
|
||||
elements: List[_Element] = CSSSelector('application[name=Thunderbird] panel>scroll-pane>internal-frame>panel[name$="anonym-x2024@outlook.com"]>section[attr|id=threadPane]>section[attr|id="threadTree"]>table[attr|class="tree-table"]>tree>tree-item>section[name="Subject"]>section>section', namespaces={"attr": "uri:deskat:attributes.at-spi.gnome.org"})(at) # table view, column header
|
||||
print(len(elements))
|
||||
for elm in elements:
|
||||
print(lxml.etree.tostring(elm, encoding="unicode", pretty_print=True))
|
||||
#elements: List[_Element] = CSSSelector('application[name=Thunderbird] panel>scroll-pane>internal-frame>panel[name$="anonym-x2024@outlook.com"]>section[attr|id=threadPane]>section[attr|id="threadTree"]>table[attr|class="tree-table"]>tree>tree-item>section[name="Subject"]>section>section', namespaces={"attr": "uri:deskat:attributes.at-spi.gnome.org"})(at) # table view, column header
|
||||
#print(len(elements))
|
||||
#for elm in elements:
|
||||
#print(lxml.etree.tostring(elm, encoding="unicode", pretty_print=True))
|
||||
|
||||
import datetime
|
||||
import os
|
||||
import sys
|
||||
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
datetime_str: str = datetime.datetime.now().strftime("%Y%m%d@%H%M%S")
|
||||
|
||||
file_handler = logging.FileHandler(os.path.join("logs", "normal-{:}.log".format(datetime_str)))
|
||||
debug_handler = logging.FileHandler(os.path.join("logs", "debug-{:}.log".format(datetime_str)))
|
||||
stdout_handler = logging.StreamHandler(sys.stdout)
|
||||
sdebug_handler = logging.FileHandler(os.path.join("logs", "sdebug-{:}.log".format(datetime_str)))
|
||||
|
||||
file_handler.setLevel(logging.INFO)
|
||||
debug_handler.setLevel(logging.DEBUG)
|
||||
stdout_handler.setLevel(logging.INFO)
|
||||
sdebug_handler.setLevel(logging.DEBUG)
|
||||
|
||||
formatter = logging.Formatter(fmt="\x1b[1;33m[%(asctime)s \x1b[31m%(levelname)s \x1b[32m%(module)s/%(lineno)d-%(processName)s\x1b[1;33m] \x1b[0m%(message)s")
|
||||
file_handler.setFormatter(formatter)
|
||||
debug_handler.setFormatter(formatter)
|
||||
stdout_handler.setFormatter(formatter)
|
||||
sdebug_handler.setFormatter(formatter)
|
||||
|
||||
stdout_handler.addFilter(logging.Filter("desktopenv"))
|
||||
sdebug_handler.addFilter(logging.Filter("desktopenv"))
|
||||
|
||||
logger.addHandler(file_handler)
|
||||
logger.addHandler(debug_handler)
|
||||
logger.addHandler(stdout_handler)
|
||||
logger.addHandler(sdebug_handler)
|
||||
|
||||
print( check_thunderbird_filter( "../../任务数据/Thunderbird/msgFilterRules.dat"
|
||||
, { "expect": [ { "enabled": "yes"
|
||||
, "action": "Move to folder"
|
||||
, "actionValue": "mailbox://nobody@Local%20Folders/Promotions"
|
||||
, "condition": ["AND (subject,contains,discount)"]
|
||||
}
|
||||
]
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
@@ -130,6 +130,10 @@ def load_charts(xlsx_file: Workbook, **options) -> Dict[str, Any]:
|
||||
return chart_set
|
||||
|
||||
|
||||
def _match_record(pattern: Dict[str, Any], item: Dict[str, Any]) -> bool:
|
||||
return all(k in item and item[k] == val for k, val in pattern.items())
|
||||
|
||||
|
||||
def are_lists_equal(list1, list2, comparison_func):
|
||||
# First check if both lists have the same length
|
||||
if len(list1) != len(list2):
|
||||
|
||||
@@ -48,7 +48,8 @@ def execute_command():
|
||||
return jsonify({
|
||||
'status': 'success',
|
||||
'output': result.stdout,
|
||||
'error': result.stderr
|
||||
'error': result.stderr,
|
||||
'returncode': result.returncode
|
||||
})
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"id": "554785e9-4523-4e7a-b8e1-8016f565f56a",
|
||||
"snapshot": "gimp",
|
||||
"instruction": "Could you help me increase the saturation of my photo to make it more colorful?",
|
||||
"source": "https://www.quora.com/How-do-I-edit-a-photo-in-GIMP",
|
||||
"config": [
|
||||
{
|
||||
"type": "download",
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "",
|
||||
"path": "Desktop/2.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/2.png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"gimp"
|
||||
],
|
||||
"evaluator": {
|
||||
"func": "increase_saturation",
|
||||
"expected": {
|
||||
"type": "cloud_file",
|
||||
"path": "",
|
||||
"dest": "edited_colorful.png"
|
||||
},
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/2.png",
|
||||
"dest": "2.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"id": "7a4deb26-d57d-4ea9-9a73-630f66a7b568",
|
||||
"snapshot": "gimp",
|
||||
"instruction": "Make my picture less bright, please.",
|
||||
"source": "https://www.quora.com/How-do-I-edit-a-photo-in-GIMP",
|
||||
"config": [
|
||||
{
|
||||
"type": "download",
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1SIvX9Wimyw6i2UvnoLTNDHIObvDLAsIM&export=download&authuser=0&confirm=t&uuid=a48447ab-13a2-421f-9662-6ffff8f6f6d5&at=APZUnTVRxofs822XxgEv33WwYCkb:1705046264363",
|
||||
"path": "Desktop/1.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/1.png"
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/",
|
||||
"related_apps": [
|
||||
"gimp"
|
||||
],
|
||||
"evaluator": {
|
||||
"func": "decrease_brightness",
|
||||
"expected": {
|
||||
"type": "cloud_file",
|
||||
"path": "https://drive.usercontent.google.com/download?id=1M7T5iPv0kWvmZBbdTcRdG45zIpHMtrBn&export=download&authuser=0&confirm=t&uuid=d95db1f8-27dc-4532-9976-ea99c293f53e&at=APZUnTXfpgNCtXDtlqd55LgmrIAj:1705048270986",
|
||||
"dest": "edited_darker.png"
|
||||
},
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/1.png",
|
||||
"dest": "1.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "0b17a146-2934-46c7-8727-73ff6b6483e8",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Change the 2 in H2O to a subscript.",
|
||||
"instruction": "Help me change the 2 in \"H2O\" to a subscript.",
|
||||
"source": "https://askubuntu.com/questions/245695/how-do-you-insert-subscripts-and-superscripts-into-ordinary-non-formula-text-i",
|
||||
"config": [
|
||||
{
|
||||
@@ -9,8 +9,8 @@
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1Nx5AoKNM7tcDRE6y_qjNIDrPOKqhNyfm&export=download&authuser=0&confirm=t&uuid=bb4de348-3bbf-46a2-95b2-e2719c67547a&at=APZUnTUeA-BW7mkQsEw7NGm272zx:1704172916742",
|
||||
"path": "Desktop/Enter_Subscript.docx"
|
||||
"url": "https://drive.usercontent.google.com/download?id=1FkorQBeTJ5L2jLuvu4YxHSlBMK4VEEG6&export=download&authuser=0&confirm=t&uuid=cc63dc0b-bae7-4ef6-a40d-e2da721976ef&at=APZUnTWyPZlZPFlqGTWAWXWmS04c:1704976667765",
|
||||
"path": "Desktop/H2O_Factsheet_WA.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Enter_Subscript.docx"
|
||||
"path": "Desktop/H2O_Factsheet_WA.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -30,13 +30,13 @@
|
||||
"func": "compare_docx_files",
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/Enter_Subscript.docx",
|
||||
"dest": "Enter_Subscript.docx"
|
||||
"path": "Desktop/H2O_Factsheet_WA.docx",
|
||||
"dest": "H2O_Factsheet_WA.docx"
|
||||
},
|
||||
"expected": {
|
||||
"type": "cloud_file",
|
||||
"path": "https://drive.usercontent.google.com/download?id=1AaKXeD9ZgfMykgijZ4G8MEzUjmMJElkq&export=download&authuser=0&confirm=t&uuid=5e347f0d-4efc-4478-878e-d89455d1593b&at=APZUnTWCYWfsD4eCeG52VJiK8-xB:1704172886196",
|
||||
"dest": "Enter_Subscript_Gold.docx"
|
||||
"path": "https://drive.usercontent.google.com/download?id=1dM_FSTGDWxSW64VEth_wKMYNkvw0y_tq&export=download&authuser=0&confirm=t&uuid=342f41e2-f48f-41ff-8942-f7dfe5de1dba&at=APZUnTXHfskcX3tvmrSbzCOyQIgb:1704976694506",
|
||||
"dest": "H2O_Factsheet_WA_Gold.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,4 +34,4 @@
|
||||
"dest": "LibreOffice_Open_Source_Word_Processing.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1fIHNzFm8JabWoLKOnxrFM722fQ1d_huK&export=download&authuser=0&confirm=t&uuid=d11a8dda-1e4e-4dc9-b05c-e6b47624dbf0&at=APZUnTVG0ViFnKJa00314wVr3uP9:1704185871014",
|
||||
"path": "Desktop/Change_Font_Through_File.docx"
|
||||
"path": "Desktop/Dublin_Zoo_Intro.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Change_Font_Through_File.docx"
|
||||
"path": "Desktop/Dublin_Zoo_Intro.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -36,8 +36,8 @@
|
||||
},
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/Change_Font_Through_File.docx",
|
||||
"dest": "Change_Font_Through_File.docx"
|
||||
"path": "Desktop/Dublin_Zoo_Intro.docx",
|
||||
"dest": "Dublin_Zoo_Intro.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "3ef2b351-8a84-4ff2-8724-d86eae9b842e",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "center-justify the first line",
|
||||
"instruction": "Help me center align the heading in LibreOffice.",
|
||||
"source": "https://askubuntu.com/questions/1066351/how-do-you-center-align-in-libreoffice#:~:text=Ctrl%20%2B%20e%20will%20Center%20align%20the%20cursor%20for%20you.",
|
||||
"config": [
|
||||
{
|
||||
@@ -9,8 +9,8 @@
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1IQ4rKyHMOui71YlyL7huggpLYFYtj923&export=download&authuser=0&confirm=t&uuid=014c2335-c0c6-4712-9d5a-ca8d3217e07f&at=APZUnTVrM698NQgSh4hqYXR8cjDc:1704185072996",
|
||||
"path": "Desktop/Centering_First_Line.docx"
|
||||
"url": "https://drive.usercontent.google.com/download?id=1P8QodvDF-3S50rx6UmW4M2D4Kr-p_Q-h&export=download&authuser=0&confirm=t&uuid=eea70a33-4c3f-4e90-885d-dd3df0d605bc&at=APZUnTX7ISvBhOICNrPLoqK0m3G-:1704971931660",
|
||||
"path": "Desktop/Constitution_Template_With_Guidelines.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Centering_First_Line.docx"
|
||||
"path": "Desktop/Constitution_Template_With_Guidelines.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -30,8 +30,8 @@
|
||||
"func": "is_first_line_centered",
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/Centering_First_Line.docx",
|
||||
"dest": "Centering_First_Line.docx"
|
||||
"path": "Desktop/Constitution_Template_With_Guidelines.docx",
|
||||
"dest": "Constitution_Template_With_Guidelines.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "45d61a06-6545-4422-97b7-bc76cfa964c1",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Replace all newlines with paragraph marks in LibreOffice Write",
|
||||
"instruction": "Replace all newlines with paragraph marks in LibreOffice Writer",
|
||||
"source": "https://stackoverflow.com/questions/71685737/how-to-replace-all-newlines-with-paragraph-marks-in-libreoffice-write",
|
||||
"config": [
|
||||
{
|
||||
@@ -9,8 +9,8 @@
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=18XFjPVUnLG_-KOM5sn-Sk74HP_JHivMy&export=download&authuser=0&confirm=t&uuid=d23041bc-2ddd-42c4-84ae-481b953f021c&at=APZUnTVYh0AK0245qsDOCol7SdMB:1704185512767",
|
||||
"path": "Desktop/Replace_Newlines_with_Paragraph_Marks.docx"
|
||||
"url": "https://drive.usercontent.google.com/download?id=16lQcSkw-JQ_v8Sg0HkCtnOzyK-4cok8N&export=download&authuser=0&confirm=t&uuid=a3f833ae-2572-4cf3-8a21-6d250e689415&at=APZUnTUfn24NGMtXEzz2Nf7cFLjt:1704975857398",
|
||||
"path": "Desktop/NOVEL_Submission_Guidelines.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Replace_Newlines_with_Paragraph_Marks.docx"
|
||||
"path": "Desktop/NOVEL_Submission_Guidelines.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -30,13 +30,13 @@
|
||||
"func": "compare_line_spacing",
|
||||
"expected": {
|
||||
"type": "cloud_file",
|
||||
"path": "https://drive.usercontent.google.com/download?id=1bP_noic02MuzrM8CdJIQN7F1gN4N8sel&export=download&authuser=0&confirm=t&uuid=657e0e4f-7b96-4d7e-83f4-99b79c68708f&at=APZUnTX7HsmefsMlzQaCGK2fg5Em:1704185514197",
|
||||
"dest": "Replace_Newlines_with_Paragraph_Marks_Gold.docx"
|
||||
"path": "https://drive.usercontent.google.com/download?id=1LaS5ObaOsbyKX1M17vi8ZseZwawgvNmf&export=download&authuser=0&confirm=t&uuid=db523e81-fa22-4002-97ff-e5dff92106a7&at=APZUnTVnT3ZYOGW7ZQdeW4SZP7mX:1704975993684",
|
||||
"dest": "NOVEL_Submission_Guidelines_Gold.docx"
|
||||
},
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/Double_Line_Spacing.docx",
|
||||
"dest": "Replace_Newlines_with_Paragraph_Marks.docx"
|
||||
"path": "Desktop/NOVEL_Submission_Guidelines.docx",
|
||||
"dest": "NOVEL_Submission_Guidelines.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,4 +31,4 @@
|
||||
"file_name": "View_Person_Organizational_Summary.pdf",
|
||||
"directory": "/home/user/Downloads/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "663876c7-3471-43db-ba51-f410b13d9d7d",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Insert the equation \"(a + b)^2 = a^2 + 2 a b + b^2\"",
|
||||
"instruction": "Insert the equation \"(a + b)^2 = a^2 + 2 a b + b^2\" at the position of the cursor.",
|
||||
"source": "https://askubuntu.com/questions/319593/how-to-type-science-equations-in-libre-office",
|
||||
"config": [
|
||||
{
|
||||
@@ -9,8 +9,8 @@
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1FgMp7Ny63eXzeF23qHYhqQux31djlkah&export=download&authuser=0&confirm=t&uuid=d6b5208d-3b3a-4972-a641-ed738a419fdb&at=APZUnTX16Fz8Qg-B0NWpWgC-3Dyu:1704184410221",
|
||||
"path": "Desktop/Insert_Equation.docx"
|
||||
"url": "https://drive.usercontent.google.com/download?id=1J3--srr-Fmt2z-wOAyPDmO5GoiJMkUvZ&export=download&authuser=0&confirm=t&uuid=5f275f3d-ab7d-4d27-848a-8012af4bcf7f&at=APZUnTVe5ucwe1Q0oVi9jwiY5PF7:1704971494071",
|
||||
"path": "Desktop/Factoring_Perfect_Square_Trinomials.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Insert_Equation.docx"
|
||||
"path": "Desktop/Factoring_Perfect_Square_Trinomials.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -30,13 +30,13 @@
|
||||
"func": "compare_insert_equation",
|
||||
"expected": {
|
||||
"type": "cloud_file",
|
||||
"path": "https://drive.usercontent.google.com/download?id=1hMFJnwHs7Iaexz3b9O2LJQUfsJ2wiwZ9&export=download&authuser=0&confirm=t&uuid=2abb49fb-d9c7-46cf-bc21-e69ecb9cefc6&at=APZUnTVzEZjChcUb4MIoxuq4cGea:1704184411805",
|
||||
"dest": "Insert_Equation_Gold.docx"
|
||||
"path": "https://drive.usercontent.google.com/download?id=1QGfyQUPEjOX8osycnjR8E5yHeIEGccKI&export=download&authuser=0&confirm=t&uuid=174491d6-7855-4323-9fa5-5146fde48c4a&at=APZUnTXA8bIcIbtw9mUN-K-IU9bT:1704971524974",
|
||||
"dest": "Factoring_Perfect_Square_Trinomials_Gold.docx"
|
||||
},
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/Insert_Equation.docx",
|
||||
"dest": "Insert_Equation.docx"
|
||||
"path": "Desktop/Factoring_Perfect_Square_Trinomials.docx",
|
||||
"dest": "Factoring_Perfect_Square_Trinomials.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "66399b0d-8fda-4618-95c4-bfc6191617e9",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Insert a 7*5 empty table",
|
||||
"instruction": "Could you help me insert a 7*5 empty table at the point of cursor?",
|
||||
"source": "https://www.youtube.com/watch?v=l25Evu4ohKg",
|
||||
"config": [
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "6ada715d-3aae-4a32-a6a7-429b2e43fb93",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Copy the screenshot 1.png from the desktop to where my cursor is locatedInsert the image which is in IMAGE_PATH where my cursor is",
|
||||
"instruction": "Copy the screenshot 1.png from the desktop to where my cursor is located",
|
||||
"source": "https://www.quora.com/How-do-you-insert-images-into-a-LibreOffice-Writer-document",
|
||||
"config": [
|
||||
{
|
||||
@@ -50,4 +50,4 @@
|
||||
"dest": "Viewing_Your_Class_Schedule_and_Textbooks_Gold.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "936321ce-5236-426a-9a20-e0e3c5dc536f",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Convert the content seperated by commas to a table",
|
||||
"instruction": "Could you help me convert the text seperated by commas to a table?",
|
||||
"source": "https://www.youtube.com/watch?v=l25Evu4ohKg",
|
||||
"config": [
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "adf5e2c3-64c7-4644-b7b6-d2f0167927e7",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Helping me adding \"C. Luo and M. J. Carey, \"LSM-based storage techniques: a survey,\" The VLDB Journal, vol. 29, no. 1, pp. 393–418, 2020.\" to my reference list, and add a cross reference at the end of the first paragraph",
|
||||
"instruction": "Help me adding \"Steinberg, F. M., Bearden, M. M., & Keen, C. L. (2003). Cocoa and chocolate flavonoids: Implications for cardiovascular health. Journal of the American Dietetic Association, 103(2), 215-223. doi: 10.1053/jada.2003.50028\" to my reference list, and add a cross reference where my cursor is located (in the fourth paragraph).",
|
||||
"source": "https://seekstar.github.io/2022/04/11/libreoffice%E5%BC%95%E7%94%A8%E6%96%87%E7%8C%AE/",
|
||||
"config": [
|
||||
{
|
||||
@@ -9,8 +9,8 @@
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1xOfwImgkPzdmjQomj-MCFd8nQS75OjaH&export=download&authuser=0&confirm=t&uuid=7eb91c26-dad5-4480-b1ec-35e506cde1e4&at=APZUnTW01MvBI_gkC8yoiyAVs7yi:1704188254979",
|
||||
"path": "Desktop/Add_Citation_Cross_Reference.docx"
|
||||
"url": "https://drive.usercontent.google.com/download?id=1ShGL4gWSV7nzamAb0V2KqjoCOhyodcKU&export=download&authuser=0&confirm=t&uuid=5f67edb8-cbbf-4a83-b46e-f193ad55e1e8&at=APZUnTVRJenYCM--vETagQ5ACTT5:1704979226579",
|
||||
"path": "Desktop/Essay_Writing_English_for_uni.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Add_Citation_Cross_Reference.docx"
|
||||
"path": "Desktop/Essay_Writing_English_for_uni.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -30,13 +30,13 @@
|
||||
"func": "compare_docx_files",
|
||||
"expected": {
|
||||
"type": "cloud_file",
|
||||
"path": "https://drive.usercontent.google.com/download?id=1wFQU7hkAT2wmSHTgM22F9Ep4WXmymEMW&export=download&authuser=0&confirm=t&uuid=a7ea1eec-678b-4407-b023-df13cc6f8c54&at=APZUnTW3WoqOfS9A1BW79XfV8jKh:1704188260410",
|
||||
"dest": "Add_Citation_Cross_Reference_Gold.docx"
|
||||
"path": "https://drive.usercontent.google.com/download?id=1bf7IKjjxGAQfbOlq9rLPzjTtkOZ3dREj&export=download&authuser=0&confirm=t&uuid=0420cfa5-7e51-4688-8c93-74748914ce52&at=APZUnTWIShIleccvgVBIr6ZsSnOw:1704979256798",
|
||||
"dest": "Essay_Writing_English_for_uni_Gold.docx"
|
||||
},
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "Desktop/Add_Citation_Cross_Reference.docx",
|
||||
"dest": "Add_Citation_Cross_Reference.docx"
|
||||
"path": "Desktop/Essay_Writing_English_for_uni.docx",
|
||||
"dest": "Essay_Writing_English_for_uni.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "ecc2413d-8a48-416e-a3a2-d30106ca36cb",
|
||||
"snapshot": "libreoffice_writer",
|
||||
"instruction": "Insert a blank page",
|
||||
"instruction": "Help me insert a blank page where my cursor is located.",
|
||||
"source": "https://www.quora.com/How-can-I-insert-a-blank-page-on-libreoffice",
|
||||
"config": [
|
||||
{
|
||||
@@ -34,4 +34,4 @@
|
||||
"dest": "Sample_Statutory_Declaration.docx"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,8 +9,8 @@
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1X2XTU2ZFuMXOhm7T400e6AOe6eBYxWzD&export=download&authuser=0&confirm=t&uuid=1318923f-6d54-4148-aa80-a454b9963cec&at=APZUnTU-h1nmcjBO_ytWVxXuh8l9:1704187013730",
|
||||
"path": "Desktop/Set_Default_Font.docx"
|
||||
"url": "https://drive.usercontent.google.com/download?id=1xREbNAu_2wLTs8EQT0NnHLpIkAVAfpyk&export=download&authuser=0&confirm=t&uuid=dd5cb525-ff4b-41a2-8123-d488f2f21fad&at=APZUnTXaYBqLT9fRtGYZHOedq-PG:1704977194647",
|
||||
"path": "Desktop/loa-one-time-submission-sealand.docx"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
{
|
||||
"type": "open",
|
||||
"parameters": {
|
||||
"path": "Desktop/Set_Default_Font.docx"
|
||||
"path": "Desktop/loa-one-time-submission-sealand.docx"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "06fe7178-4491-4589-810f-2e2bc9502122",
|
||||
"snapshot": "thunderbird",
|
||||
"instruction": "Could you help me back up all the email files in my profile to ~/email.bak? Please save them in eml format.",
|
||||
"instruction": "Could you help me back up all the email files in my profile to ~/email.bak? Please save them separately in eml format.",
|
||||
"source": "https://www.quora.com/How-do-I-backup-email-files-in-Mozilla-Thunderbird",
|
||||
"config": [
|
||||
{
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"id": "6766f2b8-8a72-417f-a9e5-56fcaa735837",
|
||||
"snapshot": "thunderbird",
|
||||
"instruction": "Set up a signature using my name and affiliation. My name is Anonym and my affiliation is XYZ Lab.",
|
||||
"source": "https://www.adsigner.com/user-manual/signatures/setup-email-client-thunderbird/#:~:text=is%20probably%20hidden.-,Right%20click%20on%20the%20empty%20space%20at%20the%20top%20of,signature%20from%20a%20file%20instead.",
|
||||
"config": [
|
||||
{
|
||||
"type": "download",
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1EHLRWzBCOsyERkSMUnTF2pnsR0n6ZvtR&export=download&authuser=0&confirm=t&uuid=de09bd5e-bef8-499a-b599-c642af190e10&at=APZUnTXqOsQkxl0zMSX6R1Sgp_v3:1704362491712",
|
||||
"path": "/home/user/thunderbird-profile.tar.gz"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "execute",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"tar",
|
||||
"-xzv",
|
||||
"--recursive-unlink",
|
||||
"-f",
|
||||
"/home/user/thunderbird-profile.tar.gz",
|
||||
"-C",
|
||||
"/home/user/"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"/usr/bin/thunderbird"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/6766f2b8-8a72-417f-a9e5-56fcaa735837",
|
||||
"related_apps": [
|
||||
"thunderbird"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "command",
|
||||
"parameters": {
|
||||
"command": ["wmctrl", "-xFc", "Mail.thunderbird"],
|
||||
"until": {
|
||||
"returncode": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "/home/user/.thunderbird/t5q2a5hp.default-release/prefs.js",
|
||||
"dest": "thunder-prefs.js"
|
||||
},
|
||||
"expected": {
|
||||
"type": "rule",
|
||||
"rules": {
|
||||
"expect": {
|
||||
"mail.identity.id1.htmlSigText": {
|
||||
"method": "re.S",
|
||||
"ref": "Anonym.+XYZ Lab"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"func": "check_thunderbird_prefs"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"id": "6766f2b8-8a72-417f-a9e5-56fcaa735837",
|
||||
"snapshot": "thunderbird",
|
||||
"instruction": "Set up a signature using my name and affiliation. My name is Anonym and my affiliation is XYZ Lab.",
|
||||
"source": "https://www.adsigner.com/user-manual/signatures/setup-email-client-thunderbird/#:~:text=is%20probably%20hidden.-,Right%20click%20on%20the%20empty%20space%20at%20the%20top%20of,signature%20from%20a%20file%20instead.",
|
||||
"config": [
|
||||
{
|
||||
"type": "download",
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1EHLRWzBCOsyERkSMUnTF2pnsR0n6ZvtR&export=download&authuser=0&confirm=t&uuid=de09bd5e-bef8-499a-b599-c642af190e10&at=APZUnTXqOsQkxl0zMSX6R1Sgp_v3:1704362491712",
|
||||
"path": "/home/user/thunderbird-profile.tar.gz"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/6766f2b8-8a72-417f-a9e5-56fcaa735837",
|
||||
"related_apps": [
|
||||
"thunderbird"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "command",
|
||||
"parameters": {
|
||||
"command": ["wmctrl", "-xFc", "Mail.thunderbird"],
|
||||
"until": {
|
||||
"returncode": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "/home/user/.thunderbird/t5q2a5hp.default-release/prefs.js",
|
||||
"dest": "thunder-prefs.js"
|
||||
},
|
||||
"expected": {
|
||||
"type": "rule",
|
||||
"rules": {
|
||||
"expect": {
|
||||
"mail.identity.id1.htmlSigText": {
|
||||
"method": "re.S",
|
||||
"ref": "Anonym.+XYZ Lab"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"func": "check_thunderbird_prefs"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"id": "e1e75309-3ddb-4d09-92ec-de869c928143",
|
||||
"snapshot": "thunderbird",
|
||||
"instruction": "Create a local folder called \"Promotions\" and create a filter to auto move the inbox emails whose subject contains “discount” to the new folder",
|
||||
"source": "https://support.mozilla.org/en-US/kb/organize-your-messages-using-filters",
|
||||
"config": [
|
||||
{
|
||||
"type": "download",
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1EHLRWzBCOsyERkSMUnTF2pnsR0n6ZvtR&export=download&authuser=0&confirm=t&uuid=de09bd5e-bef8-499a-b599-c642af190e10&at=APZUnTXqOsQkxl0zMSX6R1Sgp_v3:1704362491712",
|
||||
"path": "/home/user/thunderbird-profile.tar.gz"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "execute",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"tar",
|
||||
"-xzv",
|
||||
"--recursive-unlink",
|
||||
"-f",
|
||||
"/home/user/thunderbird-profile.tar.gz",
|
||||
"-C",
|
||||
"/home/user/"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "launch",
|
||||
"parameters": {
|
||||
"command": [
|
||||
"/usr/bin/thunderbird"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/e1e75309-3ddb-4d09-92ec-de869c928143",
|
||||
"related_apps": [
|
||||
"thunderbird"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "command",
|
||||
"parameters": {
|
||||
"command": ["wmctrl", "-Fc", "Message Filters"],
|
||||
"until": {
|
||||
"returncode": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "check_thunderbird_filter",
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "/home/user/.thunderbird/t5q2a5hp.default-release/ImapMail/outlook.office365.com/msgFilterRules.dat",
|
||||
"dest": "msgFilterRules.dat"
|
||||
},
|
||||
"expected": {
|
||||
"type": "rule",
|
||||
"rules": {
|
||||
"expect": [
|
||||
{
|
||||
"enabled": "yes",
|
||||
"action": "Move to folder",
|
||||
"actionValue": "mailbox://nobody@Local%20Folders/Promotions",
|
||||
"condition": ["AND (subject,contains,discount)"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"id": "e1e75309-3ddb-4d09-92ec-de869c928143",
|
||||
"snapshot": "thunderbird",
|
||||
"instruction": "Create a local folder called \"Promotions\" and create a filter to auto move the inbox emails whose subject contains “discount” to the new folder",
|
||||
"source": "https://support.mozilla.org/en-US/kb/organize-your-messages-using-filters",
|
||||
"config": [
|
||||
{
|
||||
"type": "download",
|
||||
"parameters": {
|
||||
"files": [
|
||||
{
|
||||
"url": "https://drive.usercontent.google.com/download?id=1EHLRWzBCOsyERkSMUnTF2pnsR0n6ZvtR&export=download&authuser=0&confirm=t&uuid=de09bd5e-bef8-499a-b599-c642af190e10&at=APZUnTXqOsQkxl0zMSX6R1Sgp_v3:1704362491712",
|
||||
"path": "/home/user/thunderbird-profile.tar.gz"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"trajectory": "trajectories/e1e75309-3ddb-4d09-92ec-de869c928143",
|
||||
"related_apps": [
|
||||
"thunderbird"
|
||||
],
|
||||
"evaluator": {
|
||||
"postconfig": [
|
||||
{
|
||||
"type": "command",
|
||||
"parameters": {
|
||||
"command": ["wmctrl", "-Fc", "Message Filters"],
|
||||
"until": {
|
||||
"returncode": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"func": "check_thunderbird_filter",
|
||||
"result": {
|
||||
"type": "vm_file",
|
||||
"path": "/home/user/.thunderbird/t5q2a5hp.default-release/ImapMail/outlook.office365.com/msgFilterRules.dat",
|
||||
"dest": "msgFilterRules.dat"
|
||||
},
|
||||
"expected": {
|
||||
"type": "rule",
|
||||
"rules": {
|
||||
"expect": [
|
||||
{
|
||||
"enabled": "yes",
|
||||
"action": "Move to folder",
|
||||
"actionValue": "mailbox://nobody@Local%20Folders/Promotions",
|
||||
"condition": ["AND (subject,contains,discount)"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
16
main.py
16
main.py
@@ -44,16 +44,14 @@ def human_agent():
|
||||
Runs the Gym environment with human input.
|
||||
"""
|
||||
|
||||
with open("evaluation_examples/examples/thunderbird/06fe7178-4491-4589-810f-2e2bc9502122.json", "r") as f:
|
||||
with open("evaluation_examples/examples/thunderbird/e1e75309-3ddb-4d09-92ec-de869c928143.json.nosetup", "r") as f:
|
||||
example = json.load(f)
|
||||
example["snapshot"] = "Snapshot 11"
|
||||
|
||||
env = DesktopEnv(
|
||||
path_to_vm=r"C:\Users\tianbaox\Documents\Virtual Machines\Ubuntu\Ubuntu.vmx",
|
||||
action_space="computer_13",
|
||||
task_config=example
|
||||
)
|
||||
example["snapshot"] = "Snapshot 18"
|
||||
|
||||
env = DesktopEnv( path_to_vm="../../../../大文件/镜像/Ubuntu-1218/Ubuntu/Ubuntu.vmx"
|
||||
, action_space="computer_13"
|
||||
, task_config=example
|
||||
)
|
||||
# reset the environment to certain snapshot
|
||||
observation = env.reset()
|
||||
done = False
|
||||
@@ -94,7 +92,7 @@ def human_agent():
|
||||
|
||||
#input("PAUSING")
|
||||
|
||||
env.close()
|
||||
#env.close()
|
||||
logger.info("Environment closed.")
|
||||
|
||||
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
# eval README
|
||||
|
||||
This is the README for your extension "eval". After writing up a brief description, we recommend including the following sections.
|
||||
|
||||
## Features
|
||||
|
||||
Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file.
|
||||
|
||||
For example if there is an image subfolder under your extension project workspace:
|
||||
|
||||
\!\[feature X\]\(images/feature-x.png\)
|
||||
|
||||
> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow.
|
||||
|
||||
## Requirements
|
||||
|
||||
If you have any requirements or dependencies, add a section describing those and how to install and configure them.
|
||||
|
||||
## Extension Settings
|
||||
|
||||
Include if your extension adds any VS Code settings through the `contributes.configuration` extension point.
|
||||
|
||||
For example:
|
||||
|
||||
This extension contributes the following settings:
|
||||
|
||||
* `myExtension.enable`: Enable/disable this extension.
|
||||
* `myExtension.thing`: Set to `blah` to do something.
|
||||
|
||||
## Known Issues
|
||||
|
||||
Calling out known issues can help limit users opening duplicate issues against your extension.
|
||||
|
||||
## Release Notes
|
||||
|
||||
Users appreciate release notes as you update your extension.
|
||||
|
||||
### 1.0.0
|
||||
|
||||
Initial release of ...
|
||||
|
||||
### 1.0.1
|
||||
|
||||
Fixed issue #.
|
||||
|
||||
### 1.1.0
|
||||
|
||||
Added features X, Y, and Z.
|
||||
|
||||
---
|
||||
|
||||
## Following extension guidelines
|
||||
|
||||
Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension.
|
||||
|
||||
* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines)
|
||||
|
||||
## Working with Markdown
|
||||
|
||||
You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts:
|
||||
|
||||
* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux).
|
||||
* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux).
|
||||
* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets.
|
||||
|
||||
## For more information
|
||||
|
||||
* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown)
|
||||
* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/)
|
||||
|
||||
**Enjoy!**
|
||||
|
||||
BIN
vscodeEvalExtension/eval-0.0.1.vsix
Normal file
BIN
vscodeEvalExtension/eval-0.0.1.vsix
Normal file
Binary file not shown.
58
vscodeEvalExtension/node_modules/.package-lock.json
generated
vendored
58
vscodeEvalExtension/node_modules/.package-lock.json
generated
vendored
@@ -244,12 +244,29 @@
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/fs-extra": {
|
||||
"version": "11.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz",
|
||||
"integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==",
|
||||
"dependencies": {
|
||||
"@types/jsonfile": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/json-schema": {
|
||||
"version": "7.0.15",
|
||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
||||
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/jsonfile": {
|
||||
"version": "6.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz",
|
||||
"integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/mocha": {
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz",
|
||||
@@ -260,7 +277,6 @@
|
||||
"version": "18.19.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz",
|
||||
"integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~5.26.4"
|
||||
}
|
||||
@@ -1234,6 +1250,19 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
|
||||
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -1332,6 +1361,11 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
||||
},
|
||||
"node_modules/graphemer": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
|
||||
@@ -1580,6 +1614,17 @@
|
||||
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/jsonfile": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/jszip": {
|
||||
"version": "3.10.1",
|
||||
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
|
||||
@@ -2538,8 +2583,15 @@
|
||||
"node_modules/undici-types": {
|
||||
"version": "5.26.5",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
|
||||
"dev": true
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||
},
|
||||
"node_modules/universalify": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uri-js": {
|
||||
"version": "4.4.1",
|
||||
|
||||
21
vscodeEvalExtension/node_modules/@types/fs-extra/LICENSE
generated
vendored
Normal file
21
vscodeEvalExtension/node_modules/@types/fs-extra/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
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
|
||||
15
vscodeEvalExtension/node_modules/@types/fs-extra/README.md
generated
vendored
Normal file
15
vscodeEvalExtension/node_modules/@types/fs-extra/README.md
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# Installation
|
||||
> `npm install --save @types/fs-extra`
|
||||
|
||||
# Summary
|
||||
This package contains type definitions for fs-extra (https://github.com/jprichardson/node-fs-extra).
|
||||
|
||||
# Details
|
||||
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra.
|
||||
|
||||
### Additional Details
|
||||
* Last updated: Tue, 07 Nov 2023 20:08:00 GMT
|
||||
* Dependencies: [@types/jsonfile](https://npmjs.com/package/@types/jsonfile), [@types/node](https://npmjs.com/package/@types/node)
|
||||
|
||||
# Credits
|
||||
These definitions were written by [Alan Agius](https://github.com/alan-agius4), [midknight41](https://github.com/midknight41), [Brendan Forster](https://github.com/shiftkey), [Mees van Dijk](https://github.com/mees-), [Justin Rockwood](https://github.com/jrockwood), [Sang Dang](https://github.com/sangdth), [Florian Keller](https://github.com/ffflorian), [Piotr Błażejewicz](https://github.com/peterblazejewicz), [Tiger Oakes](https://github.com/NotWoods), and [BendingBender](https://github.com/BendingBender).
|
||||
111
vscodeEvalExtension/node_modules/@types/fs-extra/esm.d.mts
generated
vendored
Normal file
111
vscodeEvalExtension/node_modules/@types/fs-extra/esm.d.mts
generated
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
import * as fse from "./index.js";
|
||||
|
||||
export {
|
||||
copy,
|
||||
CopyFilterAsync,
|
||||
CopyFilterSync,
|
||||
CopyOptions,
|
||||
CopyOptionsSync,
|
||||
copySync,
|
||||
createFile,
|
||||
createFileSync,
|
||||
createLink,
|
||||
createLinkSync,
|
||||
createSymlink,
|
||||
createSymlinkSync,
|
||||
emptyDir,
|
||||
emptydir,
|
||||
emptyDirSync,
|
||||
emptydirSync,
|
||||
ensureDir,
|
||||
EnsureDirOptions,
|
||||
ensureDirSync,
|
||||
ensureFile,
|
||||
ensureFileSync,
|
||||
ensureLink,
|
||||
ensureLinkSync,
|
||||
ensureSymlink,
|
||||
ensureSymlinkSync,
|
||||
JsonOutputOptions,
|
||||
JsonReadOptions,
|
||||
JsonWriteOptions,
|
||||
mkdirp,
|
||||
mkdirpSync,
|
||||
mkdirs,
|
||||
mkdirsSync,
|
||||
move,
|
||||
MoveOptions,
|
||||
moveSync,
|
||||
NoParamCallback,
|
||||
NoParamCallbackWithUndefined,
|
||||
outputFile,
|
||||
outputFileSync,
|
||||
outputJSON,
|
||||
outputJson,
|
||||
outputJSONSync,
|
||||
outputJsonSync,
|
||||
pathExists,
|
||||
pathExistsSync,
|
||||
PathLike,
|
||||
readJSON,
|
||||
readJson,
|
||||
readJSONSync,
|
||||
readJsonSync,
|
||||
remove,
|
||||
removeSync,
|
||||
SymlinkType,
|
||||
WriteFileOptions,
|
||||
writeJSON,
|
||||
writeJson,
|
||||
writeJSONSync,
|
||||
writeJsonSync,
|
||||
} from "./index.js";
|
||||
|
||||
declare const fsExtra: {
|
||||
copy: typeof fse.copy;
|
||||
copySync: typeof fse.copySync;
|
||||
emptyDirSync: typeof fse.emptyDirSync;
|
||||
emptydirSync: typeof fse.emptydirSync;
|
||||
emptyDir: typeof fse.emptyDir;
|
||||
emptydir: typeof fse.emptydir;
|
||||
createFile: typeof fse.createFile;
|
||||
createFileSync: typeof fse.createFileSync;
|
||||
ensureFile: typeof fse.ensureFile;
|
||||
ensureFileSync: typeof fse.ensureFileSync;
|
||||
createLink: typeof fse.createLink;
|
||||
createLinkSync: typeof fse.createLinkSync;
|
||||
ensureLink: typeof fse.ensureLink;
|
||||
ensureLinkSync: typeof fse.ensureLinkSync;
|
||||
createSymlink: typeof fse.createSymlink;
|
||||
createSymlinkSync: typeof fse.createSymlinkSync;
|
||||
ensureSymlink: typeof fse.ensureSymlink;
|
||||
ensureSymlinkSync: typeof fse.ensureSymlinkSync;
|
||||
readJson: typeof fse.readJson;
|
||||
readJSON: typeof fse.readJSON;
|
||||
readJsonSync: typeof fse.readJsonSync;
|
||||
readJSONSync: typeof fse.readJSONSync;
|
||||
writeJson: typeof fse.writeJson;
|
||||
writeJSON: typeof fse.writeJSON;
|
||||
writeJsonSync: typeof fse.writeJsonSync;
|
||||
writeJSONSync: typeof fse.writeJSONSync;
|
||||
outputJson: typeof fse.outputJson;
|
||||
outputJSON: typeof fse.outputJSON;
|
||||
outputJsonSync: typeof fse.outputJsonSync;
|
||||
outputJSONSync: typeof fse.outputJSONSync;
|
||||
mkdirs: typeof fse.mkdirs;
|
||||
mkdirsSync: typeof fse.mkdirsSync;
|
||||
mkdirp: typeof fse.mkdirp;
|
||||
mkdirpSync: typeof fse.mkdirpSync;
|
||||
ensureDir: typeof fse.ensureDir;
|
||||
ensureDirSync: typeof fse.ensureDirSync;
|
||||
move: typeof fse.move;
|
||||
moveSync: typeof fse.moveSync;
|
||||
outputFile: typeof fse.outputFile;
|
||||
outputFileSync: typeof fse.outputFileSync;
|
||||
pathExists: typeof fse.pathExists;
|
||||
pathExistsSync: typeof fse.pathExistsSync;
|
||||
remove: typeof fse.remove;
|
||||
removeSync: typeof fse.removeSync;
|
||||
};
|
||||
|
||||
export default fsExtra;
|
||||
996
vscodeEvalExtension/node_modules/@types/fs-extra/index.d.ts
generated
vendored
Normal file
996
vscodeEvalExtension/node_modules/@types/fs-extra/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,996 @@
|
||||
/// <reference types="node" />
|
||||
|
||||
import * as fs from "fs";
|
||||
import * as jsonfile from "jsonfile";
|
||||
import { StringifyOptions } from "jsonfile/utils";
|
||||
|
||||
export * from "fs";
|
||||
|
||||
/**
|
||||
* Copy a file or directory. The directory can have contents.
|
||||
*
|
||||
* @param src Note that if `src` is a directory it will copy everything inside of this directory,
|
||||
* not the entire directory itself (see [issue #537](https://github.com/jprichardson/node-fs-extra/issues/537)).
|
||||
* @param dest Note that if `src` is a file, `dest` cannot be a directory
|
||||
* (see [issue #323](https://github.com/jprichardson/node-fs-extra/issues/323)).
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* }) // copies file
|
||||
*
|
||||
* fs.copy('/tmp/mydir', '/tmp/mynewdir', err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* }) // copies directory, even if it has subdirectories or files
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.copy('/tmp/myfile', '/tmp/mynewfile')
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.copy('/tmp/myfile', '/tmp/mynewfile')
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*
|
||||
* // Using filter function
|
||||
* fs.copy(
|
||||
* '/tmp/mydir',
|
||||
* '/tmp/mynewdir',
|
||||
* {
|
||||
* filter(src, dest) {
|
||||
* // your logic here
|
||||
* // it will be copied if return true
|
||||
* }
|
||||
* },
|
||||
* err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
export function copy(src: string, dest: string, options?: CopyOptions): Promise<void>;
|
||||
export function copy(src: string, dest: string, callback: NoParamCallbackWithUndefined): void;
|
||||
export function copy(src: string, dest: string, options: CopyOptions, callback: NoParamCallbackWithUndefined): void;
|
||||
/**
|
||||
* Copy a file or directory. The directory can have contents.
|
||||
*
|
||||
* @param src Note that if `src` is a directory it will copy everything inside of this directory,
|
||||
* not the entire directory itself (see [issue #537](https://github.com/jprichardson/node-fs-extra/issues/537)).
|
||||
* @param dest Note that if `src` is a file, `dest` cannot be a directory
|
||||
* (see [issue #323](https://github.com/jprichardson/node-fs-extra/issues/323)).
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // copy file
|
||||
* fs.copySync('/tmp/myfile', '/tmp/mynewfile')
|
||||
*
|
||||
* // copy directory, even if it has subdirectories or files
|
||||
* fs.copySync('/tmp/mydir', '/tmp/mynewdir')
|
||||
*
|
||||
* // Using filter function
|
||||
* fs.copySync('/tmp/mydir', '/tmp/mynewdir', {
|
||||
* filter(src, dest) {
|
||||
* // your logic here
|
||||
* // it will be copied if return true
|
||||
* }
|
||||
* })
|
||||
*/
|
||||
export function copySync(src: string, dest: string, options?: CopyOptionsSync): void;
|
||||
|
||||
/**
|
||||
* Moves a file or directory, even across devices.
|
||||
*
|
||||
* @param dest Note: When `src` is a file, `dest` must be a file and when `src` is a directory, `dest` must be a directory.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const src = '/tmp/file.txt'
|
||||
* const dest = '/tmp/this/path/does/not/exist/file.txt'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.move(src, dest, err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.move(src, dest)
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.move(src, dest)
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*
|
||||
* // Using `overwrite` option
|
||||
* fs.move('/tmp/somedir', '/tmp/may/already/exist/somedir', { overwrite: true }, err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* })
|
||||
*/
|
||||
export function move(src: string, dest: string, options?: MoveOptions): Promise<void>;
|
||||
export function move(src: string, dest: string, callback: NoParamCallbackWithUndefined): void;
|
||||
export function move(src: string, dest: string, options: MoveOptions, callback: NoParamCallbackWithUndefined): void;
|
||||
/**
|
||||
* Moves a file or directory, even across devices.
|
||||
*
|
||||
* @param dest Note: When `src` is a file, `dest` must be a file and when `src` is a directory, `dest` must be a directory.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* fs.moveSync('/tmp/somefile', '/tmp/does/not/exist/yet/somefile')
|
||||
*
|
||||
* // Using `overwrite` option
|
||||
* fs.moveSync('/tmp/somedir', '/tmp/may/already/exist/somedir', { overwrite: true })
|
||||
*/
|
||||
export function moveSync(src: string, dest: string, options?: MoveOptions): void;
|
||||
|
||||
/**
|
||||
* Ensures that the file exists. If the file that is requested to be created is in
|
||||
* directories that do not exist, these directories are created. If the file already
|
||||
* exists, it is **NOT MODIFIED**.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.txt'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.ensureFile(file, err => {
|
||||
* console.log(err) // => null
|
||||
* // file has now been created, including the directory it is to be placed in
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.ensureFile(file)
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.ensureFile(file)
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function ensureFile(file: string): Promise<void>;
|
||||
export function ensureFile(file: string, callback: NoParamCallbackWithUndefined): void;
|
||||
/**
|
||||
* @see ensureFile
|
||||
*/
|
||||
export const createFile: typeof ensureFile;
|
||||
/**
|
||||
* Ensures that the file exists. If the file that is requested to be created is in
|
||||
* directories that do not exist, these directories are created. If the file already
|
||||
* exists, it is **NOT MODIFIED**.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.txt'
|
||||
* fs.ensureFileSync(file)
|
||||
* // file has now been created, including the directory it is to be placed in
|
||||
*/
|
||||
export function ensureFileSync(file: string): void;
|
||||
/**
|
||||
* @see ensureFileSync
|
||||
*/
|
||||
export const createFileSync: typeof ensureFileSync;
|
||||
|
||||
/**
|
||||
* Ensures that the link exists. If the directory structure does not exist, it is created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const srcPath = '/tmp/file.txt'
|
||||
* const destPath = '/tmp/this/path/does/not/exist/file.txt'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.ensureLink(srcPath, destPath, err => {
|
||||
* console.log(err) // => null
|
||||
* // link has now been created, including the directory it is to be placed in
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.ensureLink(srcPath, destPath)
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.ensureLink(srcPath, destPath)
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function ensureLink(src: string, dest: string): Promise<void>;
|
||||
export function ensureLink(src: string, dest: string, callback: fs.NoParamCallback): void;
|
||||
/**
|
||||
* @see ensureLink
|
||||
*/
|
||||
export const createLink: typeof ensureLink;
|
||||
/**
|
||||
* Ensures that the link exists. If the directory structure does not exist, it is created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const srcPath = '/tmp/file.txt'
|
||||
* const destPath = '/tmp/this/path/does/not/exist/file.txt'
|
||||
* fs.ensureLinkSync(srcPath, destPath)
|
||||
* // link has now been created, including the directory it is to be placed in
|
||||
*/
|
||||
export function ensureLinkSync(src: string, dest: string): void;
|
||||
/**
|
||||
* @see ensureLinkSync
|
||||
*/
|
||||
export const createLinkSync: typeof ensureLinkSync;
|
||||
|
||||
/**
|
||||
* Ensures that the symlink exists. If the directory structure does not exist, it is created.
|
||||
*
|
||||
* @param type It is only available on Windows and ignored on other platforms.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const srcPath = '/tmp/file.txt'
|
||||
* const destPath = '/tmp/this/path/does/not/exist/file.txt'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.ensureSymlink(srcPath, destPath, err => {
|
||||
* console.log(err) // => null
|
||||
* // symlink has now been created, including the directory it is to be placed in
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.ensureSymlink(srcPath, destPath)
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.ensureSymlink(srcPath, destPath)
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function ensureSymlink(src: string, dest: string, type?: SymlinkType): Promise<void>;
|
||||
export function ensureSymlink(src: string, dest: string, callback: fs.NoParamCallback): void;
|
||||
export function ensureSymlink(src: string, dest: string, type: SymlinkType, callback: fs.NoParamCallback): void;
|
||||
/**
|
||||
* @see ensureSymlink
|
||||
*/
|
||||
export const createSymlink: typeof ensureSymlink;
|
||||
/**
|
||||
* Ensures that the symlink exists. If the directory structure does not exist, it is created.
|
||||
*
|
||||
* @param type It is only available on Windows and ignored on other platforms.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const srcPath = '/tmp/file.txt'
|
||||
* const destPath = '/tmp/this/path/does/not/exist/file.txt'
|
||||
* fs.ensureSymlinkSync(srcPath, destPath)
|
||||
* // symlink has now been created, including the directory it is to be placed in
|
||||
*/
|
||||
export function ensureSymlinkSync(src: string, dest: string, type?: SymlinkType): void;
|
||||
/**
|
||||
* @see ensureSymlinkSync
|
||||
*/
|
||||
export const createSymlinkSync: typeof ensureSymlinkSync;
|
||||
|
||||
/**
|
||||
* Ensures that the directory exists. If the directory structure does not exist, it is created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const dir = '/tmp/this/path/does/not/exist'
|
||||
* const desiredMode = 0o2775
|
||||
* const options = {
|
||||
* mode: 0o2775
|
||||
* }
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.ensureDir(dir, err => {
|
||||
* console.log(err) // => null
|
||||
* // dir has now been created, including the directory it is to be placed in
|
||||
* })
|
||||
*
|
||||
* // With a callback and a mode integer
|
||||
* fs.ensureDir(dir, desiredMode, err => {
|
||||
* console.log(err) // => null
|
||||
* // dir has now been created with mode 0o2775, including the directory it is to be placed in
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.ensureDir(dir)
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With Promises and a mode integer:
|
||||
* fs.ensureDir(dir, desiredMode)
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.ensureDir(dir)
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
* asyncAwait()
|
||||
*
|
||||
* // With async/await and an options object, containing mode:
|
||||
* async function asyncAwaitMode () {
|
||||
* try {
|
||||
* await fs.ensureDir(dir, options)
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
* asyncAwaitMode()
|
||||
*/
|
||||
export function ensureDir(path: string, options?: EnsureDirOptions | number): Promise<void>;
|
||||
export function ensureDir(path: string, callback: fs.NoParamCallback): void;
|
||||
export function ensureDir(path: string, options: EnsureDirOptions | number, callback: fs.NoParamCallback): void;
|
||||
/**
|
||||
* Ensures that the directory exists. If the directory structure does not exist, it is created.
|
||||
* If provided, options may specify the desired mode for the directory.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const dir = '/tmp/this/path/does/not/exist'
|
||||
*
|
||||
* const desiredMode = 0o2775
|
||||
* const options = {
|
||||
* mode: 0o2775
|
||||
* }
|
||||
*
|
||||
* fs.ensureDirSync(dir)
|
||||
* // dir has now been created, including the directory it is to be placed in
|
||||
*
|
||||
* fs.ensureDirSync(dir, desiredMode)
|
||||
* // dir has now been created, including the directory it is to be placed in with permission 0o2775
|
||||
*
|
||||
* fs.ensureDirSync(dir, options)
|
||||
* // dir has now been created, including the directory it is to be placed in with permission 0o2775
|
||||
*/
|
||||
export function ensureDirSync(path: string, options?: EnsureDirOptions | number): void;
|
||||
|
||||
/**
|
||||
* @see ensureDir
|
||||
*/
|
||||
export const mkdirs: typeof ensureDir;
|
||||
/**
|
||||
* @see ensureDirSync
|
||||
*/
|
||||
export const mkdirsSync: typeof ensureDirSync;
|
||||
|
||||
/**
|
||||
* @see ensureDir
|
||||
*/
|
||||
export const mkdirp: typeof ensureDir;
|
||||
/**
|
||||
* @see ensureDirSync
|
||||
*/
|
||||
export const mkdirpSync: typeof ensureDirSync;
|
||||
|
||||
/**
|
||||
* Almost the same as `writeFile` (i.e. it overwrites), except that if the parent directory
|
||||
* does not exist, it's created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.txt'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.outputFile(file, 'hello!', err => {
|
||||
* console.log(err) // => null
|
||||
*
|
||||
* fs.readFile(file, 'utf8', (err, data) => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log(data) // => hello!
|
||||
* })
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.outputFile(file, 'hello!')
|
||||
* .then(() => fs.readFile(file, 'utf8'))
|
||||
* .then(data => {
|
||||
* console.log(data) // => hello!
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.outputFile(file, 'hello!')
|
||||
*
|
||||
* const data = await fs.readFile(file, 'utf8')
|
||||
*
|
||||
* console.log(data) // => hello!
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function outputFile(
|
||||
file: string,
|
||||
data: string | NodeJS.ArrayBufferView,
|
||||
options?: fs.WriteFileOptions,
|
||||
): Promise<void>;
|
||||
export function outputFile(file: string, data: string | NodeJS.ArrayBufferView, callback: fs.NoParamCallback): void;
|
||||
export function outputFile(
|
||||
file: string,
|
||||
data: string | NodeJS.ArrayBufferView,
|
||||
options: fs.WriteFileOptions,
|
||||
callback: fs.NoParamCallback,
|
||||
): void;
|
||||
/**
|
||||
* Almost the same as `writeFileSync` (i.e. it overwrites), except that if the parent directory
|
||||
* does not exist, it's created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.txt'
|
||||
* fs.outputFileSync(file, 'hello!')
|
||||
*
|
||||
* const data = fs.readFileSync(file, 'utf8')
|
||||
* console.log(data) // => hello!
|
||||
*/
|
||||
export function outputFileSync(
|
||||
file: string,
|
||||
data: string | NodeJS.ArrayBufferView,
|
||||
options?: fs.WriteFileOptions,
|
||||
): void;
|
||||
|
||||
/**
|
||||
* Reads a JSON file and then parses it into an object.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.readJson('./package.json', (err, packageObj) => {
|
||||
* if (err) console.error(err)
|
||||
* console.log(packageObj.version) // => 0.1.3
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.readJson('./package.json')
|
||||
* .then(packageObj => {
|
||||
* console.log(packageObj.version) // => 0.1.3
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* const packageObj = await fs.readJson('./package.json')
|
||||
* console.log(packageObj.version) // => 0.1.3
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*
|
||||
* // `readJsonSync()` can take a `throws` option set to `false` and it won't throw if the JSON is invalid. Example:
|
||||
* const file = '/tmp/some-invalid.json'
|
||||
* const data = '{not valid JSON'
|
||||
* fs.writeFileSync(file, data)
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.readJson(file, { throws: false }, (err, obj) => {
|
||||
* if (err) console.error(err)
|
||||
* console.log(obj) // => null
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.readJson(file, { throws: false })
|
||||
* .then(obj => {
|
||||
* console.log(obj) // => null
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err) // Not called
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwaitThrows () {
|
||||
* const obj = await fs.readJson(file, { throws: false })
|
||||
* console.log(obj) // => null
|
||||
* }
|
||||
*
|
||||
* asyncAwaitThrows()
|
||||
*/
|
||||
export const readJson: typeof jsonfile.readFile;
|
||||
/**
|
||||
* @see readJson
|
||||
*/
|
||||
export const readJSON: typeof jsonfile.readFile;
|
||||
/**
|
||||
* Reads a JSON file and then parses it into an object.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const packageObj = fs.readJsonSync('./package.json')
|
||||
* console.log(packageObj.version) // => 2.0.0
|
||||
*
|
||||
* // `readJsonSync()` can take a `throws` option set to `false` and it won't throw if the JSON is invalid. Example:
|
||||
* const file = '/tmp/some-invalid.json'
|
||||
* const data = '{not valid JSON'
|
||||
* fs.writeFileSync(file, data)
|
||||
*
|
||||
* const obj = fs.readJsonSync(file, { throws: false })
|
||||
* console.log(obj) // => null
|
||||
*/
|
||||
export const readJsonSync: typeof jsonfile.readFileSync;
|
||||
/**
|
||||
* @see readJsonSync
|
||||
*/
|
||||
export const readJSONSync: typeof jsonfile.readFileSync;
|
||||
|
||||
/**
|
||||
* Writes an object to a JSON file.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.writeJson('./package.json', {name: 'fs-extra'}, err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.writeJson('./package.json', {name: 'fs-extra'})
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.writeJson('./package.json', {name: 'fs-extra'})
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export const writeJson: typeof jsonfile.writeFile;
|
||||
/**
|
||||
* @see writeJson
|
||||
*/
|
||||
export const writeJSON: typeof jsonfile.writeFile;
|
||||
/**
|
||||
* Writes an object to a JSON file.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* fs.writeJsonSync('./package.json', {name: 'fs-extra'})
|
||||
*/
|
||||
export const writeJsonSync: typeof jsonfile.writeFileSync;
|
||||
/**
|
||||
* @see writeJsonSync
|
||||
*/
|
||||
export const writeJSONSync: typeof jsonfile.writeFileSync;
|
||||
|
||||
/**
|
||||
* Almost the same as `writeJson`, except that if the directory does not exist, it's created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.json'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.outputJson(file, {name: 'JP'}, err => {
|
||||
* console.log(err) // => null
|
||||
*
|
||||
* fs.readJson(file, (err, data) => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log(data.name) // => JP
|
||||
* })
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.outputJson(file, {name: 'JP'})
|
||||
* .then(() => fs.readJson(file))
|
||||
* .then(data => {
|
||||
* console.log(data.name) // => JP
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.outputJson(file, {name: 'JP'})
|
||||
*
|
||||
* const data = await fs.readJson(file)
|
||||
*
|
||||
* console.log(data.name) // => JP
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function outputJson(file: string, data: any, options?: JsonOutputOptions): Promise<void>;
|
||||
export function outputJson(file: string, data: any, options: JsonOutputOptions, callback: fs.NoParamCallback): void;
|
||||
export function outputJson(file: string, data: any, callback: fs.NoParamCallback): void;
|
||||
/**
|
||||
* @see outputJson
|
||||
*/
|
||||
export const outputJSON: typeof outputJson;
|
||||
/**
|
||||
* Almost the same as `writeJsonSync`, except that if the directory does not exist, it's created.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.json'
|
||||
* fs.outputJsonSync(file, {name: 'JP'})
|
||||
*
|
||||
* const data = fs.readJsonSync(file)
|
||||
* console.log(data.name) // => JP
|
||||
*/
|
||||
export function outputJsonSync(file: string, data: any, options?: JsonOutputOptions): void;
|
||||
/**
|
||||
* @see outputJsonSync
|
||||
*/
|
||||
export const outputJSONSync: typeof outputJsonSync;
|
||||
|
||||
/**
|
||||
* Removes a file or directory. The directory can have contents. If the path does not exist, silently does nothing.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // remove file
|
||||
* // With a callback:
|
||||
* fs.remove('/tmp/myfile', err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* })
|
||||
*
|
||||
* fs.remove('/home/jprichardson', err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!') // I just deleted my entire HOME directory.
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.remove('/tmp/myfile')
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.remove('/tmp/myfile')
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function remove(dir: string): Promise<void>;
|
||||
export function remove(dir: string, callback: fs.NoParamCallback): void;
|
||||
/**
|
||||
* Removes a file or directory. The directory can have contents. If the path does not exist, silently does nothing.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // remove file
|
||||
* fs.removeSync('/tmp/myfile')
|
||||
*
|
||||
* fs.removeSync('/home/jprichardson') // I just deleted my entire HOME directory.
|
||||
*/
|
||||
export function removeSync(dir: string): void;
|
||||
|
||||
/**
|
||||
* Ensures that a directory is empty. Deletes directory contents if the directory is not empty.
|
||||
* If the directory does not exist, it is created. The directory itself is not deleted.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // assume this directory has a lot of files and folders
|
||||
* // With a callback:
|
||||
* fs.emptyDir('/tmp/some/dir', err => {
|
||||
* if (err) return console.error(err)
|
||||
* console.log('success!')
|
||||
* })
|
||||
*
|
||||
* // With Promises:
|
||||
* fs.emptyDir('/tmp/some/dir')
|
||||
* .then(() => {
|
||||
* console.log('success!')
|
||||
* })
|
||||
* .catch(err => {
|
||||
* console.error(err)
|
||||
* })
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* try {
|
||||
* await fs.emptyDir('/tmp/some/dir')
|
||||
* console.log('success!')
|
||||
* } catch (err) {
|
||||
* console.error(err)
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function emptyDir(path: string): Promise<void>;
|
||||
export function emptyDir(path: string, callback: fs.NoParamCallback): void;
|
||||
/**
|
||||
* @see emptyDir
|
||||
*/
|
||||
export const emptydir: typeof emptyDir;
|
||||
/**
|
||||
* Ensures that a directory is empty. Deletes directory contents if the directory is not empty.
|
||||
* If the directory does not exist, it is created. The directory itself is not deleted.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* // assume this directory has a lot of files and folders
|
||||
* fs.emptyDirSync('/tmp/some/dir')
|
||||
*/
|
||||
export function emptyDirSync(path: string): void;
|
||||
/**
|
||||
* @see emptyDirSync
|
||||
*/
|
||||
export const emptydirSync: typeof emptyDirSync;
|
||||
|
||||
/**
|
||||
* Test whether or not the given path exists by checking with the file system. Like
|
||||
* [`fs.exists`](https://nodejs.org/api/fs.html#fs_fs_exists_path_callback), but with a normal
|
||||
* callback signature (err, exists). Uses `fs.access` under the hood.
|
||||
*
|
||||
* @example
|
||||
* import * as fs from 'fs-extra'
|
||||
*
|
||||
* const file = '/tmp/this/path/does/not/exist/file.txt'
|
||||
*
|
||||
* // With a callback:
|
||||
* fs.pathExists(file, (err, exists) => {
|
||||
* console.log(err) // => null
|
||||
* console.log(exists) // => false
|
||||
* })
|
||||
*
|
||||
* // Promise usage:
|
||||
* fs.pathExists(file)
|
||||
* .then(exists => console.log(exists)) // => false
|
||||
*
|
||||
* // With async/await:
|
||||
* async function asyncAwait () {
|
||||
* const exists = await fs.pathExists(file)
|
||||
*
|
||||
* console.log(exists) // => false
|
||||
* }
|
||||
*
|
||||
* asyncAwait()
|
||||
*/
|
||||
export function pathExists(path: string): Promise<boolean>;
|
||||
export function pathExists(path: string, callback: (err: NodeJS.ErrnoException | null, exists: boolean) => void): void;
|
||||
/**
|
||||
* An alias for [`fs.existsSync`](https://nodejs.org/api/fs.html#fs_fs_existssync_path), created for
|
||||
* consistency with `pathExists`.
|
||||
*/
|
||||
export function pathExistsSync(path: string): boolean;
|
||||
|
||||
export const access: typeof fs.access.__promisify__ & typeof fs.access;
|
||||
export const appendFile: typeof fs.appendFile.__promisify__ & typeof fs.appendFile;
|
||||
export const chmod: typeof fs.chmod.__promisify__ & typeof fs.chmod;
|
||||
export const chown: typeof fs.chown.__promisify__ & typeof fs.chown;
|
||||
export const close: typeof fs.close.__promisify__ & typeof fs.close;
|
||||
export const copyFile: typeof fs.copyFile.__promisify__ & typeof fs.copyFile;
|
||||
export const exists: typeof fs.exists.__promisify__ & typeof fs.exists;
|
||||
export const fchmod: typeof fs.fchmod.__promisify__ & typeof fs.fchmod;
|
||||
export const fchown: typeof fs.fchown.__promisify__ & typeof fs.fchown;
|
||||
export const fdatasync: typeof fs.fdatasync.__promisify__ & typeof fs.fdatasync;
|
||||
export const fstat: typeof fs.fstat.__promisify__ & typeof fs.fstat;
|
||||
export const fsync: typeof fs.fsync.__promisify__ & typeof fs.fsync;
|
||||
export const ftruncate: typeof fs.ftruncate.__promisify__ & typeof fs.ftruncate;
|
||||
export const futimes: typeof fs.futimes.__promisify__ & typeof fs.futimes;
|
||||
export const lchmod: typeof fs.lchmod.__promisify__ & typeof fs.lchmod;
|
||||
export const lchown: typeof fs.lchown.__promisify__ & typeof fs.lchown;
|
||||
export const link: typeof fs.link.__promisify__ & typeof fs.link;
|
||||
export const lstat: typeof fs.lstat.__promisify__ & typeof fs.lstat;
|
||||
export const mkdir: typeof fs.mkdir.__promisify__ & typeof fs.mkdir;
|
||||
export const mkdtemp: typeof fs.mkdtemp.__promisify__ & typeof fs.mkdtemp;
|
||||
export const open: typeof fs.open.__promisify__ & typeof fs.open;
|
||||
export const opendir: typeof fs.opendir.__promisify__ & typeof fs.opendir;
|
||||
export const read: typeof fs.read.__promisify__ & typeof fs.read;
|
||||
export const readv: typeof fs.readv.__promisify__ & typeof fs.readv;
|
||||
export const readdir: typeof fs.readdir.__promisify__ & typeof fs.readdir;
|
||||
export const readFile: typeof fs.readFile.__promisify__ & typeof fs.readFile;
|
||||
export const readlink: typeof fs.readlink.__promisify__ & typeof fs.readlink;
|
||||
export const realpath:
|
||||
& typeof fs.realpath.__promisify__
|
||||
& typeof fs.realpath
|
||||
& {
|
||||
native(path: fs.PathLike, options?: fs.EncodingOption): Promise<string>;
|
||||
native(path: fs.PathLike, options: fs.BufferEncodingOption): Promise<Buffer>;
|
||||
};
|
||||
export const rename: typeof fs.rename.__promisify__ & typeof fs.rename;
|
||||
export const rm: typeof fs.rm.__promisify__ & typeof fs.rm;
|
||||
export const rmdir: typeof fs.rmdir.__promisify__ & typeof fs.rmdir;
|
||||
export const stat: typeof fs.stat.__promisify__ & typeof fs.stat;
|
||||
export const symlink: typeof fs.symlink.__promisify__ & typeof fs.symlink;
|
||||
export const truncate: typeof fs.truncate.__promisify__ & typeof fs.truncate;
|
||||
export const unlink: typeof fs.unlink.__promisify__ & typeof fs.unlink;
|
||||
export const utimes: typeof fs.utimes.__promisify__ & typeof fs.utimes;
|
||||
export const write: typeof fs.write.__promisify__ & typeof fs.write;
|
||||
export const writev: typeof fs.writev.__promisify__ & typeof fs.writev;
|
||||
export const writeFile: typeof fs.writeFile.__promisify__ & typeof fs.writeFile;
|
||||
|
||||
export type NoParamCallbackWithUndefined = (err: NodeJS.ErrnoException | null | undefined) => void;
|
||||
|
||||
export type SymlinkType = fs.symlink.Type;
|
||||
|
||||
export type CopyFilterSync = (src: string, dest: string) => boolean;
|
||||
export type CopyFilterAsync = (src: string, dest: string) => Promise<boolean>;
|
||||
|
||||
export interface CopyOptions {
|
||||
/**
|
||||
* Dereference symlinks.
|
||||
* @default false
|
||||
*/
|
||||
dereference?: boolean | undefined;
|
||||
/**
|
||||
* Overwrite existing file or directory.
|
||||
* _Note that the copy operation will silently fail if you set this to `false` and the destination exists._
|
||||
* Use the `errorOnExist` option to change this behavior.
|
||||
* @default true
|
||||
*/
|
||||
overwrite?: boolean | undefined;
|
||||
/**
|
||||
* When `true`, will set last modification and access times to the ones of the original source files.
|
||||
* When `false`, timestamp behavior is OS-dependent.
|
||||
* @default false
|
||||
*/
|
||||
preserveTimestamps?: boolean | undefined;
|
||||
/**
|
||||
* When `overwrite` is `false` and the destination exists, throw an error.
|
||||
* @default false
|
||||
*/
|
||||
errorOnExist?: boolean | undefined;
|
||||
/**
|
||||
* Function to filter copied files/directories. Return `true` to copy the item, `false` to ignore it.
|
||||
* Can also return a `Promise` that resolves to `true` or `false` (or pass in an `async` function).
|
||||
*/
|
||||
filter?: CopyFilterSync | CopyFilterAsync | undefined;
|
||||
}
|
||||
|
||||
export interface CopyOptionsSync extends CopyOptions {
|
||||
/**
|
||||
* Function to filter copied files/directories. Return `true` to copy the item, `false` to ignore it.
|
||||
*/
|
||||
filter?: CopyFilterSync | undefined;
|
||||
}
|
||||
|
||||
export interface EnsureDirOptions {
|
||||
mode?: number | undefined;
|
||||
}
|
||||
|
||||
export interface MoveOptions {
|
||||
/**
|
||||
* Overwrite existing file or directory.
|
||||
* @default false
|
||||
*/
|
||||
overwrite?: boolean | undefined;
|
||||
/**
|
||||
* Dereference symlinks.
|
||||
* @default false
|
||||
*/
|
||||
dereference?: boolean | undefined;
|
||||
}
|
||||
|
||||
export { JFReadOptions as JsonReadOptions, JFWriteOptions as JsonWriteOptions } from "jsonfile";
|
||||
|
||||
export type JsonOutputOptions = fs.WriteFileOptions & StringifyOptions;
|
||||
84
vscodeEvalExtension/node_modules/@types/fs-extra/package.json
generated
vendored
Normal file
84
vscodeEvalExtension/node_modules/@types/fs-extra/package.json
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"name": "@types/fs-extra",
|
||||
"version": "11.0.4",
|
||||
"description": "TypeScript definitions for fs-extra",
|
||||
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra",
|
||||
"license": "MIT",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Alan Agius",
|
||||
"githubUsername": "alan-agius4",
|
||||
"url": "https://github.com/alan-agius4"
|
||||
},
|
||||
{
|
||||
"name": "midknight41",
|
||||
"githubUsername": "midknight41",
|
||||
"url": "https://github.com/midknight41"
|
||||
},
|
||||
{
|
||||
"name": "Brendan Forster",
|
||||
"githubUsername": "shiftkey",
|
||||
"url": "https://github.com/shiftkey"
|
||||
},
|
||||
{
|
||||
"name": "Mees van Dijk",
|
||||
"githubUsername": "mees-",
|
||||
"url": "https://github.com/mees-"
|
||||
},
|
||||
{
|
||||
"name": "Justin Rockwood",
|
||||
"githubUsername": "jrockwood",
|
||||
"url": "https://github.com/jrockwood"
|
||||
},
|
||||
{
|
||||
"name": "Sang Dang",
|
||||
"githubUsername": "sangdth",
|
||||
"url": "https://github.com/sangdth"
|
||||
},
|
||||
{
|
||||
"name": "Florian Keller",
|
||||
"githubUsername": "ffflorian",
|
||||
"url": "https://github.com/ffflorian"
|
||||
},
|
||||
{
|
||||
"name": "Piotr Błażejewicz",
|
||||
"githubUsername": "peterblazejewicz",
|
||||
"url": "https://github.com/peterblazejewicz"
|
||||
},
|
||||
{
|
||||
"name": "Tiger Oakes",
|
||||
"githubUsername": "NotWoods",
|
||||
"url": "https://github.com/NotWoods"
|
||||
},
|
||||
{
|
||||
"name": "BendingBender",
|
||||
"githubUsername": "BendingBender",
|
||||
"url": "https://github.com/BendingBender"
|
||||
}
|
||||
],
|
||||
"main": "",
|
||||
"types": "index.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./index.d.ts"
|
||||
},
|
||||
"./esm": {
|
||||
"types": {
|
||||
"import": "./esm.d.mts"
|
||||
}
|
||||
},
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
|
||||
"directory": "types/fs-extra"
|
||||
},
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"@types/jsonfile": "*",
|
||||
"@types/node": "*"
|
||||
},
|
||||
"typesPublisherContentHash": "2929b595f5fdba90096984c89127b1a93f583ee50680a2ad02fad15b1f571bb0",
|
||||
"typeScriptVersion": "4.5"
|
||||
}
|
||||
21
vscodeEvalExtension/node_modules/@types/jsonfile/LICENSE
generated
vendored
Normal file
21
vscodeEvalExtension/node_modules/@types/jsonfile/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
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
|
||||
15
vscodeEvalExtension/node_modules/@types/jsonfile/README.md
generated
vendored
Normal file
15
vscodeEvalExtension/node_modules/@types/jsonfile/README.md
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# Installation
|
||||
> `npm install --save @types/jsonfile`
|
||||
|
||||
# Summary
|
||||
This package contains type definitions for jsonfile (https://github.com/jprichardson/node-jsonfile#readme).
|
||||
|
||||
# Details
|
||||
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jsonfile.
|
||||
|
||||
### Additional Details
|
||||
* Last updated: Tue, 07 Nov 2023 03:09:37 GMT
|
||||
* Dependencies: [@types/node](https://npmjs.com/package/@types/node)
|
||||
|
||||
# Credits
|
||||
These definitions were written by [Daniel Bowring](https://github.com/dbowring), [BendingBender](https://github.com/BendingBender), and [Piotr Błażejewicz](https://github.com/peterblazejewicz).
|
||||
71
vscodeEvalExtension/node_modules/@types/jsonfile/index.d.ts
generated
vendored
Normal file
71
vscodeEvalExtension/node_modules/@types/jsonfile/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
/// <reference types="node"/>
|
||||
|
||||
import {
|
||||
PathLike,
|
||||
readFile as fsReadFile,
|
||||
readFileSync as fsReadFileSync,
|
||||
writeFile as fsWriteFile,
|
||||
writeFileSync as fsWriteFileSync,
|
||||
} from "fs";
|
||||
import { Url } from "url";
|
||||
|
||||
export type Path = PathLike | Url;
|
||||
|
||||
export interface FS {
|
||||
readFile: typeof fsReadFile;
|
||||
readFileSync: typeof fsReadFileSync;
|
||||
writeFile: typeof fsWriteFile;
|
||||
writeFileSync: typeof fsWriteFileSync;
|
||||
}
|
||||
|
||||
export type JFReadOptions =
|
||||
| {
|
||||
encoding?: string | null | undefined;
|
||||
flag?: string | undefined;
|
||||
throws?: boolean | undefined;
|
||||
fs?: FS | undefined;
|
||||
reviver?: ((key: any, value: any) => any) | undefined;
|
||||
}
|
||||
| string
|
||||
| null
|
||||
| undefined;
|
||||
|
||||
export type JFWriteOptions =
|
||||
| {
|
||||
encoding?: string | null | undefined;
|
||||
mode?: string | number | undefined;
|
||||
flag?: string | undefined;
|
||||
fs?: FS | undefined;
|
||||
EOL?: string | undefined;
|
||||
spaces?: string | number | undefined;
|
||||
replacer?: ((key: string, value: any) => any) | undefined;
|
||||
}
|
||||
| string
|
||||
| null;
|
||||
|
||||
export type ReadCallback = (err: NodeJS.ErrnoException | null, data: any) => void;
|
||||
export type WriteCallback = (err: NodeJS.ErrnoException | null) => void;
|
||||
|
||||
/**
|
||||
* @see {@link https://github.com/jprichardson/node-jsonfile#readfilefilename-options-callback}
|
||||
*/
|
||||
export function readFile(file: Path, options: JFReadOptions, callback: ReadCallback): void;
|
||||
export function readFile(file: Path, callback: ReadCallback): void;
|
||||
export function readFile(file: Path, options?: JFReadOptions): Promise<any>;
|
||||
|
||||
/**
|
||||
* @see {@link https://github.com/jprichardson/node-jsonfile#readfilesyncfilename-options}
|
||||
*/
|
||||
export function readFileSync(file: Path, options?: JFReadOptions): any;
|
||||
|
||||
/**
|
||||
* @see {@link https://github.com/jprichardson/node-jsonfile#writefilefilename-obj-options-callback}
|
||||
*/
|
||||
export function writeFile(file: Path, obj: any, options: JFWriteOptions, callback: WriteCallback): void;
|
||||
export function writeFile(file: Path, obj: any, callback: WriteCallback): void;
|
||||
export function writeFile(file: Path, obj: any, options?: JFWriteOptions): Promise<void>;
|
||||
|
||||
/**
|
||||
* @see {@link https://github.com/jprichardson/node-jsonfile#writefilesyncfilename-obj-options}
|
||||
*/
|
||||
export function writeFileSync(file: Path, obj: any, options?: JFWriteOptions): void;
|
||||
37
vscodeEvalExtension/node_modules/@types/jsonfile/package.json
generated
vendored
Normal file
37
vscodeEvalExtension/node_modules/@types/jsonfile/package.json
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"name": "@types/jsonfile",
|
||||
"version": "6.1.4",
|
||||
"description": "TypeScript definitions for jsonfile",
|
||||
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jsonfile",
|
||||
"license": "MIT",
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Daniel Bowring",
|
||||
"githubUsername": "dbowring",
|
||||
"url": "https://github.com/dbowring"
|
||||
},
|
||||
{
|
||||
"name": "BendingBender",
|
||||
"githubUsername": "BendingBender",
|
||||
"url": "https://github.com/BendingBender"
|
||||
},
|
||||
{
|
||||
"name": "Piotr Błażejewicz",
|
||||
"githubUsername": "peterblazejewicz",
|
||||
"url": "https://github.com/peterblazejewicz"
|
||||
}
|
||||
],
|
||||
"main": "",
|
||||
"types": "index.d.ts",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git",
|
||||
"directory": "types/jsonfile"
|
||||
},
|
||||
"scripts": {},
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
},
|
||||
"typesPublisherContentHash": "c4c437c24ccd22e0fd74368adceefc3c6ed726b74d1cc5188deeb5b0119b9523",
|
||||
"typeScriptVersion": "4.5"
|
||||
}
|
||||
9
vscodeEvalExtension/node_modules/@types/jsonfile/utils.d.ts
generated
vendored
Normal file
9
vscodeEvalExtension/node_modules/@types/jsonfile/utils.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
export function stringify(obj: any, options?: StringifyOptions): string;
|
||||
export function stripBom(content: string): string;
|
||||
|
||||
export interface StringifyOptions {
|
||||
EOL?: string | undefined;
|
||||
finalEOL?: boolean | undefined;
|
||||
replacer?: ((key: string, value: any) => any) | undefined;
|
||||
spaces?: string | number | undefined;
|
||||
}
|
||||
15
vscodeEvalExtension/node_modules/fs-extra/LICENSE
generated
vendored
Normal file
15
vscodeEvalExtension/node_modules/fs-extra/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011-2017 JP Richardson
|
||||
|
||||
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.
|
||||
292
vscodeEvalExtension/node_modules/fs-extra/README.md
generated
vendored
Normal file
292
vscodeEvalExtension/node_modules/fs-extra/README.md
generated
vendored
Normal file
@@ -0,0 +1,292 @@
|
||||
Node.js: fs-extra
|
||||
=================
|
||||
|
||||
`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.
|
||||
|
||||
[](https://www.npmjs.org/package/fs-extra)
|
||||
[](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)
|
||||
[](https://github.com/jprichardson/node-fs-extra/actions/workflows/ci.yml?query=branch%3Amaster)
|
||||
[](https://www.npmjs.org/package/fs-extra)
|
||||
[](https://standardjs.com)
|
||||
|
||||
Why?
|
||||
----
|
||||
|
||||
I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.
|
||||
|
||||
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
npm install fs-extra
|
||||
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
### CommonJS
|
||||
|
||||
`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.
|
||||
|
||||
You don't ever need to include the original `fs` module again:
|
||||
|
||||
```js
|
||||
const fs = require('fs') // this is no longer necessary
|
||||
```
|
||||
|
||||
you can now do this:
|
||||
|
||||
```js
|
||||
const fs = require('fs-extra')
|
||||
```
|
||||
|
||||
or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want
|
||||
to name your `fs` variable `fse` like so:
|
||||
|
||||
```js
|
||||
const fse = require('fs-extra')
|
||||
```
|
||||
|
||||
you can also keep both, but it's redundant:
|
||||
|
||||
```js
|
||||
const fs = require('fs')
|
||||
const fse = require('fs-extra')
|
||||
```
|
||||
|
||||
### ESM
|
||||
|
||||
There is also an `fs-extra/esm` import, that supports both default and named exports. However, note that `fs` methods are not included in `fs-extra/esm`; you still need to import `fs` and/or `fs/promises` seperately:
|
||||
|
||||
```js
|
||||
import { readFileSync } from 'fs'
|
||||
import { readFile } from 'fs/promises'
|
||||
import { outputFile, outputFileSync } from 'fs-extra/esm'
|
||||
```
|
||||
|
||||
Default exports are supported:
|
||||
|
||||
```js
|
||||
import fs from 'fs'
|
||||
import fse from 'fs-extra/esm'
|
||||
// fse.readFileSync is not a function; must use fs.readFileSync
|
||||
```
|
||||
|
||||
but you probably want to just use regular `fs-extra` instead of `fs-extra/esm` for default exports:
|
||||
|
||||
```js
|
||||
import fs from 'fs-extra'
|
||||
// both fs and fs-extra methods are defined
|
||||
```
|
||||
|
||||
Sync vs Async vs Async/Await
|
||||
-------------
|
||||
Most methods are async by default. All async methods will return a promise if the callback isn't passed.
|
||||
|
||||
Sync methods on the other hand will throw if an error occurs.
|
||||
|
||||
Also Async/Await will throw an error if one occurs.
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
const fs = require('fs-extra')
|
||||
|
||||
// Async with promises:
|
||||
fs.copy('/tmp/myfile', '/tmp/mynewfile')
|
||||
.then(() => console.log('success!'))
|
||||
.catch(err => console.error(err))
|
||||
|
||||
// Async with callbacks:
|
||||
fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
|
||||
if (err) return console.error(err)
|
||||
console.log('success!')
|
||||
})
|
||||
|
||||
// Sync:
|
||||
try {
|
||||
fs.copySync('/tmp/myfile', '/tmp/mynewfile')
|
||||
console.log('success!')
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
|
||||
// Async/Await:
|
||||
async function copyFiles () {
|
||||
try {
|
||||
await fs.copy('/tmp/myfile', '/tmp/mynewfile')
|
||||
console.log('success!')
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
}
|
||||
|
||||
copyFiles()
|
||||
```
|
||||
|
||||
|
||||
Methods
|
||||
-------
|
||||
|
||||
### Async
|
||||
|
||||
- [copy](docs/copy.md)
|
||||
- [emptyDir](docs/emptyDir.md)
|
||||
- [ensureFile](docs/ensureFile.md)
|
||||
- [ensureDir](docs/ensureDir.md)
|
||||
- [ensureLink](docs/ensureLink.md)
|
||||
- [ensureSymlink](docs/ensureSymlink.md)
|
||||
- [mkdirp](docs/ensureDir.md)
|
||||
- [mkdirs](docs/ensureDir.md)
|
||||
- [move](docs/move.md)
|
||||
- [outputFile](docs/outputFile.md)
|
||||
- [outputJson](docs/outputJson.md)
|
||||
- [pathExists](docs/pathExists.md)
|
||||
- [readJson](docs/readJson.md)
|
||||
- [remove](docs/remove.md)
|
||||
- [writeJson](docs/writeJson.md)
|
||||
|
||||
### Sync
|
||||
|
||||
- [copySync](docs/copy-sync.md)
|
||||
- [emptyDirSync](docs/emptyDir-sync.md)
|
||||
- [ensureFileSync](docs/ensureFile-sync.md)
|
||||
- [ensureDirSync](docs/ensureDir-sync.md)
|
||||
- [ensureLinkSync](docs/ensureLink-sync.md)
|
||||
- [ensureSymlinkSync](docs/ensureSymlink-sync.md)
|
||||
- [mkdirpSync](docs/ensureDir-sync.md)
|
||||
- [mkdirsSync](docs/ensureDir-sync.md)
|
||||
- [moveSync](docs/move-sync.md)
|
||||
- [outputFileSync](docs/outputFile-sync.md)
|
||||
- [outputJsonSync](docs/outputJson-sync.md)
|
||||
- [pathExistsSync](docs/pathExists-sync.md)
|
||||
- [readJsonSync](docs/readJson-sync.md)
|
||||
- [removeSync](docs/remove-sync.md)
|
||||
- [writeJsonSync](docs/writeJson-sync.md)
|
||||
|
||||
|
||||
**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()`, `fs.write()`, & `fs.writev()`](docs/fs-read-write-writev.md)
|
||||
|
||||
### What happened to `walk()` and `walkSync()`?
|
||||
|
||||
They were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).
|
||||
|
||||
|
||||
Third Party
|
||||
-----------
|
||||
|
||||
### CLI
|
||||
|
||||
[fse-cli](https://www.npmjs.com/package/@atao60/fse-cli) allows you to run `fs-extra` from a console or from [npm](https://www.npmjs.com) scripts.
|
||||
|
||||
### TypeScript
|
||||
|
||||
If you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
|
||||
|
||||
|
||||
### File / Directory Watching
|
||||
|
||||
If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).
|
||||
|
||||
### Obtain Filesystem (Devices, Partitions) Information
|
||||
|
||||
[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.
|
||||
|
||||
### Misc.
|
||||
|
||||
- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).
|
||||
- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.
|
||||
|
||||
|
||||
|
||||
Hacking on fs-extra
|
||||
-------------------
|
||||
|
||||
Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project
|
||||
uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,
|
||||
you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.
|
||||
|
||||
[](https://github.com/feross/standard)
|
||||
|
||||
What's needed?
|
||||
- First, take a look at existing issues. Those are probably going to be where the priority lies.
|
||||
- More tests for edge cases. Specifically on different platforms. There can never be enough tests.
|
||||
- Improve test coverage.
|
||||
|
||||
Note: If you make any big changes, **you should definitely file an issue for discussion first.**
|
||||
|
||||
### Running the Test Suite
|
||||
|
||||
fs-extra contains hundreds of tests.
|
||||
|
||||
- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
|
||||
- `npm run unit`: runs the unit tests
|
||||
- `npm run unit-esm`: runs tests for `fs-extra/esm` exports
|
||||
- `npm test`: runs the linter and all tests
|
||||
|
||||
When running unit tests, set the environment variable `CROSS_DEVICE_PATH` to the absolute path of an empty directory on another device (like a thumb drive) to enable cross-device move tests.
|
||||
|
||||
|
||||
### Windows
|
||||
|
||||
If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's
|
||||
because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's
|
||||
account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7
|
||||
However, I didn't have much luck doing this.
|
||||
|
||||
Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.
|
||||
I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:
|
||||
|
||||
net use z: "\\vmware-host\Shared Folders"
|
||||
|
||||
I can then navigate to my `fs-extra` directory and run the tests.
|
||||
|
||||
|
||||
Naming
|
||||
------
|
||||
|
||||
I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:
|
||||
|
||||
* https://github.com/jprichardson/node-fs-extra/issues/2
|
||||
* https://github.com/flatiron/utile/issues/11
|
||||
* https://github.com/ryanmcgrath/wrench-js/issues/29
|
||||
* https://github.com/substack/node-mkdirp/issues/17
|
||||
|
||||
First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.
|
||||
|
||||
For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.
|
||||
|
||||
We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?
|
||||
|
||||
My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.
|
||||
|
||||
So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.
|
||||
|
||||
|
||||
Credit
|
||||
------
|
||||
|
||||
`fs-extra` wouldn't be possible without using the modules from the following authors:
|
||||
|
||||
- [Isaac Shlueter](https://github.com/isaacs)
|
||||
- [Charlie McConnel](https://github.com/avianflu)
|
||||
- [James Halliday](https://github.com/substack)
|
||||
- [Andrew Kelley](https://github.com/andrewrk)
|
||||
|
||||
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Licensed under MIT
|
||||
|
||||
Copyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)
|
||||
|
||||
[1]: http://nodejs.org/docs/latest/api/fs.html
|
||||
|
||||
|
||||
[jsonfile]: https://github.com/jprichardson/node-jsonfile
|
||||
71
vscodeEvalExtension/node_modules/fs-extra/package.json
generated
vendored
Normal file
71
vscodeEvalExtension/node_modules/fs-extra/package.json
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"name": "fs-extra",
|
||||
"version": "11.2.0",
|
||||
"description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
},
|
||||
"homepage": "https://github.com/jprichardson/node-fs-extra",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jprichardson/node-fs-extra"
|
||||
},
|
||||
"keywords": [
|
||||
"fs",
|
||||
"file",
|
||||
"file system",
|
||||
"copy",
|
||||
"directory",
|
||||
"extra",
|
||||
"mkdirp",
|
||||
"mkdir",
|
||||
"mkdirs",
|
||||
"recursive",
|
||||
"json",
|
||||
"read",
|
||||
"write",
|
||||
"extra",
|
||||
"delete",
|
||||
"remove",
|
||||
"touch",
|
||||
"create",
|
||||
"text",
|
||||
"output",
|
||||
"move",
|
||||
"promise"
|
||||
],
|
||||
"author": "JP Richardson <jprichardson@gmail.com>",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"klaw": "^2.1.1",
|
||||
"klaw-sync": "^3.0.2",
|
||||
"minimist": "^1.1.1",
|
||||
"mocha": "^10.1.0",
|
||||
"nyc": "^15.0.0",
|
||||
"proxyquire": "^2.0.1",
|
||||
"read-dir-files": "^0.1.1",
|
||||
"standard": "^17.0.0"
|
||||
},
|
||||
"main": "./lib/index.js",
|
||||
"exports": {
|
||||
".": "./lib/index.js",
|
||||
"./esm": "./lib/esm.mjs"
|
||||
},
|
||||
"files": [
|
||||
"lib/",
|
||||
"!lib/**/__tests__/"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "standard",
|
||||
"test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
|
||||
"test": "npm run lint && npm run unit && npm run unit-esm",
|
||||
"unit": "nyc node test.js",
|
||||
"unit-esm": "node test.mjs"
|
||||
},
|
||||
"sideEffects": false
|
||||
}
|
||||
15
vscodeEvalExtension/node_modules/graceful-fs/LICENSE
generated
vendored
Normal file
15
vscodeEvalExtension/node_modules/graceful-fs/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
The ISC License
|
||||
|
||||
Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
143
vscodeEvalExtension/node_modules/graceful-fs/README.md
generated
vendored
Normal file
143
vscodeEvalExtension/node_modules/graceful-fs/README.md
generated
vendored
Normal file
@@ -0,0 +1,143 @@
|
||||
# graceful-fs
|
||||
|
||||
graceful-fs functions as a drop-in replacement for the fs module,
|
||||
making various improvements.
|
||||
|
||||
The improvements are meant to normalize behavior across different
|
||||
platforms and environments, and to make filesystem access more
|
||||
resilient to errors.
|
||||
|
||||
## Improvements over [fs module](https://nodejs.org/api/fs.html)
|
||||
|
||||
* Queues up `open` and `readdir` calls, and retries them once
|
||||
something closes if there is an EMFILE error from too many file
|
||||
descriptors.
|
||||
* fixes `lchmod` for Node versions prior to 0.6.2.
|
||||
* implements `fs.lutimes` if possible. Otherwise it becomes a noop.
|
||||
* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or
|
||||
`lchown` if the user isn't root.
|
||||
* makes `lchmod` and `lchown` become noops, if not available.
|
||||
* retries reading a file if `read` results in EAGAIN error.
|
||||
|
||||
On Windows, it retries renaming a file for up to one second if `EACCESS`
|
||||
or `EPERM` error occurs, likely because antivirus software has locked
|
||||
the directory.
|
||||
|
||||
## USAGE
|
||||
|
||||
```javascript
|
||||
// use just like fs
|
||||
var fs = require('graceful-fs')
|
||||
|
||||
// now go and do stuff with it...
|
||||
fs.readFile('some-file-or-whatever', (err, data) => {
|
||||
// Do stuff here.
|
||||
})
|
||||
```
|
||||
|
||||
## Sync methods
|
||||
|
||||
This module cannot intercept or handle `EMFILE` or `ENFILE` errors from sync
|
||||
methods. If you use sync methods which open file descriptors then you are
|
||||
responsible for dealing with any errors.
|
||||
|
||||
This is a known limitation, not a bug.
|
||||
|
||||
## Global Patching
|
||||
|
||||
If you want to patch the global fs module (or any other fs-like
|
||||
module) you can do this:
|
||||
|
||||
```javascript
|
||||
// Make sure to read the caveat below.
|
||||
var realFs = require('fs')
|
||||
var gracefulFs = require('graceful-fs')
|
||||
gracefulFs.gracefulify(realFs)
|
||||
```
|
||||
|
||||
This should only ever be done at the top-level application layer, in
|
||||
order to delay on EMFILE errors from any fs-using dependencies. You
|
||||
should **not** do this in a library, because it can cause unexpected
|
||||
delays in other parts of the program.
|
||||
|
||||
## Changes
|
||||
|
||||
This module is fairly stable at this point, and used by a lot of
|
||||
things. That being said, because it implements a subtle behavior
|
||||
change in a core part of the node API, even modest changes can be
|
||||
extremely breaking, and the versioning is thus biased towards
|
||||
bumping the major when in doubt.
|
||||
|
||||
The main change between major versions has been switching between
|
||||
providing a fully-patched `fs` module vs monkey-patching the node core
|
||||
builtin, and the approach by which a non-monkey-patched `fs` was
|
||||
created.
|
||||
|
||||
The goal is to trade `EMFILE` errors for slower fs operations. So, if
|
||||
you try to open a zillion files, rather than crashing, `open`
|
||||
operations will be queued up and wait for something else to `close`.
|
||||
|
||||
There are advantages to each approach. Monkey-patching the fs means
|
||||
that no `EMFILE` errors can possibly occur anywhere in your
|
||||
application, because everything is using the same core `fs` module,
|
||||
which is patched. However, it can also obviously cause undesirable
|
||||
side-effects, especially if the module is loaded multiple times.
|
||||
|
||||
Implementing a separate-but-identical patched `fs` module is more
|
||||
surgical (and doesn't run the risk of patching multiple times), but
|
||||
also imposes the challenge of keeping in sync with the core module.
|
||||
|
||||
The current approach loads the `fs` module, and then creates a
|
||||
lookalike object that has all the same methods, except a few that are
|
||||
patched. It is safe to use in all versions of Node from 0.8 through
|
||||
7.0.
|
||||
|
||||
### v4
|
||||
|
||||
* Do not monkey-patch the fs module. This module may now be used as a
|
||||
drop-in dep, and users can opt into monkey-patching the fs builtin
|
||||
if their app requires it.
|
||||
|
||||
### v3
|
||||
|
||||
* Monkey-patch fs, because the eval approach no longer works on recent
|
||||
node.
|
||||
* fixed possible type-error throw if rename fails on windows
|
||||
* verify that we *never* get EMFILE errors
|
||||
* Ignore ENOSYS from chmod/chown
|
||||
* clarify that graceful-fs must be used as a drop-in
|
||||
|
||||
### v2.1.0
|
||||
|
||||
* Use eval rather than monkey-patching fs.
|
||||
* readdir: Always sort the results
|
||||
* win32: requeue a file if error has an OK status
|
||||
|
||||
### v2.0
|
||||
|
||||
* A return to monkey patching
|
||||
* wrap process.cwd
|
||||
|
||||
### v1.1
|
||||
|
||||
* wrap readFile
|
||||
* Wrap fs.writeFile.
|
||||
* readdir protection
|
||||
* Don't clobber the fs builtin
|
||||
* Handle fs.read EAGAIN errors by trying again
|
||||
* Expose the curOpen counter
|
||||
* No-op lchown/lchmod if not implemented
|
||||
* fs.rename patch only for win32
|
||||
* Patch fs.rename to handle AV software on Windows
|
||||
* Close #4 Chown should not fail on einval or eperm if non-root
|
||||
* Fix isaacs/fstream#1 Only wrap fs one time
|
||||
* Fix #3 Start at 1024 max files, then back off on EMFILE
|
||||
* lutimes that doens't blow up on Linux
|
||||
* A full on-rewrite using a queue instead of just swallowing the EMFILE error
|
||||
* Wrap Read/Write streams as well
|
||||
|
||||
### 1.0
|
||||
|
||||
* Update engines for node 0.6
|
||||
* Be lstat-graceful on Windows
|
||||
* first
|
||||
23
vscodeEvalExtension/node_modules/graceful-fs/clone.js
generated
vendored
Normal file
23
vscodeEvalExtension/node_modules/graceful-fs/clone.js
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
'use strict'
|
||||
|
||||
module.exports = clone
|
||||
|
||||
var getPrototypeOf = Object.getPrototypeOf || function (obj) {
|
||||
return obj.__proto__
|
||||
}
|
||||
|
||||
function clone (obj) {
|
||||
if (obj === null || typeof obj !== 'object')
|
||||
return obj
|
||||
|
||||
if (obj instanceof Object)
|
||||
var copy = { __proto__: getPrototypeOf(obj) }
|
||||
else
|
||||
var copy = Object.create(null)
|
||||
|
||||
Object.getOwnPropertyNames(obj).forEach(function (key) {
|
||||
Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))
|
||||
})
|
||||
|
||||
return copy
|
||||
}
|
||||
448
vscodeEvalExtension/node_modules/graceful-fs/graceful-fs.js
generated
vendored
Normal file
448
vscodeEvalExtension/node_modules/graceful-fs/graceful-fs.js
generated
vendored
Normal file
@@ -0,0 +1,448 @@
|
||||
var fs = require('fs')
|
||||
var polyfills = require('./polyfills.js')
|
||||
var legacy = require('./legacy-streams.js')
|
||||
var clone = require('./clone.js')
|
||||
|
||||
var util = require('util')
|
||||
|
||||
/* istanbul ignore next - node 0.x polyfill */
|
||||
var gracefulQueue
|
||||
var previousSymbol
|
||||
|
||||
/* istanbul ignore else - node 0.x polyfill */
|
||||
if (typeof Symbol === 'function' && typeof Symbol.for === 'function') {
|
||||
gracefulQueue = Symbol.for('graceful-fs.queue')
|
||||
// This is used in testing by future versions
|
||||
previousSymbol = Symbol.for('graceful-fs.previous')
|
||||
} else {
|
||||
gracefulQueue = '___graceful-fs.queue'
|
||||
previousSymbol = '___graceful-fs.previous'
|
||||
}
|
||||
|
||||
function noop () {}
|
||||
|
||||
function publishQueue(context, queue) {
|
||||
Object.defineProperty(context, gracefulQueue, {
|
||||
get: function() {
|
||||
return queue
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var debug = noop
|
||||
if (util.debuglog)
|
||||
debug = util.debuglog('gfs4')
|
||||
else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
|
||||
debug = function() {
|
||||
var m = util.format.apply(util, arguments)
|
||||
m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ')
|
||||
console.error(m)
|
||||
}
|
||||
|
||||
// Once time initialization
|
||||
if (!fs[gracefulQueue]) {
|
||||
// This queue can be shared by multiple loaded instances
|
||||
var queue = global[gracefulQueue] || []
|
||||
publishQueue(fs, queue)
|
||||
|
||||
// Patch fs.close/closeSync to shared queue version, because we need
|
||||
// to retry() whenever a close happens *anywhere* in the program.
|
||||
// This is essential when multiple graceful-fs instances are
|
||||
// in play at the same time.
|
||||
fs.close = (function (fs$close) {
|
||||
function close (fd, cb) {
|
||||
return fs$close.call(fs, fd, function (err) {
|
||||
// This function uses the graceful-fs shared queue
|
||||
if (!err) {
|
||||
resetQueue()
|
||||
}
|
||||
|
||||
if (typeof cb === 'function')
|
||||
cb.apply(this, arguments)
|
||||
})
|
||||
}
|
||||
|
||||
Object.defineProperty(close, previousSymbol, {
|
||||
value: fs$close
|
||||
})
|
||||
return close
|
||||
})(fs.close)
|
||||
|
||||
fs.closeSync = (function (fs$closeSync) {
|
||||
function closeSync (fd) {
|
||||
// This function uses the graceful-fs shared queue
|
||||
fs$closeSync.apply(fs, arguments)
|
||||
resetQueue()
|
||||
}
|
||||
|
||||
Object.defineProperty(closeSync, previousSymbol, {
|
||||
value: fs$closeSync
|
||||
})
|
||||
return closeSync
|
||||
})(fs.closeSync)
|
||||
|
||||
if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
|
||||
process.on('exit', function() {
|
||||
debug(fs[gracefulQueue])
|
||||
require('assert').equal(fs[gracefulQueue].length, 0)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (!global[gracefulQueue]) {
|
||||
publishQueue(global, fs[gracefulQueue]);
|
||||
}
|
||||
|
||||
module.exports = patch(clone(fs))
|
||||
if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) {
|
||||
module.exports = patch(fs)
|
||||
fs.__patched = true;
|
||||
}
|
||||
|
||||
function patch (fs) {
|
||||
// Everything that references the open() function needs to be in here
|
||||
polyfills(fs)
|
||||
fs.gracefulify = patch
|
||||
|
||||
fs.createReadStream = createReadStream
|
||||
fs.createWriteStream = createWriteStream
|
||||
var fs$readFile = fs.readFile
|
||||
fs.readFile = readFile
|
||||
function readFile (path, options, cb) {
|
||||
if (typeof options === 'function')
|
||||
cb = options, options = null
|
||||
|
||||
return go$readFile(path, options, cb)
|
||||
|
||||
function go$readFile (path, options, cb, startTime) {
|
||||
return fs$readFile(path, options, function (err) {
|
||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||
enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])
|
||||
else {
|
||||
if (typeof cb === 'function')
|
||||
cb.apply(this, arguments)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
var fs$writeFile = fs.writeFile
|
||||
fs.writeFile = writeFile
|
||||
function writeFile (path, data, options, cb) {
|
||||
if (typeof options === 'function')
|
||||
cb = options, options = null
|
||||
|
||||
return go$writeFile(path, data, options, cb)
|
||||
|
||||
function go$writeFile (path, data, options, cb, startTime) {
|
||||
return fs$writeFile(path, data, options, function (err) {
|
||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||
enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
|
||||
else {
|
||||
if (typeof cb === 'function')
|
||||
cb.apply(this, arguments)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
var fs$appendFile = fs.appendFile
|
||||
if (fs$appendFile)
|
||||
fs.appendFile = appendFile
|
||||
function appendFile (path, data, options, cb) {
|
||||
if (typeof options === 'function')
|
||||
cb = options, options = null
|
||||
|
||||
return go$appendFile(path, data, options, cb)
|
||||
|
||||
function go$appendFile (path, data, options, cb, startTime) {
|
||||
return fs$appendFile(path, data, options, function (err) {
|
||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||
enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
|
||||
else {
|
||||
if (typeof cb === 'function')
|
||||
cb.apply(this, arguments)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
var fs$copyFile = fs.copyFile
|
||||
if (fs$copyFile)
|
||||
fs.copyFile = copyFile
|
||||
function copyFile (src, dest, flags, cb) {
|
||||
if (typeof flags === 'function') {
|
||||
cb = flags
|
||||
flags = 0
|
||||
}
|
||||
return go$copyFile(src, dest, flags, cb)
|
||||
|
||||
function go$copyFile (src, dest, flags, cb, startTime) {
|
||||
return fs$copyFile(src, dest, flags, function (err) {
|
||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||
enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])
|
||||
else {
|
||||
if (typeof cb === 'function')
|
||||
cb.apply(this, arguments)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
var fs$readdir = fs.readdir
|
||||
fs.readdir = readdir
|
||||
var noReaddirOptionVersions = /^v[0-5]\./
|
||||
function readdir (path, options, cb) {
|
||||
if (typeof options === 'function')
|
||||
cb = options, options = null
|
||||
|
||||
var go$readdir = noReaddirOptionVersions.test(process.version)
|
||||
? function go$readdir (path, options, cb, startTime) {
|
||||
return fs$readdir(path, fs$readdirCallback(
|
||||
path, options, cb, startTime
|
||||
))
|
||||
}
|
||||
: function go$readdir (path, options, cb, startTime) {
|
||||
return fs$readdir(path, options, fs$readdirCallback(
|
||||
path, options, cb, startTime
|
||||
))
|
||||
}
|
||||
|
||||
return go$readdir(path, options, cb)
|
||||
|
||||
function fs$readdirCallback (path, options, cb, startTime) {
|
||||
return function (err, files) {
|
||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||
enqueue([
|
||||
go$readdir,
|
||||
[path, options, cb],
|
||||
err,
|
||||
startTime || Date.now(),
|
||||
Date.now()
|
||||
])
|
||||
else {
|
||||
if (files && files.sort)
|
||||
files.sort()
|
||||
|
||||
if (typeof cb === 'function')
|
||||
cb.call(this, err, files)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (process.version.substr(0, 4) === 'v0.8') {
|
||||
var legStreams = legacy(fs)
|
||||
ReadStream = legStreams.ReadStream
|
||||
WriteStream = legStreams.WriteStream
|
||||
}
|
||||
|
||||
var fs$ReadStream = fs.ReadStream
|
||||
if (fs$ReadStream) {
|
||||
ReadStream.prototype = Object.create(fs$ReadStream.prototype)
|
||||
ReadStream.prototype.open = ReadStream$open
|
||||
}
|
||||
|
||||
var fs$WriteStream = fs.WriteStream
|
||||
if (fs$WriteStream) {
|
||||
WriteStream.prototype = Object.create(fs$WriteStream.prototype)
|
||||
WriteStream.prototype.open = WriteStream$open
|
||||
}
|
||||
|
||||
Object.defineProperty(fs, 'ReadStream', {
|
||||
get: function () {
|
||||
return ReadStream
|
||||
},
|
||||
set: function (val) {
|
||||
ReadStream = val
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
})
|
||||
Object.defineProperty(fs, 'WriteStream', {
|
||||
get: function () {
|
||||
return WriteStream
|
||||
},
|
||||
set: function (val) {
|
||||
WriteStream = val
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
})
|
||||
|
||||
// legacy names
|
||||
var FileReadStream = ReadStream
|
||||
Object.defineProperty(fs, 'FileReadStream', {
|
||||
get: function () {
|
||||
return FileReadStream
|
||||
},
|
||||
set: function (val) {
|
||||
FileReadStream = val
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
})
|
||||
var FileWriteStream = WriteStream
|
||||
Object.defineProperty(fs, 'FileWriteStream', {
|
||||
get: function () {
|
||||
return FileWriteStream
|
||||
},
|
||||
set: function (val) {
|
||||
FileWriteStream = val
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
})
|
||||
|
||||
function ReadStream (path, options) {
|
||||
if (this instanceof ReadStream)
|
||||
return fs$ReadStream.apply(this, arguments), this
|
||||
else
|
||||
return ReadStream.apply(Object.create(ReadStream.prototype), arguments)
|
||||
}
|
||||
|
||||
function ReadStream$open () {
|
||||
var that = this
|
||||
open(that.path, that.flags, that.mode, function (err, fd) {
|
||||
if (err) {
|
||||
if (that.autoClose)
|
||||
that.destroy()
|
||||
|
||||
that.emit('error', err)
|
||||
} else {
|
||||
that.fd = fd
|
||||
that.emit('open', fd)
|
||||
that.read()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function WriteStream (path, options) {
|
||||
if (this instanceof WriteStream)
|
||||
return fs$WriteStream.apply(this, arguments), this
|
||||
else
|
||||
return WriteStream.apply(Object.create(WriteStream.prototype), arguments)
|
||||
}
|
||||
|
||||
function WriteStream$open () {
|
||||
var that = this
|
||||
open(that.path, that.flags, that.mode, function (err, fd) {
|
||||
if (err) {
|
||||
that.destroy()
|
||||
that.emit('error', err)
|
||||
} else {
|
||||
that.fd = fd
|
||||
that.emit('open', fd)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function createReadStream (path, options) {
|
||||
return new fs.ReadStream(path, options)
|
||||
}
|
||||
|
||||
function createWriteStream (path, options) {
|
||||
return new fs.WriteStream(path, options)
|
||||
}
|
||||
|
||||
var fs$open = fs.open
|
||||
fs.open = open
|
||||
function open (path, flags, mode, cb) {
|
||||
if (typeof mode === 'function')
|
||||
cb = mode, mode = null
|
||||
|
||||
return go$open(path, flags, mode, cb)
|
||||
|
||||
function go$open (path, flags, mode, cb, startTime) {
|
||||
return fs$open(path, flags, mode, function (err, fd) {
|
||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||
enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])
|
||||
else {
|
||||
if (typeof cb === 'function')
|
||||
cb.apply(this, arguments)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return fs
|
||||
}
|
||||
|
||||
function enqueue (elem) {
|
||||
debug('ENQUEUE', elem[0].name, elem[1])
|
||||
fs[gracefulQueue].push(elem)
|
||||
retry()
|
||||
}
|
||||
|
||||
// keep track of the timeout between retry() calls
|
||||
var retryTimer
|
||||
|
||||
// reset the startTime and lastTime to now
|
||||
// this resets the start of the 60 second overall timeout as well as the
|
||||
// delay between attempts so that we'll retry these jobs sooner
|
||||
function resetQueue () {
|
||||
var now = Date.now()
|
||||
for (var i = 0; i < fs[gracefulQueue].length; ++i) {
|
||||
// entries that are only a length of 2 are from an older version, don't
|
||||
// bother modifying those since they'll be retried anyway.
|
||||
if (fs[gracefulQueue][i].length > 2) {
|
||||
fs[gracefulQueue][i][3] = now // startTime
|
||||
fs[gracefulQueue][i][4] = now // lastTime
|
||||
}
|
||||
}
|
||||
// call retry to make sure we're actively processing the queue
|
||||
retry()
|
||||
}
|
||||
|
||||
function retry () {
|
||||
// clear the timer and remove it to help prevent unintended concurrency
|
||||
clearTimeout(retryTimer)
|
||||
retryTimer = undefined
|
||||
|
||||
if (fs[gracefulQueue].length === 0)
|
||||
return
|
||||
|
||||
var elem = fs[gracefulQueue].shift()
|
||||
var fn = elem[0]
|
||||
var args = elem[1]
|
||||
// these items may be unset if they were added by an older graceful-fs
|
||||
var err = elem[2]
|
||||
var startTime = elem[3]
|
||||
var lastTime = elem[4]
|
||||
|
||||
// if we don't have a startTime we have no way of knowing if we've waited
|
||||
// long enough, so go ahead and retry this item now
|
||||
if (startTime === undefined) {
|
||||
debug('RETRY', fn.name, args)
|
||||
fn.apply(null, args)
|
||||
} else if (Date.now() - startTime >= 60000) {
|
||||
// it's been more than 60 seconds total, bail now
|
||||
debug('TIMEOUT', fn.name, args)
|
||||
var cb = args.pop()
|
||||
if (typeof cb === 'function')
|
||||
cb.call(null, err)
|
||||
} else {
|
||||
// the amount of time between the last attempt and right now
|
||||
var sinceAttempt = Date.now() - lastTime
|
||||
// the amount of time between when we first tried, and when we last tried
|
||||
// rounded up to at least 1
|
||||
var sinceStart = Math.max(lastTime - startTime, 1)
|
||||
// backoff. wait longer than the total time we've been retrying, but only
|
||||
// up to a maximum of 100ms
|
||||
var desiredDelay = Math.min(sinceStart * 1.2, 100)
|
||||
// it's been long enough since the last retry, do it again
|
||||
if (sinceAttempt >= desiredDelay) {
|
||||
debug('RETRY', fn.name, args)
|
||||
fn.apply(null, args.concat([startTime]))
|
||||
} else {
|
||||
// if we can't do this job yet, push it to the end of the queue
|
||||
// and let the next iteration check again
|
||||
fs[gracefulQueue].push(elem)
|
||||
}
|
||||
}
|
||||
|
||||
// schedule our next run if one isn't already scheduled
|
||||
if (retryTimer === undefined) {
|
||||
retryTimer = setTimeout(retry, 0)
|
||||
}
|
||||
}
|
||||
118
vscodeEvalExtension/node_modules/graceful-fs/legacy-streams.js
generated
vendored
Normal file
118
vscodeEvalExtension/node_modules/graceful-fs/legacy-streams.js
generated
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
var Stream = require('stream').Stream
|
||||
|
||||
module.exports = legacy
|
||||
|
||||
function legacy (fs) {
|
||||
return {
|
||||
ReadStream: ReadStream,
|
||||
WriteStream: WriteStream
|
||||
}
|
||||
|
||||
function ReadStream (path, options) {
|
||||
if (!(this instanceof ReadStream)) return new ReadStream(path, options);
|
||||
|
||||
Stream.call(this);
|
||||
|
||||
var self = this;
|
||||
|
||||
this.path = path;
|
||||
this.fd = null;
|
||||
this.readable = true;
|
||||
this.paused = false;
|
||||
|
||||
this.flags = 'r';
|
||||
this.mode = 438; /*=0666*/
|
||||
this.bufferSize = 64 * 1024;
|
||||
|
||||
options = options || {};
|
||||
|
||||
// Mixin options into this
|
||||
var keys = Object.keys(options);
|
||||
for (var index = 0, length = keys.length; index < length; index++) {
|
||||
var key = keys[index];
|
||||
this[key] = options[key];
|
||||
}
|
||||
|
||||
if (this.encoding) this.setEncoding(this.encoding);
|
||||
|
||||
if (this.start !== undefined) {
|
||||
if ('number' !== typeof this.start) {
|
||||
throw TypeError('start must be a Number');
|
||||
}
|
||||
if (this.end === undefined) {
|
||||
this.end = Infinity;
|
||||
} else if ('number' !== typeof this.end) {
|
||||
throw TypeError('end must be a Number');
|
||||
}
|
||||
|
||||
if (this.start > this.end) {
|
||||
throw new Error('start must be <= end');
|
||||
}
|
||||
|
||||
this.pos = this.start;
|
||||
}
|
||||
|
||||
if (this.fd !== null) {
|
||||
process.nextTick(function() {
|
||||
self._read();
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
fs.open(this.path, this.flags, this.mode, function (err, fd) {
|
||||
if (err) {
|
||||
self.emit('error', err);
|
||||
self.readable = false;
|
||||
return;
|
||||
}
|
||||
|
||||
self.fd = fd;
|
||||
self.emit('open', fd);
|
||||
self._read();
|
||||
})
|
||||
}
|
||||
|
||||
function WriteStream (path, options) {
|
||||
if (!(this instanceof WriteStream)) return new WriteStream(path, options);
|
||||
|
||||
Stream.call(this);
|
||||
|
||||
this.path = path;
|
||||
this.fd = null;
|
||||
this.writable = true;
|
||||
|
||||
this.flags = 'w';
|
||||
this.encoding = 'binary';
|
||||
this.mode = 438; /*=0666*/
|
||||
this.bytesWritten = 0;
|
||||
|
||||
options = options || {};
|
||||
|
||||
// Mixin options into this
|
||||
var keys = Object.keys(options);
|
||||
for (var index = 0, length = keys.length; index < length; index++) {
|
||||
var key = keys[index];
|
||||
this[key] = options[key];
|
||||
}
|
||||
|
||||
if (this.start !== undefined) {
|
||||
if ('number' !== typeof this.start) {
|
||||
throw TypeError('start must be a Number');
|
||||
}
|
||||
if (this.start < 0) {
|
||||
throw new Error('start must be >= zero');
|
||||
}
|
||||
|
||||
this.pos = this.start;
|
||||
}
|
||||
|
||||
this.busy = false;
|
||||
this._queue = [];
|
||||
|
||||
if (this.fd === null) {
|
||||
this._open = fs.open;
|
||||
this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
|
||||
this.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
53
vscodeEvalExtension/node_modules/graceful-fs/package.json
generated
vendored
Normal file
53
vscodeEvalExtension/node_modules/graceful-fs/package.json
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"name": "graceful-fs",
|
||||
"description": "A drop-in replacement for fs, making various improvements.",
|
||||
"version": "4.2.11",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/isaacs/node-graceful-fs"
|
||||
},
|
||||
"main": "graceful-fs.js",
|
||||
"directories": {
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"preversion": "npm test",
|
||||
"postversion": "npm publish",
|
||||
"postpublish": "git push origin --follow-tags",
|
||||
"test": "nyc --silent node test.js | tap -c -",
|
||||
"posttest": "nyc report"
|
||||
},
|
||||
"keywords": [
|
||||
"fs",
|
||||
"module",
|
||||
"reading",
|
||||
"retry",
|
||||
"retries",
|
||||
"queue",
|
||||
"error",
|
||||
"errors",
|
||||
"handling",
|
||||
"EMFILE",
|
||||
"EAGAIN",
|
||||
"EINVAL",
|
||||
"EPERM",
|
||||
"EACCESS"
|
||||
],
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"import-fresh": "^2.0.0",
|
||||
"mkdirp": "^0.5.0",
|
||||
"rimraf": "^2.2.8",
|
||||
"tap": "^16.3.4"
|
||||
},
|
||||
"files": [
|
||||
"fs.js",
|
||||
"graceful-fs.js",
|
||||
"legacy-streams.js",
|
||||
"polyfills.js",
|
||||
"clone.js"
|
||||
],
|
||||
"tap": {
|
||||
"reporter": "classic"
|
||||
}
|
||||
}
|
||||
355
vscodeEvalExtension/node_modules/graceful-fs/polyfills.js
generated
vendored
Normal file
355
vscodeEvalExtension/node_modules/graceful-fs/polyfills.js
generated
vendored
Normal file
@@ -0,0 +1,355 @@
|
||||
var constants = require('constants')
|
||||
|
||||
var origCwd = process.cwd
|
||||
var cwd = null
|
||||
|
||||
var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform
|
||||
|
||||
process.cwd = function() {
|
||||
if (!cwd)
|
||||
cwd = origCwd.call(process)
|
||||
return cwd
|
||||
}
|
||||
try {
|
||||
process.cwd()
|
||||
} catch (er) {}
|
||||
|
||||
// This check is needed until node.js 12 is required
|
||||
if (typeof process.chdir === 'function') {
|
||||
var chdir = process.chdir
|
||||
process.chdir = function (d) {
|
||||
cwd = null
|
||||
chdir.call(process, d)
|
||||
}
|
||||
if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)
|
||||
}
|
||||
|
||||
module.exports = patch
|
||||
|
||||
function patch (fs) {
|
||||
// (re-)implement some things that are known busted or missing.
|
||||
|
||||
// lchmod, broken prior to 0.6.2
|
||||
// back-port the fix here.
|
||||
if (constants.hasOwnProperty('O_SYMLINK') &&
|
||||
process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
|
||||
patchLchmod(fs)
|
||||
}
|
||||
|
||||
// lutimes implementation, or no-op
|
||||
if (!fs.lutimes) {
|
||||
patchLutimes(fs)
|
||||
}
|
||||
|
||||
// https://github.com/isaacs/node-graceful-fs/issues/4
|
||||
// Chown should not fail on einval or eperm if non-root.
|
||||
// It should not fail on enosys ever, as this just indicates
|
||||
// that a fs doesn't support the intended operation.
|
||||
|
||||
fs.chown = chownFix(fs.chown)
|
||||
fs.fchown = chownFix(fs.fchown)
|
||||
fs.lchown = chownFix(fs.lchown)
|
||||
|
||||
fs.chmod = chmodFix(fs.chmod)
|
||||
fs.fchmod = chmodFix(fs.fchmod)
|
||||
fs.lchmod = chmodFix(fs.lchmod)
|
||||
|
||||
fs.chownSync = chownFixSync(fs.chownSync)
|
||||
fs.fchownSync = chownFixSync(fs.fchownSync)
|
||||
fs.lchownSync = chownFixSync(fs.lchownSync)
|
||||
|
||||
fs.chmodSync = chmodFixSync(fs.chmodSync)
|
||||
fs.fchmodSync = chmodFixSync(fs.fchmodSync)
|
||||
fs.lchmodSync = chmodFixSync(fs.lchmodSync)
|
||||
|
||||
fs.stat = statFix(fs.stat)
|
||||
fs.fstat = statFix(fs.fstat)
|
||||
fs.lstat = statFix(fs.lstat)
|
||||
|
||||
fs.statSync = statFixSync(fs.statSync)
|
||||
fs.fstatSync = statFixSync(fs.fstatSync)
|
||||
fs.lstatSync = statFixSync(fs.lstatSync)
|
||||
|
||||
// if lchmod/lchown do not exist, then make them no-ops
|
||||
if (fs.chmod && !fs.lchmod) {
|
||||
fs.lchmod = function (path, mode, cb) {
|
||||
if (cb) process.nextTick(cb)
|
||||
}
|
||||
fs.lchmodSync = function () {}
|
||||
}
|
||||
if (fs.chown && !fs.lchown) {
|
||||
fs.lchown = function (path, uid, gid, cb) {
|
||||
if (cb) process.nextTick(cb)
|
||||
}
|
||||
fs.lchownSync = function () {}
|
||||
}
|
||||
|
||||
// on Windows, A/V software can lock the directory, causing this
|
||||
// to fail with an EACCES or EPERM if the directory contains newly
|
||||
// created files. Try again on failure, for up to 60 seconds.
|
||||
|
||||
// Set the timeout this long because some Windows Anti-Virus, such as Parity
|
||||
// bit9, may lock files for up to a minute, causing npm package install
|
||||
// failures. Also, take care to yield the scheduler. Windows scheduling gives
|
||||
// CPU to a busy looping process, which can cause the program causing the lock
|
||||
// contention to be starved of CPU by node, so the contention doesn't resolve.
|
||||
if (platform === "win32") {
|
||||
fs.rename = typeof fs.rename !== 'function' ? fs.rename
|
||||
: (function (fs$rename) {
|
||||
function rename (from, to, cb) {
|
||||
var start = Date.now()
|
||||
var backoff = 0;
|
||||
fs$rename(from, to, function CB (er) {
|
||||
if (er
|
||||
&& (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY")
|
||||
&& Date.now() - start < 60000) {
|
||||
setTimeout(function() {
|
||||
fs.stat(to, function (stater, st) {
|
||||
if (stater && stater.code === "ENOENT")
|
||||
fs$rename(from, to, CB);
|
||||
else
|
||||
cb(er)
|
||||
})
|
||||
}, backoff)
|
||||
if (backoff < 100)
|
||||
backoff += 10;
|
||||
return;
|
||||
}
|
||||
if (cb) cb(er)
|
||||
})
|
||||
}
|
||||
if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)
|
||||
return rename
|
||||
})(fs.rename)
|
||||
}
|
||||
|
||||
// if read() returns EAGAIN, then just try it again.
|
||||
fs.read = typeof fs.read !== 'function' ? fs.read
|
||||
: (function (fs$read) {
|
||||
function read (fd, buffer, offset, length, position, callback_) {
|
||||
var callback
|
||||
if (callback_ && typeof callback_ === 'function') {
|
||||
var eagCounter = 0
|
||||
callback = function (er, _, __) {
|
||||
if (er && er.code === 'EAGAIN' && eagCounter < 10) {
|
||||
eagCounter ++
|
||||
return fs$read.call(fs, fd, buffer, offset, length, position, callback)
|
||||
}
|
||||
callback_.apply(this, arguments)
|
||||
}
|
||||
}
|
||||
return fs$read.call(fs, fd, buffer, offset, length, position, callback)
|
||||
}
|
||||
|
||||
// This ensures `util.promisify` works as it does for native `fs.read`.
|
||||
if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)
|
||||
return read
|
||||
})(fs.read)
|
||||
|
||||
fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync
|
||||
: (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
||||
var eagCounter = 0
|
||||
while (true) {
|
||||
try {
|
||||
return fs$readSync.call(fs, fd, buffer, offset, length, position)
|
||||
} catch (er) {
|
||||
if (er.code === 'EAGAIN' && eagCounter < 10) {
|
||||
eagCounter ++
|
||||
continue
|
||||
}
|
||||
throw er
|
||||
}
|
||||
}
|
||||
}})(fs.readSync)
|
||||
|
||||
function patchLchmod (fs) {
|
||||
fs.lchmod = function (path, mode, callback) {
|
||||
fs.open( path
|
||||
, constants.O_WRONLY | constants.O_SYMLINK
|
||||
, mode
|
||||
, function (err, fd) {
|
||||
if (err) {
|
||||
if (callback) callback(err)
|
||||
return
|
||||
}
|
||||
// prefer to return the chmod error, if one occurs,
|
||||
// but still try to close, and report closing errors if they occur.
|
||||
fs.fchmod(fd, mode, function (err) {
|
||||
fs.close(fd, function(err2) {
|
||||
if (callback) callback(err || err2)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fs.lchmodSync = function (path, mode) {
|
||||
var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)
|
||||
|
||||
// prefer to return the chmod error, if one occurs,
|
||||
// but still try to close, and report closing errors if they occur.
|
||||
var threw = true
|
||||
var ret
|
||||
try {
|
||||
ret = fs.fchmodSync(fd, mode)
|
||||
threw = false
|
||||
} finally {
|
||||
if (threw) {
|
||||
try {
|
||||
fs.closeSync(fd)
|
||||
} catch (er) {}
|
||||
} else {
|
||||
fs.closeSync(fd)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
function patchLutimes (fs) {
|
||||
if (constants.hasOwnProperty("O_SYMLINK") && fs.futimes) {
|
||||
fs.lutimes = function (path, at, mt, cb) {
|
||||
fs.open(path, constants.O_SYMLINK, function (er, fd) {
|
||||
if (er) {
|
||||
if (cb) cb(er)
|
||||
return
|
||||
}
|
||||
fs.futimes(fd, at, mt, function (er) {
|
||||
fs.close(fd, function (er2) {
|
||||
if (cb) cb(er || er2)
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
fs.lutimesSync = function (path, at, mt) {
|
||||
var fd = fs.openSync(path, constants.O_SYMLINK)
|
||||
var ret
|
||||
var threw = true
|
||||
try {
|
||||
ret = fs.futimesSync(fd, at, mt)
|
||||
threw = false
|
||||
} finally {
|
||||
if (threw) {
|
||||
try {
|
||||
fs.closeSync(fd)
|
||||
} catch (er) {}
|
||||
} else {
|
||||
fs.closeSync(fd)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
} else if (fs.futimes) {
|
||||
fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
|
||||
fs.lutimesSync = function () {}
|
||||
}
|
||||
}
|
||||
|
||||
function chmodFix (orig) {
|
||||
if (!orig) return orig
|
||||
return function (target, mode, cb) {
|
||||
return orig.call(fs, target, mode, function (er) {
|
||||
if (chownErOk(er)) er = null
|
||||
if (cb) cb.apply(this, arguments)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function chmodFixSync (orig) {
|
||||
if (!orig) return orig
|
||||
return function (target, mode) {
|
||||
try {
|
||||
return orig.call(fs, target, mode)
|
||||
} catch (er) {
|
||||
if (!chownErOk(er)) throw er
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function chownFix (orig) {
|
||||
if (!orig) return orig
|
||||
return function (target, uid, gid, cb) {
|
||||
return orig.call(fs, target, uid, gid, function (er) {
|
||||
if (chownErOk(er)) er = null
|
||||
if (cb) cb.apply(this, arguments)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function chownFixSync (orig) {
|
||||
if (!orig) return orig
|
||||
return function (target, uid, gid) {
|
||||
try {
|
||||
return orig.call(fs, target, uid, gid)
|
||||
} catch (er) {
|
||||
if (!chownErOk(er)) throw er
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function statFix (orig) {
|
||||
if (!orig) return orig
|
||||
// Older versions of Node erroneously returned signed integers for
|
||||
// uid + gid.
|
||||
return function (target, options, cb) {
|
||||
if (typeof options === 'function') {
|
||||
cb = options
|
||||
options = null
|
||||
}
|
||||
function callback (er, stats) {
|
||||
if (stats) {
|
||||
if (stats.uid < 0) stats.uid += 0x100000000
|
||||
if (stats.gid < 0) stats.gid += 0x100000000
|
||||
}
|
||||
if (cb) cb.apply(this, arguments)
|
||||
}
|
||||
return options ? orig.call(fs, target, options, callback)
|
||||
: orig.call(fs, target, callback)
|
||||
}
|
||||
}
|
||||
|
||||
function statFixSync (orig) {
|
||||
if (!orig) return orig
|
||||
// Older versions of Node erroneously returned signed integers for
|
||||
// uid + gid.
|
||||
return function (target, options) {
|
||||
var stats = options ? orig.call(fs, target, options)
|
||||
: orig.call(fs, target)
|
||||
if (stats) {
|
||||
if (stats.uid < 0) stats.uid += 0x100000000
|
||||
if (stats.gid < 0) stats.gid += 0x100000000
|
||||
}
|
||||
return stats;
|
||||
}
|
||||
}
|
||||
|
||||
// ENOSYS means that the fs doesn't support the op. Just ignore
|
||||
// that, because it doesn't matter.
|
||||
//
|
||||
// if there's no getuid, or if getuid() is something other
|
||||
// than 0, and the error is EINVAL or EPERM, then just ignore
|
||||
// it.
|
||||
//
|
||||
// This specific case is a silent failure in cp, install, tar,
|
||||
// and most other unix tools that manage permissions.
|
||||
//
|
||||
// When running as root, or if other types of errors are
|
||||
// encountered, then it's strict.
|
||||
function chownErOk (er) {
|
||||
if (!er)
|
||||
return true
|
||||
|
||||
if (er.code === "ENOSYS")
|
||||
return true
|
||||
|
||||
var nonroot = !process.getuid || process.getuid() !== 0
|
||||
if (nonroot) {
|
||||
if (er.code === "EINVAL" || er.code === "EPERM")
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
171
vscodeEvalExtension/node_modules/jsonfile/CHANGELOG.md
generated
vendored
Normal file
171
vscodeEvalExtension/node_modules/jsonfile/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,171 @@
|
||||
6.1.0 / 2020-10-31
|
||||
------------------
|
||||
|
||||
- Add `finalEOL` option to disable writing final EOL ([#115](https://github.com/jprichardson/node-jsonfile/issues/115), [#137](https://github.com/jprichardson/node-jsonfile/pull/137))
|
||||
- Update dependency ([#138](https://github.com/jprichardson/node-jsonfile/pull/138))
|
||||
|
||||
6.0.1 / 2020-03-07
|
||||
------------------
|
||||
|
||||
- Update dependency ([#130](https://github.com/jprichardson/node-jsonfile/pull/130))
|
||||
- Fix code style ([#129](https://github.com/jprichardson/node-jsonfile/pull/129))
|
||||
|
||||
6.0.0 / 2020-02-24
|
||||
------------------
|
||||
|
||||
- **BREAKING:** Drop support for Node 6 & 8 ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
|
||||
- **BREAKING:** Do not allow passing `null` as options to `readFile()` or `writeFile()` ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
|
||||
- Refactor internals ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
|
||||
|
||||
5.0.0 / 2018-09-08
|
||||
------------------
|
||||
|
||||
- **BREAKING:** Drop Node 4 support
|
||||
- **BREAKING:** If no callback is passed to an asynchronous method, a promise is now returned ([#109](https://github.com/jprichardson/node-jsonfile/pull/109))
|
||||
- Cleanup docs
|
||||
|
||||
4.0.0 / 2017-07-12
|
||||
------------------
|
||||
|
||||
- **BREAKING:** Remove global `spaces` option.
|
||||
- **BREAKING:** Drop support for Node 0.10, 0.12, and io.js.
|
||||
- Remove undocumented `passParsingErrors` option.
|
||||
- Added `EOL` override option to `writeFile` when using `spaces`. [#89]
|
||||
|
||||
3.0.1 / 2017-07-05
|
||||
------------------
|
||||
|
||||
- Fixed bug in `writeFile` when there was a serialization error & no callback was passed. In previous versions, an empty file would be written; now no file is written.
|
||||
|
||||
3.0.0 / 2017-04-25
|
||||
------------------
|
||||
|
||||
- Changed behavior of `throws` option for `readFileSync`; now does not throw filesystem errors when `throws` is `false`
|
||||
|
||||
2.4.0 / 2016-09-15
|
||||
------------------
|
||||
### Changed
|
||||
- added optional support for `graceful-fs` [#62]
|
||||
|
||||
2.3.1 / 2016-05-13
|
||||
------------------
|
||||
- fix to support BOM. [#45][#45]
|
||||
|
||||
2.3.0 / 2016-04-16
|
||||
------------------
|
||||
- add `throws` to `readFile()`. See [#39][#39]
|
||||
- add support for any arbitrary `fs` module. Useful with [mock-fs](https://www.npmjs.com/package/mock-fs)
|
||||
|
||||
2.2.3 / 2015-10-14
|
||||
------------------
|
||||
- include file name in parse error. See: https://github.com/jprichardson/node-jsonfile/pull/34
|
||||
|
||||
2.2.2 / 2015-09-16
|
||||
------------------
|
||||
- split out tests into separate files
|
||||
- fixed `throws` when set to `true` in `readFileSync()`. See: https://github.com/jprichardson/node-jsonfile/pull/33
|
||||
|
||||
2.2.1 / 2015-06-25
|
||||
------------------
|
||||
- fixed regression when passing in string as encoding for options in `writeFile()` and `writeFileSync()`. See: https://github.com/jprichardson/node-jsonfile/issues/28
|
||||
|
||||
2.2.0 / 2015-06-25
|
||||
------------------
|
||||
- added `options.spaces` to `writeFile()` and `writeFileSync()`
|
||||
|
||||
2.1.2 / 2015-06-22
|
||||
------------------
|
||||
- fixed if passed `readFileSync(file, 'utf8')`. See: https://github.com/jprichardson/node-jsonfile/issues/25
|
||||
|
||||
2.1.1 / 2015-06-19
|
||||
------------------
|
||||
- fixed regressions if `null` is passed for options. See: https://github.com/jprichardson/node-jsonfile/issues/24
|
||||
|
||||
2.1.0 / 2015-06-19
|
||||
------------------
|
||||
- cleanup: JavaScript Standard Style, rename files, dropped terst for assert
|
||||
- methods now support JSON revivers/replacers
|
||||
|
||||
2.0.1 / 2015-05-24
|
||||
------------------
|
||||
- update license attribute https://github.com/jprichardson/node-jsonfile/pull/21
|
||||
|
||||
2.0.0 / 2014-07-28
|
||||
------------------
|
||||
* added `\n` to end of file on write. [#14](https://github.com/jprichardson/node-jsonfile/pull/14)
|
||||
* added `options.throws` to `readFileSync()`
|
||||
* dropped support for Node v0.8
|
||||
|
||||
1.2.0 / 2014-06-29
|
||||
------------------
|
||||
* removed semicolons
|
||||
* bugfix: passed `options` to `fs.readFile` and `fs.readFileSync`. This technically changes behavior, but
|
||||
changes it according to docs. [#12][#12]
|
||||
|
||||
1.1.1 / 2013-11-11
|
||||
------------------
|
||||
* fixed catching of callback bug (ffissore / #5)
|
||||
|
||||
1.1.0 / 2013-10-11
|
||||
------------------
|
||||
* added `options` param to methods, (seanodell / #4)
|
||||
|
||||
1.0.1 / 2013-09-05
|
||||
------------------
|
||||
* removed `homepage` field from package.json to remove NPM warning
|
||||
|
||||
1.0.0 / 2013-06-28
|
||||
------------------
|
||||
* added `.npmignore`, #1
|
||||
* changed spacing default from `4` to `2` to follow Node conventions
|
||||
|
||||
0.0.1 / 2012-09-10
|
||||
------------------
|
||||
* Initial release.
|
||||
|
||||
[#89]: https://github.com/jprichardson/node-jsonfile/pull/89
|
||||
[#45]: https://github.com/jprichardson/node-jsonfile/issues/45 "Reading of UTF8-encoded (w/ BOM) files fails"
|
||||
[#44]: https://github.com/jprichardson/node-jsonfile/issues/44 "Extra characters in written file"
|
||||
[#43]: https://github.com/jprichardson/node-jsonfile/issues/43 "Prettyfy json when written to file"
|
||||
[#42]: https://github.com/jprichardson/node-jsonfile/pull/42 "Moved fs.readFileSync within the try/catch"
|
||||
[#41]: https://github.com/jprichardson/node-jsonfile/issues/41 "Linux: Hidden file not working"
|
||||
[#40]: https://github.com/jprichardson/node-jsonfile/issues/40 "autocreate folder doesn't work from Path-value"
|
||||
[#39]: https://github.com/jprichardson/node-jsonfile/pull/39 "Add `throws` option for readFile (async)"
|
||||
[#38]: https://github.com/jprichardson/node-jsonfile/pull/38 "Update README.md writeFile[Sync] signature"
|
||||
[#37]: https://github.com/jprichardson/node-jsonfile/pull/37 "support append file"
|
||||
[#36]: https://github.com/jprichardson/node-jsonfile/pull/36 "Add typescript definition file."
|
||||
[#35]: https://github.com/jprichardson/node-jsonfile/pull/35 "Add typescript definition file."
|
||||
[#34]: https://github.com/jprichardson/node-jsonfile/pull/34 "readFile JSON parse error includes filename"
|
||||
[#33]: https://github.com/jprichardson/node-jsonfile/pull/33 "fix throw->throws typo in readFileSync()"
|
||||
[#32]: https://github.com/jprichardson/node-jsonfile/issues/32 "readFile & readFileSync can possible have strip-comments as an option?"
|
||||
[#31]: https://github.com/jprichardson/node-jsonfile/pull/31 "[Modify] Support string include is unicode escape string"
|
||||
[#30]: https://github.com/jprichardson/node-jsonfile/issues/30 "How to use Jsonfile package in Meteor.js App?"
|
||||
[#29]: https://github.com/jprichardson/node-jsonfile/issues/29 "writefile callback if no error?"
|
||||
[#28]: https://github.com/jprichardson/node-jsonfile/issues/28 "writeFile options argument broken "
|
||||
[#27]: https://github.com/jprichardson/node-jsonfile/pull/27 "Use svg instead of png to get better image quality"
|
||||
[#26]: https://github.com/jprichardson/node-jsonfile/issues/26 "Breaking change to fs-extra"
|
||||
[#25]: https://github.com/jprichardson/node-jsonfile/issues/25 "support string encoding param for read methods"
|
||||
[#24]: https://github.com/jprichardson/node-jsonfile/issues/24 "readFile: Passing in null options with a callback throws an error"
|
||||
[#23]: https://github.com/jprichardson/node-jsonfile/pull/23 "Add appendFile and appendFileSync"
|
||||
[#22]: https://github.com/jprichardson/node-jsonfile/issues/22 "Default value for spaces in readme.md is outdated"
|
||||
[#21]: https://github.com/jprichardson/node-jsonfile/pull/21 "Update license attribute"
|
||||
[#20]: https://github.com/jprichardson/node-jsonfile/issues/20 "Add simple caching functionallity"
|
||||
[#19]: https://github.com/jprichardson/node-jsonfile/pull/19 "Add appendFileSync method"
|
||||
[#18]: https://github.com/jprichardson/node-jsonfile/issues/18 "Add updateFile and updateFileSync methods"
|
||||
[#17]: https://github.com/jprichardson/node-jsonfile/issues/17 "seem read & write sync has sequentially problem"
|
||||
[#16]: https://github.com/jprichardson/node-jsonfile/pull/16 "export spaces defaulted to null"
|
||||
[#15]: https://github.com/jprichardson/node-jsonfile/issues/15 "`jsonfile.spaces` should default to `null`"
|
||||
[#14]: https://github.com/jprichardson/node-jsonfile/pull/14 "Add EOL at EOF"
|
||||
[#13]: https://github.com/jprichardson/node-jsonfile/issues/13 "Add a final newline"
|
||||
[#12]: https://github.com/jprichardson/node-jsonfile/issues/12 "readFile doesn't accept options"
|
||||
[#11]: https://github.com/jprichardson/node-jsonfile/pull/11 "Added try,catch to readFileSync"
|
||||
[#10]: https://github.com/jprichardson/node-jsonfile/issues/10 "No output or error from writeFile"
|
||||
[#9]: https://github.com/jprichardson/node-jsonfile/pull/9 "Change 'js' to 'jf' in example."
|
||||
[#8]: https://github.com/jprichardson/node-jsonfile/pull/8 "Updated forgotten module.exports to me."
|
||||
[#7]: https://github.com/jprichardson/node-jsonfile/pull/7 "Add file name in error message"
|
||||
[#6]: https://github.com/jprichardson/node-jsonfile/pull/6 "Use graceful-fs when possible"
|
||||
[#5]: https://github.com/jprichardson/node-jsonfile/pull/5 "Jsonfile doesn't behave nicely when used inside a test suite."
|
||||
[#4]: https://github.com/jprichardson/node-jsonfile/pull/4 "Added options parameter to writeFile and writeFileSync"
|
||||
[#3]: https://github.com/jprichardson/node-jsonfile/issues/3 "test2"
|
||||
[#2]: https://github.com/jprichardson/node-jsonfile/issues/2 "homepage field must be a string url. Deleted."
|
||||
[#1]: https://github.com/jprichardson/node-jsonfile/pull/1 "adding an `.npmignore` file"
|
||||
15
vscodeEvalExtension/node_modules/jsonfile/LICENSE
generated
vendored
Normal file
15
vscodeEvalExtension/node_modules/jsonfile/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2012-2015, JP Richardson <jprichardson@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.
|
||||
230
vscodeEvalExtension/node_modules/jsonfile/README.md
generated
vendored
Normal file
230
vscodeEvalExtension/node_modules/jsonfile/README.md
generated
vendored
Normal file
@@ -0,0 +1,230 @@
|
||||
Node.js - jsonfile
|
||||
================
|
||||
|
||||
Easily read/write JSON files in Node.js. _Note: this module cannot be used in the browser._
|
||||
|
||||
[](https://www.npmjs.org/package/jsonfile)
|
||||
[](http://travis-ci.org/jprichardson/node-jsonfile)
|
||||
[](https://ci.appveyor.com/project/jprichardson/node-jsonfile/branch/master)
|
||||
|
||||
<a href="https://github.com/feross/standard"><img src="https://cdn.rawgit.com/feross/standard/master/sticker.svg" alt="Standard JavaScript" width="100"></a>
|
||||
|
||||
Why?
|
||||
----
|
||||
|
||||
Writing `JSON.stringify()` and then `fs.writeFile()` and `JSON.parse()` with `fs.readFile()` enclosed in `try/catch` blocks became annoying.
|
||||
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
npm install --save jsonfile
|
||||
|
||||
|
||||
|
||||
API
|
||||
---
|
||||
|
||||
* [`readFile(filename, [options], callback)`](#readfilefilename-options-callback)
|
||||
* [`readFileSync(filename, [options])`](#readfilesyncfilename-options)
|
||||
* [`writeFile(filename, obj, [options], callback)`](#writefilefilename-obj-options-callback)
|
||||
* [`writeFileSync(filename, obj, [options])`](#writefilesyncfilename-obj-options)
|
||||
|
||||
----
|
||||
|
||||
### readFile(filename, [options], callback)
|
||||
|
||||
`options` (`object`, default `undefined`): Pass in any [`fs.readFile`](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
|
||||
- `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, pass this error to the callback.
|
||||
If `false`, returns `null` for the object.
|
||||
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
const file = '/tmp/data.json'
|
||||
jsonfile.readFile(file, function (err, obj) {
|
||||
if (err) console.error(err)
|
||||
console.dir(obj)
|
||||
})
|
||||
```
|
||||
|
||||
You can also use this method with promises. The `readFile` method will return a promise if you do not pass a callback function.
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
const file = '/tmp/data.json'
|
||||
jsonfile.readFile(file)
|
||||
.then(obj => console.dir(obj))
|
||||
.catch(error => console.error(error))
|
||||
```
|
||||
|
||||
----
|
||||
|
||||
### readFileSync(filename, [options])
|
||||
|
||||
`options` (`object`, default `undefined`): Pass in any [`fs.readFileSync`](https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
|
||||
- `throws` (`boolean`, default: `true`). If an error is encountered reading or parsing the file, throw the error. If `false`, returns `null` for the object.
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
const file = '/tmp/data.json'
|
||||
|
||||
console.dir(jsonfile.readFileSync(file))
|
||||
```
|
||||
|
||||
----
|
||||
|
||||
### writeFile(filename, obj, [options], callback)
|
||||
|
||||
`options`: Pass in any [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
|
||||
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFile(file, obj, function (err) {
|
||||
if (err) console.error(err)
|
||||
})
|
||||
```
|
||||
Or use with promises as follows:
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFile(file, obj)
|
||||
.then(res => {
|
||||
console.log('Write complete')
|
||||
})
|
||||
.catch(error => console.error(error))
|
||||
```
|
||||
|
||||
|
||||
**formatting with spaces:**
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFile(file, obj, { spaces: 2 }, function (err) {
|
||||
if (err) console.error(err)
|
||||
})
|
||||
```
|
||||
|
||||
**overriding EOL:**
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFile(file, obj, { spaces: 2, EOL: '\r\n' }, function (err) {
|
||||
if (err) console.error(err)
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
**disabling the EOL at the end of file:**
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFile(file, obj, { spaces: 2, finalEOL: false }, function (err) {
|
||||
if (err) console.log(err)
|
||||
})
|
||||
```
|
||||
|
||||
**appending to an existing JSON file:**
|
||||
|
||||
You can use `fs.writeFile` option `{ flag: 'a' }` to achieve this.
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/mayAlreadyExistedData.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFile(file, obj, { flag: 'a' }, function (err) {
|
||||
if (err) console.error(err)
|
||||
})
|
||||
```
|
||||
|
||||
----
|
||||
|
||||
### writeFileSync(filename, obj, [options])
|
||||
|
||||
`options`: Pass in any [`fs.writeFileSync`](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFileSync(file, obj)
|
||||
```
|
||||
|
||||
**formatting with spaces:**
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFileSync(file, obj, { spaces: 2 })
|
||||
```
|
||||
|
||||
**overriding EOL:**
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFileSync(file, obj, { spaces: 2, EOL: '\r\n' })
|
||||
```
|
||||
|
||||
**disabling the EOL at the end of file:**
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/data.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFileSync(file, obj, { spaces: 2, finalEOL: false })
|
||||
```
|
||||
|
||||
**appending to an existing JSON file:**
|
||||
|
||||
You can use `fs.writeFileSync` option `{ flag: 'a' }` to achieve this.
|
||||
|
||||
```js
|
||||
const jsonfile = require('jsonfile')
|
||||
|
||||
const file = '/tmp/mayAlreadyExistedData.json'
|
||||
const obj = { name: 'JP' }
|
||||
|
||||
jsonfile.writeFileSync(file, obj, { flag: 'a' })
|
||||
```
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
(MIT License)
|
||||
|
||||
Copyright 2012-2016, JP Richardson <jprichardson@gmail.com>
|
||||
88
vscodeEvalExtension/node_modules/jsonfile/index.js
generated
vendored
Normal file
88
vscodeEvalExtension/node_modules/jsonfile/index.js
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
let _fs
|
||||
try {
|
||||
_fs = require('graceful-fs')
|
||||
} catch (_) {
|
||||
_fs = require('fs')
|
||||
}
|
||||
const universalify = require('universalify')
|
||||
const { stringify, stripBom } = require('./utils')
|
||||
|
||||
async function _readFile (file, options = {}) {
|
||||
if (typeof options === 'string') {
|
||||
options = { encoding: options }
|
||||
}
|
||||
|
||||
const fs = options.fs || _fs
|
||||
|
||||
const shouldThrow = 'throws' in options ? options.throws : true
|
||||
|
||||
let data = await universalify.fromCallback(fs.readFile)(file, options)
|
||||
|
||||
data = stripBom(data)
|
||||
|
||||
let obj
|
||||
try {
|
||||
obj = JSON.parse(data, options ? options.reviver : null)
|
||||
} catch (err) {
|
||||
if (shouldThrow) {
|
||||
err.message = `${file}: ${err.message}`
|
||||
throw err
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
return obj
|
||||
}
|
||||
|
||||
const readFile = universalify.fromPromise(_readFile)
|
||||
|
||||
function readFileSync (file, options = {}) {
|
||||
if (typeof options === 'string') {
|
||||
options = { encoding: options }
|
||||
}
|
||||
|
||||
const fs = options.fs || _fs
|
||||
|
||||
const shouldThrow = 'throws' in options ? options.throws : true
|
||||
|
||||
try {
|
||||
let content = fs.readFileSync(file, options)
|
||||
content = stripBom(content)
|
||||
return JSON.parse(content, options.reviver)
|
||||
} catch (err) {
|
||||
if (shouldThrow) {
|
||||
err.message = `${file}: ${err.message}`
|
||||
throw err
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function _writeFile (file, obj, options = {}) {
|
||||
const fs = options.fs || _fs
|
||||
|
||||
const str = stringify(obj, options)
|
||||
|
||||
await universalify.fromCallback(fs.writeFile)(file, str, options)
|
||||
}
|
||||
|
||||
const writeFile = universalify.fromPromise(_writeFile)
|
||||
|
||||
function writeFileSync (file, obj, options = {}) {
|
||||
const fs = options.fs || _fs
|
||||
|
||||
const str = stringify(obj, options)
|
||||
// not sure if fs.writeFileSync returns anything, but just in case
|
||||
return fs.writeFileSync(file, str, options)
|
||||
}
|
||||
|
||||
const jsonfile = {
|
||||
readFile,
|
||||
readFileSync,
|
||||
writeFile,
|
||||
writeFileSync
|
||||
}
|
||||
|
||||
module.exports = jsonfile
|
||||
40
vscodeEvalExtension/node_modules/jsonfile/package.json
generated
vendored
Normal file
40
vscodeEvalExtension/node_modules/jsonfile/package.json
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "jsonfile",
|
||||
"version": "6.1.0",
|
||||
"description": "Easily read/write JSON files.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:jprichardson/node-jsonfile.git"
|
||||
},
|
||||
"keywords": [
|
||||
"read",
|
||||
"write",
|
||||
"file",
|
||||
"json",
|
||||
"fs",
|
||||
"fs-extra"
|
||||
],
|
||||
"author": "JP Richardson <jprichardson@gmail.com>",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"mocha": "^8.2.0",
|
||||
"rimraf": "^2.4.0",
|
||||
"standard": "^16.0.1"
|
||||
},
|
||||
"main": "index.js",
|
||||
"files": [
|
||||
"index.js",
|
||||
"utils.js"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "standard",
|
||||
"test": "npm run lint && npm run unit",
|
||||
"unit": "mocha"
|
||||
}
|
||||
}
|
||||
14
vscodeEvalExtension/node_modules/jsonfile/utils.js
generated
vendored
Normal file
14
vscodeEvalExtension/node_modules/jsonfile/utils.js
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) {
|
||||
const EOF = finalEOL ? EOL : ''
|
||||
const str = JSON.stringify(obj, replacer, spaces)
|
||||
|
||||
return str.replace(/\n/g, EOL) + EOF
|
||||
}
|
||||
|
||||
function stripBom (content) {
|
||||
// we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
|
||||
if (Buffer.isBuffer(content)) content = content.toString('utf8')
|
||||
return content.replace(/^\uFEFF/, '')
|
||||
}
|
||||
|
||||
module.exports = { stringify, stripBom }
|
||||
20
vscodeEvalExtension/node_modules/universalify/LICENSE
generated
vendored
Normal file
20
vscodeEvalExtension/node_modules/universalify/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.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.
|
||||
76
vscodeEvalExtension/node_modules/universalify/README.md
generated
vendored
Normal file
76
vscodeEvalExtension/node_modules/universalify/README.md
generated
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
# universalify
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Make a callback- or promise-based function support both promises and callbacks.
|
||||
|
||||
Uses the native promise implementation.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
npm install universalify
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### `universalify.fromCallback(fn)`
|
||||
|
||||
Takes a callback-based function to universalify, and returns the universalified function.
|
||||
|
||||
Function must take a callback as the last parameter that will be called with the signature `(error, result)`. `universalify` does not support calling the callback with three or more arguments, and does not ensure that the callback is only called once.
|
||||
|
||||
```js
|
||||
function callbackFn (n, cb) {
|
||||
setTimeout(() => cb(null, n), 15)
|
||||
}
|
||||
|
||||
const fn = universalify.fromCallback(callbackFn)
|
||||
|
||||
// Works with Promises:
|
||||
fn('Hello World!')
|
||||
.then(result => console.log(result)) // -> Hello World!
|
||||
.catch(error => console.error(error))
|
||||
|
||||
// Works with Callbacks:
|
||||
fn('Hi!', (error, result) => {
|
||||
if (error) return console.error(error)
|
||||
console.log(result)
|
||||
// -> Hi!
|
||||
})
|
||||
```
|
||||
|
||||
### `universalify.fromPromise(fn)`
|
||||
|
||||
Takes a promise-based function to universalify, and returns the universalified function.
|
||||
|
||||
Function must return a valid JS promise. `universalify` does not ensure that a valid promise is returned.
|
||||
|
||||
```js
|
||||
function promiseFn (n) {
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => resolve(n), 15)
|
||||
})
|
||||
}
|
||||
|
||||
const fn = universalify.fromPromise(promiseFn)
|
||||
|
||||
// Works with Promises:
|
||||
fn('Hello World!')
|
||||
.then(result => console.log(result)) // -> Hello World!
|
||||
.catch(error => console.error(error))
|
||||
|
||||
// Works with Callbacks:
|
||||
fn('Hi!', (error, result) => {
|
||||
if (error) return console.error(error)
|
||||
console.log(result)
|
||||
// -> Hi!
|
||||
})
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
24
vscodeEvalExtension/node_modules/universalify/index.js
generated
vendored
Normal file
24
vscodeEvalExtension/node_modules/universalify/index.js
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
'use strict'
|
||||
|
||||
exports.fromCallback = function (fn) {
|
||||
return Object.defineProperty(function (...args) {
|
||||
if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
|
||||
else {
|
||||
return new Promise((resolve, reject) => {
|
||||
args.push((err, res) => (err != null) ? reject(err) : resolve(res))
|
||||
fn.apply(this, args)
|
||||
})
|
||||
}
|
||||
}, 'name', { value: fn.name })
|
||||
}
|
||||
|
||||
exports.fromPromise = function (fn) {
|
||||
return Object.defineProperty(function (...args) {
|
||||
const cb = args[args.length - 1]
|
||||
if (typeof cb !== 'function') return fn.apply(this, args)
|
||||
else {
|
||||
args.pop()
|
||||
fn.apply(this, args).then(r => cb(null, r), cb)
|
||||
}
|
||||
}, 'name', { value: fn.name })
|
||||
}
|
||||
34
vscodeEvalExtension/node_modules/universalify/package.json
generated
vendored
Normal file
34
vscodeEvalExtension/node_modules/universalify/package.json
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "universalify",
|
||||
"version": "2.0.1",
|
||||
"description": "Make a callback- or promise-based function support both promises and callbacks.",
|
||||
"keywords": [
|
||||
"callback",
|
||||
"native",
|
||||
"promise"
|
||||
],
|
||||
"homepage": "https://github.com/RyanZim/universalify#readme",
|
||||
"bugs": "https://github.com/RyanZim/universalify/issues",
|
||||
"license": "MIT",
|
||||
"author": "Ryan Zimmerman <opensrc@ryanzim.com>",
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/RyanZim/universalify.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "standard && nyc --reporter text --reporter lcovonly tape test/*.js | colortape"
|
||||
},
|
||||
"devDependencies": {
|
||||
"colortape": "^0.1.2",
|
||||
"coveralls": "^3.0.1",
|
||||
"nyc": "^15.0.0",
|
||||
"standard": "^14.3.1",
|
||||
"tape": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
}
|
||||
@@ -27,31 +27,26 @@ exports.deactivate = exports.activate = void 0;
|
||||
// The module 'vscode' contains the VS Code extensibility API
|
||||
// Import the module and reference it with the alias vscode in your code below
|
||||
const vscode = __importStar(require("vscode"));
|
||||
const fs = __importStar(require("fs-extra"));
|
||||
// This method is called when your extension is activated
|
||||
// Your extension is activated the very first time the command is executed
|
||||
function activate(context) {
|
||||
// Use the console to output diagnostic information (console.log) and errors (console.error)
|
||||
// This line of code will only be executed once when your extension is activated
|
||||
// console.log('Congratulations, your extension "eval" is now active!');
|
||||
// The command has been defined in the package.json file
|
||||
// Now provide the implementation of the command with registerCommand
|
||||
// The commandId parameter must match the command field in package.json
|
||||
let OpenProject = vscode.commands.registerCommand('eval.OpenProject', () => {
|
||||
// The code you place here will be executed every time your command is executed
|
||||
// Display a message box to the user
|
||||
// vscode.window.showInformationMessage(String(vscode.window.state.focused));
|
||||
if (vscode.workspace.workspaceFolders) {
|
||||
console.log(vscode.workspace.workspaceFolders[0].name);
|
||||
fs.writeFileSync("/home/user/OpenProject.txt", vscode.workspace.workspaceFolders[0].name);
|
||||
}
|
||||
else {
|
||||
console.log(false);
|
||||
fs.writeFileSync("/home/user/OpenProject.txt", "");
|
||||
}
|
||||
});
|
||||
let GetColorTheme = vscode.commands.registerCommand('eval.GetColorTheme', () => {
|
||||
console.log(vscode.window.activeColorTheme.kind == 2);
|
||||
fs.writeFileSync("/home/user/GetColorTheme.txt", String(vscode.window.activeColorTheme.kind)); // ==2
|
||||
});
|
||||
let GetBreakPoint = vscode.commands.registerCommand('eval.GetBreakPoint', () => {
|
||||
console.log(vscode.debug.breakpoints.length == 1);
|
||||
fs.writeFileSync("/home/user/GetBreakPoint.txt", String(vscode.debug.breakpoints.length)); // ==1
|
||||
});
|
||||
context.subscriptions.push(OpenProject, GetColorTheme, GetBreakPoint);
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,8EAA8E;AAC9E,+CAAiC;AAEjC,yDAAyD;AACzD,0EAA0E;AAC1E,SAAgB,QAAQ,CAAC,OAAgC;IAExD,4FAA4F;IAC5F,gFAAgF;IAChF,wEAAwE;IAExE,wDAAwD;IACxD,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1E,+EAA+E;QAC/E,oCAAoC;QACpC,6EAA6E;QAC7E,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9E,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AACvE,CAAC;AA7BD,4BA6BC;AAED,2DAA2D;AAC3D,SAAgB,UAAU,KAAI,CAAC;AAA/B,gCAA+B"}
|
||||
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA6D;AAC7D,8EAA8E;AAC9E,+CAAiC;AACjC,6CAA+B;AAE/B,yDAAyD;AACzD,0EAA0E;AAC1E,SAAgB,QAAQ,CAAC,OAAgC;IACxD,wDAAwD;IACxD,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1E,IAAI,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;YACvC,EAAE,CAAC,aAAa,CAAC,4BAA4B,EAAE,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACP,EAAE,CAAC,aAAa,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9E,EAAE,CAAC,aAAa,CAAC,8BAA8B,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM;IACtG,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9E,EAAE,CAAC,aAAa,CAAC,8BAA8B,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;IAClG,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AACvE,CAAC;AArBD,4BAqBC;AAED,2DAA2D;AAC3D,SAAgB,UAAU,KAAI,CAAC;AAA/B,gCAA+B"}
|
||||
62
vscodeEvalExtension/package-lock.json
generated
62
vscodeEvalExtension/package-lock.json
generated
@@ -7,6 +7,10 @@
|
||||
"": {
|
||||
"name": "eval",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"@types/fs-extra": "^11.0.4",
|
||||
"fs-extra": "^11.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mocha": "^10.0.6",
|
||||
"@types/node": "18.x",
|
||||
@@ -262,12 +266,29 @@
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/fs-extra": {
|
||||
"version": "11.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz",
|
||||
"integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==",
|
||||
"dependencies": {
|
||||
"@types/jsonfile": "*",
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/json-schema": {
|
||||
"version": "7.0.15",
|
||||
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
|
||||
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/jsonfile": {
|
||||
"version": "6.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz",
|
||||
"integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/mocha": {
|
||||
"version": "10.0.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz",
|
||||
@@ -278,7 +299,6 @@
|
||||
"version": "18.19.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz",
|
||||
"integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"undici-types": "~5.26.4"
|
||||
}
|
||||
@@ -1252,6 +1272,19 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
|
||||
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -1350,6 +1383,11 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
||||
},
|
||||
"node_modules/graphemer": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
|
||||
@@ -1598,6 +1636,17 @@
|
||||
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/jsonfile": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/jszip": {
|
||||
"version": "3.10.1",
|
||||
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
|
||||
@@ -2556,8 +2605,15 @@
|
||||
"node_modules/undici-types": {
|
||||
"version": "5.26.5",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
|
||||
"dev": true
|
||||
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||
},
|
||||
"node_modules/universalify": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uri-js": {
|
||||
"version": "4.4.1",
|
||||
|
||||
@@ -36,14 +36,18 @@
|
||||
"test": "vscode-test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/vscode": "^1.85.0",
|
||||
"@types/mocha": "^10.0.6",
|
||||
"@types/node": "18.x",
|
||||
"@types/vscode": "^1.85.0",
|
||||
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
||||
"@typescript-eslint/parser": "^6.15.0",
|
||||
"eslint": "^8.56.0",
|
||||
"typescript": "^5.3.3",
|
||||
"@vscode/test-cli": "^0.0.4",
|
||||
"@vscode/test-electron": "^2.3.8"
|
||||
"@vscode/test-electron": "^2.3.8",
|
||||
"eslint": "^8.56.0",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/fs-extra": "^11.0.4",
|
||||
"fs-extra": "^11.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +1,28 @@
|
||||
// The module 'vscode' contains the VS Code extensibility API
|
||||
// Import the module and reference it with the alias vscode in your code below
|
||||
import * as vscode from 'vscode';
|
||||
import * as fs from 'fs-extra';
|
||||
|
||||
// This method is called when your extension is activated
|
||||
// Your extension is activated the very first time the command is executed
|
||||
export function activate(context: vscode.ExtensionContext) {
|
||||
|
||||
// Use the console to output diagnostic information (console.log) and errors (console.error)
|
||||
// This line of code will only be executed once when your extension is activated
|
||||
// console.log('Congratulations, your extension "eval" is now active!');
|
||||
|
||||
// The command has been defined in the package.json file
|
||||
// Now provide the implementation of the command with registerCommand
|
||||
// The commandId parameter must match the command field in package.json
|
||||
let OpenProject = vscode.commands.registerCommand('eval.OpenProject', () => {
|
||||
// The code you place here will be executed every time your command is executed
|
||||
// Display a message box to the user
|
||||
// vscode.window.showInformationMessage(String(vscode.window.state.focused));
|
||||
if (vscode.workspace.workspaceFolders) {
|
||||
console.log(vscode.workspace.workspaceFolders[0].name);
|
||||
fs.writeFileSync("/home/user/OpenProject.txt", vscode.workspace.workspaceFolders[0].name);
|
||||
} else {
|
||||
console.log(false);
|
||||
fs.writeFileSync("/home/user/OpenProject.txt", "");
|
||||
}
|
||||
});
|
||||
|
||||
let GetColorTheme = vscode.commands.registerCommand('eval.GetColorTheme', () => {
|
||||
console.log(vscode.window.activeColorTheme.kind == 2);
|
||||
fs.writeFileSync("/home/user/GetColorTheme.txt", String(vscode.window.activeColorTheme.kind)); // ==2
|
||||
});
|
||||
|
||||
let GetBreakPoint = vscode.commands.registerCommand('eval.GetBreakPoint', () => {
|
||||
console.log(vscode.debug.breakpoints.length == 1);
|
||||
fs.writeFileSync("/home/user/GetBreakPoint.txt", String(vscode.debug.breakpoints.length)); // ==1
|
||||
});
|
||||
|
||||
context.subscriptions.push(OpenProject, GetColorTheme, GetBreakPoint);
|
||||
|
||||
Reference in New Issue
Block a user