diff --git a/.github/workflows/cargo.yml b/.github/workflows/cargo.yml index 98e23cbfd71..2885620213e 100644 --- a/.github/workflows/cargo.yml +++ b/.github/workflows/cargo.yml @@ -102,6 +102,8 @@ jobs: os: ubuntu-latest - crate: enum_kind os: ubuntu-latest + - crate: fastmem + os: ubuntu-latest - crate: from_variant os: ubuntu-latest - crate: jsdoc @@ -109,8 +111,8 @@ jobs: - crate: node os: ubuntu-latest check: | - cargo check - cargo check --no-default-features --features swc_v2 + cargo check --features plugin + cargo check --no-default-features --features plugin --features swc_v2 - crate: node_macro_deps os: ubuntu-latest - crate: preset_env_base @@ -120,7 +122,7 @@ jobs: - crate: swc os: ubuntu-latest check: | - cargo hack check --feature-powerset --no-dev-deps + cargo hack check --feature-powerset --no-dev-deps --exclude-features debug --exclude-features plugin - crate: swc os: windows-latest - crate: swc_atoms @@ -129,6 +131,8 @@ jobs: os: ubuntu-latest check: | cargo hack check --feature-powerset --no-dev-deps + - crate: swc_cached + os: ubuntu-latest - crate: swc_cli os: ubuntu-latest - crate: swc_cli @@ -241,6 +245,8 @@ jobs: os: ubuntu-latest - crate: swc_eq_ignore_macros os: ubuntu-latest + - crate: swc_error_reporters + os: ubuntu-latest - crate: swc_estree_ast os: ubuntu-latest - crate: swc_estree_compat diff --git a/.gitignore b/.gitignore index 1d8998f466c..620ba730dc8 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,5 @@ pkg/ # Used to see output of babel. /lab -*.mm_profdata \ No newline at end of file +*.mm_profdata +.tsbuildinfo \ No newline at end of file diff --git a/.npmignore b/.npmignore index da54d088d49..70b32ba9728 100644 --- a/.npmignore +++ b/.npmignore @@ -67,3 +67,4 @@ jest.config.js cliff.toml .kodiak.toml clippy.toml +.tsbuildinfo diff --git a/Cargo.lock b/Cargo.lock index 625f5cc958c..83810b72ba1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -977,8 +977,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", + "js-sys", "libc", "wasi 0.10.2+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1661,6 +1663,8 @@ dependencies = [ "tracing-chrome", "tracing-futures", "tracing-subscriber", + "wasmer", + "wasmer-wasi", ] [[package]] @@ -3082,6 +3086,8 @@ dependencies = [ "tracing-futures", "tracing-subscriber", "walkdir", + "wasmer", + "wasmer-wasi", ] [[package]] @@ -4506,6 +4512,8 @@ dependencies = [ "swc_ecmascript", "tracing", "wasm-bindgen", + "wasmer", + "wasmer-wasi", ] [[package]] @@ -4598,6 +4606,7 @@ dependencies = [ "wasmer-engine-universal", "wasmer-types", "wasmer-vm", + "wasmparser", "wat", "winapi", ] @@ -4765,6 +4774,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d9c4be9fba0cb769ae2466437d629427bb2494c9e134eacd15a6f8127a77dc2" dependencies = [ "libc", + "slab", "thiserror", "tracing", ] diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 79cb8405284..4838cf6a9cf 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -13,7 +13,7 @@ crate-type = ["cdylib"] [features] default = ["swc_v1", "plugin"] -plugin = ["swc/plugin"] +plugin = ["swc/plugin", "wasmer/default", "wasmer-wasi/default"] swc_v1 = ["swc_node_bundler/swc_v1"] swc_v2 = ["swc_node_bundler/swc_v2"] @@ -43,3 +43,5 @@ tracing = { version = "0.1.32" , features = ["release_max_level_info"] } tracing-chrome = "0.4.0" tracing-futures = "0.2.5" tracing-subscriber = { version = "0.3.9", features = ["env-filter"] } +wasmer = {version = "2.2.0", default-features = false} +wasmer-wasi = {version = "2.2.0", default-features = false} \ No newline at end of file diff --git a/crates/swc/src/plugin.rs b/crates/swc/src/plugin.rs index 8e578c134cf..510e54b4c6b 100644 --- a/crates/swc/src/plugin.rs +++ b/crates/swc/src/plugin.rs @@ -119,7 +119,7 @@ impl RustPlugins { plugin_module = p.0.as_str() ); let transform_span_guard = span.enter(); - serialized = swc_plugin_runner::apply_js_plugin( + serialized = swc_plugin_runner::apply_transform_plugin( &p.0, &path, &swc_plugin_runner::cache::PLUGIN_MODULE_CACHE, diff --git a/crates/swc_cli/Cargo.toml b/crates/swc_cli/Cargo.toml index 1b46c1398e8..ff1afc4a850 100644 --- a/crates/swc_cli/Cargo.toml +++ b/crates/swc_cli/Cargo.toml @@ -12,6 +12,14 @@ version = "0.26.1" name = "swc" path = "./src/main.rs" +[features] +default = [] +plugin = [ + "swc/plugin", + "wasmer/default", + "wasmer-wasi/default", +] + [dependencies] anyhow = "1.0.53" atty = "0.2.14" @@ -28,9 +36,10 @@ tracing-chrome = "0.4.0" tracing-futures = "0.2.5" tracing-subscriber = {version = "0.3.9", features = ["env-filter"]} walkdir = "2" +wasmer = {version = "2.2.0", optional = true} +wasmer-wasi = {version = "2.2.0", optional = true} [dependencies.path-absolutize] features = ["once_cell_cache"] version = "3.0.11" -[features] diff --git a/crates/swc_plugin_runner/Cargo.toml b/crates/swc_plugin_runner/Cargo.toml index 220060ad973..fec2940ee8e 100644 --- a/crates/swc_plugin_runner/Cargo.toml +++ b/crates/swc_plugin_runner/Cargo.toml @@ -17,9 +17,11 @@ serde_json = "1.0.64" swc_common = {version = "0.17.0", path = "../swc_common", features = ["plugin-rt", "concurrent"]} swc_ecma_ast = {version = "0.70.0", path = "../swc_ecma_ast", features = ["rkyv-impl"]} tracing = "0.1.32" -wasmer = "2.2.0" -wasmer-cache = "2.2.0" -wasmer-wasi = "2.2.0" +wasmer = {version = "2.2.0", default-features = false} +wasmer-wasi = {version = "2.2.0", default-features = false} + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +wasmer-cache = {version = "2.2.0"} [dev-dependencies] swc_atoms = {version = "0.2.7", path = '../swc_atoms'} @@ -27,5 +29,6 @@ swc_ecma_loader = {version = "0.29.0", path = "../swc_ecma_loader"} swc_ecma_parser = {version = "0.94.0", path = "../swc_ecma_parser"} swc_ecma_visit = {version = "0.56.0", path = "../swc_ecma_visit"} testing = {version = "0.19.0", path = "../testing"} - -[features] +# This allows we can run non-wasm32 target build command while some pkg select features for wasmer/js omits its transitive deps +wasmer = {version = "2.2.0"} +wasmer-wasi = {version = "2.2.0"} diff --git a/crates/swc_plugin_runner/src/context.rs b/crates/swc_plugin_runner/src/context.rs new file mode 100644 index 00000000000..253242ba4b1 --- /dev/null +++ b/crates/swc_plugin_runner/src/context.rs @@ -0,0 +1,15 @@ +use std::sync::Arc; + +use parking_lot::Mutex; +use wasmer::Memory; + +#[derive(wasmer::WasmerEnv, Clone)] +/// An external enviornment state imported (declared in host, injected into +/// guest) fn can access. This'll allow host access updated state via plugin's +/// transform. +/// ref: https://docs.wasmer.io/integrations/examples/host-functions#declaring-the-data +pub struct HostEnvironment { + #[wasmer(export)] + pub memory: wasmer::LazyInit, + pub transform_result: Arc>>, +} diff --git a/crates/swc_plugin_runner/src/imported_fn.rs b/crates/swc_plugin_runner/src/imported_fn.rs new file mode 100644 index 00000000000..cf8d6d09d82 --- /dev/null +++ b/crates/swc_plugin_runner/src/imported_fn.rs @@ -0,0 +1,132 @@ +//! Functions imported into the guests (plugin) runtime allows interop between +//! host's state to plugin. +//! All of these fn is being called inside of guest's memory space, which calls +//! appropriate host fn as needed. + +use swc_common::{ + errors::{Diagnostic, HANDLER}, + hygiene::MutableMarkContext, + plugin::Serialized, + Mark, SyntaxContext, +}; + +use crate::{ + context::HostEnvironment, + memory_interop::{copy_bytes_into_host, write_into_memory_view}, +}; + +/// Set plugin's transformed result into host's enviroment. +/// This is an `imported` fn - when we instantiate plugin module, we inject this +/// fn into pluging's export space. Once transform completes, plugin will call +/// this to set its result back to host. +pub fn set_transform_result(env: &HostEnvironment, bytes_ptr: i32, bytes_ptr_len: i32) { + if let Some(memory) = env.memory_ref() { + (*env.transform_result.lock()) = copy_bytes_into_host(memory, bytes_ptr, bytes_ptr_len); + } +} + +pub fn emit_diagnostics(env: &HostEnvironment, bytes_ptr: i32, bytes_ptr_len: i32) { + if let Some(memory) = env.memory_ref() { + if HANDLER.is_set() { + HANDLER.with(|handler| { + let diagnostics_bytes = copy_bytes_into_host(memory, bytes_ptr, bytes_ptr_len); + let serialized = Serialized::new_for_plugin(&diagnostics_bytes[..], bytes_ptr_len); + let diagnostic = Serialized::deserialize::(&serialized) + .expect("Should able to be deserialized into diagnsotic"); + + let mut builder = + swc_common::errors::DiagnosticBuilder::new_diagnostic(handler, diagnostic); + builder.emit(); + }) + } + } +} + +/// A proxy to Mark::fresh() that can be used in plugin. +/// This it not direcly called by plugin, instead `impl Mark` will selectively +/// call this depends on the running context. +pub fn mark_fresh_proxy(parent: u32) -> u32 { + Mark::fresh(Mark::from_u32(parent)).as_u32() +} + +pub fn mark_parent_proxy(self_mark: u32) -> u32 { + Mark::from_u32(self_mark).parent().as_u32() +} + +pub fn mark_is_builtin_proxy(self_mark: u32) -> u32 { + Mark::from_u32(self_mark).is_builtin() as u32 +} + +pub fn mark_set_builtin_proxy(self_mark: u32, is_builtin: u32) { + Mark::from_u32(self_mark).set_is_builtin(is_builtin != 0); +} + +/// A proxy to Mark::is_descendant_of_() that can be used in plugin. +/// Origianl call site have mutable param, which we'll pass over as return value +/// via serialized MutableMarkContext. +/// Inside of guest context, once this host function returns it'll assign params +/// with return value accordingly. +pub fn mark_is_descendant_of_proxy( + env: &HostEnvironment, + self_mark: u32, + ancestor: u32, + allocated_ptr: i32, +) { + let self_mark = Mark::from_u32(self_mark); + let ancestor = Mark::from_u32(ancestor); + + let return_value = self_mark.is_descendant_of(ancestor); + + if let Some(memory) = env.memory_ref() { + let serialized_bytes = Serialized::serialize(&MutableMarkContext( + self_mark.as_u32(), + 0, + return_value as u32, + )) + .expect("Should be serializable"); + + write_into_memory_view(memory, &serialized_bytes, |_| allocated_ptr); + } +} + +pub fn mark_least_ancestor_proxy(env: &HostEnvironment, a: u32, b: u32, allocated_ptr: i32) { + let a = Mark::from_u32(a); + let b = Mark::from_u32(b); + + let return_value = Mark::least_ancestor(a, b).as_u32(); + + if let Some(memory) = env.memory_ref() { + let serialized_bytes = + Serialized::serialize(&MutableMarkContext(a.as_u32(), b.as_u32(), return_value)) + .expect("Should be serializable"); + + write_into_memory_view(memory, &serialized_bytes, |_| allocated_ptr); + } +} + +pub fn syntax_context_apply_mark_proxy(self_syntax_context: u32, mark: u32) -> u32 { + SyntaxContext::from_u32(self_syntax_context) + .apply_mark(Mark::from_u32(mark)) + .as_u32() +} + +pub fn syntax_context_remove_mark_proxy(env: &HostEnvironment, self_mark: u32, allocated_ptr: i32) { + let mut self_mark = SyntaxContext::from_u32(self_mark); + + let return_value = self_mark.remove_mark(); + + if let Some(memory) = env.memory_ref() { + let serialized_bytes = Serialized::serialize(&MutableMarkContext( + self_mark.as_u32(), + 0, + return_value.as_u32(), + )) + .expect("Should be serializable"); + + write_into_memory_view(memory, &serialized_bytes, |_| allocated_ptr); + } +} + +pub fn syntax_context_outer_proxy(self_mark: u32) -> u32 { + SyntaxContext::from_u32(self_mark).outer().as_u32() +} diff --git a/crates/swc_plugin_runner/src/lib.rs b/crates/swc_plugin_runner/src/lib.rs index 8797629c7a2..03c886d0030 100644 --- a/crates/swc_plugin_runner/src/lib.rs +++ b/crates/swc_plugin_runner/src/lib.rs @@ -1,473 +1,35 @@ -use std::{path::Path, sync::Arc}; +#![cfg_attr( + not(any(feature = "embedded_runtime", feature = "native_runtime")), + allow(unused) +)] -use anyhow::{anyhow, Context, Error}; -use cache::PluginModuleCache; +use std::path::Path; + +use anyhow::{Context, Error}; use once_cell::sync::Lazy; -use parking_lot::Mutex; -use swc_common::{ - errors::{Diagnostic, HANDLER}, - hygiene::MutableMarkContext, - plugin::{PluginError, Serialized}, - Mark, SyntaxContext, -}; -use wasmer::{imports, Array, Exports, Function, Instance, LazyInit, Memory, WasmPtr}; -use wasmer_wasi::{is_wasi_module, WasiState}; +use swc_common::plugin::Serialized; +use transform_executor::TransformExecutor; +#[cfg(not(target_arch = "wasm32"))] pub mod cache; +mod context; +mod imported_fn; +mod load_plugin; +mod memory_interop; +mod transform_executor; -#[tracing::instrument(level = "info", skip_all)] -fn copy_bytes_into_host(memory: &Memory, bytes_ptr: i32, bytes_ptr_len: i32) -> Vec { - let ptr: WasmPtr = WasmPtr::new(bytes_ptr as _); - - // Deref & read through plugin's wasm memory space via returned ptr - let derefed_ptr = ptr - .deref(memory, 0, bytes_ptr_len as u32) - .expect("Should able to deref from given ptr"); - - derefed_ptr - .iter() - .enumerate() - .take(bytes_ptr_len as usize) - .map(|(_size, cell)| cell.get()) - .collect::>() -} - -/// Locate a view from given memory, write serialized bytes into. -#[tracing::instrument(level = "info", skip_all)] -fn write_into_memory_view( - memory: &Memory, - serialized_bytes: &Serialized, - get_allocated_ptr: F, -) -> (i32, i32) -where - F: Fn(usize) -> i32, -{ - let serialized = serialized_bytes.as_ref(); - let serialized_len = serialized.len(); - - let ptr_start = get_allocated_ptr(serialized_len); - let ptr_start_size = ptr_start - .try_into() - .expect("Should be able to convert to usize"); - let serialized_len_size: u32 = serialized_len - .try_into() - .expect("Should be able to convert to u32"); - - // Note: it's important to get a view from memory _after_ alloc completes - let view = memory.view::(); - - // Get a subarray for current memoryview starting from ptr address we just - // allocated above, perform copying into specified ptr. Wasm's memory layout - // is linear and we have atomic gaurantee by not having any thread access, - // so can safely get subarray from allocated ptr address. - // - // If we want safer operation instead, refer previous implementation - // https://github.com/swc-project/swc/blob/1ef8f3749b6454eb7d40a36a5f9366137fa97928/crates/swc_plugin_runner/src/lib.rs#L56-L61 - unsafe { - view.subarray(ptr_start_size, ptr_start_size + serialized_len_size) - .copy_from(serialized); - } - - ( - ptr_start, - serialized_len - .try_into() - .expect("Should be able to convert to i32"), - ) -} - -/// Set plugin's transformed result into host's enviroment. -/// This is an `imported` fn - when we instantiate plugin module, we inject this -/// fn into pluging's export space. Once transform completes, plugin will call -/// this to set its result back to host. -fn set_transform_result(env: &HostEnvironment, bytes_ptr: i32, bytes_ptr_len: i32) { - if let Some(memory) = env.memory_ref() { - (*env.transform_result.lock()) = copy_bytes_into_host(memory, bytes_ptr, bytes_ptr_len); - } -} - -fn emit_diagnostics(env: &HostEnvironment, bytes_ptr: i32, bytes_ptr_len: i32) { - if let Some(memory) = env.memory_ref() { - if HANDLER.is_set() { - HANDLER.with(|handler| { - let diagnostics_bytes = copy_bytes_into_host(memory, bytes_ptr, bytes_ptr_len); - let serialized = Serialized::new_for_plugin(&diagnostics_bytes[..], bytes_ptr_len); - let diagnostic = Serialized::deserialize::(&serialized) - .expect("Should able to be deserialized into diagnsotic"); - - let mut builder = - swc_common::errors::DiagnosticBuilder::new_diagnostic(handler, diagnostic); - builder.emit(); - }) - } - } -} - -/// A proxy to Mark::fresh() that can be used in plugin. -/// This it not direcly called by plugin, instead `impl Mark` will selectively -/// call this depends on the running context. -fn mark_fresh_proxy(parent: u32) -> u32 { - Mark::fresh(Mark::from_u32(parent)).as_u32() -} - -fn mark_parent_proxy(self_mark: u32) -> u32 { - Mark::from_u32(self_mark).parent().as_u32() -} - -fn mark_is_builtin_proxy(self_mark: u32) -> u32 { - Mark::from_u32(self_mark).is_builtin() as u32 -} - -fn mark_set_builtin_proxy(self_mark: u32, is_builtin: u32) { - Mark::from_u32(self_mark).set_is_builtin(is_builtin != 0); -} - -/// A proxy to Mark::is_descendant_of_() that can be used in plugin. -/// Origianl call site have mutable param, which we'll pass over as return value -/// via serialized MutableMarkContext. -/// Inside of guest context, once this host function returns it'll assign params -/// with return value accordingly. -fn mark_is_descendant_of_proxy( - env: &HostEnvironment, - self_mark: u32, - ancestor: u32, - allocated_ptr: i32, -) { - let self_mark = Mark::from_u32(self_mark); - let ancestor = Mark::from_u32(ancestor); - - let return_value = self_mark.is_descendant_of(ancestor); - - if let Some(memory) = env.memory_ref() { - let serialized_bytes = Serialized::serialize(&MutableMarkContext( - self_mark.as_u32(), - 0, - return_value as u32, - )) - .expect("Should be serializable"); - - write_into_memory_view(memory, &serialized_bytes, |_| allocated_ptr); - } -} - -fn mark_least_ancestor_proxy(env: &HostEnvironment, a: u32, b: u32, allocated_ptr: i32) { - let a = Mark::from_u32(a); - let b = Mark::from_u32(b); - - let return_value = Mark::least_ancestor(a, b).as_u32(); - - if let Some(memory) = env.memory_ref() { - let serialized_bytes = - Serialized::serialize(&MutableMarkContext(a.as_u32(), b.as_u32(), return_value)) - .expect("Should be serializable"); - - write_into_memory_view(memory, &serialized_bytes, |_| allocated_ptr); - } -} - -fn syntax_context_apply_mark_proxy(self_syntax_context: u32, mark: u32) -> u32 { - SyntaxContext::from_u32(self_syntax_context) - .apply_mark(Mark::from_u32(mark)) - .as_u32() -} - -fn syntax_context_remove_mark_proxy(env: &HostEnvironment, self_mark: u32, allocated_ptr: i32) { - let mut self_mark = SyntaxContext::from_u32(self_mark); - - let return_value = self_mark.remove_mark(); - - if let Some(memory) = env.memory_ref() { - let serialized_bytes = Serialized::serialize(&MutableMarkContext( - self_mark.as_u32(), - 0, - return_value.as_u32(), - )) - .expect("Should be serializable"); - - write_into_memory_view(memory, &serialized_bytes, |_| allocated_ptr); - } -} - -fn syntax_context_outer_proxy(self_mark: u32) -> u32 { - SyntaxContext::from_u32(self_mark).outer().as_u32() -} - -#[derive(wasmer::WasmerEnv, Clone)] -/// An external enviornment state imported (declared in host, injected into -/// guest) fn can access. This'll allow host access updated state via plugin's -/// transform. -/// ref: https://docs.wasmer.io/integrations/examples/host-functions#declaring-the-data -struct HostEnvironment { - #[wasmer(export)] - memory: wasmer::LazyInit, - transform_result: Arc>>, -} - -#[tracing::instrument(level = "info", skip_all)] -fn load_plugin( - plugin_path: &Path, - cache: &Lazy, -) -> Result<(Instance, Arc>>), Error> { - let module = cache.load_module(plugin_path); - - return match module { - Ok(module) => { - let wasmer_store = module.store(); - let transform_result: Arc>> = Arc::new(Mutex::new(vec![])); - let set_transform_result_fn_decl = Function::new_native_with_env( - wasmer_store, - HostEnvironment { - memory: LazyInit::default(), - transform_result: transform_result.clone(), - }, - set_transform_result, - ); - - let emit_diagnostics_fn_decl = Function::new_native_with_env( - wasmer_store, - HostEnvironment { - memory: LazyInit::default(), - transform_result: transform_result.clone(), - }, - emit_diagnostics, - ); - - let mark_fresh_fn_decl = Function::new_native(wasmer_store, mark_fresh_proxy); - let mark_parent_fn_decl = Function::new_native(wasmer_store, mark_parent_proxy); - let mark_is_builtin_fn_decl = Function::new_native(wasmer_store, mark_is_builtin_proxy); - let mark_set_builtin_fn_decl = - Function::new_native(wasmer_store, mark_set_builtin_proxy); - let mark_is_descendant_of_fn_decl = Function::new_native_with_env( - wasmer_store, - HostEnvironment { - memory: LazyInit::default(), - transform_result: transform_result.clone(), - }, - mark_is_descendant_of_proxy, - ); - - let mark_least_ancestor_fn_decl = Function::new_native_with_env( - wasmer_store, - HostEnvironment { - memory: LazyInit::default(), - transform_result: transform_result.clone(), - }, - mark_least_ancestor_proxy, - ); - - let syntax_context_apply_mark_fn_decl = - Function::new_native(wasmer_store, syntax_context_apply_mark_proxy); - let syntax_context_remove_mark_fn_decl = Function::new_native_with_env( - wasmer_store, - HostEnvironment { - memory: LazyInit::default(), - transform_result: transform_result.clone(), - }, - syntax_context_remove_mark_proxy, - ); - let syntax_context_outer_fn_decl = - Function::new_native(wasmer_store, syntax_context_outer_proxy); - - // Plugin binary can be either wasm32-wasi or wasm32-unknown-unknown - let import_object = if is_wasi_module(&module) { - // Create the `WasiEnv`. - let mut wasi_env = WasiState::new( - plugin_path - .file_name() - .and_then(|f| f.to_str()) - .expect("Plugin path missing file name"), - ) - .finalize()?; - - // Generate an `ImportObject` from wasi_env - let mut import_object = wasi_env.import_object(&module)?; - - // This'll inject few interfaces into plugin's namespace to let plugin - // communicate with host - let mut env = Exports::new(); - env.insert("__set_transform_result", set_transform_result_fn_decl); - env.insert("__emit_diagnostics", emit_diagnostics_fn_decl); - - env.insert("__mark_fresh_proxy", mark_fresh_fn_decl); - env.insert("__mark_parent_proxy", mark_parent_fn_decl); - env.insert("__mark_is_builtin_proxy", mark_is_builtin_fn_decl); - env.insert("__mark_set_builtin_proxy", mark_set_builtin_fn_decl); - env.insert( - "__mark_is_descendant_of_proxy", - mark_is_descendant_of_fn_decl, - ); - env.insert("__mark_least_ancestor", mark_least_ancestor_fn_decl); - env.insert( - "__syntax_context_apply_mark_proxy", - syntax_context_apply_mark_fn_decl, - ); - env.insert( - "__syntax_context_remove_mark_proxy", - syntax_context_remove_mark_fn_decl, - ); - env.insert("__syntax_context_outer_proxy", syntax_context_outer_fn_decl); - - import_object.register("env", env); - import_object - } - // Not able to detect wasi version in binary - assume plugin targets - // wasm32-unknown-unknown - else { - imports! { - "env" => { - "__set_transform_result" => set_transform_result_fn_decl, - "__emit_diagnostics" => emit_diagnostics_fn_decl, - "__mark_fresh_proxy" => mark_fresh_fn_decl, - "__mark_parent_proxy" => mark_parent_fn_decl, - "__mark_is_builtin_proxy" => mark_is_builtin_fn_decl, - "__mark_set_builtin_proxy" => mark_set_builtin_fn_decl, - "__mark_is_descendant_of_proxy" => mark_is_descendant_of_fn_decl, - "__mark_least_ancestor" => mark_least_ancestor_fn_decl, - "__syntax_context_apply_mark_proxy" => syntax_context_apply_mark_fn_decl, - "__syntax_context_remove_mark_proxy" => syntax_context_remove_mark_fn_decl, - "__syntax_context_outer_proxy" => syntax_context_outer_fn_decl - } - } - }; - - Instance::new(&module, &import_object) - .map(|i| (i, transform_result)) - .context("Failed to create plugin instance") - } - Err(err) => Err(err), - }; -} - -/// Wraps wasm plugin's exports and its allocated resource to allow easier -/// teardown -struct PluginTransformTracker { - // Main transform interface plugin exports - exported_plugin_transform: wasmer::NativeFunc<(i32, i32, i32, i32, i32, i32), i32>, - // `__free` function automatically exported via swc_plugin sdk to allow deallocation in guest - // memory space - exported_plugin_free: wasmer::NativeFunc<(i32, i32), i32>, - // `__alloc` function automatically exported via swc_plugin sdk to allow allocation in guest - // memory space - exported_plugin_alloc: wasmer::NativeFunc, - instance: Instance, - // Reference to the pointers succesfully allocated which'll be freed by Drop. - allocated_ptr_vec: Vec<(i32, i32)>, - transform_result: Arc>>, -} - -impl PluginTransformTracker { - #[tracing::instrument(level = "info", skip(cache))] - fn new(path: &Path, cache: &Lazy) -> Result { - let (instance, transform_result) = load_plugin(path, cache)?; - - let tracker = PluginTransformTracker { - exported_plugin_transform: instance - .exports - .get_native_function::<(i32, i32, i32, i32, i32, i32), i32>( - "__plugin_process_impl", - )?, - exported_plugin_free: instance - .exports - .get_native_function::<(i32, i32), i32>("__free")?, - exported_plugin_alloc: instance - .exports - .get_native_function::("__alloc")?, - instance, - allocated_ptr_vec: Vec::with_capacity(3), - transform_result, - }; - - Ok(tracker) - } - - /// Copy host's serialized bytes into guest (plugin)'s allocated memory. - /// Once transformation completes, host should free allocated memory. - fn write_bytes_into_guest( - &mut self, - serialized_bytes: &Serialized, - ) -> Result<(i32, i32), Error> { - let memory = self.instance.exports.get_memory("memory")?; - - let ptr = write_into_memory_view(memory, serialized_bytes, |serialized_len| { - self.exported_plugin_alloc - .call(serialized_len.try_into().expect("")) - .expect("") - }); - - self.allocated_ptr_vec.push(ptr); - Ok(ptr) - } - - /// Copy guest's memory into host, construct serialized struct from raw - /// bytes. - fn read_bytes_from_guest(&mut self, returned_ptr_result: i32) -> Result { - let transformed_result = &(*self.transform_result.lock()); - let ret = - Serialized::new_for_plugin(&transformed_result[..], transformed_result.len() as i32); - - if returned_ptr_result == 0 { - Ok(ret) - } else { - let err: PluginError = Serialized::deserialize(&ret)?; - match err { - PluginError::SizeInteropFailure(msg) => Err(anyhow!( - "Failed to convert pointer size to calculate: {}", - msg - )), - PluginError::Deserialize((msg, ..)) | PluginError::Serialize(msg) => { - Err(anyhow!("{}", msg)) - } - _ => Err(anyhow!( - "Unexpected error occurred while running plugin transform" - )), - } - } - } - - #[tracing::instrument(level = "info", skip_all)] - fn transform( - &mut self, - program: &Serialized, - config: &Serialized, - context: &Serialized, - ) -> Result { - let guest_program_ptr = self.write_bytes_into_guest(program)?; - let config_str_ptr = self.write_bytes_into_guest(config)?; - let context_str_ptr = self.write_bytes_into_guest(context)?; - - let result = self.exported_plugin_transform.call( - guest_program_ptr.0, - guest_program_ptr.1, - config_str_ptr.0, - config_str_ptr.1, - context_str_ptr.0, - context_str_ptr.1, - )?; - - self.read_bytes_from_guest(result) - } -} - -impl Drop for PluginTransformTracker { - fn drop(&mut self) { - for ptr in self.allocated_ptr_vec.iter() { - self.exported_plugin_free - .call(ptr.0, ptr.1) - .expect("Failed to free memory allocated in the plugin"); - } - } -} - -pub fn apply_js_plugin( +// entrypoint fn swc calls to perform its transform via plugin. +#[cfg(not(target_arch = "wasm32"))] +pub fn apply_transform_plugin( plugin_name: &str, path: &Path, - cache: &Lazy, + cache: &Lazy, program: Serialized, config_json: Serialized, context_json: Serialized, ) -> Result { (|| -> Result<_, Error> { - let mut transform_tracker = PluginTransformTracker::new(path, cache)?; + let mut transform_tracker = TransformExecutor::new(path, cache)?; transform_tracker.transform(&program, &config_json, &context_json) })() @@ -479,3 +41,8 @@ pub fn apply_js_plugin( ) }) } + +#[cfg(target_arch = "wasm32")] +pub fn apply_transform_plugin() -> Result { + unimplemented!("Not implemented yet"); +} diff --git a/crates/swc_plugin_runner/src/load_plugin.rs b/crates/swc_plugin_runner/src/load_plugin.rs new file mode 100644 index 00000000000..d7b03f338ad --- /dev/null +++ b/crates/swc_plugin_runner/src/load_plugin.rs @@ -0,0 +1,125 @@ +use std::sync::Arc; + +use anyhow::{Context, Error}; +use parking_lot::Mutex; +use wasmer::{imports, ChainableNamedResolver, Function, Instance, LazyInit}; +use wasmer_wasi::{is_wasi_module, WasiState}; + +use crate::{ + context::HostEnvironment, + imported_fn::{ + emit_diagnostics, mark_fresh_proxy, mark_is_builtin_proxy, mark_is_descendant_of_proxy, + mark_least_ancestor_proxy, mark_parent_proxy, mark_set_builtin_proxy, set_transform_result, + syntax_context_apply_mark_proxy, syntax_context_outer_proxy, + syntax_context_remove_mark_proxy, + }, +}; + +#[tracing::instrument(level = "info", skip_all)] +pub fn load_plugin( + plugin_path: &std::path::Path, + cache: &once_cell::sync::Lazy, +) -> Result<(Instance, Arc>>), Error> { + let module = cache.load_module(plugin_path); + + return match module { + Ok(module) => { + let wasmer_store = module.store(); + let transform_result: Arc>> = Arc::new(Mutex::new(vec![])); + let set_transform_result_fn_decl = Function::new_native_with_env( + wasmer_store, + HostEnvironment { + memory: LazyInit::default(), + transform_result: transform_result.clone(), + }, + set_transform_result, + ); + + let emit_diagnostics_fn_decl = Function::new_native_with_env( + wasmer_store, + HostEnvironment { + memory: LazyInit::default(), + transform_result: transform_result.clone(), + }, + emit_diagnostics, + ); + + let mark_fresh_fn_decl = Function::new_native(wasmer_store, mark_fresh_proxy); + let mark_parent_fn_decl = Function::new_native(wasmer_store, mark_parent_proxy); + let mark_is_builtin_fn_decl = Function::new_native(wasmer_store, mark_is_builtin_proxy); + let mark_set_builtin_fn_decl = + Function::new_native(wasmer_store, mark_set_builtin_proxy); + let mark_is_descendant_of_fn_decl = Function::new_native_with_env( + wasmer_store, + HostEnvironment { + memory: LazyInit::default(), + transform_result: transform_result.clone(), + }, + mark_is_descendant_of_proxy, + ); + + let mark_least_ancestor_fn_decl = Function::new_native_with_env( + wasmer_store, + HostEnvironment { + memory: LazyInit::default(), + transform_result: transform_result.clone(), + }, + mark_least_ancestor_proxy, + ); + + let syntax_context_apply_mark_fn_decl = + Function::new_native(wasmer_store, syntax_context_apply_mark_proxy); + let syntax_context_remove_mark_fn_decl = Function::new_native_with_env( + wasmer_store, + HostEnvironment { + memory: LazyInit::default(), + transform_result: transform_result.clone(), + }, + syntax_context_remove_mark_proxy, + ); + let syntax_context_outer_fn_decl = + Function::new_native(wasmer_store, syntax_context_outer_proxy); + + let import_object = imports! { + "env" => { + "__set_transform_result" => set_transform_result_fn_decl, + "__emit_diagnostics" => emit_diagnostics_fn_decl, + "__mark_fresh_proxy" => mark_fresh_fn_decl, + "__mark_parent_proxy" => mark_parent_fn_decl, + "__mark_is_builtin_proxy" => mark_is_builtin_fn_decl, + "__mark_set_builtin_proxy" => mark_set_builtin_fn_decl, + "__mark_is_descendant_of_proxy" => mark_is_descendant_of_fn_decl, + "__mark_least_ancestor" => mark_least_ancestor_fn_decl, + "__syntax_context_apply_mark_proxy" => syntax_context_apply_mark_fn_decl, + "__syntax_context_remove_mark_proxy" => syntax_context_remove_mark_fn_decl, + "__syntax_context_outer_proxy" => syntax_context_outer_fn_decl + } + }; + + // Plugin binary can be either wasm32-wasi or wasm32-unknown-unknown. + // Wasi specific env need to be initialized if given module targets wasm32-wasi. + let instance = if is_wasi_module(&module) { + // Create the `WasiEnv`. + let mut wasi_env = WasiState::new( + plugin_path + .file_name() + .and_then(|f| f.to_str()) + .expect("Plugin path missing file name"), + ) + .finalize()?; + + // Generate an `ImportObject` from wasi_env, overwrite into imported_object + let wasi_env_import_object = wasi_env.import_object(&module)?; + let chained_resolver = import_object.chain_front(wasi_env_import_object); + Instance::new(&module, &chained_resolver) + } else { + Instance::new(&module, &import_object) + }; + + instance + .map(|i| (i, transform_result)) + .context("Failed to create plugin instance") + } + Err(err) => Err(err), + }; +} diff --git a/crates/swc_plugin_runner/src/memory_interop.rs b/crates/swc_plugin_runner/src/memory_interop.rs new file mode 100644 index 00000000000..dc25bd5b0bc --- /dev/null +++ b/crates/swc_plugin_runner/src/memory_interop.rs @@ -0,0 +1,63 @@ +use swc_common::plugin::Serialized; +use wasmer::{Array, Memory, WasmPtr}; + +#[tracing::instrument(level = "info", skip_all)] +pub fn copy_bytes_into_host(memory: &Memory, bytes_ptr: i32, bytes_ptr_len: i32) -> Vec { + let ptr: WasmPtr = WasmPtr::new(bytes_ptr as _); + + // Deref & read through plugin's wasm memory space via returned ptr + let derefed_ptr = ptr + .deref(memory, 0, bytes_ptr_len as u32) + .expect("Should able to deref from given ptr"); + + derefed_ptr + .iter() + .enumerate() + .take(bytes_ptr_len as usize) + .map(|(_size, cell)| cell.get()) + .collect::>() +} + +/// Locate a view from given memory, write serialized bytes into. +#[tracing::instrument(level = "info", skip_all)] +pub fn write_into_memory_view( + memory: &Memory, + serialized_bytes: &Serialized, + get_allocated_ptr: F, +) -> (i32, i32) +where + F: Fn(usize) -> i32, +{ + let serialized = serialized_bytes.as_ref(); + let serialized_len = serialized.len(); + + let ptr_start = get_allocated_ptr(serialized_len); + let ptr_start_size = ptr_start + .try_into() + .expect("Should be able to convert to usize"); + let serialized_len_size: u32 = serialized_len + .try_into() + .expect("Should be able to convert to u32"); + + // Note: it's important to get a view from memory _after_ alloc completes + let view = memory.view::(); + + // Get a subarray for current memoryview starting from ptr address we just + // allocated above, perform copying into specified ptr. Wasm's memory layout + // is linear and we have atomic gaurantee by not having any thread access, + // so can safely get subarray from allocated ptr address. + // + // If we want safer operation instead, refer previous implementation + // https://github.com/swc-project/swc/blob/1ef8f3749b6454eb7d40a36a5f9366137fa97928/crates/swc_plugin_runner/src/lib.rs#L56-L61 + unsafe { + view.subarray(ptr_start_size, ptr_start_size + serialized_len_size) + .copy_from(serialized); + } + + ( + ptr_start, + serialized_len + .try_into() + .expect("Should be able to convert to i32"), + ) +} diff --git a/crates/swc_plugin_runner/src/transform_executor.rs b/crates/swc_plugin_runner/src/transform_executor.rs new file mode 100644 index 00000000000..9a0e66501b5 --- /dev/null +++ b/crates/swc_plugin_runner/src/transform_executor.rs @@ -0,0 +1,130 @@ +use std::sync::Arc; + +use anyhow::{anyhow, Error}; +use parking_lot::Mutex; +use swc_common::plugin::{PluginError, Serialized}; +use wasmer::Instance; + +use crate::memory_interop::write_into_memory_view; + +/// A struct encapsule executing a plugin's transform interop to its teardown +pub struct TransformExecutor { + // Main transform interface plugin exports + exported_plugin_transform: wasmer::NativeFunc<(i32, i32, i32, i32, i32, i32), i32>, + // `__free` function automatically exported via swc_plugin sdk to allow deallocation in guest + // memory space + exported_plugin_free: wasmer::NativeFunc<(i32, i32), i32>, + // `__alloc` function automatically exported via swc_plugin sdk to allow allocation in guest + // memory space + exported_plugin_alloc: wasmer::NativeFunc, + instance: Instance, + // Reference to the pointers succesfully allocated which'll be freed by Drop. + allocated_ptr_vec: Vec<(i32, i32)>, + transform_result: Arc>>, +} + +impl TransformExecutor { + #[tracing::instrument(level = "info", skip(cache))] + pub fn new( + path: &std::path::Path, + cache: &once_cell::sync::Lazy, + ) -> Result { + let (instance, transform_result) = crate::load_plugin::load_plugin(path, cache)?; + + let tracker = TransformExecutor { + exported_plugin_transform: instance + .exports + .get_native_function::<(i32, i32, i32, i32, i32, i32), i32>( + "__plugin_process_impl", + )?, + exported_plugin_free: instance + .exports + .get_native_function::<(i32, i32), i32>("__free")?, + exported_plugin_alloc: instance + .exports + .get_native_function::("__alloc")?, + instance, + allocated_ptr_vec: Vec::with_capacity(3), + transform_result, + }; + + Ok(tracker) + } + + /// Copy host's serialized bytes into guest (plugin)'s allocated memory. + /// Once transformation completes, host should free allocated memory. + fn write_bytes_into_guest( + &mut self, + serialized_bytes: &Serialized, + ) -> Result<(i32, i32), Error> { + let memory = self.instance.exports.get_memory("memory")?; + + let ptr = write_into_memory_view(memory, serialized_bytes, |serialized_len| { + self.exported_plugin_alloc + .call(serialized_len.try_into().expect("")) + .expect("") + }); + + self.allocated_ptr_vec.push(ptr); + Ok(ptr) + } + + /// Copy guest's memory into host, construct serialized struct from raw + /// bytes. + fn read_bytes_from_guest(&mut self, returned_ptr_result: i32) -> Result { + let transformed_result = &(*self.transform_result.lock()); + let ret = + Serialized::new_for_plugin(&transformed_result[..], transformed_result.len() as i32); + + if returned_ptr_result == 0 { + Ok(ret) + } else { + let err: PluginError = Serialized::deserialize(&ret)?; + match err { + PluginError::SizeInteropFailure(msg) => Err(anyhow!( + "Failed to convert pointer size to calculate: {}", + msg + )), + PluginError::Deserialize((msg, ..)) | PluginError::Serialize(msg) => { + Err(anyhow!("{}", msg)) + } + _ => Err(anyhow!( + "Unexpected error occurred while running plugin transform" + )), + } + } + } + + #[tracing::instrument(level = "info", skip_all)] + pub fn transform( + &mut self, + program: &Serialized, + config: &Serialized, + context: &Serialized, + ) -> Result { + let guest_program_ptr = self.write_bytes_into_guest(program)?; + let config_str_ptr = self.write_bytes_into_guest(config)?; + let context_str_ptr = self.write_bytes_into_guest(context)?; + + let result = self.exported_plugin_transform.call( + guest_program_ptr.0, + guest_program_ptr.1, + config_str_ptr.0, + config_str_ptr.1, + context_str_ptr.0, + context_str_ptr.1, + )?; + + self.read_bytes_from_guest(result) + } +} + +impl Drop for TransformExecutor { + fn drop(&mut self) { + for ptr in self.allocated_ptr_vec.iter() { + self.exported_plugin_free + .call(ptr.0, ptr.1) + .expect("Failed to free memory allocated in the plugin"); + } + } +} diff --git a/crates/swc_plugin_runner/tests/integration.rs b/crates/swc_plugin_runner/tests/integration.rs index 1bf1420e50c..4dc93cae073 100644 --- a/crates/swc_plugin_runner/tests/integration.rs +++ b/crates/swc_plugin_runner/tests/integration.rs @@ -87,7 +87,7 @@ fn internal() -> Result<(), Error> { let cache: Lazy = Lazy::new(PluginModuleCache::new); - let program_bytes = swc_plugin_runner::apply_js_plugin( + let program_bytes = swc_plugin_runner::apply_transform_plugin( "internal-test", &path, &cache, @@ -135,7 +135,7 @@ fn internal() -> Result<(), Error> { let cache: Lazy = Lazy::new(PluginModuleCache::new); let _res = HANDLER.set(&handler, || { - swc_plugin_runner::apply_js_plugin( + swc_plugin_runner::apply_transform_plugin( "internal-test", &path, &cache, @@ -168,7 +168,7 @@ fn internal() -> Result<(), Error> { let mut serialized_program = Serialized::serialize(&program).expect("Should serializable"); let cache: Lazy = Lazy::new(PluginModuleCache::new); - serialized_program = swc_plugin_runner::apply_js_plugin( + serialized_program = swc_plugin_runner::apply_transform_plugin( "internal-test", &path, &cache, @@ -180,7 +180,7 @@ fn internal() -> Result<(), Error> { .expect("Plugin should apply transform"); // TODO: we'll need to apply 2 different plugins - serialized_program = swc_plugin_runner::apply_js_plugin( + serialized_program = swc_plugin_runner::apply_transform_plugin( "internal-test", &path, &cache, diff --git a/crates/wasm/Cargo.toml b/crates/wasm/Cargo.toml index affceba9169..787ab65eed5 100644 --- a/crates/wasm/Cargo.toml +++ b/crates/wasm/Cargo.toml @@ -15,6 +15,14 @@ crate-type = ["cdylib"] default = ["swc_v1"] swc_v1 = [] swc_v2 = [] +# This feature exists to allow cargo operations +plugin = [ + "swc/plugin", + "wasmer", + "wasmer-wasi", + "wasmer/js-default", + "wasmer-wasi/js-default", +] [dependencies] anyhow = "1.0.42" @@ -30,3 +38,5 @@ swc_ecma_lints = {path = "../swc_ecma_lints", features = ["non_critical_lints"]} swc_ecmascript = {path = "../swc_ecmascript"} tracing = {version = "0.1.32", features = ["release_max_level_off"]} wasm-bindgen = {version = "0.2", features = ["serde-serialize"]} +wasmer = {version = "2.2.0", optional = true, default-features = false} +wasmer-wasi = {version = "2.2.0", optional = true, default-features = false} diff --git a/package.json b/package.json index 69c1ac03e80..a6f0a55819a 100644 --- a/package.json +++ b/package.json @@ -56,9 +56,12 @@ "prepare": "husky install && git config feature.manyFiles true && node ./crates/swc_ecma_preset_env/scripts/copy-data.js", "artifacts": "napi artifacts --dist scripts/npm", "prepublishOnly": "tsc -d && napi prepublish -p scripts/npm --tagstyle npm", - "build": "tsc -d && napi build --platform --cargo-name node --js ./node-swc/src/binding.js --dts ./node-swc/src/binding.d.ts -p node --release", - "build:dev": "tsc -d && napi build --platform --cargo-name node --js ./node-swc/src/binding.js --dts ./node-swc/src/binding.d.ts -p node", + "pack": "wasm-pack", "build:ts": "tsc -d", + "build:wasm": "npm-run-all \"pack -- build ./crates/wasm --scope swc {1} -t {2} --features plugin\" --", + "build:node": "napi build --platform --cargo-name node --js ./node-swc/src/binding.js --dts ./node-swc/src/binding.d.ts -p node", + "build": "npm-run-all build:ts \"build:node -- --release\"", + "build:dev": "npm-run-all build:ts build:node", "test": "cross-env NODE_OPTIONS='--experimental-vm-modules' jest node-swc/__tests__", "version": "napi version -p scripts/npm" }, @@ -91,6 +94,7 @@ "jest": "^27.0.1", "lodash": "^4.17.21", "mocha": "^9.1.3", + "npm-run-all": "^4.1.5", "progress": "^2.0.3", "prop-types": "^15.7.2", "react": "^17.0.2", @@ -122,4 +126,4 @@ "@swc/core-win32-ia32-msvc": "1.2.146", "@swc/core-win32-x64-msvc": "1.2.146" } -} +} \ No newline at end of file diff --git a/scripts/github/tests.yml b/scripts/github/tests.yml index cbfa4545330..6cd167577c1 100644 --- a/scripts/github/tests.yml +++ b/scripts/github/tests.yml @@ -20,10 +20,11 @@ os: check: node: - - "check" - - "check --no-default-features --features swc_v2" + - "check --features plugin" + - "check --no-default-features --features plugin --features swc_v2" swc: - - "hack check --feature-powerset --no-dev-deps" + # plugin feature is verified by other tasks + - "hack check --feature-powerset --no-dev-deps --exclude-features debug --exclude-features plugin" swc_bundler: - "hack check --feature-powerset --no-dev-deps" swc_common: diff --git a/tests/rust-plugins/swc_internal_plugin/Cargo.lock b/tests/rust-plugins/swc_internal_plugin/Cargo.lock index b0ee9d51909..c90a6e45505 100644 --- a/tests/rust-plugins/swc_internal_plugin/Cargo.lock +++ b/tests/rust-plugins/swc_internal_plugin/Cargo.lock @@ -776,7 +776,7 @@ dependencies = [ [[package]] name = "swc_common" -version = "0.17.15" +version = "0.17.17" dependencies = [ "ahash", "anyhow", @@ -816,7 +816,7 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "0.93.0" +version = "0.94.3" dependencies = [ "either", "enum_kind", @@ -834,7 +834,7 @@ dependencies = [ [[package]] name = "swc_ecma_quote" -version = "0.4.0" +version = "0.5.0" dependencies = [ "swc_atoms", "swc_common", @@ -845,7 +845,7 @@ dependencies = [ [[package]] name = "swc_ecma_quote_macros" -version = "0.3.0" +version = "0.4.0" dependencies = [ "anyhow", "pmutil", @@ -861,7 +861,7 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "0.72.0" +version = "0.73.0" dependencies = [ "indexmap", "once_cell", @@ -914,7 +914,7 @@ dependencies = [ [[package]] name = "swc_plugin" -version = "0.33.0" +version = "0.34.0" dependencies = [ "swc_atoms", "swc_common", diff --git a/tsconfig.json b/tsconfig.json index 8ffd6c70e68..5d2e723e866 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -41,7 +41,7 @@ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ @@ -51,6 +51,7 @@ /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + "incremental": true /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ }, "include": [ "node-swc/src/" diff --git a/yarn.lock b/yarn.lock index 59baea0d52f..b019c9ca5e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1984,7 +1984,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -call-bind@^1.0.0: +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -2022,7 +2022,7 @@ caniuse-lite@^1.0.30001313: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz#65c7f9fb7e4594fca0a333bec1d8939662377596" integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw== -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2235,6 +2235,17 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.1, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2460,6 +2471,41 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2669,7 +2715,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== @@ -2693,6 +2739,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -2751,6 +2805,11 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2771,6 +2830,18 @@ has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -2783,6 +2854,11 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -2868,11 +2944,27 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2880,6 +2972,19 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-ci@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" @@ -2894,6 +2999,20 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2916,6 +3035,18 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -2936,11 +3067,38 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -2951,6 +3109,13 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3534,6 +3699,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3583,6 +3753,16 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -3673,6 +3853,11 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -3765,6 +3950,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -3785,11 +3975,36 @@ node-releases@^2.0.2: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -3807,12 +4022,17 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.0: +object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -3900,6 +4120,14 @@ parent-module@^2.0.0: dependencies: callsites "^3.1.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -3925,16 +4153,28 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -3950,6 +4190,16 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -4061,6 +4311,15 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4155,6 +4414,15 @@ resolve-global@^1.0.0: dependencies: global-dirs "^0.1.1" +resolve@^1.10.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^1.14.2, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" @@ -4192,6 +4460,11 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -4216,6 +4489,13 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4223,11 +4503,30 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -4291,6 +4590,32 @@ sourcemap-validator@^2.1.0: lodash.template "^4.5.0" source-map "~0.1.x" +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4320,6 +4645,31 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.padend@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" + integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -4334,6 +4684,11 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -4378,6 +4733,11 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -4495,6 +4855,16 @@ typescript@^4.5.2: resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -4549,6 +4919,14 @@ v8-to-istanbul@^8.0.0: convert-source-map "^1.6.0" source-map "^0.7.3" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validator@^13.5.2: version "13.7.0" resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" @@ -4611,6 +4989,17 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: tr46 "^2.1.0" webidl-conversions "^6.1.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -4618,6 +5007,13 @@ which@2.0.2, which@^2.0.1: dependencies: isexe "^2.0.0" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"