mirror of
https://github.com/swc-project/swc.git
synced 2025-01-03 02:54:43 +03:00
refactor(plugin/runner): Split modules and introduce feature flags (#4035)
This commit is contained in:
parent
62c1e944aa
commit
dab2002a2e
12
.github/workflows/cargo.yml
vendored
12
.github/workflows/cargo.yml
vendored
@ -102,6 +102,8 @@ jobs:
|
|||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
- crate: enum_kind
|
- crate: enum_kind
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
|
- crate: fastmem
|
||||||
|
os: ubuntu-latest
|
||||||
- crate: from_variant
|
- crate: from_variant
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
- crate: jsdoc
|
- crate: jsdoc
|
||||||
@ -109,8 +111,8 @@ jobs:
|
|||||||
- crate: node
|
- crate: node
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
check: |
|
check: |
|
||||||
cargo check
|
cargo check --features plugin
|
||||||
cargo check --no-default-features --features swc_v2
|
cargo check --no-default-features --features plugin --features swc_v2
|
||||||
- crate: node_macro_deps
|
- crate: node_macro_deps
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
- crate: preset_env_base
|
- crate: preset_env_base
|
||||||
@ -120,7 +122,7 @@ jobs:
|
|||||||
- crate: swc
|
- crate: swc
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
check: |
|
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
|
- crate: swc
|
||||||
os: windows-latest
|
os: windows-latest
|
||||||
- crate: swc_atoms
|
- crate: swc_atoms
|
||||||
@ -129,6 +131,8 @@ jobs:
|
|||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
check: |
|
check: |
|
||||||
cargo hack check --feature-powerset --no-dev-deps
|
cargo hack check --feature-powerset --no-dev-deps
|
||||||
|
- crate: swc_cached
|
||||||
|
os: ubuntu-latest
|
||||||
- crate: swc_cli
|
- crate: swc_cli
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
- crate: swc_cli
|
- crate: swc_cli
|
||||||
@ -241,6 +245,8 @@ jobs:
|
|||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
- crate: swc_eq_ignore_macros
|
- crate: swc_eq_ignore_macros
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
|
- crate: swc_error_reporters
|
||||||
|
os: ubuntu-latest
|
||||||
- crate: swc_estree_ast
|
- crate: swc_estree_ast
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
- crate: swc_estree_compat
|
- crate: swc_estree_compat
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -54,4 +54,5 @@ pkg/
|
|||||||
# Used to see output of babel.
|
# Used to see output of babel.
|
||||||
/lab
|
/lab
|
||||||
|
|
||||||
*.mm_profdata
|
*.mm_profdata
|
||||||
|
.tsbuildinfo
|
@ -67,3 +67,4 @@ jest.config.js
|
|||||||
cliff.toml
|
cliff.toml
|
||||||
.kodiak.toml
|
.kodiak.toml
|
||||||
clippy.toml
|
clippy.toml
|
||||||
|
.tsbuildinfo
|
||||||
|
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -977,8 +977,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
|
checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
|
"js-sys",
|
||||||
"libc",
|
"libc",
|
||||||
"wasi 0.10.2+wasi-snapshot-preview1",
|
"wasi 0.10.2+wasi-snapshot-preview1",
|
||||||
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1661,6 +1663,8 @@ dependencies = [
|
|||||||
"tracing-chrome",
|
"tracing-chrome",
|
||||||
"tracing-futures",
|
"tracing-futures",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
"wasmer",
|
||||||
|
"wasmer-wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -3082,6 +3086,8 @@ dependencies = [
|
|||||||
"tracing-futures",
|
"tracing-futures",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
|
"wasmer",
|
||||||
|
"wasmer-wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4506,6 +4512,8 @@ dependencies = [
|
|||||||
"swc_ecmascript",
|
"swc_ecmascript",
|
||||||
"tracing",
|
"tracing",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
|
"wasmer",
|
||||||
|
"wasmer-wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -4598,6 +4606,7 @@ dependencies = [
|
|||||||
"wasmer-engine-universal",
|
"wasmer-engine-universal",
|
||||||
"wasmer-types",
|
"wasmer-types",
|
||||||
"wasmer-vm",
|
"wasmer-vm",
|
||||||
|
"wasmparser",
|
||||||
"wat",
|
"wat",
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
@ -4765,6 +4774,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "5d9c4be9fba0cb769ae2466437d629427bb2494c9e134eacd15a6f8127a77dc2"
|
checksum = "5d9c4be9fba0cb769ae2466437d629427bb2494c9e134eacd15a6f8127a77dc2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
|
"slab",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
@ -13,7 +13,7 @@ crate-type = ["cdylib"]
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["swc_v1", "plugin"]
|
default = ["swc_v1", "plugin"]
|
||||||
plugin = ["swc/plugin"]
|
plugin = ["swc/plugin", "wasmer/default", "wasmer-wasi/default"]
|
||||||
swc_v1 = ["swc_node_bundler/swc_v1"]
|
swc_v1 = ["swc_node_bundler/swc_v1"]
|
||||||
swc_v2 = ["swc_node_bundler/swc_v2"]
|
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-chrome = "0.4.0"
|
||||||
tracing-futures = "0.2.5"
|
tracing-futures = "0.2.5"
|
||||||
tracing-subscriber = { version = "0.3.9", features = ["env-filter"] }
|
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}
|
@ -119,7 +119,7 @@ impl RustPlugins {
|
|||||||
plugin_module = p.0.as_str()
|
plugin_module = p.0.as_str()
|
||||||
);
|
);
|
||||||
let transform_span_guard = span.enter();
|
let transform_span_guard = span.enter();
|
||||||
serialized = swc_plugin_runner::apply_js_plugin(
|
serialized = swc_plugin_runner::apply_transform_plugin(
|
||||||
&p.0,
|
&p.0,
|
||||||
&path,
|
&path,
|
||||||
&swc_plugin_runner::cache::PLUGIN_MODULE_CACHE,
|
&swc_plugin_runner::cache::PLUGIN_MODULE_CACHE,
|
||||||
|
@ -12,6 +12,14 @@ version = "0.26.1"
|
|||||||
name = "swc"
|
name = "swc"
|
||||||
path = "./src/main.rs"
|
path = "./src/main.rs"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = []
|
||||||
|
plugin = [
|
||||||
|
"swc/plugin",
|
||||||
|
"wasmer/default",
|
||||||
|
"wasmer-wasi/default",
|
||||||
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.53"
|
anyhow = "1.0.53"
|
||||||
atty = "0.2.14"
|
atty = "0.2.14"
|
||||||
@ -28,9 +36,10 @@ tracing-chrome = "0.4.0"
|
|||||||
tracing-futures = "0.2.5"
|
tracing-futures = "0.2.5"
|
||||||
tracing-subscriber = {version = "0.3.9", features = ["env-filter"]}
|
tracing-subscriber = {version = "0.3.9", features = ["env-filter"]}
|
||||||
walkdir = "2"
|
walkdir = "2"
|
||||||
|
wasmer = {version = "2.2.0", optional = true}
|
||||||
|
wasmer-wasi = {version = "2.2.0", optional = true}
|
||||||
|
|
||||||
[dependencies.path-absolutize]
|
[dependencies.path-absolutize]
|
||||||
features = ["once_cell_cache"]
|
features = ["once_cell_cache"]
|
||||||
version = "3.0.11"
|
version = "3.0.11"
|
||||||
|
|
||||||
[features]
|
|
||||||
|
@ -17,9 +17,11 @@ serde_json = "1.0.64"
|
|||||||
swc_common = {version = "0.17.0", path = "../swc_common", features = ["plugin-rt", "concurrent"]}
|
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"]}
|
swc_ecma_ast = {version = "0.70.0", path = "../swc_ecma_ast", features = ["rkyv-impl"]}
|
||||||
tracing = "0.1.32"
|
tracing = "0.1.32"
|
||||||
wasmer = "2.2.0"
|
wasmer = {version = "2.2.0", default-features = false}
|
||||||
wasmer-cache = "2.2.0"
|
wasmer-wasi = {version = "2.2.0", default-features = false}
|
||||||
wasmer-wasi = "2.2.0"
|
|
||||||
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
wasmer-cache = {version = "2.2.0"}
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
swc_atoms = {version = "0.2.7", path = '../swc_atoms'}
|
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_parser = {version = "0.94.0", path = "../swc_ecma_parser"}
|
||||||
swc_ecma_visit = {version = "0.56.0", path = "../swc_ecma_visit"}
|
swc_ecma_visit = {version = "0.56.0", path = "../swc_ecma_visit"}
|
||||||
testing = {version = "0.19.0", path = "../testing"}
|
testing = {version = "0.19.0", path = "../testing"}
|
||||||
|
# This allows we can run non-wasm32 target build command while some pkg select features for wasmer/js omits its transitive deps
|
||||||
[features]
|
wasmer = {version = "2.2.0"}
|
||||||
|
wasmer-wasi = {version = "2.2.0"}
|
||||||
|
15
crates/swc_plugin_runner/src/context.rs
Normal file
15
crates/swc_plugin_runner/src/context.rs
Normal file
@ -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<Memory>,
|
||||||
|
pub transform_result: Arc<Mutex<Vec<u8>>>,
|
||||||
|
}
|
132
crates/swc_plugin_runner/src/imported_fn.rs
Normal file
132
crates/swc_plugin_runner/src/imported_fn.rs
Normal file
@ -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::<Diagnostic>(&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()
|
||||||
|
}
|
@ -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 std::path::Path;
|
||||||
use cache::PluginModuleCache;
|
|
||||||
|
use anyhow::{Context, Error};
|
||||||
use once_cell::sync::Lazy;
|
use once_cell::sync::Lazy;
|
||||||
use parking_lot::Mutex;
|
use swc_common::plugin::Serialized;
|
||||||
use swc_common::{
|
use transform_executor::TransformExecutor;
|
||||||
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};
|
|
||||||
|
|
||||||
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
pub mod cache;
|
pub mod cache;
|
||||||
|
mod context;
|
||||||
|
mod imported_fn;
|
||||||
|
mod load_plugin;
|
||||||
|
mod memory_interop;
|
||||||
|
mod transform_executor;
|
||||||
|
|
||||||
#[tracing::instrument(level = "info", skip_all)]
|
// entrypoint fn swc calls to perform its transform via plugin.
|
||||||
fn copy_bytes_into_host(memory: &Memory, bytes_ptr: i32, bytes_ptr_len: i32) -> Vec<u8> {
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
let ptr: WasmPtr<u8, Array> = WasmPtr::new(bytes_ptr as _);
|
pub fn apply_transform_plugin(
|
||||||
|
|
||||||
// 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::<Vec<u8>>()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Locate a view from given memory, write serialized bytes into.
|
|
||||||
#[tracing::instrument(level = "info", skip_all)]
|
|
||||||
fn write_into_memory_view<F>(
|
|
||||||
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::<u8>();
|
|
||||||
|
|
||||||
// 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::<Diagnostic>(&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<Memory>,
|
|
||||||
transform_result: Arc<Mutex<Vec<u8>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tracing::instrument(level = "info", skip_all)]
|
|
||||||
fn load_plugin(
|
|
||||||
plugin_path: &Path,
|
|
||||||
cache: &Lazy<PluginModuleCache>,
|
|
||||||
) -> Result<(Instance, Arc<Mutex<Vec<u8>>>), Error> {
|
|
||||||
let module = cache.load_module(plugin_path);
|
|
||||||
|
|
||||||
return match module {
|
|
||||||
Ok(module) => {
|
|
||||||
let wasmer_store = module.store();
|
|
||||||
let transform_result: Arc<Mutex<Vec<u8>>> = 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<u32, i32>,
|
|
||||||
instance: Instance,
|
|
||||||
// Reference to the pointers succesfully allocated which'll be freed by Drop.
|
|
||||||
allocated_ptr_vec: Vec<(i32, i32)>,
|
|
||||||
transform_result: Arc<Mutex<Vec<u8>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PluginTransformTracker {
|
|
||||||
#[tracing::instrument(level = "info", skip(cache))]
|
|
||||||
fn new(path: &Path, cache: &Lazy<PluginModuleCache>) -> Result<PluginTransformTracker, Error> {
|
|
||||||
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::<u32, i32>("__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<Serialized, Error> {
|
|
||||||
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<Serialized, Error> {
|
|
||||||
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(
|
|
||||||
plugin_name: &str,
|
plugin_name: &str,
|
||||||
path: &Path,
|
path: &Path,
|
||||||
cache: &Lazy<PluginModuleCache>,
|
cache: &Lazy<cache::PluginModuleCache>,
|
||||||
program: Serialized,
|
program: Serialized,
|
||||||
config_json: Serialized,
|
config_json: Serialized,
|
||||||
context_json: Serialized,
|
context_json: Serialized,
|
||||||
) -> Result<Serialized, Error> {
|
) -> Result<Serialized, Error> {
|
||||||
(|| -> Result<_, Error> {
|
(|| -> 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)
|
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<Serialized, Error> {
|
||||||
|
unimplemented!("Not implemented yet");
|
||||||
|
}
|
||||||
|
125
crates/swc_plugin_runner/src/load_plugin.rs
Normal file
125
crates/swc_plugin_runner/src/load_plugin.rs
Normal file
@ -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<crate::cache::PluginModuleCache>,
|
||||||
|
) -> Result<(Instance, Arc<Mutex<Vec<u8>>>), Error> {
|
||||||
|
let module = cache.load_module(plugin_path);
|
||||||
|
|
||||||
|
return match module {
|
||||||
|
Ok(module) => {
|
||||||
|
let wasmer_store = module.store();
|
||||||
|
let transform_result: Arc<Mutex<Vec<u8>>> = 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),
|
||||||
|
};
|
||||||
|
}
|
63
crates/swc_plugin_runner/src/memory_interop.rs
Normal file
63
crates/swc_plugin_runner/src/memory_interop.rs
Normal file
@ -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<u8> {
|
||||||
|
let ptr: WasmPtr<u8, Array> = 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::<Vec<u8>>()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Locate a view from given memory, write serialized bytes into.
|
||||||
|
#[tracing::instrument(level = "info", skip_all)]
|
||||||
|
pub fn write_into_memory_view<F>(
|
||||||
|
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::<u8>();
|
||||||
|
|
||||||
|
// 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"),
|
||||||
|
)
|
||||||
|
}
|
130
crates/swc_plugin_runner/src/transform_executor.rs
Normal file
130
crates/swc_plugin_runner/src/transform_executor.rs
Normal file
@ -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<u32, i32>,
|
||||||
|
instance: Instance,
|
||||||
|
// Reference to the pointers succesfully allocated which'll be freed by Drop.
|
||||||
|
allocated_ptr_vec: Vec<(i32, i32)>,
|
||||||
|
transform_result: Arc<Mutex<Vec<u8>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TransformExecutor {
|
||||||
|
#[tracing::instrument(level = "info", skip(cache))]
|
||||||
|
pub fn new(
|
||||||
|
path: &std::path::Path,
|
||||||
|
cache: &once_cell::sync::Lazy<crate::cache::PluginModuleCache>,
|
||||||
|
) -> Result<TransformExecutor, Error> {
|
||||||
|
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::<u32, i32>("__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<Serialized, Error> {
|
||||||
|
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<Serialized, Error> {
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -87,7 +87,7 @@ fn internal() -> Result<(), Error> {
|
|||||||
|
|
||||||
let cache: Lazy<PluginModuleCache> = Lazy::new(PluginModuleCache::new);
|
let cache: Lazy<PluginModuleCache> = Lazy::new(PluginModuleCache::new);
|
||||||
|
|
||||||
let program_bytes = swc_plugin_runner::apply_js_plugin(
|
let program_bytes = swc_plugin_runner::apply_transform_plugin(
|
||||||
"internal-test",
|
"internal-test",
|
||||||
&path,
|
&path,
|
||||||
&cache,
|
&cache,
|
||||||
@ -135,7 +135,7 @@ fn internal() -> Result<(), Error> {
|
|||||||
let cache: Lazy<PluginModuleCache> = Lazy::new(PluginModuleCache::new);
|
let cache: Lazy<PluginModuleCache> = Lazy::new(PluginModuleCache::new);
|
||||||
|
|
||||||
let _res = HANDLER.set(&handler, || {
|
let _res = HANDLER.set(&handler, || {
|
||||||
swc_plugin_runner::apply_js_plugin(
|
swc_plugin_runner::apply_transform_plugin(
|
||||||
"internal-test",
|
"internal-test",
|
||||||
&path,
|
&path,
|
||||||
&cache,
|
&cache,
|
||||||
@ -168,7 +168,7 @@ fn internal() -> Result<(), Error> {
|
|||||||
let mut serialized_program = Serialized::serialize(&program).expect("Should serializable");
|
let mut serialized_program = Serialized::serialize(&program).expect("Should serializable");
|
||||||
let cache: Lazy<PluginModuleCache> = Lazy::new(PluginModuleCache::new);
|
let cache: Lazy<PluginModuleCache> = Lazy::new(PluginModuleCache::new);
|
||||||
|
|
||||||
serialized_program = swc_plugin_runner::apply_js_plugin(
|
serialized_program = swc_plugin_runner::apply_transform_plugin(
|
||||||
"internal-test",
|
"internal-test",
|
||||||
&path,
|
&path,
|
||||||
&cache,
|
&cache,
|
||||||
@ -180,7 +180,7 @@ fn internal() -> Result<(), Error> {
|
|||||||
.expect("Plugin should apply transform");
|
.expect("Plugin should apply transform");
|
||||||
|
|
||||||
// TODO: we'll need to apply 2 different plugins
|
// 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",
|
"internal-test",
|
||||||
&path,
|
&path,
|
||||||
&cache,
|
&cache,
|
||||||
|
@ -15,6 +15,14 @@ crate-type = ["cdylib"]
|
|||||||
default = ["swc_v1"]
|
default = ["swc_v1"]
|
||||||
swc_v1 = []
|
swc_v1 = []
|
||||||
swc_v2 = []
|
swc_v2 = []
|
||||||
|
# This feature exists to allow cargo operations
|
||||||
|
plugin = [
|
||||||
|
"swc/plugin",
|
||||||
|
"wasmer",
|
||||||
|
"wasmer-wasi",
|
||||||
|
"wasmer/js-default",
|
||||||
|
"wasmer-wasi/js-default",
|
||||||
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.42"
|
anyhow = "1.0.42"
|
||||||
@ -30,3 +38,5 @@ swc_ecma_lints = {path = "../swc_ecma_lints", features = ["non_critical_lints"]}
|
|||||||
swc_ecmascript = {path = "../swc_ecmascript"}
|
swc_ecmascript = {path = "../swc_ecmascript"}
|
||||||
tracing = {version = "0.1.32", features = ["release_max_level_off"]}
|
tracing = {version = "0.1.32", features = ["release_max_level_off"]}
|
||||||
wasm-bindgen = {version = "0.2", features = ["serde-serialize"]}
|
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}
|
||||||
|
10
package.json
10
package.json
@ -56,9 +56,12 @@
|
|||||||
"prepare": "husky install && git config feature.manyFiles true && node ./crates/swc_ecma_preset_env/scripts/copy-data.js",
|
"prepare": "husky install && git config feature.manyFiles true && node ./crates/swc_ecma_preset_env/scripts/copy-data.js",
|
||||||
"artifacts": "napi artifacts --dist scripts/npm",
|
"artifacts": "napi artifacts --dist scripts/npm",
|
||||||
"prepublishOnly": "tsc -d && napi prepublish -p scripts/npm --tagstyle 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",
|
"pack": "wasm-pack",
|
||||||
"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",
|
|
||||||
"build:ts": "tsc -d",
|
"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__",
|
"test": "cross-env NODE_OPTIONS='--experimental-vm-modules' jest node-swc/__tests__",
|
||||||
"version": "napi version -p scripts/npm"
|
"version": "napi version -p scripts/npm"
|
||||||
},
|
},
|
||||||
@ -91,6 +94,7 @@
|
|||||||
"jest": "^27.0.1",
|
"jest": "^27.0.1",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mocha": "^9.1.3",
|
"mocha": "^9.1.3",
|
||||||
|
"npm-run-all": "^4.1.5",
|
||||||
"progress": "^2.0.3",
|
"progress": "^2.0.3",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
@ -122,4 +126,4 @@
|
|||||||
"@swc/core-win32-ia32-msvc": "1.2.146",
|
"@swc/core-win32-ia32-msvc": "1.2.146",
|
||||||
"@swc/core-win32-x64-msvc": "1.2.146"
|
"@swc/core-win32-x64-msvc": "1.2.146"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,10 +20,11 @@ os:
|
|||||||
|
|
||||||
check:
|
check:
|
||||||
node:
|
node:
|
||||||
- "check"
|
- "check --features plugin"
|
||||||
- "check --no-default-features --features swc_v2"
|
- "check --no-default-features --features plugin --features swc_v2"
|
||||||
swc:
|
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:
|
swc_bundler:
|
||||||
- "hack check --feature-powerset --no-dev-deps"
|
- "hack check --feature-powerset --no-dev-deps"
|
||||||
swc_common:
|
swc_common:
|
||||||
|
12
tests/rust-plugins/swc_internal_plugin/Cargo.lock
generated
12
tests/rust-plugins/swc_internal_plugin/Cargo.lock
generated
@ -776,7 +776,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swc_common"
|
name = "swc_common"
|
||||||
version = "0.17.15"
|
version = "0.17.17"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@ -816,7 +816,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swc_ecma_parser"
|
name = "swc_ecma_parser"
|
||||||
version = "0.93.0"
|
version = "0.94.3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"either",
|
"either",
|
||||||
"enum_kind",
|
"enum_kind",
|
||||||
@ -834,7 +834,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swc_ecma_quote"
|
name = "swc_ecma_quote"
|
||||||
version = "0.4.0"
|
version = "0.5.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"swc_atoms",
|
"swc_atoms",
|
||||||
"swc_common",
|
"swc_common",
|
||||||
@ -845,7 +845,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swc_ecma_quote_macros"
|
name = "swc_ecma_quote_macros"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"pmutil",
|
"pmutil",
|
||||||
@ -861,7 +861,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swc_ecma_utils"
|
name = "swc_ecma_utils"
|
||||||
version = "0.72.0"
|
version = "0.73.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
@ -914,7 +914,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swc_plugin"
|
name = "swc_plugin"
|
||||||
version = "0.33.0"
|
version = "0.34.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"swc_atoms",
|
"swc_atoms",
|
||||||
"swc_common",
|
"swc_common",
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||||
// "types": [], /* Type declaration files to be included in compilation. */
|
// "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. */
|
// "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. */
|
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||||
/* Source Map Options */
|
/* Source Map Options */
|
||||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||||
@ -51,6 +51,7 @@
|
|||||||
/* Experimental Options */
|
/* Experimental Options */
|
||||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for 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": [
|
"include": [
|
||||||
"node-swc/src/"
|
"node-swc/src/"
|
||||||
|
406
yarn.lock
406
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"
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
||||||
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
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"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
|
||||||
integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
|
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"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz#65c7f9fb7e4594fca0a333bec1d8939662377596"
|
||||||
integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==
|
integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==
|
||||||
|
|
||||||
chalk@^2.0.0:
|
chalk@^2.0.0, chalk@^2.4.1:
|
||||||
version "2.4.2"
|
version "2.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||||
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
|
||||||
@ -2235,6 +2235,17 @@ cross-env@^7.0.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
cross-spawn "^7.0.1"
|
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:
|
cross-spawn@^7.0.1, cross-spawn@^7.0.3:
|
||||||
version "7.0.3"
|
version "7.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||||
@ -2460,6 +2471,41 @@ error-ex@^1.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.2.1"
|
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:
|
escalade@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
|
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"
|
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
|
||||||
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
|
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"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
|
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
|
||||||
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
|
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"
|
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
|
||||||
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
|
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:
|
glob-parent@~5.1.2:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
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"
|
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
|
||||||
integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
|
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:
|
has-flag@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
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"
|
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
|
||||||
integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
|
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:
|
has@^1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
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"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
||||||
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
|
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:
|
html-encoding-sniffer@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
|
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"
|
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
|
||||||
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
|
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:
|
is-arrayish@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
||||||
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
|
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:
|
is-binary-path@~2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
|
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:
|
dependencies:
|
||||||
binary-extensions "^2.0.0"
|
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:
|
is-ci@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994"
|
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:
|
dependencies:
|
||||||
has "^1.0.3"
|
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:
|
is-extglob@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
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:
|
dependencies:
|
||||||
is-extglob "^2.1.1"
|
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:
|
is-number@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
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"
|
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==
|
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:
|
is-stream@^2.0.0:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
|
||||||
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
|
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:
|
is-typedarray@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
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"
|
resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
|
||||||
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
|
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:
|
isexe@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
|
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"
|
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
|
||||||
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
|
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:
|
json-parse-even-better-errors@^2.3.0:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
|
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"
|
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
|
||||||
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
|
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:
|
locate-path@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
|
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
|
||||||
@ -3673,6 +3853,11 @@ makeerror@1.0.x:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tmpl "1.0.x"
|
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:
|
merge-stream@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
|
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"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
|
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:
|
node-int64@^0.4.0:
|
||||||
version "0.4.0"
|
version "0.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
|
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"
|
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
|
||||||
integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
|
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:
|
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
|
||||||
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
|
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:
|
npm-run-path@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
|
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"
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
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:
|
object-keys@^1.0.12, object-keys@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
|
||||||
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
|
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
|
||||||
|
|
||||||
object.assign@^4.1.0:
|
object.assign@^4.1.0, object.assign@^4.1.2:
|
||||||
version "4.1.2"
|
version "4.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
|
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
|
||||||
integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
|
integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
|
||||||
@ -3900,6 +4120,14 @@ parent-module@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
callsites "^3.1.0"
|
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:
|
parse-json@^5.0.0:
|
||||||
version "5.2.0"
|
version "5.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
|
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"
|
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
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:
|
path-key@^3.0.0, path-key@^3.1.0:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
|
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
|
||||||
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
|
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
|
||||||
|
|
||||||
path-parse@^1.0.6:
|
path-parse@^1.0.6, path-parse@^1.0.7:
|
||||||
version "1.0.7"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
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:
|
path-type@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
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"
|
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
|
||||||
integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
|
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:
|
pirates@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
|
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"
|
loose-envify "^1.1.0"
|
||||||
object-assign "^4.1.1"
|
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:
|
readdirp@~3.6.0:
|
||||||
version "3.6.0"
|
version "3.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
||||||
@ -4155,6 +4414,15 @@ resolve-global@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
global-dirs "^0.1.1"
|
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:
|
resolve@^1.14.2, resolve@^1.20.0:
|
||||||
version "1.20.0"
|
version "1.20.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
||||||
@ -4192,6 +4460,11 @@ saxes@^5.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
xmlchars "^2.2.0"
|
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:
|
semver@7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
|
||||||
@ -4216,6 +4489,13 @@ serialize-javascript@6.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
randombytes "^2.1.0"
|
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:
|
shebang-command@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||||
@ -4223,11 +4503,30 @@ shebang-command@^2.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
shebang-regex "^3.0.0"
|
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:
|
shebang-regex@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
||||||
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
|
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:
|
signal-exit@^3.0.2, signal-exit@^3.0.3:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
|
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"
|
lodash.template "^4.5.0"
|
||||||
source-map "~0.1.x"
|
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:
|
sprintf-js@~1.0.2:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
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"
|
is-fullwidth-code-point "^3.0.0"
|
||||||
strip-ansi "^6.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:
|
strip-ansi@^6.0.0:
|
||||||
version "6.0.0"
|
version "6.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
|
||||||
@ -4334,6 +4684,11 @@ strip-ansi@^6.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ansi-regex "^5.0.1"
|
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:
|
strip-bom@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
|
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"
|
has-flag "^4.0.0"
|
||||||
supports-color "^7.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:
|
symbol-tree@^3.2.4:
|
||||||
version "3.2.4"
|
version "3.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
|
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"
|
resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998"
|
||||||
integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==
|
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:
|
unicode-canonical-property-names-ecmascript@^1.0.4:
|
||||||
version "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"
|
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"
|
convert-source-map "^1.6.0"
|
||||||
source-map "^0.7.3"
|
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:
|
validator@^13.5.2:
|
||||||
version "13.7.0"
|
version "13.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857"
|
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"
|
tr46 "^2.1.0"
|
||||||
webidl-conversions "^6.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:
|
which@2.0.2, which@^2.0.1:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
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:
|
dependencies:
|
||||||
isexe "^2.0.0"
|
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:
|
word-wrap@~1.2.3:
|
||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
|
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
|
||||||
|
Loading…
Reference in New Issue
Block a user