Merge pull request #1176 from napi-rs/remove-thread-local
Remove `thread_local!` usage, add electron test
This commit is contained in:
commit
5ecf16e5ad
21 changed files with 678 additions and 131 deletions
15
.github/workflows/test.yaml
vendored
15
.github/workflows/test.yaml
vendored
|
@ -2,6 +2,7 @@ name: macOS/Windows/Linux x64
|
|||
|
||||
env:
|
||||
DEBUG: 'napi:*'
|
||||
RUST_BACKTRACE: 1
|
||||
|
||||
on:
|
||||
push:
|
||||
|
@ -69,5 +70,15 @@ jobs:
|
|||
yarn build:test
|
||||
yarn test --verbose
|
||||
yarn tsc -p examples/napi/tsconfig.json --noEmit
|
||||
env:
|
||||
RUST_BACKTRACE: 1
|
||||
|
||||
- name: Electron tests
|
||||
if: matrix.os != 'ubuntu-latest'
|
||||
run: |
|
||||
node ./node_modules/electron/install.js
|
||||
yarn test:electron
|
||||
|
||||
- name: Electron tests
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
run: |
|
||||
node ./node_modules/electron/install.js
|
||||
xvfb-run --auto-servernum yarn test:electron
|
||||
|
|
2
.github/workflows/windows-i686.yml
vendored
2
.github/workflows/windows-i686.yml
vendored
|
@ -73,5 +73,7 @@ jobs:
|
|||
yarn workspace compat-mode-examples build-i686 --release
|
||||
yarn workspace examples build-i686 --release
|
||||
yarn test --verbose
|
||||
node ./node_modules/electron/install.js
|
||||
yarn test:electron
|
||||
env:
|
||||
RUST_BACKTRACE: 1
|
||||
|
|
|
@ -49,7 +49,8 @@ impl TryToTokens for NapiFn {
|
|||
quote! {
|
||||
// constructor function is called from class `factory`
|
||||
// so we should skip the original `constructor` logic
|
||||
if napi::bindgen_prelude::___CALL_FROM_FACTORY.with(|inner| inner.load(std::sync::atomic::Ordering::Relaxed)) {
|
||||
let inner = napi::__private::___CALL_FROM_FACTORY.get_or_default();
|
||||
if inner.load(std::sync::atomic::Ordering::Relaxed) {
|
||||
return std::ptr::null_mut();
|
||||
}
|
||||
napi::bindgen_prelude::CallbackInfo::<#args_len>::new(env, cb, None).and_then(|mut cb| {
|
||||
|
|
|
@ -276,12 +276,14 @@ impl NapiStruct {
|
|||
)?;
|
||||
|
||||
let mut result = std::ptr::null_mut();
|
||||
napi::bindgen_prelude::___CALL_FROM_FACTORY.with(|inner| inner.store(true, std::sync::atomic::Ordering::Relaxed));
|
||||
let inner = napi::__private::___CALL_FROM_FACTORY.get_or_default();
|
||||
inner.store(true, std::sync::atomic::Ordering::Relaxed);
|
||||
napi::check_status!(
|
||||
napi::sys::napi_new_instance(env, ctor, 0, std::ptr::null_mut(), &mut result),
|
||||
"Failed to construct class `{}`",
|
||||
#js_name_raw
|
||||
)?;
|
||||
inner.store(false, std::sync::atomic::Ordering::Relaxed);
|
||||
let mut object_ref = std::ptr::null_mut();
|
||||
let initial_finalize: Box<dyn FnOnce()> = Box::new(|| {});
|
||||
let finalize_callbacks_ptr = std::rc::Rc::into_raw(std::rc::Rc::new(std::cell::Cell::new(Box::into_raw(initial_finalize))));
|
||||
|
@ -298,7 +300,6 @@ impl NapiStruct {
|
|||
#js_name_raw
|
||||
)?;
|
||||
napi::bindgen_prelude::Reference::<#name>::add_ref(wrapped_value, (wrapped_value, object_ref, finalize_callbacks_ptr));
|
||||
napi::bindgen_prelude::___CALL_FROM_FACTORY.with(|inner| inner.store(false, std::sync::atomic::Ordering::Relaxed));
|
||||
Ok(result)
|
||||
}
|
||||
}
|
||||
|
@ -316,6 +317,7 @@ impl NapiStruct {
|
|||
|
||||
fn gen_to_napi_value_ctor_impl(&self) -> TokenStream {
|
||||
let name = &self.name;
|
||||
let js_name_without_null = &self.js_name;
|
||||
let js_name_str = format!("{}\0", &self.js_name);
|
||||
|
||||
let mut field_conversions = vec![];
|
||||
|
@ -362,7 +364,7 @@ impl NapiStruct {
|
|||
napi::bindgen_prelude::check_status!(
|
||||
napi::bindgen_prelude::sys::napi_get_reference_value(env, ctor_ref, &mut ctor),
|
||||
"Failed to get constructor reference of class `{}`",
|
||||
#js_name_str
|
||||
#js_name_without_null
|
||||
)?;
|
||||
|
||||
let mut instance_value = std::ptr::null_mut();
|
||||
|
@ -372,7 +374,7 @@ impl NapiStruct {
|
|||
napi::bindgen_prelude::check_status!(
|
||||
napi::bindgen_prelude::sys::napi_new_instance(env, ctor, args.len(), args.as_ptr(), &mut instance_value),
|
||||
"Failed to construct class `{}`",
|
||||
#js_name_str
|
||||
#js_name_without_null
|
||||
)?;
|
||||
|
||||
Ok(instance_value)
|
||||
|
|
|
@ -2,8 +2,7 @@ mod macos;
|
|||
|
||||
pub fn setup() {
|
||||
println!("cargo:rerun-if-env-changed=DEBUG_GENERATED_CODE");
|
||||
match std::env::var("CARGO_CFG_TARGET_OS").as_deref() {
|
||||
Ok("macos") => macos::setup(),
|
||||
_ => {}
|
||||
if let Ok("macos") = std::env::var("CARGO_CFG_TARGET_OS").as_deref() {
|
||||
macos::setup();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ tokio_time = ["tokio/time"]
|
|||
[dependencies]
|
||||
ctor = "0.1"
|
||||
lazy_static = "1"
|
||||
thread_local = "1"
|
||||
|
||||
[dependencies.napi-sys]
|
||||
version = "2.1.1"
|
||||
|
|
|
@ -4,12 +4,15 @@ use std::ptr;
|
|||
use std::rc::Rc;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
use thread_local::ThreadLocal;
|
||||
|
||||
use crate::{bindgen_prelude::*, check_status, sys, Result};
|
||||
|
||||
thread_local! {
|
||||
lazy_static! {
|
||||
#[doc(hidden)]
|
||||
/// Determined is `constructor` called from Class `factory`
|
||||
pub static ___CALL_FROM_FACTORY: AtomicBool = AtomicBool::new(false);
|
||||
pub static ref ___CALL_FROM_FACTORY: ThreadLocal<AtomicBool> = ThreadLocal::new();
|
||||
}
|
||||
|
||||
pub struct CallbackInfo<const N: usize> {
|
||||
|
@ -113,9 +116,10 @@ impl<const N: usize> CallbackInfo<N> {
|
|||
let this = self.this();
|
||||
let mut instance = ptr::null_mut();
|
||||
unsafe {
|
||||
___CALL_FROM_FACTORY.with(|inner| inner.store(true, Ordering::Relaxed));
|
||||
let inner = ___CALL_FROM_FACTORY.get_or_default();
|
||||
inner.store(true, Ordering::Relaxed);
|
||||
let status = sys::napi_new_instance(self.env, this, 0, ptr::null_mut(), &mut instance);
|
||||
___CALL_FROM_FACTORY.with(|inner| inner.store(false, Ordering::Relaxed));
|
||||
inner.store(false, Ordering::Relaxed);
|
||||
// Error thrown in `constructor`
|
||||
if status == sys::Status::napi_pending_exception {
|
||||
let mut exception = ptr::null_mut();
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
use std::cell::RefCell;
|
||||
use std::ptr;
|
||||
|
||||
use crate::{check_status, sys, JsGlobal, JsNull, JsUndefined, NapiValue, Result};
|
||||
|
@ -7,11 +6,6 @@ use super::Array;
|
|||
|
||||
pub use crate::Env;
|
||||
|
||||
thread_local! {
|
||||
static JS_UNDEFINED: RefCell<Option<JsUndefined>> = RefCell::default();
|
||||
static JS_NULL: RefCell<Option<JsNull>> = RefCell::default();
|
||||
}
|
||||
|
||||
impl Env {
|
||||
pub fn create_array(&self, len: u32) -> Result<Array> {
|
||||
Array::new(self.0, len)
|
||||
|
@ -19,26 +13,16 @@ impl Env {
|
|||
|
||||
/// Get [JsUndefined](./struct.JsUndefined.html) value
|
||||
pub fn get_undefined(&self) -> Result<JsUndefined> {
|
||||
if let Some(js_undefined) = JS_UNDEFINED.with(|x| *x.borrow()) {
|
||||
return Ok(js_undefined);
|
||||
}
|
||||
let mut raw_value = ptr::null_mut();
|
||||
check_status!(unsafe { sys::napi_get_undefined(self.0, &mut raw_value) })?;
|
||||
let js_undefined = unsafe { JsUndefined::from_raw_unchecked(self.0, raw_value) };
|
||||
JS_UNDEFINED.with(|x| x.borrow_mut().replace(js_undefined));
|
||||
Ok(js_undefined)
|
||||
}
|
||||
|
||||
pub fn get_null(&self) -> Result<JsNull> {
|
||||
if let Some(js_null) = JS_NULL.with(|cell| *cell.borrow()) {
|
||||
return Ok(js_null);
|
||||
}
|
||||
let mut raw_value = ptr::null_mut();
|
||||
check_status!(unsafe { sys::napi_get_null(self.0, &mut raw_value) })?;
|
||||
let js_null = unsafe { JsNull::from_raw_unchecked(self.0, raw_value) };
|
||||
JS_NULL.with(|js_null_cell| {
|
||||
js_null_cell.borrow_mut().replace(js_null);
|
||||
});
|
||||
Ok(js_null)
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
use std::cell::{Cell, RefCell};
|
||||
use std::collections::HashMap;
|
||||
use std::cell::Cell;
|
||||
use std::ffi::c_void;
|
||||
use std::ops::{Deref, DerefMut};
|
||||
use std::rc::Rc;
|
||||
|
||||
use crate::{bindgen_runtime::ToNapiValue, check_status, Env, Error, Result, Status};
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
use crate::{
|
||||
bindgen_runtime::{PersistedSingleThreadHashMap, ToNapiValue},
|
||||
check_status, Env, Error, Result, Status,
|
||||
};
|
||||
|
||||
type RefInformation = (
|
||||
*mut c_void,
|
||||
|
@ -12,8 +16,9 @@ type RefInformation = (
|
|||
*const Cell<*mut dyn FnOnce()>,
|
||||
);
|
||||
|
||||
thread_local! {
|
||||
pub(crate) static REFERENCE_MAP: RefCell<HashMap<*mut c_void, RefInformation>> = Default::default();
|
||||
lazy_static! {
|
||||
pub(crate) static ref REFERENCE_MAP: PersistedSingleThreadHashMap<*mut c_void, RefInformation> =
|
||||
Default::default();
|
||||
}
|
||||
|
||||
/// ### Experimental feature
|
||||
|
@ -57,15 +62,15 @@ impl<T> Drop for Reference<T> {
|
|||
impl<T: 'static> Reference<T> {
|
||||
#[doc(hidden)]
|
||||
pub fn add_ref(t: *mut c_void, value: RefInformation) {
|
||||
REFERENCE_MAP.with(|map| {
|
||||
map.borrow_mut().insert(t, value);
|
||||
REFERENCE_MAP.borrow_mut(|map| {
|
||||
map.insert(t, value);
|
||||
});
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
pub unsafe fn from_value_ptr(t: *mut c_void, env: crate::sys::napi_env) -> Result<Self> {
|
||||
if let Some((wrapped_value, napi_ref, finalize_callbacks_ptr)) =
|
||||
REFERENCE_MAP.with(|map| map.borrow().get(&t).cloned())
|
||||
REFERENCE_MAP.borrow_mut(|map| map.get(&t).cloned())
|
||||
{
|
||||
check_status!(
|
||||
unsafe { crate::sys::napi_reference_ref(env, napi_ref, &mut 0) },
|
||||
|
|
|
@ -30,7 +30,7 @@ pub unsafe extern "C" fn raw_finalize_unchecked<T>(
|
|||
) {
|
||||
unsafe { Box::from_raw(finalize_data as *mut T) };
|
||||
if let Some((_, ref_val, finalize_callbacks_ptr)) =
|
||||
REFERENCE_MAP.with(|reference_map| reference_map.borrow_mut().remove(&finalize_data))
|
||||
REFERENCE_MAP.borrow_mut(|reference_map| reference_map.remove(&finalize_data))
|
||||
{
|
||||
let finalize_callbacks_rc = unsafe { Rc::from_raw(finalize_callbacks_ptr) };
|
||||
|
||||
|
|
|
@ -1,11 +1,9 @@
|
|||
use std::cell::RefCell;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
#[cfg(all(feature = "tokio_rt", feature = "napi4"))]
|
||||
use std::ffi::c_void;
|
||||
use std::ffi::CStr;
|
||||
use std::mem;
|
||||
use std::ptr;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use std::sync::atomic::{AtomicBool, AtomicPtr};
|
||||
use std::sync::{atomic::Ordering, Mutex};
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
|
@ -56,11 +54,11 @@ impl<T> PersistedSingleThreadVec<T> {
|
|||
unsafe impl<T> Send for PersistedSingleThreadVec<T> {}
|
||||
unsafe impl<T> Sync for PersistedSingleThreadVec<T> {}
|
||||
|
||||
struct PersistedSingleThreadHashMap<K, V>(Mutex<HashMap<K, V>>);
|
||||
pub(crate) struct PersistedSingleThreadHashMap<K, V>(Mutex<HashMap<K, V>>);
|
||||
|
||||
impl<K, V> PersistedSingleThreadHashMap<K, V> {
|
||||
#[allow(clippy::mut_from_ref)]
|
||||
fn borrow_mut<F, R>(&self, f: F) -> R
|
||||
pub(crate) fn borrow_mut<F, R>(&self, f: F) -> R
|
||||
where
|
||||
F: FnOnce(&mut HashMap<K, V>) -> R,
|
||||
{
|
||||
|
@ -89,11 +87,17 @@ type ModuleClassProperty = PersistedSingleThreadHashMap<
|
|||
unsafe impl<K, V> Send for PersistedSingleThreadHashMap<K, V> {}
|
||||
unsafe impl<K, V> Sync for PersistedSingleThreadHashMap<K, V> {}
|
||||
|
||||
type FnRegisterMap =
|
||||
PersistedSingleThreadHashMap<ExportRegisterCallback, (sys::napi_callback, &'static str)>;
|
||||
|
||||
lazy_static! {
|
||||
static ref MODULE_REGISTER_CALLBACK: ModuleRegisterCallback = Default::default();
|
||||
static ref MODULE_CLASS_PROPERTIES: ModuleClassProperty = Default::default();
|
||||
static ref MODULE_REGISTER_LOCK: Mutex<()> = Mutex::new(());
|
||||
static ref REGISTERED: AtomicBool = AtomicBool::new(false);
|
||||
static ref REGISTERED_CLASSES: thread_local::ThreadLocal<AtomicPtr<RegisteredClasses>> =
|
||||
thread_local::ThreadLocal::new();
|
||||
static ref FN_REGISTER_MAP: FnRegisterMap = Default::default();
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
@ -103,27 +107,22 @@ fn wait_first_thread_registered() {
|
|||
}
|
||||
}
|
||||
|
||||
type RegisteredClasses =
|
||||
HashMap</* export name */ String, /* constructor */ sys::napi_ref>;
|
||||
|
||||
#[cfg(feature = "compat-mode")]
|
||||
// compatibility for #[module_exports]
|
||||
lazy_static! {
|
||||
static ref MODULE_EXPORTS: PersistedSingleThreadVec<ModuleExportsCallback> = Default::default();
|
||||
}
|
||||
|
||||
thread_local! {
|
||||
static REGISTERED_CLASSES: RefCell<HashMap<
|
||||
/* export name */ String,
|
||||
/* constructor */ sys::napi_ref,
|
||||
>> = Default::default();
|
||||
static FN_REGISTER_MAP: RefCell<HashMap<ExportRegisterCallback, (sys::napi_callback, String)>> = Default::default();
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
pub fn get_class_constructor(js_name: &'static str) -> Option<sys::napi_ref> {
|
||||
wait_first_thread_registered();
|
||||
REGISTERED_CLASSES.with(|registered_classes| {
|
||||
let classes = registered_classes.borrow();
|
||||
classes.get(js_name).copied()
|
||||
})
|
||||
let registered_classes = REGISTERED_CLASSES.get().unwrap();
|
||||
let registered_classes =
|
||||
Box::leak(unsafe { Box::from_raw(registered_classes.load(Ordering::Relaxed)) });
|
||||
registered_classes.get(js_name).copied()
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
|
@ -148,8 +147,8 @@ pub fn register_js_function(
|
|||
cb: ExportRegisterCallback,
|
||||
c_fn: sys::napi_callback,
|
||||
) {
|
||||
FN_REGISTER_MAP.with(|inner| {
|
||||
inner.borrow_mut().insert(cb, (c_fn, name.to_owned()));
|
||||
FN_REGISTER_MAP.borrow_mut(|inner| {
|
||||
inner.insert(cb, (c_fn, name));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -188,9 +187,8 @@ pub fn register_class(
|
|||
///
|
||||
pub fn get_js_function(env: &Env, raw_fn: ExportRegisterCallback) -> Result<JsFunction> {
|
||||
wait_first_thread_registered();
|
||||
FN_REGISTER_MAP.with(|inner| {
|
||||
FN_REGISTER_MAP.borrow_mut(|inner| {
|
||||
inner
|
||||
.borrow()
|
||||
.get(&raw_fn)
|
||||
.and_then(|(cb, name)| {
|
||||
let mut function = ptr::null_mut();
|
||||
|
@ -243,9 +241,8 @@ pub fn get_js_function(env: &Env, raw_fn: ExportRegisterCallback) -> Result<JsFu
|
|||
///
|
||||
pub fn get_c_callback(raw_fn: ExportRegisterCallback) -> Result<crate::Callback> {
|
||||
wait_first_thread_registered();
|
||||
FN_REGISTER_MAP.with(|inner| {
|
||||
FN_REGISTER_MAP.borrow_mut(|inner| {
|
||||
inner
|
||||
.borrow()
|
||||
.get(&raw_fn)
|
||||
.and_then(|(cb, _name)| *cb)
|
||||
.ok_or_else(|| {
|
||||
|
@ -266,6 +263,8 @@ unsafe extern "C" fn napi_register_module_v1(
|
|||
unsafe {
|
||||
sys::setup();
|
||||
}
|
||||
crate::__private::___CALL_FROM_FACTORY.get_or_default();
|
||||
let registered_classes_ptr = REGISTERED_CLASSES.get_or_default();
|
||||
let lock = MODULE_REGISTER_LOCK
|
||||
.lock()
|
||||
.expect("Failed to acquire module register lock");
|
||||
|
@ -344,6 +343,9 @@ unsafe extern "C" fn napi_register_module_v1(
|
|||
})
|
||||
});
|
||||
|
||||
let mut registered_classes: RegisteredClasses =
|
||||
HashMap::with_capacity(MODULE_CLASS_PROPERTIES.borrow_mut(|inner| inner.len()));
|
||||
|
||||
MODULE_CLASS_PROPERTIES.borrow_mut(|inner| {
|
||||
inner.iter().for_each(|(rust_name, js_mods)| {
|
||||
for (js_mod, (js_name, props)) in js_mods {
|
||||
|
@ -407,10 +409,7 @@ unsafe extern "C" fn napi_register_module_v1(
|
|||
let mut ctor_ref = ptr::null_mut();
|
||||
sys::napi_create_reference(env, class_ptr, 1, &mut ctor_ref);
|
||||
|
||||
REGISTERED_CLASSES.with(|registered_classes| {
|
||||
let mut registered_class = registered_classes.borrow_mut();
|
||||
registered_class.insert(js_name.to_string(), ctor_ref);
|
||||
});
|
||||
registered_classes.insert(js_name.to_string(), ctor_ref);
|
||||
|
||||
check_status_or_throw!(
|
||||
env,
|
||||
|
@ -430,7 +429,11 @@ unsafe extern "C" fn napi_register_module_v1(
|
|||
);
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
registered_classes_ptr.store(
|
||||
Box::into_raw(Box::new(registered_classes)),
|
||||
Ordering::Relaxed,
|
||||
);
|
||||
});
|
||||
|
||||
#[cfg(feature = "compat-mode")]
|
||||
|
@ -462,7 +465,8 @@ pub(crate) unsafe extern "C" fn noop(
|
|||
env: sys::napi_env,
|
||||
_info: sys::napi_callback_info,
|
||||
) -> sys::napi_value {
|
||||
if !crate::bindgen_runtime::___CALL_FROM_FACTORY.with(|inner| inner.load(Ordering::Relaxed)) {
|
||||
let inner = crate::bindgen_runtime::___CALL_FROM_FACTORY.get_or_default();
|
||||
if !inner.load(Ordering::Relaxed) {
|
||||
unsafe {
|
||||
sys::napi_throw_error(
|
||||
env,
|
||||
|
|
|
@ -75,7 +75,6 @@
|
|||
|
||||
#[cfg(feature = "napi8")]
|
||||
mod async_cleanup_hook;
|
||||
|
||||
#[cfg(feature = "napi8")]
|
||||
pub use async_cleanup_hook::AsyncCleanupHook;
|
||||
mod async_work;
|
||||
|
@ -86,7 +85,6 @@ mod cleanup_env;
|
|||
mod env;
|
||||
mod error;
|
||||
mod js_values;
|
||||
|
||||
#[cfg(all(feature = "tokio_rt", feature = "napi4"))]
|
||||
mod promise;
|
||||
mod status;
|
||||
|
@ -169,7 +167,7 @@ pub mod bindgen_prelude {
|
|||
#[doc(hidden)]
|
||||
pub mod __private {
|
||||
pub use crate::bindgen_runtime::{
|
||||
get_class_constructor, iterator::create_iterator, register_class,
|
||||
get_class_constructor, iterator::create_iterator, register_class, ___CALL_FROM_FACTORY,
|
||||
};
|
||||
|
||||
use crate::sys;
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
//! The following directly was copied from [neon][].
|
||||
//!
|
||||
//! Rust port of [win_delay_load_hook.cc][].
|
||||
//!
|
||||
//! When the addon tries to load the "node.exe" DLL module, this module gives it the pointer to the
|
||||
//! .exe we are running in instead. Typically, that will be the same value. But if the node executable
|
||||
//! was renamed, you would not otherwise get the correct DLL.
|
||||
//!
|
||||
//! [neon]: https://github.com/neon-bindings/neon/blob/5ffa2d282177b63094c46e92b20b8e850d122e65/src/win_delay_load_hook.rs
|
||||
//! [win_delay_load_hook.cc]: https://github.com/nodejs/node-gyp/blob/e18a61afc1669d4897e6c5c8a6694f4995a0f4d6/src/win_delay_load_hook.cc
|
||||
|
||||
use std::ffi::CStr;
|
||||
use std::os::raw::c_char;
|
||||
|
||||
use windows::core::PCSTR;
|
||||
use windows::Win32::Foundation::HINSTANCE;
|
||||
use windows::Win32::System::LibraryLoader::GetModuleHandleA;
|
||||
use windows::Win32::System::WindowsProgramming::{DELAYLOAD_INFO, PDELAYLOAD_FAILURE_DLL_CALLBACK};
|
||||
|
||||
// Structures hand-copied from
|
||||
// https://docs.microsoft.com/en-us/cpp/build/reference/structure-and-constant-definitions
|
||||
|
||||
const HOST_BINARIES: &[&[u8]] = &[b"node.exe", b"electron.exe"];
|
||||
|
||||
unsafe extern "C" fn load_exe_hook(event: u32, info: *const DELAYLOAD_INFO) -> HINSTANCE {
|
||||
if event != 0x01
|
||||
/* dliNotePreLoadLibrary */
|
||||
{
|
||||
return HINSTANCE::default();
|
||||
}
|
||||
|
||||
let dll_name = unsafe { CStr::from_ptr((*info).TargetDllName.0 as *mut i8) };
|
||||
if !HOST_BINARIES
|
||||
.iter()
|
||||
.any(|&host_name| host_name == dll_name.to_bytes())
|
||||
{
|
||||
return HINSTANCE::default();
|
||||
}
|
||||
|
||||
match unsafe { GetModuleHandleA(PCSTR::default()) } {
|
||||
Ok(h) => h,
|
||||
Err(e) => unsafe {
|
||||
let location = "win_delay_load_hook.rs\0";
|
||||
let err = format!("{}", e);
|
||||
crate::sys::napi_fatal_error(
|
||||
location.as_ptr() as *const c_char,
|
||||
22,
|
||||
format!("{}\0", err).as_ptr() as *const c_char,
|
||||
err.len(),
|
||||
);
|
||||
unreachable!();
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
static mut __pfnDliNotifyHook2: *mut PDELAYLOAD_FAILURE_DLL_CALLBACK =
|
||||
load_exe_hook as *mut PDELAYLOAD_FAILURE_DLL_CALLBACK;
|
|
@ -35,7 +35,19 @@ macro_rules! generate {
|
|||
) -> Result<(), libloading::Error> {
|
||||
NAPI = Napi {
|
||||
$(
|
||||
$name: *host.get(stringify!($name).as_bytes())?,
|
||||
$name: {
|
||||
let symbol: Result<libloading::Symbol<unsafe extern "C" fn ($(_: $ptype,)*)$( -> $rtype)*>, libloading::Error> = host.get(stringify!($name).as_bytes());
|
||||
match symbol {
|
||||
Ok(f) => *f,
|
||||
Err(e) => {
|
||||
debug_assert!({
|
||||
println!("Load Node-API [{}] from host runtime failed: {}", stringify!($name), e);
|
||||
true
|
||||
});
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
},
|
||||
)*
|
||||
};
|
||||
|
||||
|
@ -44,6 +56,7 @@ macro_rules! generate {
|
|||
|
||||
$(
|
||||
#[inline]
|
||||
#[allow(clippy::missing_safety_doc)]
|
||||
pub unsafe fn $name($($param: $ptype,)*)$( -> $rtype)* {
|
||||
(NAPI.$name)($($param,)*)
|
||||
}
|
||||
|
@ -81,6 +94,7 @@ static SETUP: Once = Once::new();
|
|||
/// they will panic.
|
||||
/// Safety: `env` must be a valid `napi_env` for the current thread
|
||||
#[cfg(windows)]
|
||||
#[allow(clippy::missing_safety_doc)]
|
||||
pub unsafe fn setup() {
|
||||
SETUP.call_once(|| {
|
||||
if let Err(err) = load() {
|
||||
|
|
|
@ -26,6 +26,7 @@ Generated by [AVA](https://avajs.dev).
|
|||
'c8',
|
||||
'colorette',
|
||||
'cross-env',
|
||||
'electron',
|
||||
'esbuild',
|
||||
'eslint',
|
||||
'eslint-config-prettier',
|
||||
|
|
Binary file not shown.
52
examples/napi/electron.js
Normal file
52
examples/napi/electron.js
Normal file
|
@ -0,0 +1,52 @@
|
|||
const assert = require('assert')
|
||||
const { readFileSync } = require('fs')
|
||||
|
||||
const {
|
||||
readFileAsync,
|
||||
callThreadsafeFunction,
|
||||
withAbortController,
|
||||
} = require('./index')
|
||||
|
||||
const FILE_CONTENT = readFileSync(__filename, 'utf8')
|
||||
|
||||
async function main() {
|
||||
const ctrl = new AbortController()
|
||||
const promise = withAbortController(1, 2, ctrl.signal)
|
||||
try {
|
||||
ctrl.abort()
|
||||
await promise
|
||||
throw new Error('Should throw AbortError')
|
||||
} catch (err) {
|
||||
assert(err.message === 'AbortError')
|
||||
}
|
||||
|
||||
const buf = await readFileAsync(__filename)
|
||||
assert(FILE_CONTENT === buf.toString('utf8'))
|
||||
|
||||
const value = await new Promise((resolve, reject) => {
|
||||
let i = 0
|
||||
let value = 0
|
||||
callThreadsafeFunction((err, v) => {
|
||||
if (err != null) {
|
||||
reject(err)
|
||||
return
|
||||
}
|
||||
i++
|
||||
value += v
|
||||
if (i === 100) {
|
||||
resolve(value)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
assert(
|
||||
value ===
|
||||
Array.from({ length: 100 }, (_, i) => i + 1).reduce((a, b) => a + b),
|
||||
)
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
main().catch((e) => {
|
||||
console.error(e)
|
||||
process.exit(1)
|
||||
})
|
|
@ -7,5 +7,5 @@
|
|||
"target": "ES2018",
|
||||
"skipLibCheck": false
|
||||
},
|
||||
"exclude": ["dist"]
|
||||
"exclude": ["dist", "electron.js"]
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
"lint": "eslint -c .eslintrc.yml .",
|
||||
"prepublishOnly": "npm run build && pinst --disable",
|
||||
"test": "ava \"./examples/napi/**/*.ts\" && ava --no-worker-threads \"./examples/napi-compat-mode/**/*.ts\" && ava \"./cli/**/*.ts\"",
|
||||
"test:electron": "electron examples/napi/electron.js",
|
||||
"test:memory": "node memory-testing/index.mjs",
|
||||
"postinstall": "husky install",
|
||||
"postpublish": "pinst --enable"
|
||||
|
@ -87,6 +88,7 @@
|
|||
"c8": "^7.11.2",
|
||||
"colorette": "^2.0.16",
|
||||
"cross-env": "^7.0.3",
|
||||
"electron": "^18.2.0",
|
||||
"esbuild": "^0.14.38",
|
||||
"eslint": "^8.14.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
|
|
525
yarn.lock
525
yarn.lock
|
@ -99,6 +99,28 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@electron/get@npm:^1.13.0":
|
||||
version: 1.14.1
|
||||
resolution: "@electron/get@npm:1.14.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2F%40electron%2Fget%2F-%2Fget-1.14.1.tgz"
|
||||
dependencies:
|
||||
debug: ^4.1.1
|
||||
env-paths: ^2.2.0
|
||||
fs-extra: ^8.1.0
|
||||
global-agent: ^3.0.0
|
||||
global-tunnel-ng: ^2.7.1
|
||||
got: ^9.6.0
|
||||
progress: ^2.0.3
|
||||
semver: ^6.2.0
|
||||
sumchecker: ^3.0.1
|
||||
dependenciesMeta:
|
||||
global-agent:
|
||||
optional: true
|
||||
global-tunnel-ng:
|
||||
optional: true
|
||||
checksum: 21fec5e82bbee8f9fa183b46e05675b137c3130c7999d3b2b34a0047d1a06ec3c76347b9bbdb9911ba9b2123697804e360a15dda9db614c0226d5d4dcc4d6d15
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@eslint/eslintrc@npm:^1.2.2":
|
||||
version: 1.2.2
|
||||
resolution: "@eslint/eslintrc@npm:1.2.2"
|
||||
|
@ -1347,6 +1369,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sindresorhus/is@npm:^0.14.0":
|
||||
version: 0.14.0
|
||||
resolution: "@sindresorhus/is@npm:0.14.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2F%40sindresorhus%2Fis%2F-%2Fis-0.14.0.tgz"
|
||||
checksum: 971e0441dd44ba3909b467219a5e242da0fc584048db5324cfb8048148fa8dcc9d44d71e3948972c4f6121d24e5da402ef191420d1266a95f713bb6d6e59c98a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@sinonjs/commons@npm:^1.6.0, @sinonjs/commons@npm:^1.7.0, @sinonjs/commons@npm:^1.8.3":
|
||||
version: 1.8.3
|
||||
resolution: "@sinonjs/commons@npm:1.8.3"
|
||||
|
@ -1383,6 +1412,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@szmarczak/http-timer@npm:^1.1.2":
|
||||
version: 1.1.2
|
||||
resolution: "@szmarczak/http-timer@npm:1.1.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2F%40szmarczak%2Fhttp-timer%2F-%2Fhttp-timer-1.1.2.tgz"
|
||||
dependencies:
|
||||
defer-to-connect: ^1.0.1
|
||||
checksum: 4d9158061c5f397c57b4988cde33a163244e4f02df16364f103971957a32886beb104d6180902cbe8b38cb940e234d9f98a4e486200deca621923f62f50a06fe
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@taplo/cli@npm:^0.3.2":
|
||||
version: 0.3.2
|
||||
resolution: "@taplo/cli@npm:0.3.2"
|
||||
|
@ -1518,6 +1556,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/keyv@npm:^3.1.1":
|
||||
version: 3.1.4
|
||||
resolution: "@types/keyv@npm:3.1.4::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fkeyv%2F-%2Fkeyv-3.1.4.tgz"
|
||||
dependencies:
|
||||
"@types/node": "*"
|
||||
checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/lodash-es@npm:^4.17.6":
|
||||
version: 4.17.6
|
||||
resolution: "@types/lodash-es@npm:4.17.6"
|
||||
|
@ -1562,6 +1609,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^16.11.26":
|
||||
version: 16.11.33
|
||||
resolution: "@types/node@npm:16.11.33::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fnode%2F-%2Fnode-16.11.33.tgz"
|
||||
checksum: 5c86d3f1e3b996607b41405d368d2e19d410eee0054595cef73d230368a609a2863926e75ad19f5091f0fd742cd018b667d54c51292018dd8020a202a5b29fa9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/normalize-package-data@npm:^2.4.0":
|
||||
version: 2.4.1
|
||||
resolution: "@types/normalize-package-data@npm:2.4.1"
|
||||
|
@ -1585,6 +1639,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/responselike@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "@types/responselike@npm:1.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2F%40types%2Fresponselike%2F-%2Fresponselike-1.0.0.tgz"
|
||||
dependencies:
|
||||
"@types/node": "*"
|
||||
checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/sinon@npm:^10.0.11":
|
||||
version: 10.0.11
|
||||
resolution: "@types/sinon@npm:10.0.11"
|
||||
|
@ -2278,6 +2341,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"boolean@npm:^3.0.1":
|
||||
version: 3.2.0
|
||||
resolution: "boolean@npm:3.2.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fboolean%2F-%2Fboolean-3.2.0.tgz"
|
||||
checksum: fb29535b8bf710ef45279677a86d14f5185d604557204abd2ca5fa3fb2a5c80e04d695c8dbf13ab269991977a79bb6c04b048220a6b2a3849853faa94f4a7d77
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"brace-expansion@npm:^1.1.7":
|
||||
version: 1.1.11
|
||||
resolution: "brace-expansion@npm:1.1.11"
|
||||
|
@ -2306,6 +2376,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"buffer-crc32@npm:~0.2.3":
|
||||
version: 0.2.13
|
||||
resolution: "buffer-crc32@npm:0.2.13::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fbuffer-crc32%2F-%2Fbuffer-crc32-0.2.13.tgz"
|
||||
checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"buffer-from@npm:^1.0.0":
|
||||
version: 1.1.2
|
||||
resolution: "buffer-from@npm:1.1.2"
|
||||
|
@ -2432,6 +2509,21 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cacheable-request@npm:^6.0.0":
|
||||
version: 6.1.0
|
||||
resolution: "cacheable-request@npm:6.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fcacheable-request%2F-%2Fcacheable-request-6.1.0.tgz"
|
||||
dependencies:
|
||||
clone-response: ^1.0.2
|
||||
get-stream: ^5.1.0
|
||||
http-cache-semantics: ^4.0.0
|
||||
keyv: ^3.0.0
|
||||
lowercase-keys: ^2.0.0
|
||||
normalize-url: ^4.1.0
|
||||
responselike: ^1.0.2
|
||||
checksum: b510b237b18d17e89942e9ee2d2a077cb38db03f12167fd100932dfa8fc963424bfae0bfa1598df4ae16c944a5484e43e03df8f32105b04395ee9495e9e4e9f1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "call-bind@npm:1.0.2"
|
||||
|
@ -2685,6 +2777,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"clone-response@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "clone-response@npm:1.0.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fclone-response%2F-%2Fclone-response-1.0.2.tgz"
|
||||
dependencies:
|
||||
mimic-response: ^1.0.0
|
||||
checksum: 2d0e61547fc66276e0903be9654ada422515f5a15741691352000d47e8c00c226061221074ce2c0064d12e975e84a8687cfd35d8b405750cb4e772f87b256eda
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"clone@npm:^1.0.2":
|
||||
version: 1.0.4
|
||||
resolution: "clone@npm:1.0.4"
|
||||
|
@ -2842,6 +2943,18 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"concat-stream@npm:^1.6.2":
|
||||
version: 1.6.2
|
||||
resolution: "concat-stream@npm:1.6.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fconcat-stream%2F-%2Fconcat-stream-1.6.2.tgz"
|
||||
dependencies:
|
||||
buffer-from: ^1.0.0
|
||||
inherits: ^2.0.3
|
||||
readable-stream: ^2.2.2
|
||||
typedarray: ^0.0.6
|
||||
checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"concat-stream@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "concat-stream@npm:2.0.0"
|
||||
|
@ -2870,6 +2983,16 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"config-chain@npm:^1.1.11":
|
||||
version: 1.1.13
|
||||
resolution: "config-chain@npm:1.1.13::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fconfig-chain%2F-%2Fconfig-chain-1.1.13.tgz"
|
||||
dependencies:
|
||||
ini: ^1.3.4
|
||||
proto-list: ~1.2.1
|
||||
checksum: 828137a28e7c2fc4b7fb229bd0cd6c1397bcf83434de54347e608154008f411749041ee392cbe42fab6307e02de4c12480260bf769b7d44b778fdea3839eafab
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"config-chain@npm:^1.1.12":
|
||||
version: 1.1.13
|
||||
resolution: "config-chain@npm:1.1.13"
|
||||
|
@ -3195,6 +3318,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"decompress-response@npm:^3.3.0":
|
||||
version: 3.3.0
|
||||
resolution: "decompress-response@npm:3.3.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fdecompress-response%2F-%2Fdecompress-response-3.3.0.tgz"
|
||||
dependencies:
|
||||
mimic-response: ^1.0.0
|
||||
checksum: 952552ac3bd7de2fc18015086b09468645c9638d98a551305e485230ada278c039c91116e946d07894b39ee53c0f0d5b6473f25a224029344354513b412d7380
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"dedent@npm:^0.7.0":
|
||||
version: 0.7.0
|
||||
resolution: "dedent@npm:0.7.0"
|
||||
|
@ -3225,6 +3357,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"defer-to-connect@npm:^1.0.1":
|
||||
version: 1.1.3
|
||||
resolution: "defer-to-connect@npm:1.1.3::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fdefer-to-connect%2F-%2Fdefer-to-connect-1.1.3.tgz"
|
||||
checksum: 9491b301dcfa04956f989481ba7a43c2231044206269eb4ab64a52d6639ee15b1252262a789eb4239fb46ab63e44d4e408641bae8e0793d640aee55398cb3930
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"define-properties@npm:^1.1.3":
|
||||
version: 1.1.4
|
||||
resolution: "define-properties@npm:1.1.4"
|
||||
|
@ -3293,6 +3432,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"detect-node@npm:^2.0.4":
|
||||
version: 2.1.0
|
||||
resolution: "detect-node@npm:2.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fdetect-node%2F-%2Fdetect-node-2.1.0.tgz"
|
||||
checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"dezalgo@npm:^1.0.0":
|
||||
version: 1.0.4
|
||||
resolution: "dezalgo@npm:1.0.4"
|
||||
|
@ -3384,6 +3530,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"duplexer3@npm:^0.1.4":
|
||||
version: 0.1.4
|
||||
resolution: "duplexer3@npm:0.1.4::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fduplexer3%2F-%2Fduplexer3-0.1.4.tgz"
|
||||
checksum: c2fd6969314607d23439c583699aaa43c4100d66b3e161df55dccd731acc57d5c81a64bb4f250805fbe434ddb1d2623fee2386fb890f5886ca1298690ec53415
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"duplexer@npm:^0.1.1":
|
||||
version: 0.1.2
|
||||
resolution: "duplexer@npm:0.1.2"
|
||||
|
@ -3408,6 +3561,19 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron@npm:^18.2.0":
|
||||
version: 18.2.0
|
||||
resolution: "electron@npm:18.2.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Felectron%2F-%2Felectron-18.2.0.tgz"
|
||||
dependencies:
|
||||
"@electron/get": ^1.13.0
|
||||
"@types/node": ^16.11.26
|
||||
extract-zip: ^1.0.3
|
||||
bin:
|
||||
electron: cli.js
|
||||
checksum: 242169d6e22854248e427326a03910b96311333d5dd57aa0e4cd9cef733aa8c2e893b16269c32514ad325468cdc08c41736d6f1f6791770cad236652fe06662c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"emittery@npm:^0.10.1":
|
||||
version: 0.10.2
|
||||
resolution: "emittery@npm:0.10.2"
|
||||
|
@ -3429,6 +3595,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"encodeurl@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "encodeurl@npm:1.0.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fencodeurl%2F-%2Fencodeurl-1.0.2.tgz"
|
||||
checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"encoding@npm:^0.1.12, encoding@npm:^0.1.13":
|
||||
version: 0.1.13
|
||||
resolution: "encoding@npm:0.1.13"
|
||||
|
@ -3534,6 +3707,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"es6-error@npm:^4.1.1":
|
||||
version: 4.1.1
|
||||
resolution: "es6-error@npm:4.1.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fes6-error%2F-%2Fes6-error-4.1.1.tgz"
|
||||
checksum: ae41332a51ec1323da6bbc5d75b7803ccdeddfae17c41b6166ebbafc8e8beb7a7b80b884b7fab1cc80df485860ac3c59d78605e860bb4f8cd816b3d6ade0d010
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"esbuild-android-64@npm:0.14.38":
|
||||
version: 0.14.38
|
||||
resolution: "esbuild-android-64@npm:0.14.38"
|
||||
|
@ -4064,6 +4244,20 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"extract-zip@npm:^1.0.3":
|
||||
version: 1.7.0
|
||||
resolution: "extract-zip@npm:1.7.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fextract-zip%2F-%2Fextract-zip-1.7.0.tgz"
|
||||
dependencies:
|
||||
concat-stream: ^1.6.2
|
||||
debug: ^2.6.9
|
||||
mkdirp: ^0.5.4
|
||||
yauzl: ^2.10.0
|
||||
bin:
|
||||
extract-zip: cli.js
|
||||
checksum: 011bab660d738614555773d381a6ba4815d98c1cfcdcdf027e154ebcc9fc8c9ef637b3ea5c9b2144013100071ee41722ed041fc9aacc60f6198ef747cac0c073
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"extsprintf@npm:1.3.0":
|
||||
version: 1.3.0
|
||||
resolution: "extsprintf@npm:1.3.0"
|
||||
|
@ -4128,6 +4322,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fd-slicer@npm:~1.1.0":
|
||||
version: 1.1.0
|
||||
resolution: "fd-slicer@npm:1.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Ffd-slicer%2F-%2Ffd-slicer-1.1.0.tgz"
|
||||
dependencies:
|
||||
pend: ~1.2.0
|
||||
checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fdir@npm:^5.2.0":
|
||||
version: 5.2.0
|
||||
resolution: "fdir@npm:5.2.0"
|
||||
|
@ -4281,6 +4484,17 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fs-extra@npm:^8.1.0":
|
||||
version: 8.1.0
|
||||
resolution: "fs-extra@npm:8.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Ffs-extra%2F-%2Ffs-extra-8.1.0.tgz"
|
||||
dependencies:
|
||||
graceful-fs: ^4.2.0
|
||||
jsonfile: ^4.0.0
|
||||
universalify: ^0.1.0
|
||||
checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fs-extra@npm:^9.1.0":
|
||||
version: 9.1.0
|
||||
resolution: "fs-extra@npm:9.1.0"
|
||||
|
@ -4422,6 +4636,24 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"get-stream@npm:^4.1.0":
|
||||
version: 4.1.0
|
||||
resolution: "get-stream@npm:4.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fget-stream%2F-%2Fget-stream-4.1.0.tgz"
|
||||
dependencies:
|
||||
pump: ^3.0.0
|
||||
checksum: 443e1914170c15bd52ff8ea6eff6dfc6d712b031303e36302d2778e3de2506af9ee964d6124010f7818736dcfde05c04ba7ca6cc26883106e084357a17ae7d73
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"get-stream@npm:^5.1.0":
|
||||
version: 5.2.0
|
||||
resolution: "get-stream@npm:5.2.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fget-stream%2F-%2Fget-stream-5.2.0.tgz"
|
||||
dependencies:
|
||||
pump: ^3.0.0
|
||||
checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"get-stream@npm:^6.0.0":
|
||||
version: 6.0.1
|
||||
resolution: "get-stream@npm:6.0.1"
|
||||
|
@ -4559,6 +4791,32 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"global-agent@npm:^3.0.0":
|
||||
version: 3.0.0
|
||||
resolution: "global-agent@npm:3.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fglobal-agent%2F-%2Fglobal-agent-3.0.0.tgz"
|
||||
dependencies:
|
||||
boolean: ^3.0.1
|
||||
es6-error: ^4.1.1
|
||||
matcher: ^3.0.0
|
||||
roarr: ^2.15.3
|
||||
semver: ^7.3.2
|
||||
serialize-error: ^7.0.1
|
||||
checksum: 75074d80733b4bd5386c47f5df028e798018025beac0ab310e9908c72bf5639e408203e7bca0130d5ee01b5f4abc6d34385d96a9f950ea5fe1979bb431c808f7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"global-tunnel-ng@npm:^2.7.1":
|
||||
version: 2.7.1
|
||||
resolution: "global-tunnel-ng@npm:2.7.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fglobal-tunnel-ng%2F-%2Fglobal-tunnel-ng-2.7.1.tgz"
|
||||
dependencies:
|
||||
encodeurl: ^1.0.2
|
||||
lodash: ^4.17.10
|
||||
npm-conf: ^1.1.3
|
||||
tunnel: ^0.0.6
|
||||
checksum: b7e016093eab6058b5fdd8caea31c22dc1a607f0f0b41c001ade5e0227c5d74efe9ce9bae56316d794bc1cedd461a187b8b7e8f0a3eb4d194972cdfb9d860af2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"globals@npm:^13.6.0, globals@npm:^13.9.0":
|
||||
version: 13.13.0
|
||||
resolution: "globals@npm:13.13.0"
|
||||
|
@ -4568,6 +4826,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"globalthis@npm:^1.0.1":
|
||||
version: 1.0.3
|
||||
resolution: "globalthis@npm:1.0.3::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fglobalthis%2F-%2Fglobalthis-1.0.3.tgz"
|
||||
dependencies:
|
||||
define-properties: ^1.1.3
|
||||
checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.0.4":
|
||||
version: 11.1.0
|
||||
resolution: "globby@npm:11.1.0"
|
||||
|
@ -4595,6 +4862,25 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"got@npm:^9.6.0":
|
||||
version: 9.6.0
|
||||
resolution: "got@npm:9.6.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fgot%2F-%2Fgot-9.6.0.tgz"
|
||||
dependencies:
|
||||
"@sindresorhus/is": ^0.14.0
|
||||
"@szmarczak/http-timer": ^1.1.2
|
||||
cacheable-request: ^6.0.0
|
||||
decompress-response: ^3.3.0
|
||||
duplexer3: ^0.1.4
|
||||
get-stream: ^4.1.0
|
||||
lowercase-keys: ^1.0.1
|
||||
mimic-response: ^1.0.1
|
||||
p-cancelable: ^1.0.0
|
||||
to-readable-stream: ^1.0.0
|
||||
url-parse-lax: ^3.0.0
|
||||
checksum: 941807bd9704bacf5eb401f0cc1212ffa1f67c6642f2d028fd75900471c221b1da2b8527f4553d2558f3faeda62ea1cf31665f8b002c6137f5de8732f07370b0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.3, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
|
||||
version: 4.2.10
|
||||
resolution: "graceful-fs@npm:4.2.10"
|
||||
|
@ -4729,6 +5015,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"http-cache-semantics@npm:^4.0.0":
|
||||
version: 4.1.0
|
||||
resolution: "http-cache-semantics@npm:4.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-cache-semantics%2F-%2Fhttp-cache-semantics-4.1.0.tgz"
|
||||
checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"http-cache-semantics@npm:^4.1.0":
|
||||
version: 4.1.0
|
||||
resolution: "http-cache-semantics@npm:4.1.0"
|
||||
|
@ -5443,6 +5736,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"json-buffer@npm:3.0.0":
|
||||
version: 3.0.0
|
||||
resolution: "json-buffer@npm:3.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-buffer%2F-%2Fjson-buffer-3.0.0.tgz"
|
||||
checksum: 0cecacb8025370686a916069a2ff81f7d55167421b6aa7270ee74e244012650dd6bce22b0852202ea7ff8624fce50ff0ec1bdf95914ccb4553426e290d5a63fa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"json-parse-better-errors@npm:^1.0.1":
|
||||
version: 1.0.2
|
||||
resolution: "json-parse-better-errors@npm:1.0.2"
|
||||
|
@ -5516,6 +5816,18 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"jsonfile@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "jsonfile@npm:4.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fjsonfile%2F-%2Fjsonfile-4.0.0.tgz"
|
||||
dependencies:
|
||||
graceful-fs: ^4.1.6
|
||||
dependenciesMeta:
|
||||
graceful-fs:
|
||||
optional: true
|
||||
checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"jsonfile@npm:^6.0.1":
|
||||
version: 6.1.0
|
||||
resolution: "jsonfile@npm:6.1.0"
|
||||
|
@ -5555,6 +5867,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"keyv@npm:^3.0.0":
|
||||
version: 3.1.0
|
||||
resolution: "keyv@npm:3.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fkeyv%2F-%2Fkeyv-3.1.0.tgz"
|
||||
dependencies:
|
||||
json-buffer: 3.0.0
|
||||
checksum: bb7e8f3acffdbafbc2dd5b63f377fe6ec4c0e2c44fc82720449ef8ab54f4a7ce3802671ed94c0f475ae0a8549703353a2124561fcf3317010c141b32ca1ce903
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3":
|
||||
version: 6.0.3
|
||||
resolution: "kind-of@npm:6.0.3"
|
||||
|
@ -5820,6 +6141,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lodash@npm:^4.17.10":
|
||||
version: 4.17.21
|
||||
resolution: "lodash@npm:4.17.21::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Flodash%2F-%2Flodash-4.17.21.tgz"
|
||||
checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0":
|
||||
version: 4.17.21
|
||||
resolution: "lodash@npm:4.17.21"
|
||||
|
@ -5849,6 +6177,20 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1":
|
||||
version: 1.0.1
|
||||
resolution: "lowercase-keys@npm:1.0.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Flowercase-keys%2F-%2Flowercase-keys-1.0.1.tgz"
|
||||
checksum: 4d045026595936e09953e3867722e309415ff2c80d7701d067546d75ef698dac218a4f53c6d1d0e7368b47e45fd7529df47e6cb56fbb90523ba599f898b3d147
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lowercase-keys@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "lowercase-keys@npm:2.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Flowercase-keys%2F-%2Flowercase-keys-2.0.0.tgz"
|
||||
checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lru-cache@npm:^6.0.0":
|
||||
version: 6.0.0
|
||||
resolution: "lru-cache@npm:6.0.0"
|
||||
|
@ -5994,6 +6336,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"matcher@npm:^3.0.0":
|
||||
version: 3.0.0
|
||||
resolution: "matcher@npm:3.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fmatcher%2F-%2Fmatcher-3.0.0.tgz"
|
||||
dependencies:
|
||||
escape-string-regexp: ^4.0.0
|
||||
checksum: 8bee1a7ab7609c2c21d9c9254b6785fa708eadf289032b556d57a34e98fcd4c537659a004dafee6ce80ab157099e645c199dc52678dff1e7fb0a6684e0da4dbe
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"matcher@npm:^5.0.0":
|
||||
version: 5.0.0
|
||||
resolution: "matcher@npm:5.0.0"
|
||||
|
@ -6114,6 +6465,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"mimic-response@npm:^1.0.0, mimic-response@npm:^1.0.1":
|
||||
version: 1.0.1
|
||||
resolution: "mimic-response@npm:1.0.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fmimic-response%2F-%2Fmimic-response-1.0.1.tgz"
|
||||
checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"min-indent@npm:^1.0.0":
|
||||
version: 1.0.1
|
||||
resolution: "min-indent@npm:1.0.1"
|
||||
|
@ -6300,6 +6658,17 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"mkdirp@npm:^0.5.4":
|
||||
version: 0.5.6
|
||||
resolution: "mkdirp@npm:0.5.6::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fmkdirp%2F-%2Fmkdirp-0.5.6.tgz"
|
||||
dependencies:
|
||||
minimist: ^1.2.6
|
||||
bin:
|
||||
mkdirp: bin/cmd.js
|
||||
checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
|
||||
version: 1.0.4
|
||||
resolution: "mkdirp@npm:1.0.4"
|
||||
|
@ -6387,6 +6756,7 @@ __metadata:
|
|||
c8: ^7.11.2
|
||||
colorette: ^2.0.16
|
||||
cross-env: ^7.0.3
|
||||
electron: ^18.2.0
|
||||
esbuild: ^0.14.38
|
||||
eslint: ^8.14.0
|
||||
eslint-config-prettier: ^8.5.0
|
||||
|
@ -6584,6 +6954,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"normalize-url@npm:^4.1.0":
|
||||
version: 4.5.1
|
||||
resolution: "normalize-url@npm:4.5.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fnormalize-url%2F-%2Fnormalize-url-4.5.1.tgz"
|
||||
checksum: 9a9dee01df02ad23e171171893e56e22d752f7cff86fb96aafeae074819b572ea655b60f8302e2d85dbb834dc885c972cc1c573892fea24df46b2765065dd05a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"normalize-url@npm:^6.1.0":
|
||||
version: 6.1.0
|
||||
resolution: "normalize-url@npm:6.1.0"
|
||||
|
@ -6600,6 +6977,16 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"npm-conf@npm:^1.1.3":
|
||||
version: 1.1.3
|
||||
resolution: "npm-conf@npm:1.1.3::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fnpm-conf%2F-%2Fnpm-conf-1.1.3.tgz"
|
||||
dependencies:
|
||||
config-chain: ^1.1.11
|
||||
pify: ^3.0.0
|
||||
checksum: 2d4e933b657623d98183ec408d17318547296b1cd17c4d3587e2920c554675f24f829d8f5f7f84db3a020516678fdcd01952ebaaf0e7fa8a17f6c39be4154bef
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"npm-install-checks@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "npm-install-checks@npm:4.0.0"
|
||||
|
@ -6895,6 +7282,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"p-cancelable@npm:^1.0.0":
|
||||
version: 1.1.0
|
||||
resolution: "p-cancelable@npm:1.1.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fp-cancelable%2F-%2Fp-cancelable-1.1.0.tgz"
|
||||
checksum: 2db3814fef6d9025787f30afaee4496a8857a28be3c5706432cbad76c688a6db1874308f48e364a42f5317f5e41e8e7b4f2ff5c8ff2256dbb6264bc361704ece
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"p-defer@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "p-defer@npm:1.0.0"
|
||||
|
@ -7243,6 +7637,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"pend@npm:~1.2.0":
|
||||
version: 1.2.0
|
||||
resolution: "pend@npm:1.2.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fpend%2F-%2Fpend-1.2.0.tgz"
|
||||
checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"performance-now@npm:^2.1.0":
|
||||
version: 2.1.0
|
||||
resolution: "performance-now@npm:2.1.0"
|
||||
|
@ -7345,6 +7746,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"prepend-http@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "prepend-http@npm:2.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fprepend-http%2F-%2Fprepend-http-2.0.0.tgz"
|
||||
checksum: 7694a9525405447662c1ffd352fcb41b6410c705b739b6f4e3a3e21cf5fdede8377890088e8934436b8b17ba55365a615f153960f30877bf0d0392f9e93503ea
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"prettier-linter-helpers@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "prettier-linter-helpers@npm:1.0.0"
|
||||
|
@ -7386,6 +7794,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"progress@npm:^2.0.3":
|
||||
version: 2.0.3
|
||||
resolution: "progress@npm:2.0.3::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fprogress%2F-%2Fprogress-2.0.3.tgz"
|
||||
checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"promise-inflight@npm:^1.0.1":
|
||||
version: 1.0.1
|
||||
resolution: "promise-inflight@npm:1.0.1"
|
||||
|
@ -7642,6 +8057,21 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readable-stream@npm:^2.2.2":
|
||||
version: 2.3.7
|
||||
resolution: "readable-stream@npm:2.3.7::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Freadable-stream%2F-%2Freadable-stream-2.3.7.tgz"
|
||||
dependencies:
|
||||
core-util-is: ~1.0.0
|
||||
inherits: ~2.0.3
|
||||
isarray: ~1.0.0
|
||||
process-nextick-args: ~2.0.0
|
||||
safe-buffer: ~5.1.1
|
||||
string_decoder: ~1.1.1
|
||||
util-deprecate: ~1.0.1
|
||||
checksum: e4920cf7549a60f8aaf694d483a0e61b2a878b969d224f89b3bc788b8d920075132c4b55a7494ee944c7b6a9a0eada28a7f6220d80b0312ece70bbf08eeca755
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readdir-scoped-modules@npm:^1.0.0":
|
||||
version: 1.1.0
|
||||
resolution: "readdir-scoped-modules@npm:1.1.0"
|
||||
|
@ -7780,6 +8210,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"responselike@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "responselike@npm:1.0.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fresponselike%2F-%2Fresponselike-1.0.2.tgz"
|
||||
dependencies:
|
||||
lowercase-keys: ^1.0.0
|
||||
checksum: 2e9e70f1dcca3da621a80ce71f2f9a9cad12c047145c6ece20df22f0743f051cf7c73505e109814915f23f9e34fb0d358e22827723ee3d56b623533cab8eafcd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"restore-cursor@npm:^3.1.0":
|
||||
version: 3.1.0
|
||||
resolution: "restore-cursor@npm:3.1.0"
|
||||
|
@ -7833,6 +8272,20 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"roarr@npm:^2.15.3":
|
||||
version: 2.15.4
|
||||
resolution: "roarr@npm:2.15.4::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Froarr%2F-%2Froarr-2.15.4.tgz"
|
||||
dependencies:
|
||||
boolean: ^3.0.1
|
||||
detect-node: ^2.0.4
|
||||
globalthis: ^1.0.1
|
||||
json-stringify-safe: ^5.0.1
|
||||
semver-compare: ^1.0.0
|
||||
sprintf-js: ^1.1.2
|
||||
checksum: 682e28d5491e3ae99728a35ba188f4f0ccb6347dbd492f95dc9f4bfdfe8ee63d8203ad234766ee2db88c8d7a300714304976eb095ce5c9366fe586c03a21586c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"rollup@npm:^2.70.2":
|
||||
version: 2.70.2
|
||||
resolution: "rollup@npm:2.70.2"
|
||||
|
@ -7902,6 +8355,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"semver-compare@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "semver-compare@npm:1.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fsemver-compare%2F-%2Fsemver-compare-1.0.0.tgz"
|
||||
checksum: dd1d7e2909744cf2cf71864ac718efc990297f9de2913b68e41a214319e70174b1d1793ac16e31183b128c2b9812541300cb324db8168e6cf6b570703b171c68
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.6.0, semver@npm:^5.7.1":
|
||||
version: 5.7.1
|
||||
resolution: "semver@npm:5.7.1"
|
||||
|
@ -7920,6 +8380,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"semver@npm:^6.2.0":
|
||||
version: 6.3.0
|
||||
resolution: "semver@npm:6.3.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fsemver%2F-%2Fsemver-6.3.0.tgz"
|
||||
bin:
|
||||
semver: ./bin/semver.js
|
||||
checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5":
|
||||
version: 7.3.7
|
||||
resolution: "semver@npm:7.3.7"
|
||||
|
@ -8252,6 +8721,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"sprintf-js@npm:^1.1.2":
|
||||
version: 1.1.2
|
||||
resolution: "sprintf-js@npm:1.1.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fsprintf-js%2F-%2Fsprintf-js-1.1.2.tgz"
|
||||
checksum: d4bb46464632b335e5faed381bd331157e0af64915a98ede833452663bc672823db49d7531c32d58798e85236581fb7342fd0270531ffc8f914e186187bf1c90
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"sprintf-js@npm:~1.0.2":
|
||||
version: 1.0.3
|
||||
resolution: "sprintf-js@npm:1.0.3"
|
||||
|
@ -8497,6 +8973,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"sumchecker@npm:^3.0.1":
|
||||
version: 3.0.1
|
||||
resolution: "sumchecker@npm:3.0.1::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fsumchecker%2F-%2Fsumchecker-3.0.1.tgz"
|
||||
dependencies:
|
||||
debug: ^4.1.0
|
||||
checksum: 31ba7a62c889236b5b07f75b5c250d481158a1ca061b8f234fca0457bdbe48a20e5011c12c715343dc577e111463dc3d9e721b98015a445a2a88c35e0c9f0f91
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"supertap@npm:^3.0.1":
|
||||
version: 3.0.1
|
||||
resolution: "supertap@npm:3.0.1"
|
||||
|
@ -8702,6 +9187,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"to-readable-stream@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "to-readable-stream@npm:1.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fto-readable-stream%2F-%2Fto-readable-stream-1.0.0.tgz"
|
||||
checksum: 2bd7778490b6214a2c40276065dd88949f4cf7037ce3964c76838b8cb212893aeb9cceaaf4352a4c486e3336214c350270f3263e1ce7a0c38863a715a4d9aeb5
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"to-regex-range@npm:^5.0.1":
|
||||
version: 5.0.1
|
||||
resolution: "to-regex-range@npm:5.0.1"
|
||||
|
@ -8835,6 +9327,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tunnel@npm:^0.0.6":
|
||||
version: 0.0.6
|
||||
resolution: "tunnel@npm:0.0.6::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Ftunnel%2F-%2Ftunnel-0.0.6.tgz"
|
||||
checksum: c362948df9ad34b649b5585e54ce2838fa583aa3037091aaed66793c65b423a264e5229f0d7e9a95513a795ac2bd4cb72cda7e89a74313f182c1e9ae0b0994fa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0":
|
||||
version: 0.14.5
|
||||
resolution: "tweetnacl@npm:0.14.5"
|
||||
|
@ -9010,6 +9509,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"universalify@npm:^0.1.0":
|
||||
version: 0.1.2
|
||||
resolution: "universalify@npm:0.1.2::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Funiversalify%2F-%2Funiversalify-0.1.2.tgz"
|
||||
checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"universalify@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "universalify@npm:2.0.0"
|
||||
|
@ -9033,6 +9539,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"url-parse-lax@npm:^3.0.0":
|
||||
version: 3.0.0
|
||||
resolution: "url-parse-lax@npm:3.0.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Furl-parse-lax%2F-%2Furl-parse-lax-3.0.0.tgz"
|
||||
dependencies:
|
||||
prepend-http: ^2.0.0
|
||||
checksum: 1040e357750451173132228036aff1fd04abbd43eac1fb3e4fca7495a078bcb8d33cb765fe71ad7e473d9c94d98fd67adca63bd2716c815a2da066198dd37217
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1":
|
||||
version: 1.0.2
|
||||
resolution: "util-deprecate@npm:1.0.2"
|
||||
|
@ -9409,6 +9924,16 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"yauzl@npm:^2.10.0":
|
||||
version: 2.10.0
|
||||
resolution: "yauzl@npm:2.10.0::__archiveUrl=https%3A%2F%2Fregistry.npmmirror.com%2Fyauzl%2F-%2Fyauzl-2.10.0.tgz"
|
||||
dependencies:
|
||||
buffer-crc32: ~0.2.3
|
||||
fd-slicer: ~1.1.0
|
||||
checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"yn@npm:3.1.1":
|
||||
version: 3.1.1
|
||||
resolution: "yn@npm:3.1.1"
|
||||
|
|
Loading…
Reference in a new issue