feat(resolver): implement enforceExtension (#567)

This commit is contained in:
Boshen 2023-07-18 16:20:03 +08:00 committed by GitHub
parent c32dd32bad
commit e8b974564e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 221 additions and 23 deletions

164
Cargo.lock generated
View file

@ -433,6 +433,12 @@ dependencies = [
"syn 2.0.18",
]
[[package]]
name = "daachorse"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63b7ef7a4be509357f4804d0a22e830daddb48f19fd604e4ad32ddce04a94c36"
[[package]]
name = "dashmap"
version = "5.4.0"
@ -476,6 +482,12 @@ dependencies = [
"crypto-common",
]
[[package]]
name = "dunce"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
[[package]]
name = "either"
version = "1.8.1"
@ -838,6 +850,15 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "jsonc-parser"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b56a20e76235284255a09fcd1f45cf55d3c524ea657ebd3854735925c57743d"
dependencies = [
"serde_json",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@ -919,6 +940,15 @@ dependencies = [
"serde",
]
[[package]]
name = "matchers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
dependencies = [
"regex-automata",
]
[[package]]
name = "memchr"
version = "2.5.0"
@ -1042,6 +1072,36 @@ dependencies = [
"libloading",
]
[[package]]
name = "nodejs-resolver"
version = "0.0.88"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7259edee7a18be2bdc9802f3357044a964d6e0624030201849ed734b8901a23b"
dependencies = [
"daachorse",
"dashmap",
"dunce",
"indexmap",
"jsonc-parser",
"once_cell",
"path-absolutize",
"rustc-hash",
"serde",
"serde_json",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "nu-ansi-term"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
dependencies = [
"overload",
"winapi",
]
[[package]]
name = "num-bigint"
version = "0.4.3"
@ -1103,6 +1163,12 @@ dependencies = [
"num-traits",
]
[[package]]
name = "overload"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "owo-colors"
version = "3.5.0"
@ -1394,6 +1460,9 @@ version = "0.0.0"
dependencies = [
"criterion",
"dashmap",
"jemallocator",
"mimalloc",
"nodejs-resolver",
"serde",
"serde_json",
"static_assertions",
@ -1707,9 +1776,24 @@ checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f"
dependencies = [
"aho-corasick 1.0.2",
"memchr",
"regex-syntax",
"regex-syntax 0.7.2",
]
[[package]]
name = "regex-automata"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
dependencies = [
"regex-syntax 0.6.29",
]
[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
version = "0.7.2"
@ -1880,6 +1964,7 @@ version = "1.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
dependencies = [
"indexmap",
"itoa",
"ryu",
"serde",
@ -1909,6 +1994,15 @@ dependencies = [
"digest",
]
[[package]]
name = "sharded-slab"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
dependencies = [
"lazy_static",
]
[[package]]
name = "similar"
version = "2.2.1"
@ -2155,6 +2249,68 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "tracing"
version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
dependencies = [
"cfg-if",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.18",
]
[[package]]
name = "tracing-core"
version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
dependencies = [
"once_cell",
"valuable",
]
[[package]]
name = "tracing-log"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
dependencies = [
"lazy_static",
"log",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
dependencies = [
"matchers",
"nu-ansi-term",
"once_cell",
"regex",
"sharded-slab",
"smallvec",
"thread_local",
"tracing",
"tracing-core",
"tracing-log",
]
[[package]]
name = "typenum"
version = "1.16.0"
@ -2260,6 +2416,12 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
name = "valuable"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "version_check"
version = "0.9.4"

View file

@ -18,7 +18,14 @@ serde_json = { workspace = true }
[dev-dependencies]
static_assertions = { workspace = true }
criterion = { workspace = true }
vfs = "0.9.0"
vfs = "0.9.0" # for testing with in memory file system
nodejs-resolver = "0.0.88" # for benchmark
[target.'cfg(not(target_env = "msvc"))'.dev-dependencies]
jemallocator = { workspace = true }
[target.'cfg(target_os = "windows")'.dev-dependencies]
mimalloc = { workspace = true }
[[bench]]
name = "resolver"

View file

@ -7,35 +7,64 @@
//! cargo bench --bench resolver -- --save-baseline pr
//! critcmp
//! ```
use std::env;
#[cfg(not(target_env = "msvc"))]
#[global_allocator]
static GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc;
#[cfg(target_os = "windows")]
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
use std::{env, path::PathBuf};
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use oxc_resolver::Resolver;
fn criterion_benchmark(c: &mut Criterion) {
fn data() -> Vec<(PathBuf, &'static str)> {
let cwd = env::current_dir().unwrap().join("tests/enhanced_resolve/");
let resolver = Resolver::default();
let data = [
vec![
(cwd.clone(), "./"),
(cwd.clone(), "./lib/index"),
(cwd.join("./test/fixtures/extensions"), "./foo"),
(cwd.join("test/fixtures/extensions/module"), "module"),
];
// Check path is valid
for (path, request) in &data {
assert!(resolver.resolve(path, request).is_ok(), "{path:?} {request}");
}
c.bench_with_input(BenchmarkId::new("resolve", ""), &data, |b, data| {
b.iter(|| {
for (path, request) in data {
_ = resolver.resolve(path, request);
}
});
});
]
}
criterion_group!(benches, criterion_benchmark);
fn resolver_benchmark(c: &mut Criterion) {
let data = data();
// bench nodejs_resolver
{
let resolver = nodejs_resolver::Resolver::new(nodejs_resolver::Options::default());
// Check path is valid
for (path, request) in &data {
assert!(resolver.resolve(path, request).is_ok(), "{path:?} {request}");
}
c.bench_with_input(BenchmarkId::new("nodejs_resolver", ""), &data, |b, data| {
b.iter(|| {
for (path, request) in data {
_ = resolver.resolve(path, request);
}
});
});
}
// bench oxc_resolver
{
let resolver = oxc_resolver::Resolver::default();
// Check path is valid
for (path, request) in &data {
assert!(resolver.resolve(path, request).is_ok(), "{path:?} {request}");
}
c.bench_with_input(BenchmarkId::new("oxc_resolver", ""), &data, |b, data| {
b.iter(|| {
for (path, request) in data {
_ = resolver.resolve(path, request);
}
});
});
}
}
criterion_group!(benches, resolver_benchmark);
criterion_main!(benches);