diff --git a/.github/workflows/reusable-build.yml b/.github/workflows/reusable-build.yml index 938785487509..664c1a724e25 100644 --- a/.github/workflows/reusable-build.yml +++ b/.github/workflows/reusable-build.yml @@ -251,7 +251,8 @@ jobs: name: Test Node ${{ matrix.node }} env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true - PUPPETEER_SKIP_DOWNLOAD: true + # TODO: use puppeteer to test SRI Plugin, maybe find a better performance way + # PUPPETEER_SKIP_DOWNLOAD: true steps: - name: Checkout if: ${{ !inputs.skipable }} diff --git a/Cargo.lock b/Cargo.lock index 730e1f012916..f7d953e6e011 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4280,6 +4280,7 @@ dependencies = [ "rspack_plugin_schemes", "rspack_plugin_size_limits", "rspack_plugin_split_chunks", + "rspack_plugin_sri", "rspack_plugin_swc_js_minimizer", "rspack_plugin_warn_sensitive_module", "rspack_plugin_wasm", @@ -5310,6 +5311,37 @@ dependencies = [ "tracing", ] +[[package]] +name = "rspack_plugin_sri" +version = "0.2.0" +dependencies = [ + "cow-utils", + "dashmap 6.1.0", + "derive_more 1.0.0", + "futures", + "indexmap 2.7.0", + "pathdiff", + "rayon", + "regex", + "rspack_base64", + "rspack_cacheable", + "rspack_collections", + "rspack_core", + "rspack_error", + "rspack_fs", + "rspack_hook", + "rspack_paths", + "rspack_plugin_html", + "rspack_plugin_real_content_hash", + "rspack_plugin_runtime", + "rspack_util", + "rustc-hash 2.1.0", + "serde_json", + "sha2", + "tracing", + "urlencoding", +] + [[package]] name = "rspack_plugin_swc_js_minimizer" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index 26ad18c54c5f..46286e826567 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -180,6 +180,7 @@ rspack_plugin_runtime_chunk = { version = "0.2.0", path = "crates/rsp rspack_plugin_schemes = { version = "0.2.0", path = "crates/rspack_plugin_schemes" } rspack_plugin_size_limits = { version = "0.2.0", path = "crates/rspack_plugin_size_limits" } rspack_plugin_split_chunks = { version = "0.2.0", path = "crates/rspack_plugin_split_chunks" } +rspack_plugin_sri = { version = "0.2.0", path = "crates/rspack_plugin_sri" } rspack_plugin_swc_js_minimizer = { version = "0.2.0", path = "crates/rspack_plugin_swc_js_minimizer" } rspack_plugin_warn_sensitive_module = { version = "0.2.0", path = "crates/rspack_plugin_warn_sensitive_module" } rspack_plugin_wasm = { version = "0.2.0", path = "crates/rspack_plugin_wasm" } diff --git a/README.md b/README.md index 632f7b95aefb..f61d5a4c8bc2 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Thanks to: - The [prefresh](https://github.com/preactjs/prefresh) created by [@Jovi De Croock](https://github.com/JoviDeCroock), which inspires implement [preact refresh rspack plugin](https://github.com/rspack-contrib/rspack-plugin-preact-refresh). - The [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) project created by [@sokra](https://github.com/sokra) which inspired implement css extract plugin. - The [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin) project created by [@kevlened](https://github.com/kevlened) which inspired implement copy rspack plugin. +- The [webpack-subresource-integrity](https://github.com/waysact/webpack-subresource-integrity) project created by [@jscheid](https://github.com/jscheid), which inspires implement subresource integrity rspack plugin. ## License diff --git a/README.zh-CN.md b/README.zh-CN.md index 2cced786c4c6..e232d0b022b8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -76,6 +76,7 @@ Rspack 是一个基于 Rust 编写的高性能 JavaScript 打包工具,它提 - [prefresh](https://github.com/preactjs/prefresh) 项目(由 [@Jovi De Croock](https://github.com/JoviDeCroock) 创建),它启发了 Rspack 内的 PreactRefreshPlugin 实现。 - [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) 项目(由 [@sokra](https://github.com/sokra) 创建),它启发了 Rspack 内的 CssExtractPlugin 实现。 - [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin) 项目(由 [@kevlened](https://github.com/kevlened) 创建),它启发了 Rspack 内的 CopyPlugin 实现。 +- [webpack-subresource-integrity](https://github.com/waysact/webpack-subresource-integrity) 项目(由 [@jscheid](https://github.com/jscheid) 创建),它启发了 Rspack 内的 SubresourceIntegrityPlugin 实现。 ## License diff --git a/crates/node_binding/binding.d.ts b/crates/node_binding/binding.d.ts index 3b582e11cac4..3608aa737463 100644 --- a/crates/node_binding/binding.d.ts +++ b/crates/node_binding/binding.d.ts @@ -381,7 +381,8 @@ export declare enum BuiltinPluginName { CssExtractRspackPlugin = 'CssExtractRspackPlugin', RsdoctorPlugin = 'RsdoctorPlugin', JsLoaderRspackPlugin = 'JsLoaderRspackPlugin', - LazyCompilationPlugin = 'LazyCompilationPlugin' + LazyCompilationPlugin = 'LazyCompilationPlugin', + SubresourceIntegrityPlugin = 'SubresourceIntegrityPlugin' } export declare function cleanupGlobalTrace(): void @@ -1756,6 +1757,15 @@ export interface RawInfo { version?: string } +export interface RawIntegrityData { + integerities: Array +} + +export interface RawIntegrityItem { + asset: string + integrity: string +} + export interface RawJavascriptParserOptions { dynamicImportMode?: string dynamicImportPreload?: string @@ -2240,6 +2250,12 @@ export interface RawStorageOptions { directory: string } +export interface RawSubresourceIntegrityPluginOptions { + integrityCallback?: (data: RawIntegrityData) => void + hashFuncNames: Array + htmlPlugin: "JavaScript" | "Native" | "Disabled" +} + export interface RawSwcJsMinimizerOptions { compress: any mangle: any diff --git a/crates/rspack_binding_values/Cargo.toml b/crates/rspack_binding_values/Cargo.toml index 0b1933b98c64..3ef46874d76e 100644 --- a/crates/rspack_binding_values/Cargo.toml +++ b/crates/rspack_binding_values/Cargo.toml @@ -82,6 +82,7 @@ rspack_plugin_runtime_chunk = { workspace = true } rspack_plugin_schemes = { workspace = true } rspack_plugin_size_limits = { workspace = true } rspack_plugin_split_chunks = { workspace = true } +rspack_plugin_sri = { workspace = true } rspack_plugin_swc_js_minimizer = { workspace = true } rspack_plugin_warn_sensitive_module = { workspace = true } rspack_plugin_wasm = { workspace = true } diff --git a/crates/rspack_binding_values/src/raw_options/raw_builtins/mod.rs b/crates/rspack_binding_values/src/raw_options/raw_builtins/mod.rs index e009fa5803f9..95af22a88204 100644 --- a/crates/rspack_binding_values/src/raw_options/raw_builtins/mod.rs +++ b/crates/rspack_binding_values/src/raw_options/raw_builtins/mod.rs @@ -13,6 +13,7 @@ mod raw_mf; mod raw_progress; mod raw_runtime_chunk; mod raw_size_limits; +mod raw_sri; mod raw_swc_js_minimizer; use napi::{bindgen_prelude::FromNapiValue, Env, JsUnknown}; @@ -20,6 +21,7 @@ use napi_derive::napi; use raw_dll::{RawDllReferenceAgencyPluginOptions, RawFlagAllModulesAsUsedPluginOptions}; use raw_ids::RawOccurrenceChunkIdsPluginOptions; use raw_lightning_css_minimizer::RawLightningCssMinimizerRspackPluginOptions; +use raw_sri::RawSubresourceIntegrityPluginOptions; use rspack_core::{BoxPlugin, Plugin, PluginExt}; use rspack_error::Result; use rspack_ids::{ @@ -76,6 +78,7 @@ use rspack_plugin_runtime::{ use rspack_plugin_runtime_chunk::RuntimeChunkPlugin; use rspack_plugin_schemes::{DataUriPlugin, FileUriPlugin}; use rspack_plugin_size_limits::SizeLimitsPlugin; +use rspack_plugin_sri::SubresourceIntegrityPlugin; use rspack_plugin_swc_js_minimizer::SwcJsMinimizerRspackPlugin; use rspack_plugin_warn_sensitive_module::WarnCaseSensitiveModulesPlugin; use rspack_plugin_wasm::{ @@ -199,6 +202,7 @@ pub enum BuiltinPluginName { // naming format follow XxxRspackPlugin JsLoaderRspackPlugin, LazyCompilationPlugin, + SubresourceIntegrityPlugin, } #[napi(object)] @@ -565,6 +569,11 @@ impl BuiltinPlugin { let options = raw_options.into(); plugins.push(RsdoctorPlugin::new(options).boxed()); } + BuiltinPluginName::SubresourceIntegrityPlugin => { + let raw_options = downcast_into::(self.options)?; + let options = raw_options.into(); + plugins.push(SubresourceIntegrityPlugin::new(options).boxed()); + } } Ok(()) } diff --git a/crates/rspack_binding_values/src/raw_options/raw_builtins/raw_sri.rs b/crates/rspack_binding_values/src/raw_options/raw_builtins/raw_sri.rs new file mode 100644 index 000000000000..649eec7a5fd3 --- /dev/null +++ b/crates/rspack_binding_values/src/raw_options/raw_builtins/raw_sri.rs @@ -0,0 +1,68 @@ +use std::sync::Arc; + +use derive_more::Debug; +use napi_derive::napi; +use rspack_napi::threadsafe_function::ThreadsafeFunction; +use rspack_plugin_sri::{ + IntegrityCallbackData, SubresourceIntegrityHashFunction, SubresourceIntegrityPluginOptions, +}; + +#[derive(Debug)] +#[napi( + object, + object_to_js = false, + js_name = "RawSubresourceIntegrityPluginOptions" +)] +pub struct RawSubresourceIntegrityPluginOptions { + #[debug(skip)] + #[napi(ts_type = "(data: RawIntegrityData) => void")] + pub integrity_callback: Option>, + pub hash_func_names: Vec, + #[napi(ts_type = "\"JavaScript\" | \"Native\" | \"Disabled\"")] + pub html_plugin: String, +} + +impl From for SubresourceIntegrityPluginOptions { + fn from(options: RawSubresourceIntegrityPluginOptions) -> Self { + Self { + integrity_callback: if let Some(func) = options.integrity_callback { + Some(Arc::new(move |data| { + func.blocking_call_with_sync(data.into()) + })) + } else { + None + }, + hash_func_names: options + .hash_func_names + .into_iter() + .map(SubresourceIntegrityHashFunction::from) + .collect::>(), + html_plugin: options.html_plugin.into(), + } + } +} + +#[derive(Debug)] +#[napi(object)] +pub struct RawIntegrityData { + pub integerities: Vec, +} + +impl From for RawIntegrityData { + fn from(data: IntegrityCallbackData) -> Self { + Self { + integerities: data + .integerities + .into_iter() + .map(|(asset, integrity)| RawIntegrityItem { asset, integrity }) + .collect::>(), + } + } +} + +#[derive(Debug)] +#[napi(object)] +pub struct RawIntegrityItem { + pub asset: String, + pub integrity: String, +} diff --git a/crates/rspack_plugin_sri/Cargo.toml b/crates/rspack_plugin_sri/Cargo.toml new file mode 100644 index 000000000000..baff170432f7 --- /dev/null +++ b/crates/rspack_plugin_sri/Cargo.toml @@ -0,0 +1,38 @@ +[package] +description = "rspack subresource integrity plugin" +edition = "2021" +license = "MIT" +name = "rspack_plugin_sri" +repository = "https://github.com/web-infra-dev/rspack" +version = "0.2.0" +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +cow-utils = { workspace = true } +dashmap = { workspace = true } +derive_more = { workspace = true, features = ["debug"] } +futures = { workspace = true } +indexmap = { workspace = true } +pathdiff = { workspace = true } +rayon = { workspace = true } +regex = { workspace = true } +rspack_base64 = { workspace = true } +rspack_cacheable = { workspace = true } +rspack_collections = { workspace = true } +rspack_core = { workspace = true } +rspack_error = { workspace = true } +rspack_fs = { workspace = true } +rspack_hook = { workspace = true } +rspack_paths = { workspace = true } +rspack_plugin_html = { workspace = true } +rspack_plugin_real_content_hash = { workspace = true } +rspack_plugin_runtime = { workspace = true } +rspack_util = { workspace = true } +rustc-hash = { workspace = true } +serde_json = { workspace = true } +sha2 = { workspace = true } +tracing = { workspace = true } +urlencoding = { workspace = true } + +[package.metadata.cargo-shear] +ignored = ["tracing"] diff --git a/crates/rspack_plugin_sri/LICENSE b/crates/rspack_plugin_sri/LICENSE new file mode 100644 index 000000000000..46310101ad8a --- /dev/null +++ b/crates/rspack_plugin_sri/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022-present Bytedance, Inc. and its affiliates. + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/rspack_plugin_sri/src/asset.rs b/crates/rspack_plugin_sri/src/asset.rs new file mode 100644 index 000000000000..e13033c24abc --- /dev/null +++ b/crates/rspack_plugin_sri/src/asset.rs @@ -0,0 +1,328 @@ +use std::{cmp::Ordering, sync::Arc}; + +use rayon::iter::{IntoParallelIterator, IntoParallelRefIterator, ParallelIterator}; +use rspack_core::{ + chunk_graph_chunk::ChunkId, + rspack_sources::{ReplaceSource, Source}, + ChunkUkey, Compilation, CompilationAfterProcessAssets, CompilationAssets, + CompilationProcessAssets, CrossOriginLoading, +}; +use rspack_error::{Diagnostic, Result}; +use rspack_hook::plugin_hook; +use rspack_plugin_real_content_hash::RealContentHashPluginUpdateHash; +use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet}; + +use crate::{ + config::IntegrityHtmlPlugin, + integrity::{compute_integrity, SubresourceIntegrityHashFunction}, + util::{make_placeholder, use_any_hash, PLACEHOLDER_PREFIX, PLACEHOLDER_REGEX}, + IntegrityCallbackData, SubresourceIntegrityPlugin, SubresourceIntegrityPluginInner, +}; + +#[derive(Debug, Clone)] +struct ProcessChunkResult { + pub file: String, + pub source: Option>, + pub warnings: Vec, + pub placeholder: Option, + pub integrity: Option, +} + +fn process_chunks( + hash_funcs: &Vec, + compilation: &mut Compilation, +) -> HashMap { + let mut hash_by_placeholders = HashMap::default(); + let mut integrities = HashMap::default(); + let batches = digest_chunks(compilation); + + if matches!( + compilation.options.output.cross_origin_loading, + CrossOriginLoading::Disable + ) { + compilation.push_diagnostic(Diagnostic::warn( + "SubresourceIntegrity".to_string(), + r#"SRI requires a cross-origin policy, defaulting to "anonymous". +Set rspack option output.crossOriginLoading to a value other than false +to make this warning go away. +See https://w3c.github.io/webappsec-subresource-integrity/#cross-origin-data-leakage"# + .to_string(), + )); + } + + for batch in batches { + let chunks = batch + .into_iter() + .filter_map(|c| compilation.chunk_by_ukey.get(&c)) + .collect::>(); + + let results = chunks + .into_par_iter() + .flat_map(|c| { + let mut files = c + .files() + .iter() + .map(|f| (c.id(&compilation.chunk_ids_artifact), f)) + .collect::>(); + files.sort_by(|a, b| { + let a_file = a.1.split("?").next().expect("should have a file name"); + let b_file = b.1.split("?").next().expect("should have a file name"); + if a_file.ends_with(".css") { + Ordering::Less + } else if b_file.ends_with(".css") { + Ordering::Greater + } else { + a_file.cmp(b_file) + } + }); + files + }) + .map(|(chunk_id, file)| { + if let Some(source) = compilation.assets().get(file).and_then(|a| a.get_source()) { + process_chunk_source( + file, + source.clone(), + chunk_id, + hash_funcs, + &hash_by_placeholders, + ) + } else { + ProcessChunkResult { + file: file.to_string(), + source: None, + warnings: vec![format!("No asset found for source path '{}'", file)], + placeholder: None, + integrity: None, + } + } + }) + .collect::>(); + + let mut should_warn_content_hash = false; + for result in results { + for warning in result.warnings { + compilation.push_diagnostic(Diagnostic::warn( + "SubresourceIntegrity".to_string(), + warning, + )); + } + + let Some(integrity) = result.integrity else { + continue; + }; + + integrities.insert(result.file.clone(), integrity.clone()); + if let Some(placeholder) = result.placeholder { + hash_by_placeholders.insert(placeholder, integrity.clone()); + } + + let real_content_hash = compilation.options.optimization.real_content_hash; + + if let Some(source) = result.source { + if let Some(error) = compilation + .update_asset(&result.file, |_, info| { + if use_any_hash(&info) && (info.content_hash.is_empty() || !real_content_hash) { + should_warn_content_hash = true; + } + + let mut new_info = info.clone(); + new_info.content_hash.insert(integrity); + Ok((Arc::new(source), new_info)) + }) + .err() + { + compilation.push_diagnostic(Diagnostic::error( + "SubresourceIntegrity".to_string(), + format!("Failed to update asset '{}': {}", result.file, error), + )); + } + } + } + if should_warn_content_hash { + compilation.push_diagnostic(Diagnostic::warn( + "SubresourceIntegrity".to_string(), + r#"Using [hash], [fullhash], [modulehash], or [chunkhash] is dangerous +with SRI. The same is true for [contenthash] when realContentHash is disabled. +Use [contenthash] and ensure realContentHash is enabled. See the README for +more information."# + .to_string(), + )); + } + } + + integrities +} + +fn process_chunk_source( + file: &str, + source: Arc, + chunk_id: Option<&ChunkId>, + hash_funcs: &Vec, + hash_by_placeholders: &HashMap, +) -> ProcessChunkResult { + // generate new source + let mut new_source = ReplaceSource::new(source.clone()); + + let mut warnings = vec![]; + let source_content = source.source(); + if source_content.contains("webpackHotUpdate") { + warnings.push("SubresourceIntegrity: SubResourceIntegrityPlugin may interfere with hot reloading. Consider disabling this plugin in development mode.".to_string()); + } + + // replace placeholders with integrity hash + for caps in PLACEHOLDER_REGEX.captures_iter(&source_content) { + if let Some(m) = caps.get(0) { + let replacement = hash_by_placeholders + .get(m.as_str()) + .map(|i| i.as_str()) + .unwrap_or(m.as_str()); + new_source.replace(m.start() as u32, m.end() as u32, replacement, None); + } + } + + // compute self integrity and placeholder + let integrity = compute_integrity(hash_funcs, new_source.source().as_ref()); + let placeholder = chunk_id.map(|id| make_placeholder(hash_funcs, id.as_str())); + + ProcessChunkResult { + file: file.to_string(), + source: Some(Arc::new(new_source)), + warnings, + placeholder, + integrity: Some(integrity), + } +} + +fn digest_chunks(compilation: &Compilation) -> Vec> { + let mut batches = vec![]; + let mut visited_chunk_groups = HashSet::default(); + let mut visited_chunks = HashSet::default(); + let mut batch_chunk_groups = compilation.entrypoints().values().collect::>(); + + while !batch_chunk_groups.is_empty() { + let mut chunk_batch = HashSet::default(); + for chunk_group in std::mem::take(&mut batch_chunk_groups) { + if visited_chunk_groups.contains(chunk_group) { + continue; + } + visited_chunk_groups.insert(chunk_group); + if let Some(chunk_group) = compilation.chunk_group_by_ukey.get(chunk_group) { + batch_chunk_groups.extend(chunk_group.children.iter()); + for chunk in chunk_group.chunks.iter() { + if visited_chunks.contains(chunk) { + continue; + } + visited_chunks.insert(*chunk); + chunk_batch.insert(*chunk); + } + } + } + batches.push(chunk_batch); + } + batches.reverse(); + batches +} + +fn add_minssing_integrities( + assets: &CompilationAssets, + integrities: &mut HashMap, + hash_func_names: &Vec, +) { + let new_integrities = assets + .par_iter() + .filter_map(|(src, asset)| { + if integrities.contains_key(src) { + return None; + } + asset.source.as_ref().map(|s| { + let content = s.source(); + let integrity = compute_integrity(hash_func_names, &content); + (src.clone(), integrity) + }) + }) + .collect::>(); + + integrities.extend(new_integrities); +} + +#[plugin_hook(CompilationProcessAssets for SubresourceIntegrityPlugin, stage = Compilation::PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE - 1)] +pub async fn handle_assets(&self, compilation: &mut Compilation) -> Result<()> { + let integrities = process_chunks(&self.options.hash_func_names, compilation); + let mut compilation_integrities = + SubresourceIntegrityPlugin::get_compilation_integrities_mut(compilation.id()); + compilation_integrities.extend(integrities); + + if matches!( + self.options.html_plugin, + IntegrityHtmlPlugin::NativePlugin | IntegrityHtmlPlugin::JavaScriptPlugin + ) { + add_minssing_integrities( + compilation.assets(), + &mut compilation_integrities, + &self.options.hash_func_names, + ); + } + + if matches!( + self.options.html_plugin, + IntegrityHtmlPlugin::JavaScriptPlugin + ) { + if let Some(integrity_callback) = &self.options.integrity_callback { + integrity_callback(IntegrityCallbackData { + integerities: compilation_integrities.clone(), + })?; + } + } + + Ok(()) +} + +#[plugin_hook(CompilationAfterProcessAssets for SubresourceIntegrityPlugin)] +pub async fn detect_unresolved_integrity(&self, compilation: &mut Compilation) -> Result<()> { + let mut contain_unresolved_files = vec![]; + for chunk in compilation.chunk_by_ukey.values() { + for file in chunk.files() { + if let Some(source) = compilation.assets().get(file).and_then(|a| a.get_source()) { + if source.source().contains(PLACEHOLDER_PREFIX.as_str()) { + contain_unresolved_files.push(file.to_string()); + } + } + } + } + + for file in contain_unresolved_files { + compilation.push_diagnostic(Diagnostic::error( + "SubresourceIntegrity".to_string(), + format!("Asset {} contains unresolved integrity placeholders", file), + )); + } + Ok(()) +} + +#[plugin_hook(RealContentHashPluginUpdateHash for SubresourceIntegrityPlugin)] +pub async fn update_hash( + &self, + compilation: &Compilation, + assets: &[Arc], + old_hash: &str, +) -> Result> { + let mut compilation_integrities = + SubresourceIntegrityPlugin::get_compilation_integrities_mut(compilation.id()); + let key = compilation_integrities + .iter() + .filter_map(|(k, v)| { + if v == old_hash { + Some(k.to_string()) + } else { + None + } + }) + .next(); + if let (Some(key), Some(asset)) = (key, assets.first()) { + let content = asset.source(); + let new_integrity = compute_integrity(&self.options.hash_func_names, &content); + compilation_integrities.insert(key, new_integrity.clone()); + return Ok(Some(new_integrity)); + } + Ok(None) +} diff --git a/crates/rspack_plugin_sri/src/config.rs b/crates/rspack_plugin_sri/src/config.rs new file mode 100644 index 000000000000..14c3a66c79a2 --- /dev/null +++ b/crates/rspack_plugin_sri/src/config.rs @@ -0,0 +1,49 @@ +use std::sync::Arc; + +use derive_more::Debug; +use rspack_core::CrossOriginLoading; +use rspack_error::Result; +use rspack_fs::WritableFileSystem; +use rspack_paths::Utf8PathBuf; +use rustc_hash::FxHashMap as HashMap; + +use crate::integrity::SubresourceIntegrityHashFunction; + +pub type IntegrityCallbackFn = Arc Result<()> + Send + Sync>; + +#[derive(Debug)] +pub enum IntegrityHtmlPlugin { + NativePlugin, + JavaScriptPlugin, + Disabled, +} + +impl From for IntegrityHtmlPlugin { + fn from(value: String) -> Self { + match value.as_str() { + "JavaScript" => Self::JavaScriptPlugin, + "Native" => Self::NativePlugin, + "Disabled" => Self::Disabled, + _ => panic!("Invalid integrity html plugin: {}", value), + } + } +} + +#[derive(Debug)] +pub struct SubresourceIntegrityPluginOptions { + pub hash_func_names: Vec, + pub html_plugin: IntegrityHtmlPlugin, + #[debug(skip)] + pub integrity_callback: Option, +} + +pub type ArcFs = Arc; +pub struct SRICompilationContext { + pub fs: ArcFs, + pub output_path: Utf8PathBuf, + pub cross_origin_loading: CrossOriginLoading, +} + +pub struct IntegrityCallbackData { + pub integerities: HashMap, +} diff --git a/crates/rspack_plugin_sri/src/html.rs b/crates/rspack_plugin_sri/src/html.rs new file mode 100644 index 000000000000..fca493d22bda --- /dev/null +++ b/crates/rspack_plugin_sri/src/html.rs @@ -0,0 +1,228 @@ +use futures::future::join_all; +use rspack_error::Result; +use rspack_hook::plugin_hook; +use rspack_paths::Utf8Path; +use rspack_plugin_html::{ + tag::{HtmlPluginAttribute, HtmlPluginTag}, + AlterAssetTagGroupsData, BeforeAssetTagGenerationData, HtmlPluginAlterAssetTagGroups, + HtmlPluginBeforeAssetTagGeneration, +}; +use rustc_hash::FxHashMap as HashMap; + +use crate::{ + config::ArcFs, integrity::compute_integrity, util::normalize_path, SRICompilationContext, + SubresourceIntegrityHashFunction, SubresourceIntegrityPlugin, SubresourceIntegrityPluginInner, +}; + +async fn handle_html_plugin_assets( + data: &mut BeforeAssetTagGenerationData, + compilation_integrities: &mut HashMap, +) -> Result<()> { + let normalized_integrities = get_normalized_integrities(compilation_integrities); + + let js_integrity = data + .assets + .js + .iter() + .map(|asset| { + get_integrity_chechsum_for_asset(asset, compilation_integrities, &normalized_integrities) + }) + .collect::>(); + + let css_integrity = data + .assets + .css + .iter() + .map(|asset| { + get_integrity_chechsum_for_asset(asset, compilation_integrities, &normalized_integrities) + }) + .collect::>(); + + data.assets.js_integrity = Some(js_integrity); + data.assets.css_integrity = Some(css_integrity); + + Ok(()) +} + +async fn handle_html_plugin_tags( + data: &mut AlterAssetTagGroupsData, + hash_func_names: &Vec, + integrities: &HashMap, + ctx: &SRICompilationContext, +) -> Result<()> { + let normalized_integrities = get_normalized_integrities(integrities); + + process_tag_group( + &mut data.head_tags, + &data.public_path, + hash_func_names, + integrities, + &normalized_integrities, + ctx, + ) + .await?; + process_tag_group( + &mut data.body_tags, + &data.public_path, + hash_func_names, + integrities, + &normalized_integrities, + ctx, + ) + .await?; + + Ok(()) +} + +async fn process_tag_group( + tags: &mut [HtmlPluginTag], + public_path: &str, + hash_func_names: &Vec, + integrities: &HashMap, + normalized_integrities: &HashMap, + ctx: &SRICompilationContext, +) -> Result<()> { + let tags_integrities = join_all(tags.iter().map(|tag| { + process_tag( + tag, + public_path, + integrities, + normalized_integrities, + hash_func_names, + ctx, + ) + })) + .await + .into_iter() + .collect::>>()?; + + for (tag, integrity) in tags.iter_mut().zip(tags_integrities) { + let Some(integrity) = integrity else { + continue; + }; + + tag.attributes.push(HtmlPluginAttribute { + attr_name: "integrity".to_string(), + attr_value: Some(integrity), + }); + + if get_tag_attribute(tag, "crossorigin").is_none() { + tag.attributes.push(HtmlPluginAttribute { + attr_name: "crossorigin".to_string(), + attr_value: Some("anonymous".to_string()), + }); + } + } + + Ok(()) +} + +async fn process_tag( + tag: &HtmlPluginTag, + public_path: &str, + integrities: &HashMap, + normalized_integrities: &HashMap, + hash_func_names: &Vec, + ctx: &SRICompilationContext, +) -> Result> { + if tag.tag_name != "script" && tag.tag_name != "link" { + return Ok(None); + } + + if get_tag_attribute(tag, "integrity").is_some() { + return Ok(None); + } + + let Some(tag_src) = get_tag_attribute(tag, "href").or(get_tag_attribute(tag, "src")) else { + return Ok(None); + }; + + let src = get_asset_path(&tag_src, public_path); + if let Some(integrity) = + get_integrity_chechsum_for_asset(&src, integrities, normalized_integrities) + { + return Ok(Some(integrity)); + } + + let file_path = ctx.output_path.join(src); + let integrity = compute_file_integrity(&file_path, &ctx.fs, hash_func_names).await?; + Ok(Some(integrity)) +} + +fn get_tag_attribute(tag: &HtmlPluginTag, name: &str) -> Option { + tag + .attributes + .iter() + .find(|attr| attr.attr_name == name) + .and_then(|attr| attr.attr_value.as_ref()) + .cloned() +} + +fn get_asset_path(src: &str, public_path: &str) -> String { + let decoded_src = urlencoding::decode(src) + .expect("Failed to decode asset path") + .to_string(); + pathdiff::diff_paths(&decoded_src, public_path) + .map(|p| p.to_string_lossy().into_owned()) + .unwrap_or_else(|| decoded_src.to_string()) +} + +fn get_integrity_chechsum_for_asset( + src: &str, + integrities: &HashMap, + normalized_integrities: &HashMap, +) -> Option { + if let Some(integrity) = integrities.get(src) { + return Some(integrity.clone()); + } + + let normalized_src = normalize_path(src).into_owned(); + normalized_integrities.get(&normalized_src).cloned() +} + +fn get_normalized_integrities(integrities: &HashMap) -> HashMap { + integrities + .iter() + .map(|(key, value)| (normalize_path(key).into_owned(), value.clone())) + .collect::>() +} + +async fn compute_file_integrity( + path: &Utf8Path, + fs: &ArcFs, + hash_func_names: &Vec, +) -> Result { + let file = fs.read_file(path).await?; + let content = String::from_utf8(file).map_err(|e| rspack_error::error!(e.to_string()))?; + let integrity = compute_integrity(hash_func_names, &content); + Ok(integrity) +} + +#[plugin_hook(HtmlPluginBeforeAssetTagGeneration for SubresourceIntegrityPlugin)] +pub async fn before_asset_tag_generation( + &self, + mut data: BeforeAssetTagGenerationData, +) -> Result { + let mut compilation_integrities = + SubresourceIntegrityPlugin::get_compilation_integrities_mut(data.compilation_id); + handle_html_plugin_assets(&mut data, &mut compilation_integrities).await?; + Ok(data) +} + +#[plugin_hook(HtmlPluginAlterAssetTagGroups for SubresourceIntegrityPlugin, stage = 10000)] +pub async fn alter_asset_tag_groups( + &self, + mut data: AlterAssetTagGroupsData, +) -> Result { + let compilation_integrities = + SubresourceIntegrityPlugin::get_compilation_integrities(data.compilation_id); + let ctx = SubresourceIntegrityPlugin::get_compilation_sri_context(data.compilation_id); + handle_html_plugin_tags( + &mut data, + &self.options.hash_func_names, + &compilation_integrities, + &ctx, + ) + .await?; + Ok(data) +} diff --git a/crates/rspack_plugin_sri/src/integrity.rs b/crates/rspack_plugin_sri/src/integrity.rs new file mode 100644 index 000000000000..20a8272667ae --- /dev/null +++ b/crates/rspack_plugin_sri/src/integrity.rs @@ -0,0 +1,56 @@ +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; +use sha2::{Digest, Sha256, Sha384, Sha512}; + +// https://www.w3.org/TR/2016/REC-SRI-20160623/#cryptographic-hash-functions +#[rspack_cacheable::cacheable] +#[derive(Debug, Clone, Copy)] +pub enum SubresourceIntegrityHashFunction { + Sha256, + Sha384, + Sha512, +} + +impl From for SubresourceIntegrityHashFunction { + fn from(s: String) -> Self { + match s.as_str() { + "sha256" => Self::Sha256, + "sha384" => Self::Sha384, + "sha512" => Self::Sha512, + _ => panic!("sri hash function only support 'sha256', 'sha384' or 'sha512'"), + } + } +} + +pub fn compute_integrity( + hash_func_names: &Vec, + source: &str, +) -> String { + hash_func_names + .par_iter() + .map(|hash_func| create_hash(hash_func, source)) + .intersperse(" ".to_string()) + .collect() +} + +fn create_hash(hash_func: &SubresourceIntegrityHashFunction, source: &str) -> String { + match hash_func { + SubresourceIntegrityHashFunction::Sha256 => { + let mut hasher = Sha256::new(); + hasher.update(source); + let digest = &hasher.finalize()[..]; + format!("sha256-{}", rspack_base64::encode_to_string(digest)) + } + SubresourceIntegrityHashFunction::Sha384 => { + let mut hasher = Sha384::new(); + hasher.update(source); + let digest = &hasher.finalize()[..]; + format!("sha384-{}", rspack_base64::encode_to_string(digest)) + } + SubresourceIntegrityHashFunction::Sha512 => { + let mut hasher = Sha512::new(); + hasher.update(source); + let digest = &hasher.finalize()[..]; + format!("sha512-{}", rspack_base64::encode_to_string(digest)) + } + } +} diff --git a/crates/rspack_plugin_sri/src/lib.rs b/crates/rspack_plugin_sri/src/lib.rs new file mode 100644 index 000000000000..8ab29dc6b361 --- /dev/null +++ b/crates/rspack_plugin_sri/src/lib.rs @@ -0,0 +1,191 @@ +mod asset; +mod config; +mod html; +mod integrity; +mod runtime; +mod util; + +use std::sync::LazyLock; + +use asset::{detect_unresolved_integrity, handle_assets, update_hash}; +use config::SRICompilationContext; +pub use config::{ + IntegrityCallbackData, IntegrityCallbackFn, IntegrityHtmlPlugin, + SubresourceIntegrityPluginOptions, +}; +use html::{alter_asset_tag_groups, before_asset_tag_generation}; +pub use integrity::SubresourceIntegrityHashFunction; +use rspack_core::{ + ChunkLoading, ChunkLoadingType, Compilation, CompilationId, CompilationParams, + CompilerThisCompilation, CrossOriginLoading, Plugin, PluginContext, +}; +use rspack_error::{Diagnostic, Result}; +use rspack_hook::{plugin, plugin_hook}; +use rspack_plugin_html::HtmlRspackPlugin; +use rspack_plugin_real_content_hash::RealContentHashPlugin; +use rspack_plugin_runtime::RuntimePlugin; +use rspack_util::fx_hash::FxDashMap; +use runtime::{create_script, handle_runtime, link_preload}; +use rustc_hash::FxHashMap as HashMap; + +static COMPILATION_INTEGRITY_MAP: LazyLock>> = + LazyLock::new(Default::default); + +static COMPILATION_CONTEXT_MAP: LazyLock> = + LazyLock::new(Default::default); + +#[plugin] +#[derive(Debug)] +pub struct SubresourceIntegrityPlugin { + pub options: SubresourceIntegrityPluginOptions, +} + +impl SubresourceIntegrityPlugin { + pub fn new(options: SubresourceIntegrityPluginOptions) -> Self { + Self::new_inner(options) + } + + pub fn get_compilation_sri_context( + id: CompilationId, + ) -> dashmap::mapref::one::Ref<'static, CompilationId, SRICompilationContext> { + COMPILATION_CONTEXT_MAP + .get(&id) + .expect("should have sri context") + } + + pub fn set_compilation_sri_context(id: CompilationId, ctx: SRICompilationContext) { + COMPILATION_CONTEXT_MAP.insert(id, ctx); + } + + pub fn get_compilation_integrities( + id: CompilationId, + ) -> dashmap::mapref::one::Ref<'static, CompilationId, HashMap> { + if !COMPILATION_INTEGRITY_MAP.contains_key(&id) { + COMPILATION_INTEGRITY_MAP.insert(id, Default::default()); + } + COMPILATION_INTEGRITY_MAP + .get(&id) + .expect("should have compilation integrities") + } + + pub fn get_compilation_integrities_mut( + id: CompilationId, + ) -> dashmap::mapref::one::RefMut<'static, CompilationId, HashMap> { + COMPILATION_INTEGRITY_MAP.entry(id).or_default() + } +} + +#[plugin_hook(CompilerThisCompilation for SubresourceIntegrityPlugin, stage = -10000)] +async fn warn_non_web( + &self, + compilation: &mut Compilation, + _params: &mut CompilationParams, +) -> Result<()> { + compilation.push_diagnostic(Diagnostic::warn( + "SubresourceIntegrity".to_string(), + "This plugin is not useful for non-web targets.".to_string(), + )); + Ok(()) +} + +#[plugin_hook(CompilerThisCompilation for SubresourceIntegrityPlugin, stage = -10000)] +async fn handle_compilation( + &self, + compilation: &mut Compilation, + _params: &mut CompilationParams, +) -> Result<()> { + let ctx = SRICompilationContext { + fs: compilation.output_filesystem.clone(), + output_path: compilation.options.output.path.clone(), + cross_origin_loading: compilation.options.output.cross_origin_loading.clone(), + }; + SubresourceIntegrityPlugin::set_compilation_sri_context(compilation.id(), ctx); + + let mut real_content_hash_plugin_hooks = + RealContentHashPlugin::get_compilation_hooks_mut(compilation.id()); + real_content_hash_plugin_hooks + .update_hash + .tap(update_hash::new(self)); + + if matches!( + compilation.options.output.cross_origin_loading, + CrossOriginLoading::Disable + ) { + compilation.push_diagnostic(Diagnostic::error( + "SubresourceIntegrity".to_string(), + "rspack option output.crossOriginLoading not set, code splitting will not work!".to_string(), + )); + } + + let mut runtime_plugin_hooks = RuntimePlugin::get_compilation_hooks_mut(compilation.id()); + runtime_plugin_hooks + .create_script + .tap(create_script::new(self)); + runtime_plugin_hooks + .link_preload + .tap(link_preload::new(self)); + + if matches!(self.options.html_plugin, IntegrityHtmlPlugin::NativePlugin) { + let mut html_plugin_hooks = HtmlRspackPlugin::get_compilation_hooks_mut(compilation.id()); + html_plugin_hooks + .before_asset_tag_generation + .tap(before_asset_tag_generation::new(self)); + html_plugin_hooks + .alter_asset_tag_groups + .tap(alter_asset_tag_groups::new(self)); + } + + Ok(()) +} + +impl Plugin for SubresourceIntegrityPlugin { + fn name(&self) -> &'static str { + "rspack.SubresourceIntegrityPlugin" + } + + fn apply( + &self, + ctx: PluginContext<&mut rspack_core::ApplyContext>, + options: &rspack_core::CompilerOptions, + ) -> Result<()> { + if let ChunkLoading::Enable(chunk_loading) = &options.output.chunk_loading { + if matches!( + chunk_loading, + ChunkLoadingType::Require | ChunkLoadingType::AsyncNode + ) { + ctx + .context + .compiler_hooks + .this_compilation + .tap(warn_non_web::new(self)); + + return Ok(()); + } + } + + ctx + .context + .compilation_hooks + .process_assets + .tap(handle_assets::new(self)); + + ctx + .context + .compilation_hooks + .after_process_assets + .tap(detect_unresolved_integrity::new(self)); + + ctx + .context + .compiler_hooks + .this_compilation + .tap(handle_compilation::new(self)); + + ctx + .context + .compilation_hooks + .additional_tree_runtime_requirements + .tap(handle_runtime::new(self)); + Ok(()) + } +} diff --git a/crates/rspack_plugin_sri/src/runtime.rs b/crates/rspack_plugin_sri/src/runtime.rs new file mode 100644 index 000000000000..cef7e99a916f --- /dev/null +++ b/crates/rspack_plugin_sri/src/runtime.rs @@ -0,0 +1,144 @@ +use rspack_collections::Identifier; +use rspack_core::{ + chunk_graph_chunk::ChunkId, + impl_runtime_module, + rspack_sources::{BoxSource, RawStringSource, SourceExt}, + ChunkUkey, Compilation, CompilationAdditionalTreeRuntimeRequirements, CrossOriginLoading, + RuntimeGlobals, RuntimeModule, RuntimeModuleExt, +}; +use rspack_error::{error, Result}; +use rspack_hook::plugin_hook; +use rspack_plugin_runtime::{ + CreateScriptData, LinkPreloadData, RuntimePluginCreateScript, RuntimePluginLinkPreload, +}; +use rustc_hash::FxHashMap as HashMap; + +use crate::{ + util::{find_chunks, make_placeholder, SRI_HASH_VARIABLE_REFERENCE}, + SubresourceIntegrityHashFunction, SubresourceIntegrityPlugin, SubresourceIntegrityPluginInner, +}; + +fn add_attribute(tag: &str, code: &str, cross_origin_loading: &CrossOriginLoading) -> String { + format!( + "{}\n{tag}.integrity = {}[chunkId];\n{tag}.crossOrigin = {};", + code, + SRI_HASH_VARIABLE_REFERENCE.as_str(), + cross_origin_loading + ) +} + +#[impl_runtime_module] +#[derive(Debug)] +struct SRIHashVariableRuntimeModule { + id: Identifier, + chunk: ChunkUkey, + hash_funcs: Vec, +} + +impl SRIHashVariableRuntimeModule { + pub fn new(chunk: ChunkUkey, hash_funcs: Vec) -> Self { + Self::with_default( + Identifier::from("rspack/runtime/sri_hash_variable"), + chunk, + hash_funcs, + ) + } +} + +impl RuntimeModule for SRIHashVariableRuntimeModule { + fn name(&self) -> Identifier { + self.id + } + + fn generate(&self, compilation: &Compilation) -> Result { + let Some(chunk) = compilation.chunk_by_ukey.get(&self.chunk) else { + return Err(error!( + "Generate sri runtime module failed: chunk not found" + )); + }; + + let include_chunks = chunk + .get_all_async_chunks(&compilation.chunk_group_by_ukey) + .iter() + .filter_map(|c| { + let chunk = compilation.chunk_by_ukey.get(c)?; + let id = chunk.id(&compilation.chunk_ids_artifact)?; + let rendered_hash = chunk.rendered_hash( + &compilation.chunk_hashes_artifact, + compilation.options.output.hash_digest_length, + )?; + Some((id, rendered_hash)) + }) + .collect::>(); + let all_chunks = find_chunks(&self.chunk, compilation) + .into_iter() + .filter_map(|c| { + let chunk = compilation.chunk_by_ukey.get(&c)?; + let id = chunk.id(&compilation.chunk_ids_artifact)?; + if include_chunks.contains_key(id) { + Some(id) + } else { + None + } + }) + .collect::>(); + + Ok( + RawStringSource::from(format!( + r#" + {} = {}; + "#, + SRI_HASH_VARIABLE_REFERENCE.as_str(), + generate_sri_hash_placeholders(all_chunks, &self.hash_funcs, compilation), + )) + .boxed(), + ) + } +} + +fn generate_sri_hash_placeholders( + chunks: Vec<&ChunkId>, + hash_funcs: &Vec, + _compilation: &Compilation, +) -> String { + format!( + "{{{}}}", + chunks + .into_iter() + .filter_map(|c| { + let chunk_id = serde_json::to_string(c.as_str()).ok()?; + let placeholder = serde_json::to_string(&make_placeholder(hash_funcs, c.as_str())).ok()?; + Some(format!("{}: {}", chunk_id, placeholder)) + }) + .collect::>() + .join(",") + ) +} + +#[plugin_hook(RuntimePluginCreateScript for SubresourceIntegrityPlugin)] +pub async fn create_script(&self, mut data: CreateScriptData) -> Result { + let ctx = SubresourceIntegrityPlugin::get_compilation_sri_context(data.chunk.compilation_id); + data.code = add_attribute("script", &data.code, &ctx.cross_origin_loading); + Ok(data) +} + +#[plugin_hook(RuntimePluginLinkPreload for SubresourceIntegrityPlugin)] +pub async fn link_preload(&self, mut data: LinkPreloadData) -> Result { + let ctx = SubresourceIntegrityPlugin::get_compilation_sri_context(data.chunk.compilation_id); + data.code = add_attribute("link", &data.code, &ctx.cross_origin_loading); + Ok(data) +} + +#[plugin_hook(CompilationAdditionalTreeRuntimeRequirements for SubresourceIntegrityPlugin)] +pub async fn handle_runtime( + &self, + compilation: &mut Compilation, + chunk_ukey: &ChunkUkey, + _runtime_requirements: &mut RuntimeGlobals, +) -> Result<()> { + compilation.add_runtime_module( + chunk_ukey, + SRIHashVariableRuntimeModule::new(*chunk_ukey, self.options.hash_func_names.clone()).boxed(), + )?; + Ok(()) +} diff --git a/crates/rspack_plugin_sri/src/util.rs b/crates/rspack_plugin_sri/src/util.rs new file mode 100644 index 000000000000..9605a65f60e0 --- /dev/null +++ b/crates/rspack_plugin_sri/src/util.rs @@ -0,0 +1,86 @@ +use std::{borrow::Cow, sync::LazyLock}; + +use cow_utils::CowUtils; +use indexmap::IndexSet; +use rspack_core::{AssetInfo, ChunkGroupUkey, ChunkUkey, Compilation}; + +use crate::{integrity::compute_integrity, SubresourceIntegrityHashFunction}; + +pub static SRI_HASH_VARIABLE_REFERENCE: LazyLock = + LazyLock::new(|| "__webpack_require__.sriHashes".to_string()); + +pub static PLACEHOLDER_PREFIX: LazyLock = + LazyLock::new(|| "*-*-*-CHUNK-SRI-HASH-".to_string()); + +pub static PLACEHOLDER_REGEX: LazyLock = LazyLock::new(|| { + let escaped_prefix = regex::escape(PLACEHOLDER_PREFIX.as_str()); + regex::Regex::new(&format!( + r"{}[a-zA-Z0-9=/+]+(\s+sha\d{{3}}-[a-zA-Z0-9=/+]+)*", + escaped_prefix + )) + .expect("should initialize `Regex`") +}); + +pub fn find_chunks(chunk: &ChunkUkey, compilation: &Compilation) -> IndexSet { + let mut all_chunks = IndexSet::default(); + let mut visited_groups = IndexSet::default(); + recurse_chunk(chunk, &mut all_chunks, &mut visited_groups, compilation); + all_chunks +} + +fn recurse_chunk_group( + group: &ChunkGroupUkey, + all_chunks: &mut IndexSet, + visited_groups: &mut IndexSet, + compilation: &Compilation, +) { + if visited_groups.contains(group) { + return; + } + visited_groups.insert(*group); + + if let Some(chunk_group) = compilation.chunk_group_by_ukey.get(group) { + for chunk in chunk_group.chunks.iter() { + recurse_chunk(chunk, all_chunks, visited_groups, compilation); + } + for child in chunk_group.children.iter() { + recurse_chunk_group(child, all_chunks, visited_groups, compilation); + } + } +} + +fn recurse_chunk( + chunk: &ChunkUkey, + all_chunks: &mut IndexSet, + visited_groups: &mut IndexSet, + compilation: &Compilation, +) { + if all_chunks.contains(chunk) { + return; + } + all_chunks.insert(*chunk); + + if let Some(chunk) = compilation.chunk_by_ukey.get(chunk) { + for group in chunk.groups() { + recurse_chunk_group(group, all_chunks, visited_groups, compilation); + } + } +} + +pub fn make_placeholder(hash_funcs: &Vec, id: &str) -> String { + let placeholder_source = format!("{}{}", PLACEHOLDER_PREFIX.as_str(), id); + let filler = compute_integrity(hash_funcs, &placeholder_source); + format!( + "{}{}", + PLACEHOLDER_PREFIX.as_str(), + &filler[PLACEHOLDER_PREFIX.len()..] + ) +} + +pub fn normalize_path(path: &str) -> Cow<'_, str> { + path.split('?').next().unwrap_or("").cow_replace('\\', "/") +} + +pub fn use_any_hash(info: &AssetInfo) -> bool { + !info.chunk_hash.is_empty() || !info.full_hash.is_empty() || !info.content_hash.is_empty() +} diff --git a/package.json b/package.json index 3c17c1c78d46..3c026c8fbc77 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "rimraf": "^5.0.10", "ts-jest": "29.2.5", "typescript": "^5.7.3", - "webpack": "5.95.0", + "webpack": "^5.95.0", "webpack-cli": "5.1.4", "zx": "8.3.0" }, @@ -88,4 +88,4 @@ "rollup-plugin-dts": "patches/rollup-plugin-dts.patch" } } -} +} \ No newline at end of file diff --git a/packages/rspack-test-tools/package.json b/packages/rspack-test-tools/package.json index 0ea617ba43bd..50dff0976bfd 100644 --- a/packages/rspack-test-tools/package.json +++ b/packages/rspack-test-tools/package.json @@ -67,7 +67,7 @@ "rimraf": "^5.0.10", "source-map": "^0.7.4", "terser-webpack-plugin": "^5.3.10", - "webpack": "5.95.0", + "webpack": "^5.95.0", "webpack-merge": "5.9.0", "webpack-sources": "3.2.3" }, diff --git a/packages/rspack/etc/core.api.md b/packages/rspack/etc/core.api.md index d74ff8a55985..270488b81d80 100644 --- a/packages/rspack/etc/core.api.md +++ b/packages/rspack/etc/core.api.md @@ -73,6 +73,7 @@ import { RawOptions } from '@rspack/binding'; import { RawProgressPluginOptions } from '@rspack/binding'; import { RawProvideOptions } from '@rspack/binding'; import { RawRuntimeChunkOptions } from '@rspack/binding'; +import { RawSubresourceIntegrityPluginOptions } from '@rspack/binding'; import { Resolver as Resolver_2 } from './Resolver'; import { RspackOptionsNormalized as RspackOptionsNormalized_2 } from '.'; import type { SecureContextOptions } from 'node:tls'; @@ -331,27 +332,27 @@ interface BaseModuleConfig { // @public (undocumented) interface BaseResolveRequest { - // (undocumented) + // (undocumented) __innerRequest?: string; - // (undocumented) + // (undocumented) __innerRequest_relativePath?: string; - // (undocumented) + // (undocumented) __innerRequest_request?: string; - // (undocumented) + // (undocumented) context?: object; - // (undocumented) + // (undocumented) descriptionFileData?: JsonObject; - // (undocumented) + // (undocumented) descriptionFilePath?: string; - // (undocumented) + // (undocumented) descriptionFileRoot?: string; - // (undocumented) + // (undocumented) fullySpecified?: boolean; - // (undocumented) + // (undocumented) ignoreSymlinks?: boolean; - // (undocumented) + // (undocumented) path: string | false; - // (undocumented) + // (undocumented) relativePath?: string; } @@ -2048,6 +2049,8 @@ interface Experiments_2 { RemoveDuplicateModulesPlugin: typeof RemoveDuplicateModulesPlugin; // (undocumented) RsdoctorPlugin: typeof RsdoctorPlugin; + // (undocumented) + SubresourceIntegrityPlugin: typeof SubresourceIntegrityPlugin; } // @public (undocumented) @@ -2305,11 +2308,11 @@ type GroupOptions = { // @public (undocumented) class Hash { - constructor(); + constructor(); - digest(encoding?: string): string | Buffer; + digest(encoding?: string): string | Buffer; - update(data: string | Buffer, inputEncoding?: string): Hash; + update(data: string | Buffer, inputEncoding?: string): Hash; } // @public (undocumented) @@ -2815,14 +2818,14 @@ type JsonArray = JsonValue_2[]; // @public (undocumented) type JsonObject = { [index: string]: JsonValue } & { - [index: string]: - | undefined - | null - | string - | number - | boolean - | JsonObject - | JsonValue[]; + [index: string]: + | undefined + | null + | string + | number + | boolean + | JsonObject + | JsonValue[]; }; // @public (undocumented) @@ -4017,6 +4020,22 @@ class MultiWatching { // @public export type Name = string; +// @internal +const NativeSubresourceIntegrityPlugin: { + new (options: NativeSubresourceIntegrityPluginOptions): { + name: BuiltinPluginName; + _args: [options: NativeSubresourceIntegrityPluginOptions]; + affectedHooks: "done" | "environment" | "make" | "compile" | "emit" | "afterEmit" | "invalid" | "thisCompilation" | "afterDone" | "compilation" | "normalModuleFactory" | "contextModuleFactory" | "initialize" | "shouldEmit" | "infrastructureLog" | "beforeRun" | "run" | "assetEmitted" | "failed" | "shutdown" | "watchRun" | "watchClose" | "afterEnvironment" | "afterPlugins" | "afterResolvers" | "beforeCompile" | "afterCompile" | "finishMake" | "entryOption" | "additionalPass" | undefined; + raw(compiler: Compiler): BuiltinPlugin; + apply(compiler: Compiler): void; + }; +}; + +// @public (undocumented) +type NativeSubresourceIntegrityPluginOptions = Omit & { + htmlPlugin: string | false; +}; + // @public (undocumented) export const node: Node_3; @@ -4539,19 +4558,19 @@ interface ParseContext { // @public (undocumented) interface ParsedIdentifier { - // (undocumented) + // (undocumented) directory: boolean; - // (undocumented) + // (undocumented) file: boolean; - // (undocumented) + // (undocumented) fragment: string; - // (undocumented) + // (undocumented) internal: boolean; - // (undocumented) + // (undocumented) module: boolean; - // (undocumented) + // (undocumented) query: string; - // (undocumented) + // (undocumented) request: string; } @@ -4822,13 +4841,13 @@ type RawCreateParams = { // @public (undocumented) type RawSourceMap = { - version: number; - sources: string[]; - names: string[]; - sourceRoot?: string; - sourcesContent?: string[]; - mappings: string; - file: string; + version: number; + sources: string[]; + names: string[]; + sourceRoot?: string; + sourcesContent?: string[]; + mappings: string; + file: string; }; // @public (undocumented) @@ -5376,6 +5395,7 @@ declare namespace rspackExports { SwcLoaderTsParserConfig, LightningcssLoaderOptions, LightningcssFeatureOptions, + SubresourceIntegrityPluginOptions, experiments, getRawResolve, LoaderContext, @@ -10222,25 +10242,25 @@ export type SnapshotOptions = {}; // @public (undocumented) abstract class Source { - // (undocumented) + // (undocumented) buffer(): Buffer; - // (undocumented) + // (undocumented) map(options?: MapOptions): RawSourceMap | null; - // (undocumented) + // (undocumented) size(): number; - // (undocumented) + // (undocumented) source(): string | Buffer; - // (undocumented) + // (undocumented) sourceAndMap(options?: MapOptions): { - source: string | Buffer; - map: Object; - }; + source: string | Buffer; + map: Object; + }; - // (undocumented) + // (undocumented) updateHash(hash: Hash): void; } @@ -10607,6 +10627,26 @@ type StringValidation = "email" | "url" | "emoji" | "uuid" | "nanoid" | "regex" // @public (undocumented) type stripPath = T extends any ? util_2.OmitKeys : never; +// @public (undocumented) +type SubresourceIntegrityHashFunction = "sha256" | "sha384" | "sha512"; + +// @public (undocumented) +class SubresourceIntegrityPlugin extends NativeSubresourceIntegrityPlugin { + constructor(options: SubresourceIntegrityPluginOptions); + // (undocumented) + apply(compiler: Compiler): void; +} + +// @public (undocumented) +export type SubresourceIntegrityPluginOptions = { + hashFuncNames?: [ + SubresourceIntegrityHashFunction, + ...SubresourceIntegrityHashFunction[] + ]; + htmlPlugin?: string | false; + enabled?: "auto" | boolean; +}; + // @public (undocumented) export const SwcJsMinimizerRspackPlugin: { new (options?: SwcJsMinimizerRspackPluginOptions | undefined): { diff --git a/packages/rspack/scripts/check-documentation-coverage.ts b/packages/rspack/scripts/check-documentation-coverage.ts index dc06e2c57686..f033f46c4512 100644 --- a/packages/rspack/scripts/check-documentation-coverage.ts +++ b/packages/rspack/scripts/check-documentation-coverage.ts @@ -112,6 +112,7 @@ function checkPluginsDocumentationCoverage() { "OriginEntryPlugin", "RuntimePlugin", // This plugin only provides hooks, should not be used separately "RsdoctorPlugin", // This plugin is not stable yet + "SubresourceIntegrityPlugin" // TODO: add document in next pr ]; const undocumentedPlugins = Array.from(implementedPlugins).filter( diff --git a/packages/rspack/src/builtin-plugin/SubresourceIntegrityPlugin.ts b/packages/rspack/src/builtin-plugin/SubresourceIntegrityPlugin.ts new file mode 100644 index 000000000000..bd0814bc1bac --- /dev/null +++ b/packages/rspack/src/builtin-plugin/SubresourceIntegrityPlugin.ts @@ -0,0 +1,368 @@ +import { createHash } from "node:crypto"; +import { readFileSync } from "node:fs"; +import { join, relative, sep } from "node:path"; +import { + BuiltinPluginName, + type JsRspackError, + type RawIntegrityData, + type RawSubresourceIntegrityPluginOptions +} from "@rspack/binding"; +import type { AsyncSeriesWaterfallHook } from "@rspack/lite-tapable"; +import { z } from "zod"; +import type { Compilation } from "../Compilation"; +import type { Compiler } from "../Compiler"; +import type { CrossOriginLoading } from "../config/types"; +import { validate } from "../util/validate"; +import { create } from "./base"; + +const PLUGIN_NAME = "SubresourceIntegrityPlugin"; +const NATIVE_HTML_PLUGIN = "HtmlRspackPlugin"; + +type HtmlTagObject = { + attributes: { + [attributeName: string]: string | boolean | null | undefined; + }; + tagName: string; + innerHTML?: string; + voidTag: boolean; + meta: { + plugin?: string; + [metaAttributeName: string]: unknown; + }; +}; + +type BeforeAssetTagGenerationData = { + assets: { + publicPath: string; + js: Array; + css: Array; + favicon?: string; + manifest?: string; + [extraAssetType: string]: unknown; + }; + outputName: string; + plugin: unknown; +}; + +type AlterAssetTagGroupsData = { + headTags: HtmlTagObject[]; + bodyTags: HtmlTagObject[]; + outputName: string; + publicPath: string; + plugin: unknown; +}; + +type HtmlPluginHooks = { + beforeAssetTagGeneration: AsyncSeriesWaterfallHook; + alterAssetTagGroups: AsyncSeriesWaterfallHook; +}; + +export type SubresourceIntegrityHashFunction = "sha256" | "sha384" | "sha512"; +export type SubresourceIntegrityPluginOptions = { + hashFuncNames?: [ + SubresourceIntegrityHashFunction, + ...SubresourceIntegrityHashFunction[] + ]; + htmlPlugin?: string | false; + enabled?: "auto" | boolean; +}; + +const hashFunctionSchema = z.enum(["sha256", "sha384", "sha512"]); +const pluginOptionsSchema = z.object({ + hashFuncNames: z + .tuple([hashFunctionSchema]) + .rest(hashFunctionSchema) + .optional(), + htmlPlugin: z.string().or(z.literal(false)).optional(), + enabled: z.literal("auto").or(z.boolean()).optional() +}) satisfies z.ZodType; + +export type NativeSubresourceIntegrityPluginOptions = Omit< + RawSubresourceIntegrityPluginOptions, + "htmlPlugin" +> & { + htmlPlugin: string | false; +}; + +/** + * Note: This is not a webpack public API, maybe removed in future. + * @internal + */ +const NativeSubresourceIntegrityPlugin = create( + BuiltinPluginName.SubresourceIntegrityPlugin, + function ( + this: Compiler, + options: NativeSubresourceIntegrityPluginOptions + ): RawSubresourceIntegrityPluginOptions { + let htmlPlugin: RawSubresourceIntegrityPluginOptions["htmlPlugin"] = + "Disabled"; + if (options.htmlPlugin === NATIVE_HTML_PLUGIN) { + htmlPlugin = "Native"; + } else if (typeof options.htmlPlugin === "string") { + htmlPlugin = "JavaScript"; + } + return { + hashFuncNames: options.hashFuncNames, + htmlPlugin, + integrityCallback: options.integrityCallback + }; + } +); + +export class SubresourceIntegrityPlugin extends NativeSubresourceIntegrityPlugin { + private integrities: Map = new Map(); + private options: SubresourceIntegrityPluginOptions; + private validateError: Error | null = null; + constructor(options: SubresourceIntegrityPluginOptions) { + let validateError: Error | null = null; + if (typeof options !== "object") { + throw new Error("SubResourceIntegrity: argument must be an object"); + } + try { + validateSubresourceIntegrityPluginOptions(options); + } catch (e) { + validateError = e as Error; + } + + const finalOptions = validateError + ? { + hashFuncNames: ["sha384"], + htmlPlugin: NATIVE_HTML_PLUGIN, + enabled: false + } + : { + hashFuncNames: options.hashFuncNames ?? ["sha384"], + htmlPlugin: options.htmlPlugin ?? NATIVE_HTML_PLUGIN, + enabled: options.enabled ?? "auto" + }; + super({ + ...finalOptions, + integrityCallback: (data: RawIntegrityData) => { + this.integrities = new Map( + data.integerities.map(item => [item.asset, item.integrity]) + ); + } + }); + this.validateError = validateError; + this.options = finalOptions as SubresourceIntegrityPluginOptions; + } + + private isEnabled(compiler: Compiler) { + if (this.options.enabled === "auto") { + return compiler.options.mode !== "development"; + } + return this.options.enabled; + } + + private getIntegrityChecksumForAsset(src: string): string | undefined { + if (this.integrities.has(src)) { + return this.integrities.get(src); + } + + const normalizedSrc = normalizePath(src); + const normalizedKey = Array.from(this.integrities.keys()).find( + assetKey => normalizePath(assetKey) === normalizedSrc + ); + + return normalizedKey ? this.integrities.get(normalizedKey) : undefined; + } + + private handleHwpPluginArgs({ assets }: BeforeAssetTagGenerationData) { + const publicPath = assets.publicPath; + const jsIntegrity = []; + for (const asset of assets.js) { + jsIntegrity.push( + this.getIntegrityChecksumForAsset( + relative(publicPath, decodeURIComponent(asset)) + ) + ); + } + + const cssIntegrity = []; + for (const asset of assets.css) { + cssIntegrity.push( + this.getIntegrityChecksumForAsset( + relative(publicPath, decodeURIComponent(asset)) + ) + ); + } + + assets.jsIntegrity = jsIntegrity; + assets.cssIntegrity = cssIntegrity; + } + + private handleHwpBodyTags( + { headTags, bodyTags, publicPath }: AlterAssetTagGroupsData, + outputPath: string, + crossOriginLoading: CrossOriginLoading | undefined + ) { + for (const tag of headTags.concat(bodyTags)) { + this.processTag(tag, publicPath, outputPath, crossOriginLoading); + } + } + + private processTag( + tag: HtmlTagObject, + publicPath: string, + outputPath: string, + crossOriginLoading: CrossOriginLoading | undefined + ): void { + if (tag.attributes && "integrity" in tag.attributes) { + return; + } + + const tagSrc = getTagSrc(tag); + if (!tagSrc) { + return; + } + + const src = relative(publicPath, decodeURIComponent(tagSrc)); + tag.attributes.integrity = + this.getIntegrityChecksumForAsset(src) || + computeIntegrity( + this.options.hashFuncNames!, + readFileSync(join(outputPath, src)) + ); + tag.attributes.crossorigin = crossOriginLoading || "anonymous"; + } + + apply(compiler: Compiler): void { + if (!this.isEnabled(compiler)) { + if (this.validateError) { + compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => { + compilation.errors.push( + this.validateError as unknown as JsRspackError + ); + }); + } + return; + } + + super.apply(compiler); + + compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => { + compilation.hooks.statsFactory.tap(PLUGIN_NAME, statsFactory => { + statsFactory.hooks.extract + .for("asset") + .tap(PLUGIN_NAME, (object, asset) => { + const contenthash = asset.info?.contenthash; + if (contenthash) { + const shaHashes = ( + Array.isArray(contenthash) ? contenthash : [contenthash] + ).filter((hash: unknown) => String(hash).match(/^sha[0-9]+-/)); + if (shaHashes.length > 0) { + ( + object as unknown as { + integrity: string; + } + ).integrity = shaHashes.join(" "); + } + } + }); + }); + }); + + if ( + typeof this.options.htmlPlugin === "string" && + this.options.htmlPlugin !== NATIVE_HTML_PLUGIN + ) { + let getHooks: ((compilation: Compilation) => HtmlPluginHooks) | null = + null; + try { + const htmlPlugin = require(this.options.htmlPlugin); + getHooks = htmlPlugin.getCompilationHooks || htmlPlugin.getHooks; + } catch (e) { + if ( + !isErrorWithCode(e as Error) || + (e as Error & { code: string }).code !== "MODULE_NOT_FOUND" + ) { + throw e; + } + } + + if (typeof getHooks === "function") { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => { + if ( + typeof compiler.options.output.chunkLoading === "string" && + ["require", "async-node"].includes( + compiler.options.output.chunkLoading + ) + ) { + return; + } + const hwpHooks = getHooks!(compilation); + hwpHooks.beforeAssetTagGeneration.tapPromise( + PLUGIN_NAME, + async data => { + this.handleHwpPluginArgs(data); + return data; + } + ); + + hwpHooks.alterAssetTagGroups.tapPromise( + { + name: PLUGIN_NAME, + stage: 10000 + }, + async data => { + this.handleHwpBodyTags( + data, + compiler.outputPath, + compiler.options.output.crossOriginLoading + ); + return data; + } + ); + }); + } + } + } +} + +function validateSubresourceIntegrityPluginOptions( + options: SubresourceIntegrityPluginOptions +) { + validate(options, pluginOptionsSchema); +} + +function isErrorWithCode(obj: T): boolean { + return ( + obj instanceof Error && + "code" in obj && + ["string", "undefined"].includes(typeof obj.code) + ); +} + +function getTagSrc(tag: HtmlTagObject): string | undefined { + if (!["script", "link"].includes(tag.tagName) || !tag.attributes) { + return undefined; + } + if (typeof tag.attributes.href === "string") { + return tag.attributes.href; + } + if (typeof tag.attributes.src === "string") { + return tag.attributes.src; + } + return undefined; +} + +function computeIntegrity( + hashFuncNames: SubresourceIntegrityHashFunction[], + source: string | Buffer +): string { + const result = hashFuncNames + .map( + hashFuncName => + `${hashFuncName}-${createHash(hashFuncName) + .update( + typeof source === "string" ? Buffer.from(source, "utf-8") : source + ) + .digest("base64")}` + ) + .join(" "); + return result; +} + +function normalizePath(path: string): string { + return path.replace(/\?.*$/, "").split(sep).join("/"); +} diff --git a/packages/rspack/src/builtin-plugin/index.ts b/packages/rspack/src/builtin-plugin/index.ts index 6750f76083ba..065238a261b4 100644 --- a/packages/rspack/src/builtin-plugin/index.ts +++ b/packages/rspack/src/builtin-plugin/index.ts @@ -72,3 +72,4 @@ export * from "./LibManifestPlugin"; export * from "./DllEntryPlugin"; export * from "./DllReferenceAgencyPlugin"; export * from "./RsdoctorPlugin"; +export * from "./SubresourceIntegrityPlugin"; diff --git a/packages/rspack/src/exports.ts b/packages/rspack/src/exports.ts index eab60e2de4b7..630989c1a883 100644 --- a/packages/rspack/src/exports.ts +++ b/packages/rspack/src/exports.ts @@ -118,7 +118,10 @@ export { LoaderOptionsPlugin } from "./lib/LoaderOptionsPlugin"; export { LoaderTargetPlugin } from "./lib/LoaderTargetPlugin"; export { NormalModuleReplacementPlugin } from "./lib/NormalModuleReplacementPlugin"; -import { FetchCompileAsyncWasmPlugin } from "./builtin-plugin"; +import { + FetchCompileAsyncWasmPlugin, + SubresourceIntegrityPlugin +} from "./builtin-plugin"; interface Web { FetchCompileAsyncWasmPlugin: typeof FetchCompileAsyncWasmPlugin; } @@ -292,6 +295,8 @@ export type { FeatureOptions as LightningcssFeatureOptions } from "./builtin-loader/lightningcss/index"; +export type { SubresourceIntegrityPluginOptions } from "./builtin-plugin"; + ///// Experiments Stuff ///// import { cleanupGlobalTrace, registerGlobalTrace } from "@rspack/binding"; interface Experiments { @@ -305,6 +310,7 @@ interface Experiments { }; RemoveDuplicateModulesPlugin: typeof RemoveDuplicateModulesPlugin; RsdoctorPlugin: typeof RsdoctorPlugin; + SubresourceIntegrityPlugin: typeof SubresourceIntegrityPlugin; } export const experiments: Experiments = { @@ -339,5 +345,6 @@ export const experiments: Experiments = { * * @internal */ - RsdoctorPlugin + RsdoctorPlugin, + SubresourceIntegrityPlugin }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6dece014b5d8..d5b472c27113 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,7 +83,7 @@ importers: specifier: ^5.7.3 version: 5.7.3 webpack: - specifier: 5.95.0 + specifier: ^5.95.0 version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0)) webpack-cli: specifier: 5.1.4 @@ -504,7 +504,7 @@ importers: specifier: ^5.3.10 version: 5.3.10(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) webpack: - specifier: 5.95.0 + specifier: ^5.95.0 version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0)) webpack-merge: specifier: 5.9.0 @@ -823,27 +823,72 @@ importers: '@rspack/core': specifier: workspace:* version: link:../../packages/rspack - '@swc/core': - specifier: 1.10.1 - version: 1.10.1(@swc/helpers@0.5.15) - '@swc/jest': - specifier: ^0.2.37 - version: 0.2.37(@swc/core@1.10.1(@swc/helpers@0.5.15)) + '@types/connect': + specifier: ^3.4.35 + version: 3.4.38 + '@types/cross-spawn': + specifier: ^6.0.2 + version: 6.0.6 + '@types/fastify-static': + specifier: ^0.14.0 + version: 0.14.0 + '@types/node': + specifier: ^14.17.5 + version: 14.18.63 + '@types/puppeteer': + specifier: ^5.4.5 + version: 5.4.7 + '@types/serve-static': + specifier: ^1.13.10 + version: 1.15.7 + '@types/tmp': + specifier: ^0.2.3 + version: 0.2.6 '@webdiscus/pug-loader': specifier: ^2.11.1 version: 2.11.1(enhanced-resolve@5.18.1)(prismjs@1.29.0)(pug@3.0.3)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) + before-build-webpack: + specifier: 0.2.15 + version: 0.2.15 + connect: + specifier: ^3.7.0 + version: 3.7.0 + cross-spawn: + specifier: ^7.0.3 + version: 7.0.3 css-loader: specifier: ^7.1.2 version: 7.1.2(@rspack/core@packages+rspack)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) del: specifier: ^6.0.0 version: 6.1.1 + expect: + specifier: ^29.7.0 + version: 29.7.0 + fastify: + specifier: ^3.29.5 + version: 3.29.5 + fastify-graceful-shutdown: + specifier: ^3.4.0 + version: 3.5.3 + fastify-static: + specifier: ^4.7.0 + version: 4.7.0 file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) + get-port: + specifier: ^5.1.1 + version: 5.1.1 html-loader: specifier: 2.1.1 version: 2.1.1(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) + html-webpack-plugin: + specifier: 5.6.3 + version: 5.6.3(@rspack/core@packages+rspack)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) + http-shutdown: + specifier: ^1.2.2 + version: 1.2.2 jsdom: specifier: ^25.0.0 version: 25.0.1 @@ -853,12 +898,738 @@ importers: memfs: specifier: 4.17.0 version: 4.17.0 + pug-loader: + specifier: 2.4.0 + version: 2.4.0 + puppeteer: + specifier: ^13.5.1 + version: 13.7.0 sass-embedded: specifier: ^1.77.8 version: 1.83.4 sass-loader: specifier: ^16.0.0 version: 16.0.1(@rspack/core@packages+rspack)(sass-embedded@1.83.4)(sass@1.56.2)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))) + serve-static: + specifier: ^1.15.0 + version: 1.15.0 + tmp: + specifier: ^0.2.1 + version: 0.2.3 + tmp-promise: + specifier: ^3.0.3 + version: 3.0.3 + + tests/plugin-test/sri-plugin/examples/basic: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/disabled: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/dll-plugin: + devDependencies: + before-build-webpack: + specifier: ^0.2.12 + version: 0.2.15 + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/dynamic-modified: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/dynamic-named-chunks: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/electron-renderer: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/hwp-basic: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/hwp-custom-template: + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + css-select: + specifier: ^5.1.0 + version: 5.1.0 + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + htmlparser2: + specifier: ^8.0.1 + version: 8.0.2 + mini-css-extract-plugin: + specifier: ^1.0.0 + version: 1.6.2(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/hwp-externals: + devDependencies: + css-select: + specifier: ^5.1.0 + version: 5.1.0 + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-externals-plugin: + specifier: ^3.8.0 + version: 3.8.0(html-webpack-plugin@5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0)) + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + htmlparser2: + specifier: ^8.0.1 + version: 8.0.2 + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir: + devDependencies: + css-select: + specifier: ^5.1.0 + version: 5.1.0 + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + htmlparser2: + specifier: ^8.0.1 + version: 8.0.2 + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/hwp-public-path: + devDependencies: + css-select: + specifier: ^5.1.0 + version: 5.1.0 + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + htmlparser2: + specifier: ^8.0.1 + version: 8.0.2 + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/hwp-subdirectories: + devDependencies: + css-select: + specifier: ^5.1.0 + version: 5.1.0 + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + htmlparser2: + specifier: ^8.0.1 + version: 8.0.2 + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/issue-147: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + script-ext-html-webpack-plugin: + specifier: ^2.1.5 + version: 2.1.5(html-webpack-plugin@5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0))(webpack@5.95.0) + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/issue-152: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/issue-154: + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + mini-css-extract-plugin: + specifier: ^1.0.0 + version: 1.6.2(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/issue-221: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/lazy-e2e: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/lazy-hashes-cycles: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/lazy-hashes-group: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/lazy-hashes-multiple-parents: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/lazy-hashes-simple: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/lazy-modified: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/mini-css-extract-plugin: + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + mini-css-extract-plugin: + specifier: ^1.0.0 + version: 1.6.2(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/minimal-sri-hashes: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/multiple-common-chunks: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/mutually-dependent-chunks: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/no-error-invalid-config: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/no-warn-filename: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/non-web-build: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/sourcemap-code-splitting: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/terser-banner: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + terser-webpack-plugin: + specifier: ^5.3.10 + version: 5.3.10(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack@5.95.0) + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/warn-hot-reload: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/webpack-assets-manifest: + devDependencies: + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-assets-manifest: + specifier: '3' + version: 3.1.1(webpack@5.95.0) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/webpack-fix-style-only-entries: + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + mini-css-extract-plugin: + specifier: ^1.0.0 + version: 1.6.2(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-assets-manifest: + specifier: '3' + version: 3.1.1(webpack@5.95.0) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + webpack-fix-style-only-entries: + specifier: 0.6.1 + version: 0.6.1 + + tests/plugin-test/sri-plugin/examples/webpack-preload: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/webpack4-contenthash: + devDependencies: + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) + + tests/plugin-test/sri-plugin/examples/webpack4-contenthash-issue-83: + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + expect: + specifier: ^26.6.2 + version: 26.6.2 + html-webpack-plugin: + specifier: ^5.5.0 + version: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + mini-css-extract-plugin: + specifier: ^1.0.0 + version: 1.6.2(webpack@5.95.0) + nyc: + specifier: '*' + version: 17.1.0 + webpack: + specifier: ^5.95.0 + version: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.95.0) tests/webpack-cli-test: dependencies: @@ -1790,10 +2561,16 @@ packages: cpu: [x64] os: [win32] + '@fastify/ajv-compiler@1.1.0': + resolution: {integrity: sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==} + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@fastify/error@2.0.0': + resolution: {integrity: sha512-wI3fpfDT0t7p8E6dA2eTECzzOd+bZsZCJ2Hcv+Onn2b7ZwK3RwD27uW2QDaMtQhAfWQQP+WNK7nKf0twLsBf9w==} + '@grpc/grpc-js@1.12.2': resolution: {integrity: sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==} engines: {node: '>=12.10.0'} @@ -1914,10 +2691,6 @@ packages: node-notifier: optional: true - '@jest/create-cache-key-function@29.7.0': - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/environment@29.7.0': resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1967,6 +2740,10 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@26.6.2': + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} + '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3161,12 +3938,6 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/jest@0.2.37': - resolution: {integrity: sha512-CR2BHhmXKGxTiFr21DYPRHQunLkX3mNIFGFkxBGji6r9uyIR5zftTOVYj1e0sFNMV2H7mf/+vpaglqaryBtqfQ==} - engines: {npm: '>= 7.0.0'} - peerDependencies: - '@swc/core': '*' - '@swc/plugin-remove-console@6.2.0': resolution: {integrity: sha512-1r2WPnhlLBP0ronIF8XoAmHkNERfu4naqyzBi0n0mksGUWSE45G6W4xoEM/97I6/OOZwy6vBhxT7XX0km59vyw==} @@ -3226,6 +3997,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -3328,12 +4102,18 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/events@3.0.3': + resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} + '@types/express-serve-static-core@4.19.0': resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + '@types/fastify-static@0.14.0': + resolution: {integrity: sha512-4sesnLoF9XGvw+7eF08pWuRqu2wZDD7ZzwcxC5gk4uW6IL1E4ShDiROa5URuHSHy3SWn/6hJhlsVjFgNmP2Udw==} + '@types/fs-extra@11.0.4': resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} @@ -3403,9 +4183,18 @@ packages: '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + '@types/node@20.17.10': resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} + '@types/pino@4.16.1': + resolution: {integrity: sha512-uYEhZ3jsuiYFsPcR34fbxVlrqzqphc+QQ3fU4rWR6PXH8ka2TKvPBjtkNqj8oBHouVGf4GCRfyPb7FG2TEtPZA==} + + '@types/puppeteer@5.4.7': + resolution: {integrity: sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==} + '@types/qs@6.9.14': resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} @@ -3453,6 +4242,9 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/tmp@0.2.6': + resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} + '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -3483,9 +4275,15 @@ packages: '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@types/yargs@15.0.19': + resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} + '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -3646,6 +4444,12 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead + abstract-logging@1.0.0: + resolution: {integrity: sha512-CWDjsyA74oOOK6ekFOE00fEUR/twE2SUmXWFQpF1J1fxaq9wSI2tnK3z0vAhpEcmCqw8xD/+A2M2a2M+3bCe8A==} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3697,6 +4501,11 @@ packages: ajv: optional: true + ajv-errors@1.0.1: + resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==} + peerDependencies: + ajv: '>=5.0.0' + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -3757,6 +4566,10 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3780,6 +4593,16 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -3795,10 +4618,18 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -3819,6 +4650,16 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@5.9.0: + resolution: {integrity: sha512-bzgrSPRdU1T/AkhEuXWAA6cJCFA3zApLk+5fkpcQt4US9YAI52AFYnsGX1HSCF2bHSltEYfk7fbffYu4WnazmA==} + + avvio@7.2.5: + resolution: {integrity: sha512-AOhBxyLVdpOad3TujtC9kL/9r3HnTkxwQ5ggOsYrvvZP1cCFvzHWJd5XxZDFuTn+IN8vkKSG5SEJrd27vCSbeA==} + axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} @@ -3873,12 +4714,18 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} before-after-hook@3.0.2: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + before-build-webpack@0.2.15: + resolution: {integrity: sha512-mxDxu4PzmZHzLrgtjDQlIIVVaxiwqMtTzKx/Blg3gVCkTRmNPYNtkD7FYfUjyO644ONSEBhHmdY0TCuXV7nvOQ==} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -3886,6 +4733,12 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3899,6 +4752,11 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bourne@1.3.3: + resolution: {integrity: sha512-6K4uuAlRGcorC6aV2Y1rypeQ17grx4XKyVyG6NA963PwRfxyievy0CDXtiSBPKvIc7OTpcJRT86X3mU7j5Zp9A==} + engines: {node: '>=6.0.0'} + deprecated: This module has moved and is now available at @hapi/bourne. Please update your dependencies as this version is no longer maintained and may contain bugs and security issues. + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -3924,9 +4782,15 @@ packages: buffer-builder@0.2.0: resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==} + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bundle-loader@0.5.6: resolution: {integrity: sha512-SUgX+u/LJzlJiuoIghuubZ66eflehnjmqSfh/ib9DTe08sxRJ5F/MhHSjp7GfSJivSp8NWgez4PVNAUuMg7vSg==} engines: {node: '>= 4'} @@ -3953,6 +4817,13 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacache@10.0.4: + resolution: {integrity: sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==} + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -3994,6 +4865,10 @@ packages: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -4053,6 +4928,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -4097,6 +4975,9 @@ packages: peerDependencies: typanion: '*' + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4199,6 +5080,9 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -4216,6 +5100,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} @@ -4227,6 +5115,10 @@ packages: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -4242,12 +5134,23 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -4255,9 +5158,17 @@ packages: copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-concurrently@1.0.5: + resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + deprecated: This package is no longer supported. + copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + copy-webpack-plugin@4.6.0: + resolution: {integrity: sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==} + engines: {node: '>= 4'} + core-js@3.36.1: resolution: {integrity: sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==} @@ -4310,6 +5221,9 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true + cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -4338,6 +5252,9 @@ packages: css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -4371,6 +5288,9 @@ packages: cuint@0.2.2: resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} + cyclist@1.0.2: + resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} + cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -4554,6 +5474,23 @@ packages: supports-color: optional: true + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -4563,6 +5500,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -4597,6 +5538,10 @@ packages: resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} engines: {node: '>= 10'} + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4628,6 +5573,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + destroy@1.0.4: + resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4645,9 +5593,16 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devtools-protocol@0.0.981744: + resolution: {integrity: sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-sequences@26.6.2: + resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} + engines: {node: '>= 10.14.2'} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4660,6 +5615,10 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + dir-glob@2.2.2: + resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} + engines: {node: '>=4'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -4721,6 +5680,9 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -4756,6 +5718,13 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encoding-negotiator@2.0.1: + resolution: {integrity: sha512-GSK7qphNR4iPcejfAlZxKDoz3xMhnspwImK+Af5WhePS9jUpK/Oh7rUdyENWu+9rgDflOCTmAojBsgsvM8neAQ==} + engines: {node: '>=10.13.0'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} @@ -4817,6 +5786,9 @@ packages: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} @@ -4945,6 +5917,10 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} + expect@26.6.2: + resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} + engines: {node: '>= 10.14.2'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4967,6 +5943,17 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4974,13 +5961,60 @@ packages: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} + fast-json-parse@1.0.3: + resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stringify@1.21.0: + resolution: {integrity: sha512-xY6gyjmHN3AK1Y15BCbMpeO9+dea5ePVsp3BouHCdukcx0hOHbXwFhRodhcI0NpZIgDChSeAKkHW9YjKvhwKBA==} + + fast-json-stringify@2.7.13: + resolution: {integrity: sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==} + engines: {node: '>= 10.0.0'} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@1.2.3: + resolution: {integrity: sha512-QJYT/i0QYoiZBQ71ivxdyTqkwKkQ0oxACXHYxH2zYHJEgzi2LsbjgvtzTbLi1SZcF190Db2YP7I7eTsU2egOlw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} + fastify-graceful-shutdown@3.5.3: + resolution: {integrity: sha512-Qb7QfvHsQA8GZ0eop430pZ/BQ4EIHnec5wqUkpbfdE3S0PXI5Kbt3Nqtc/z8PBjrsX4y1xOuNesYUFfWaTd8IA==} + engines: {node: '>=16.0.0'} + + fastify-plugin@3.0.1: + resolution: {integrity: sha512-qKcDXmuZadJqdTm6vlCqioEbyewF60b/0LOFCcYN1B6BIZGlYJumWWOYs70SFYLDAH4YqdE1cxH/RKMG7rFxgA==} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify-static@4.6.1: + resolution: {integrity: sha512-vy7N28U4AMhuOim12ZZWHulEE6OQKtzZbHgiB8Zj4llUuUQXPka0WHAQI3njm1jTCx4W6fixUHfpITxweMtAIA==} + + fastify-static@4.7.0: + resolution: {integrity: sha512-zZhCfJv/hkmud2qhWqpU3K9XVAuy3+IV8Tp9BC5J5U+GyA2XwoB6h8lh9GqpEIqdXOw01WyWQllV7dOWVyAlXg==} + deprecated: Please use @fastify/static@5.0.0 instead + + fastify@1.14.6: + resolution: {integrity: sha512-w5JIVLc+7NdCsoVRDTNK9kwqDgKS61HcffHKIsUTdQ6etbUYnsL0QpPFcYPM/hasZwsbkzdXk28ftbtqyZJdtA==} + engines: {node: '>=6'} + + fastify@3.29.5: + resolution: {integrity: sha512-FBDgb1gkenZxxh4sTD6AdI6mFnZnsgckpjIXzIvfLSYCa4isfQeD8QWGPib63dxq6btnY0l1j8I0xYhMvUb+sw==} + + fastparallel@2.4.1: + resolution: {integrity: sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -4994,6 +6028,9 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: @@ -5027,14 +6064,37 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} + find-cache-dir@1.0.0: + resolution: {integrity: sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==} + engines: {node: '>=4'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + find-cache-dir@4.0.0: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} engines: {node: '>=14.16'} + find-my-way@1.18.1: + resolution: {integrity: sha512-5M9oQuUPNDxr7w7g65Rv2acToLUIjVUbnMsltXNQaSYWOwjf+2MBp7sMuY+pfO+OPCo2qwcxsr29VQQ09ouVMg==} + + find-my-way@4.5.1: + resolution: {integrity: sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==} + engines: {node: '>=10'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5047,9 +6107,15 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true + flatstr@1.0.12: + resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} + flexsearch@0.7.43: resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} + flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + focus-lock@1.3.6: resolution: {integrity: sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==} engines: {node: '>=10'} @@ -5063,6 +6129,10 @@ packages: debug: optional: true + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -5097,10 +6167,23 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@11.3.0: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} + fs-write-stream-atomic@1.0.10: + resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} + deprecated: This package is no longer supported. + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5137,10 +6220,18 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -5191,6 +6282,10 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} + globby@7.1.1: + resolution: {integrity: sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==} + engines: {node: '>=4'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -5212,6 +6307,10 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -5230,6 +6329,10 @@ packages: hash-sum@2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -5322,6 +6425,15 @@ packages: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} + html-webpack-externals-plugin@3.8.0: + resolution: {integrity: sha512-LYrlPk/F8E+4xXNTVGuePalVx+efBlms3jaDCJE5yXEUBIORdzY5m2CMM45oBAZonUY50htXRsMyMizEbABUjw==} + engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} + peerDependencies: + html-webpack-plugin: ^2.0.0 + + html-webpack-include-assets-plugin@1.0.10: + resolution: {integrity: sha512-F+VqD4Vt5zxqzYikT7+B/oZOHCi3xvBy5NaE8AtZGRB840mZ4+cti2p5z0PwXTs3pQShO3MEuhG+vakk0XtTig==} + html-webpack-plugin@5.6.0: resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} engines: {node: '>=10.13.0'} @@ -5334,6 +6446,18 @@ packages: webpack: optional: true + html-webpack-plugin@5.6.3: + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -5352,6 +6476,10 @@ packages: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -5380,6 +6508,10 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -5419,6 +6551,15 @@ packages: peerDependencies: postcss: ^8.1.0 + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + iferr@0.1.5: + resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} + + ignore@3.3.10: + resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} + ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -5633,9 +6774,16 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-what@3.14.1: resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -5658,6 +6806,10 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -5666,6 +6818,10 @@ packages: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -5720,6 +6876,10 @@ packages: ts-node: optional: true + jest-diff@26.6.2: + resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} + engines: {node: '>= 10.14.2'} + jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5745,6 +6905,10 @@ packages: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-get-type@26.3.0: + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} + jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5757,10 +6921,18 @@ packages: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@26.6.2: + resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} + engines: {node: '>= 10.14.2'} + jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@26.6.2: + resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} + engines: {node: '>= 10.14.2'} + jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5778,6 +6950,10 @@ packages: jest-resolve: optional: true + jest-regex-util@26.0.0: + resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} + engines: {node: '>= 10.14.2'} + jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5917,9 +7093,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -5993,6 +7166,12 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + light-my-request@3.8.0: + resolution: {integrity: sha512-cIOWmNsgoStysmkzcv2EwvLwMb2hEm6oqKMerG/b5ey9F0we2Qony8cAZgBktmGPYUvPyKsDCzMcYU6fXbpWew==} + + light-my-request@4.12.0: + resolution: {integrity: sha512-0y+9VIfJEsPVzK5ArSIJ8Dkxp8QMP7/aCuxCUtG/tr9a2NoOf/snATE/OUc05XUplJCEnRh6gTkH7xh9POt1DQ==} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -6033,6 +7212,10 @@ packages: resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} engines: {node: '>=14'} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -6047,6 +7230,16 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.has@4.5.2: + resolution: {integrity: sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -6086,6 +7279,9 @@ packages: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -6096,10 +7292,18 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -6320,6 +7524,9 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + middie@3.2.1: + resolution: {integrity: sha512-K4L4De0X4tqLOuxna4Y2Bg9U1p9k8ZRtJHp9i6yOT6b2rOmvP06MW9Yas2AzTQJAGkhC74VM8kOI+x0x41+77Q==} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -6345,6 +7552,12 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mini-css-extract-plugin@1.6.2: + resolution: {integrity: sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.4.0 || ^5.0.0 + mini-svg-data-uri@1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -6377,6 +7590,17 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mississippi@2.0.0: + resolution: {integrity: sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==} + engines: {node: '>=4.0.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} @@ -6398,6 +7622,10 @@ packages: motion-utils@12.0.0: resolution: {integrity: sha512-MNFiBKbbqnmvOjkPyOKgHUp3Q6oiokLkI1bEwm5QA28cxMZrv0CbbBGDNmhF6DIXsi1pCQBSs0dX8xjeER1tmA==} + move-concurrently@1.0.1: + resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} + deprecated: This package is no longer supported. + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -6409,6 +7637,9 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -6453,6 +7684,15 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} @@ -6464,6 +7704,10 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -6494,6 +7738,11 @@ packages: nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + nyc@17.1.0: + resolution: {integrity: sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==} + engines: {node: '>=18'} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6508,6 +7757,10 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -6543,6 +7796,10 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6555,6 +7812,10 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6563,6 +7824,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -6575,16 +7840,27 @@ packages: resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} engines: {node: '>=16.17'} + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} package-manager-detector@0.2.9: resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + parallel-transform@1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -6625,6 +7901,10 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6662,6 +7942,13 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@2.4.0: + resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -6679,6 +7966,9 @@ packages: peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} @@ -6702,14 +7992,36 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pino-std-serializers@2.5.0: + resolution: {integrity: sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==} + + pino-std-serializers@3.2.0: + resolution: {integrity: sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==} + + pino@4.17.6: + resolution: {integrity: sha512-LFDwmhyWLBnmwO/2UFbWu1jEGVDzaPupaVdx0XcZ3tIAx1EDEBauzxXf2S0UcFK7oe+X9MApjH0hx9U1XMgfCA==} + hasBin: true + + pino@6.14.0: + resolution: {integrity: sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-dir@2.0.0: + resolution: {integrity: sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==} + engines: {node: '>=4'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -6869,6 +8181,10 @@ packages: pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + pretty-format@26.6.2: + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6884,6 +8200,25 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} + engines: {node: '>=8'} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + promise@7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} @@ -6914,6 +8249,9 @@ packages: prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} @@ -6938,6 +8276,11 @@ packages: pug-load@3.0.0: resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + pug-loader@2.4.0: + resolution: {integrity: sha512-cD4bU2wmkZ1EEVyu0IfKOsh1F26KPva5oglO1Doc3knx8VpBIXmFHw16k9sITYIjQMCnRv1vb4vfQgy7VdR6eg==} + peerDependencies: + pug: ^2.0.0 + pug-parser@6.0.0: resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} @@ -6947,16 +8290,33 @@ packages: pug-strip-comments@2.0.0: resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + pug-walk@1.1.8: + resolution: {integrity: sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==} + pug-walk@2.0.0: resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} pug@3.0.3: resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + puppeteer@13.7.0: + resolution: {integrity: sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA==} + engines: {node: '>=10.18.1'} + deprecated: < 22.8.2 is no longer supported + pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} @@ -6974,6 +8334,12 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@1.1.2: + resolution: {integrity: sha512-lli1svZnGwCLiDydlAN2bmSiEeThfI5gnqWsv0cFRiRbzXsRuzoPldK+BY5TM/i+koLoZ8dmZA6uPEBGTpaZqw==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -7027,6 +8393,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -7103,6 +8472,10 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} @@ -7136,6 +8509,9 @@ packages: resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} engines: {node: '>=8.6.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -7170,6 +8546,14 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -7181,6 +8565,11 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -7263,6 +8652,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-queue@1.0.3: + resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} + rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} @@ -7279,6 +8671,12 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex2@2.0.0: + resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -7446,6 +8844,10 @@ packages: scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + schema-utils@1.0.0: + resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} + engines: {node: '>= 4'} + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -7454,6 +8856,13 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} + script-ext-html-webpack-plugin@2.1.5: + resolution: {integrity: sha512-nMjd5dtsnoB8dS+pVM9ZL4mC9O1uVtTxrDS99OGZsZxFbkZE6pw0HCMued/cncDrKivIShO9vwoyOTvsGqQHEQ==} + engines: {node: '>=6.11.5'} + peerDependencies: + html-webpack-plugin: ^3.0.0 || ^4.0.0 + webpack: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + scroll-into-view-if-needed@2.2.20: resolution: {integrity: sha512-P9kYMrhi9f6dvWwTGpO5I3HgjSU/8Mts7xL3lkoH5xlewK7O9Obdc5WmMCzppln7bCVGNmf3qfoZXrpCeyNJXw==} @@ -7461,6 +8870,9 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} @@ -7471,6 +8883,9 @@ packages: resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} engines: {node: '>=10'} + semver-store@0.3.0: + resolution: {integrity: sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -7489,10 +8904,17 @@ packages: engines: {node: '>=10'} hasBin: true + send@0.17.2: + resolution: {integrity: sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==} + engines: {node: '>= 0.8.0'} + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} + serialize-javascript@1.9.1: + resolution: {integrity: sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -7504,6 +8926,12 @@ packages: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7559,6 +8987,14 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@1.0.0: + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} + engines: {node: '>=0.10.0'} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -7578,6 +9014,12 @@ packages: sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + sonic-boom@1.4.1: + resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} + + source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -7612,6 +9054,10 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -7619,9 +9065,15 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} + split2@2.2.0: + resolution: {integrity: sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==} + sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + ssri@5.3.0: + resolution: {integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -7646,6 +9098,12 @@ packages: std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + stream-each@1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -7658,6 +9116,10 @@ packages: resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} engines: {node: '>=12.20'} + string-similarity@4.0.4: + resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -7728,6 +9190,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -7756,10 +9222,21 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + terser-webpack-plugin@5.3.10: resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -7803,9 +9280,23 @@ packages: peerDependencies: tslib: ^2 + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + tiny-lru@2.0.0: + resolution: {integrity: sha512-LcvsiH/JYkeItdNK5w8EJjlHcOuaULkpjA97cfLBMvylHKlXAcccNFqKUw4EGhbYaFnhn6q7xqfTyO0xIOj59Q==} + engines: {node: '>=8.0.0'} + + tiny-lru@8.0.2: + resolution: {integrity: sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==} + engines: {node: '>=6'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -7835,10 +9326,17 @@ packages: resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==} hasBin: true + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -7871,6 +9369,9 @@ packages: resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} engines: {node: '>=16'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -7993,6 +9494,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -8000,6 +9505,9 @@ packages: type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -8021,6 +9529,9 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -8031,6 +9542,12 @@ packages: unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} @@ -8317,6 +9834,9 @@ packages: webassembly-feature@1.3.0: resolution: {integrity: sha512-tvszvOBbV/X6gj0Nh3hxmrLUSZzXIxEwL6EzDrqU4OPLRuUVMne/bg8kFFRxwDMJVM+1R+c+O2ajrxa8HIkRwA==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -8324,6 +9844,12 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-assets-manifest@3.1.1: + resolution: {integrity: sha512-JV9V2QKc5wEWQptdIjvXDUL1ucbPLH2f27toAY3SNdGZp+xSaStAgpoMcvMZmqtFrBc9a5pTS1058vxyMPOzRQ==} + engines: {node: '>=6.11.5'} + peerDependencies: + webpack: '>=4.4.0' + webpack-bundle-analyzer@4.6.1: resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} engines: {node: '>= 10.13.0'} @@ -8368,6 +9894,9 @@ packages: webpack-cli: optional: true + webpack-fix-style-only-entries@0.6.1: + resolution: {integrity: sha512-wyIhoxS3DD3Fr9JA8hQPA+ZmaWnqPxx12Nv166wcsI/0fbReqyEtiIk2llOFYIg57WVS3XX5cZJxw2ji70R0sA==} + webpack-merge@5.9.0: resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} engines: {node: '>=10.0.0'} @@ -8376,6 +9905,9 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} + webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -8422,9 +9954,15 @@ packages: resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -8473,6 +10011,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -8501,6 +10042,18 @@ packages: utf-8-validate: optional: true + ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-js@1.6.11: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true @@ -8523,10 +10076,16 @@ packages: xxhashjs@0.2.2: resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -8542,14 +10101,25 @@ packages: resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==} hasBin: true + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -9142,8 +10712,14 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true + '@fastify/ajv-compiler@1.1.0': + dependencies: + ajv: 6.12.6 + '@fastify/busboy@2.1.1': {} + '@fastify/error@2.0.0': {} + '@grpc/grpc-js@1.12.2': dependencies: '@grpc/proto-loader': 0.7.13 @@ -9340,10 +10916,6 @@ snapshots: - supports-color - ts-node - '@jest/create-cache-key-function@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 @@ -9453,6 +11025,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/types@26.6.2': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.17.10 + '@types/yargs': 15.0.19 + chalk: 4.1.2 + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 @@ -10711,13 +12291,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/jest@0.2.37(@swc/core@1.10.1(@swc/helpers@0.5.15))': - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.10.1(@swc/helpers@0.5.15) - '@swc/counter': 0.1.3 - jsonc-parser: 3.3.1 - '@swc/plugin-remove-console@6.2.0': dependencies: '@swc/counter': 0.1.3 @@ -10786,7 +12359,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.10 + '@types/node': 14.18.63 + + '@types/cross-spawn@6.0.6': + dependencies: + '@types/node': 14.18.63 '@types/d3-array@3.2.1': {} @@ -10915,6 +12492,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/events@3.0.3': {} + '@types/express-serve-static-core@4.19.0': dependencies: '@types/node': 20.17.10 @@ -10929,6 +12508,12 @@ snapshots: '@types/qs': 6.9.14 '@types/serve-static': 1.15.7 + '@types/fastify-static@0.14.0': + dependencies: + fastify: 1.14.6 + transitivePeerDependencies: + - supports-color + '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 @@ -11011,10 +12596,21 @@ snapshots: dependencies: '@types/node': 20.17.10 + '@types/node@14.18.63': {} + '@types/node@20.17.10': dependencies: undici-types: 6.19.8 + '@types/pino@4.16.1': + dependencies: + '@types/events': 3.0.3 + '@types/node': 14.18.63 + + '@types/puppeteer@5.4.7': + dependencies: + '@types/node': 14.18.63 + '@types/qs@6.9.14': {} '@types/range-parser@1.2.7': {} @@ -11040,7 +12636,7 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.10 + '@types/node': 14.18.63 '@types/serve-index@1.9.4': dependencies: @@ -11049,7 +12645,7 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.17.10 + '@types/node': 14.18.63 '@types/send': 0.17.4 '@types/shimmer@1.2.0': {} @@ -11062,6 +12658,8 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/tmp@0.2.6': {} + '@types/tough-cookie@4.0.5': {} '@types/trusted-types@2.0.7': @@ -11110,10 +12708,19 @@ snapshots: '@types/yargs-parser@21.0.3': {} + '@types/yargs@15.0.19': + dependencies: + '@types/yargs-parser': 21.0.3 + '@types/yargs@17.0.33': dependencies: '@types/yargs-parser': 21.0.3 + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 14.18.63 + optional: true + '@ungap/structured-clone@1.2.0': {} '@vercel/ncc@0.38.3': {} @@ -11331,6 +12938,10 @@ snapshots: abab@2.0.6: {} + abstract-logging@1.0.0: {} + + abstract-logging@2.0.1: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -11372,6 +12983,10 @@ snapshots: optionalDependencies: ajv: 8.13.0 + ajv-errors@1.0.1(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv-formats@2.1.1(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -11426,6 +13041,10 @@ snapshots: ansi-regex@6.0.1: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -11443,6 +13062,14 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + aproba@1.2.0: {} + + archy@1.0.0: {} + arg@4.1.3: {} arg@5.0.2: {} @@ -11455,8 +13082,14 @@ snapshots: array-flatten@1.1.1: {} + array-union@1.0.2: + dependencies: + array-uniq: 1.0.3 + array-union@2.1.0: {} + array-uniq@1.0.3: {} + asap@2.0.6: {} assert-never@1.4.0: {} @@ -11469,6 +13102,24 @@ snapshots: asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} + + avvio@5.9.0: + dependencies: + debug: 3.2.7 + fastq: 1.17.1 + transitivePeerDependencies: + - supports-color + + avvio@7.2.5: + dependencies: + archy: 1.0.0 + debug: 4.4.0 + fastq: 1.17.1 + queue-microtask: 1.2.3 + transitivePeerDependencies: + - supports-color + axios@1.7.7: dependencies: follow-redirects: 1.15.6 @@ -11561,14 +13212,26 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + batch@0.6.1: {} before-after-hook@3.0.2: {} + before-build-webpack@0.2.15: {} + big.js@5.2.2: {} binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.7.2: {} + body-parser@1.20.2: dependencies: bytes: 3.1.2 @@ -11595,6 +13258,8 @@ snapshots: boolbase@1.0.0: {} + bourne@1.3.3: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -11625,8 +13290,15 @@ snapshots: buffer-builder@0.2.0: {} + buffer-crc32@0.2.13: {} + buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-loader@0.5.6: dependencies: loader-utils: 1.4.2 @@ -11646,6 +13318,29 @@ snapshots: cac@6.7.14: {} + cacache@10.0.4: + dependencies: + bluebird: 3.7.2 + chownr: 1.1.4 + glob: 7.2.3 + graceful-fs: 4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) + lru-cache: 4.1.5 + mississippi: 2.0.0 + mkdirp: 0.5.6 + move-concurrently: 1.0.1 + promise-inflight: 1.0.1(bluebird@3.7.2) + rimraf: 2.7.1 + ssri: 5.3.0 + unique-filename: 1.1.1 + y18n: 4.0.3 + + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -11689,6 +13384,12 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -11748,6 +13449,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chownr@1.1.4: {} + chrome-trace-event@1.0.3: {} ci-info@3.9.0: {} @@ -11781,6 +13484,12 @@ snapshots: dependencies: typanion: 3.14.0 + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -11870,6 +13579,8 @@ snapshots: common-path-prefix@3.0.0: {} + commondir@1.0.1: {} + compressible@2.0.18: dependencies: mime-db: 1.52.0 @@ -11892,6 +13603,13 @@ snapshots: concat-map@0.0.1: {} + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 @@ -11903,6 +13621,15 @@ snapshots: connect-history-api-fallback@2.0.0: {} + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + consola@3.2.3: {} constantinople@4.0.1: @@ -11916,20 +13643,46 @@ snapshots: content-type@1.0.5: {} + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.0.6: {} + cookie@0.4.2: {} + + cookie@0.5.0: {} + cookie@0.6.0: {} copy-anything@2.0.6: dependencies: is-what: 3.14.1 + copy-concurrently@1.0.5: + dependencies: + aproba: 1.2.0 + fs-write-stream-atomic: 1.0.10 + iferr: 0.1.5 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 + copy-webpack-plugin@4.6.0: + dependencies: + cacache: 10.0.4 + find-cache-dir: 1.0.0 + globby: 7.1.1 + is-glob: 4.0.3 + loader-utils: 1.4.2 + minimatch: 3.1.2 + p-limit: 1.3.0 + serialize-javascript: 1.9.1 + core-js@3.36.1: {} core-js@3.38.1: {} @@ -11987,6 +13740,12 @@ snapshots: dependencies: cross-spawn: 7.0.3 + cross-fetch@3.1.5: + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -12045,6 +13804,14 @@ snapshots: domutils: 2.8.0 nth-check: 2.1.1 + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + css-what@6.1.0: {} cssesc@3.0.0: {} @@ -12068,6 +13835,8 @@ snapshots: cuint@0.2.2: {} + cyclist@1.0.2: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): dependencies: cose-base: 1.0.3 @@ -12278,10 +14047,20 @@ snapshots: dependencies: ms: 2.0.0 + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + debug@4.4.0: dependencies: ms: 2.1.3 + decamelize@1.2.0: {} + decimal.js@10.4.3: {} decode-named-character-reference@1.0.2: @@ -12305,6 +14084,10 @@ snapshots: dependencies: execa: 5.1.1 + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -12336,6 +14119,8 @@ snapshots: dequal@2.0.3: {} + destroy@1.0.4: {} + destroy@1.2.0: {} detect-newline@3.1.0: {} @@ -12348,14 +14133,22 @@ snapshots: dependencies: dequal: 2.0.3 + devtools-protocol@0.0.981744: {} + didyoumean@1.2.2: {} + diff-sequences@26.6.2: {} + diff-sequences@29.6.3: {} diff@4.0.2: {} diff@5.2.0: {} + dir-glob@2.2.2: + dependencies: + path-type: 3.0.0 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -12432,6 +14225,13 @@ snapshots: duplexer@0.1.2: {} + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -12454,6 +14254,12 @@ snapshots: encodeurl@1.0.2: {} + encoding-negotiator@2.0.1: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + enhanced-resolve@5.12.0: dependencies: graceful-fs: 4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) @@ -12509,6 +14315,8 @@ snapshots: esniff: 2.0.1 next-tick: 1.1.0 + es6-error@4.1.1: {} + es6-iterator@2.0.3: dependencies: d: 1.0.2 @@ -12687,6 +14495,15 @@ snapshots: expect-type@1.1.0: {} + expect@26.6.2: + dependencies: + '@jest/types': 26.6.2 + ansi-styles: 4.3.0 + jest-get-type: 26.3.0 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -12747,6 +14564,20 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-content-type-parse@1.1.0: {} + + fast-decode-uri-component@1.0.1: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -12757,10 +14588,105 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-parse@1.0.3: {} + fast-json-stable-stringify@2.1.0: {} + fast-json-stringify@1.21.0: + dependencies: + ajv: 6.12.6 + deepmerge: 4.3.1 + string-similarity: 4.0.4 + + fast-json-stringify@2.7.13: + dependencies: + ajv: 6.12.6 + deepmerge: 4.3.1 + rfdc: 1.4.1 + string-similarity: 4.0.4 + + fast-redact@3.5.0: {} + + fast-safe-stringify@1.2.3: {} + + fast-safe-stringify@2.1.1: {} + fastest-levenshtein@1.0.16: {} + fastify-graceful-shutdown@3.5.3: + dependencies: + fastify-plugin: 4.5.1 + fastparallel: 2.4.1 + + fastify-plugin@3.0.1: {} + + fastify-plugin@4.5.1: {} + + fastify-static@4.6.1: + dependencies: + content-disposition: 0.5.4 + encoding-negotiator: 2.0.1 + fastify-plugin: 3.0.1 + glob: 7.2.3 + p-limit: 3.1.0 + readable-stream: 3.6.2 + send: 0.17.2 + transitivePeerDependencies: + - supports-color + + fastify-static@4.7.0: + dependencies: + fastify-static-deprecated: fastify-static@4.6.1 + process-warning: 1.0.0 + transitivePeerDependencies: + - supports-color + + fastify@1.14.6: + dependencies: + '@types/pino': 4.16.1 + abstract-logging: 1.0.0 + ajv: 6.12.6 + avvio: 5.9.0 + bourne: 1.3.3 + end-of-stream: 1.4.4 + fast-json-stringify: 1.21.0 + find-my-way: 1.18.1 + flatstr: 1.0.12 + light-my-request: 3.8.0 + middie: 3.2.1 + pino: 4.17.6 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + tiny-lru: 2.0.0 + transitivePeerDependencies: + - supports-color + + fastify@3.29.5: + dependencies: + '@fastify/ajv-compiler': 1.1.0 + '@fastify/error': 2.0.0 + abstract-logging: 2.0.1 + avvio: 7.2.5 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 2.7.13 + find-my-way: 4.5.1 + flatstr: 1.0.12 + light-my-request: 4.12.0 + pino: 6.14.0 + process-warning: 1.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.6.3 + tiny-lru: 8.0.2 + transitivePeerDependencies: + - supports-color + + fastparallel@2.4.1: + dependencies: + reusify: 1.0.4 + xtend: 4.0.2 + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -12777,6 +14703,10 @@ snapshots: dependencies: bser: 2.1.1 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -12807,6 +14737,18 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@1.2.0: dependencies: debug: 2.6.9 @@ -12819,11 +14761,40 @@ snapshots: transitivePeerDependencies: - supports-color + find-cache-dir@1.0.0: + dependencies: + commondir: 1.0.1 + make-dir: 1.3.0 + pkg-dir: 2.0.0 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + find-cache-dir@4.0.0: dependencies: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 + find-my-way@1.18.1: + dependencies: + fast-decode-uri-component: 1.0.1 + safe-regex: 1.1.0 + semver-store: 0.3.0 + + find-my-way@4.5.1: + dependencies: + fast-decode-uri-component: 1.0.1 + fast-deep-equal: 3.1.3 + safe-regex2: 2.0.0 + semver-store: 0.3.0 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -12836,14 +14807,26 @@ snapshots: flat@5.0.2: {} + flatstr@1.0.12: {} + flexsearch@0.7.43: {} + flush-write-stream@1.1.1: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + focus-lock@1.3.6: dependencies: tslib: 2.8.1 follow-redirects@1.15.6: {} + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 @@ -12870,12 +14853,28 @@ snapshots: fresh@0.5.2: {} + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fromentries@1.3.2: {} + + fs-constants@1.0.0: {} + fs-extra@11.3.0: dependencies: graceful-fs: 4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) jsonfile: 6.1.0 universalify: 2.0.1 + fs-write-stream-atomic@1.0.10: + dependencies: + graceful-fs: 4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) + iferr: 0.1.5 + imurmurhash: 0.1.4 + readable-stream: 2.3.8 + fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -12907,11 +14906,17 @@ snapshots: get-package-type@0.1.0: {} + get-port@5.1.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -12972,6 +14977,15 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 + globby@7.1.1: + dependencies: + array-union: 1.0.2 + dir-glob: 2.2.2 + glob: 7.2.3 + ignore: 3.3.10 + pify: 3.0.0 + slash: 1.0.0 + gopd@1.2.0: {} graceful-fs@4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q): {} @@ -12991,6 +15005,8 @@ snapshots: handle-thing@2.0.1: {} + has-flag@3.0.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -13005,6 +15021,11 @@ snapshots: hash-sum@2.0.0: {} + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -13156,6 +15177,19 @@ snapshots: htmlparser2: 8.0.2 selderee: 0.11.0 + html-webpack-externals-plugin@3.8.0(html-webpack-plugin@5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0)): + dependencies: + ajv: 6.12.6 + copy-webpack-plugin: 4.6.0 + html-webpack-include-assets-plugin: 1.0.10 + html-webpack-plugin: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + + html-webpack-include-assets-plugin@1.0.10: + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + slash: 2.0.0 + html-webpack-plugin@5.6.0(@rspack/core@packages+rspack)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -13167,6 +15201,28 @@ snapshots: '@rspack/core': link:packages/rspack webpack: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0)) + html-webpack-plugin@5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + '@rspack/core': 1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15) + webpack: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + + html-webpack-plugin@5.6.3(@rspack/core@packages+rspack)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + '@rspack/core': link:packages/rspack + webpack: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0)) + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -13196,6 +15252,14 @@ snapshots: setprototypeof: 1.1.0 statuses: 1.5.0 + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -13241,6 +15305,8 @@ snapshots: transitivePeerDependencies: - debug + http-shutdown@1.2.2: {} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -13275,6 +15341,12 @@ snapshots: dependencies: postcss: 8.5.2 + ieee754@1.2.1: {} + + iferr@0.1.5: {} + + ignore@3.3.10: {} + ignore@5.3.1: {} image-size@0.5.5: @@ -13439,8 +15511,12 @@ snapshots: is-stream@3.0.0: {} + is-typedarray@1.0.0: {} + is-what@3.14.1: {} + is-windows@1.0.2: {} + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -13455,6 +15531,10 @@ snapshots: istanbul-lib-coverage@3.2.2: {} + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.24.4 @@ -13475,6 +15555,15 @@ snapshots: transitivePeerDependencies: - supports-color + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -13593,6 +15682,13 @@ snapshots: - babel-plugin-macros - supports-color + jest-diff@26.6.2: + dependencies: + chalk: 4.1.2 + diff-sequences: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -13636,6 +15732,8 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 + jest-get-type@26.3.0: {} + jest-get-type@29.6.3: {} jest-haste-map@29.7.0: @@ -13659,6 +15757,13 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 + jest-matcher-utils@26.6.2: + dependencies: + chalk: 4.1.2 + jest-diff: 26.6.2 + jest-get-type: 26.3.0 + pretty-format: 26.6.2 + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 @@ -13666,6 +15771,18 @@ snapshots: jest-get-type: 29.6.3 pretty-format: 29.7.0 + jest-message-util@26.6.2: + dependencies: + '@babel/code-frame': 7.26.2 + '@jest/types': 26.6.2 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) + micromatch: 4.0.8 + pretty-format: 26.6.2 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.26.2 @@ -13688,6 +15805,8 @@ snapshots: optionalDependencies: jest-resolve: 29.7.0 + jest-regex-util@26.0.0: {} + jest-regex-util@29.6.3: {} jest-resolve-dependencies@29.7.0: @@ -13976,8 +16095,6 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.3.1: {} - jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -14050,6 +16167,20 @@ snapshots: leven@3.1.0: {} + light-my-request@3.8.0: + dependencies: + ajv: 6.12.6 + cookie: 0.4.2 + readable-stream: 3.6.2 + set-cookie-parser: 2.7.1 + + light-my-request@4.12.0: + dependencies: + ajv: 8.13.0 + cookie: 0.5.0 + process-warning: 1.0.0 + set-cookie-parser: 2.7.1 + lilconfig@2.1.0: {} lilconfig@3.1.3: {} @@ -14101,6 +16232,11 @@ snapshots: mlly: 1.7.4 pkg-types: 1.3.1 + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -14113,6 +16249,12 @@ snapshots: lodash.camelcase@4.3.0: {} + lodash.flattendeep@4.4.0: {} + + lodash.get@4.4.2: {} + + lodash.has@4.5.2: {} + lodash.memoize@4.1.2: {} lodash.sortby@4.7.0: {} @@ -14150,6 +16292,11 @@ snapshots: lru-cache@11.0.2: {} + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -14162,12 +16309,20 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + make-dir@2.1.0: dependencies: pify: 4.0.1 semver: 5.7.2 optional: true + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + make-dir@4.0.0: dependencies: semver: 7.6.3 @@ -14655,6 +16810,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + middie@3.2.1: + dependencies: + path-to-regexp: 2.4.0 + reusify: 1.0.4 + mime-db@1.52.0: {} mime-types@2.1.35: @@ -14669,6 +16829,13 @@ snapshots: mimic-function@5.0.1: {} + mini-css-extract-plugin@1.6.2(webpack@5.95.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-sources: 1.4.3 + mini-svg-data-uri@1.4.4: {} minimalistic-assert@1.0.1: {} @@ -14697,6 +16864,25 @@ snapshots: minipass@7.1.2: {} + mississippi@2.0.0: + dependencies: + concat-stream: 1.6.2 + duplexify: 3.7.1 + end-of-stream: 1.4.4 + flush-write-stream: 1.1.1 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 2.0.1 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 2.0.5 + + mkdirp-classic@0.5.3: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + mlly@1.7.4: dependencies: acorn: 8.14.0 @@ -14720,12 +16906,23 @@ snapshots: motion-utils@12.0.0: {} + move-concurrently@1.0.1: + dependencies: + aproba: 1.2.0 + copy-concurrently: 1.0.5 + fs-write-stream-atomic: 1.0.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + run-queue: 1.0.3 + mri@1.2.0: {} mrmime@1.0.1: {} ms@2.0.0: {} + ms@2.1.2: {} + ms@2.1.3: {} multicast-dns@7.2.5: @@ -14764,12 +16961,20 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-fetch@2.6.7: + dependencies: + whatwg-url: 5.0.0 + node-forge@1.3.1: {} node-gyp-build@4.8.4: {} node-int64@0.4.0: {} + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.1.0 + node-releases@2.0.18: {} normalize-path@3.0.0: {} @@ -14794,6 +16999,38 @@ snapshots: nwsapi@2.2.16: {} + nyc@17.1.0: + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 3.3.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.1.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -14802,6 +17039,10 @@ snapshots: obuf@1.1.2: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -14835,6 +17076,10 @@ snapshots: os-tmpdir@1.0.2: {} + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -14847,6 +17092,10 @@ snapshots: dependencies: yocto-queue: 1.0.0 + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -14855,6 +17104,10 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@3.0.0: + dependencies: + aggregate-error: 3.1.0 + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -14870,12 +17123,27 @@ snapshots: is-network-error: 1.1.0 retry: 0.13.1 + p-try@1.0.0: {} + p-try@2.2.0: {} + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11(patch_hash=ivtm2a2cfr5pomcfbedhmr5v2q) + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + package-json-from-dist@1.0.1: {} package-manager-detector@0.2.9: {} + parallel-transform@1.2.0: + dependencies: + cyclist: 1.0.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -14934,6 +17202,8 @@ snapshots: path-data-parser@0.1.0: {} + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -14960,6 +17230,12 @@ snapshots: path-to-regexp@0.1.7: {} + path-to-regexp@2.4.0: {} + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + path-type@4.0.0: {} pathe@1.1.2: {} @@ -14970,6 +17246,8 @@ snapshots: peberminta@0.9.0: {} + pend@1.2.0: {} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.6 @@ -14986,11 +17264,42 @@ snapshots: pify@2.3.0: {} + pify@3.0.0: {} + pify@4.0.1: optional: true + pino-std-serializers@2.5.0: {} + + pino-std-serializers@3.2.0: {} + + pino@4.17.6: + dependencies: + chalk: 2.4.2 + fast-json-parse: 1.0.3 + fast-safe-stringify: 1.2.3 + flatstr: 1.0.12 + pino-std-serializers: 2.5.0 + pump: 3.0.2 + quick-format-unescaped: 1.1.2 + split2: 2.2.0 + + pino@6.14.0: + dependencies: + fast-redact: 3.5.0 + fast-safe-stringify: 2.1.1 + flatstr: 1.0.12 + pino-std-serializers: 3.2.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + sonic-boom: 1.4.1 + pirates@4.0.6: {} + pkg-dir@2.0.0: + dependencies: + find-up: 2.1.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -15139,6 +17448,13 @@ snapshots: lodash: 4.17.21 renderkid: 3.0.0 + pretty-format@26.6.2: + dependencies: + '@jest/types': 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -15151,6 +17467,18 @@ snapshots: process-nextick-args@2.0.1: {} + process-on-spawn@1.1.0: + dependencies: + fromentries: 1.3.2 + + process-warning@1.0.0: {} + + progress@2.0.3: {} + + promise-inflight@1.0.1(bluebird@3.7.2): + optionalDependencies: + bluebird: 3.7.2 + promise@7.3.1: dependencies: asap: 2.0.6 @@ -15197,6 +17525,8 @@ snapshots: prr@1.0.1: optional: true + pseudomap@1.0.2: {} + psl@1.9.0: {} pug-attrs@3.0.0: @@ -15242,6 +17572,12 @@ snapshots: object-assign: 4.1.1 pug-walk: 2.0.0 + pug-loader@2.4.0: + dependencies: + loader-utils: 1.4.2 + pug-walk: 1.1.8 + resolve: 1.22.10 + pug-parser@6.0.0: dependencies: pug-error: 2.1.0 @@ -15253,6 +17589,8 @@ snapshots: dependencies: pug-error: 2.1.0 + pug-walk@1.1.8: {} + pug-walk@2.0.0: {} pug@3.0.3: @@ -15266,8 +17604,44 @@ snapshots: pug-runtime: 3.0.1 pug-strip-comments: 2.0.0 + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + punycode@2.3.1: {} + puppeteer@13.7.0: + dependencies: + cross-fetch: 3.1.5 + debug: 4.3.4 + devtools-protocol: 0.0.981744 + extract-zip: 2.0.1 + https-proxy-agent: 5.0.1 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + pure-rand@6.1.0: {} qs@6.11.0: @@ -15280,6 +17654,12 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@1.1.2: + dependencies: + fast-safe-stringify: 1.2.3 + + quick-format-unescaped@4.0.4: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -15341,6 +17721,8 @@ snapshots: react-is@16.13.1: {} + react-is@17.0.2: {} + react-is@18.2.0: {} react-lazy-with-preload@2.2.1: {} @@ -15433,6 +17815,10 @@ snapshots: relateurl@0.2.7: {} + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + remark-gfm@3.0.1: dependencies: '@types/mdast': 3.0.15 @@ -15499,6 +17885,8 @@ snapshots: transitivePeerDependencies: - supports-color + require-main-filename@2.0.0: {} + requires-port@1.0.0: {} resize-observer-polyfill@1.5.1: {} @@ -15526,12 +17914,20 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + ret@0.1.15: {} + + ret@0.2.2: {} + retry@0.13.1: {} reusify@1.0.4: {} rfdc@1.4.1: {} + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -15640,6 +18036,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 + run-queue@1.0.3: + dependencies: + aproba: 1.2.0 + rw@1.3.3: {} rxjs@7.8.1: @@ -15654,6 +18054,14 @@ snapshots: safe-buffer@5.2.1: {} + safe-regex2@2.0.0: + dependencies: + ret: 0.2.2 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + safer-buffer@2.1.2: {} sass-embedded-android-arm64@1.83.4: @@ -15776,6 +18184,12 @@ snapshots: scheduler@0.25.0: {} + schema-utils@1.0.0: + dependencies: + ajv: 6.12.6 + ajv-errors: 1.0.1(ajv@6.12.6) + ajv-keywords: 3.5.2(ajv@6.12.6) + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -15789,6 +18203,14 @@ snapshots: ajv-formats: 2.1.1(ajv@8.13.0) ajv-keywords: 5.1.0(ajv@8.13.0) + script-ext-html-webpack-plugin@2.1.5(html-webpack-plugin@5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0))(webpack@5.95.0): + dependencies: + debug: 4.4.0 + html-webpack-plugin: 5.6.3(@rspack/core@1.2.3(@rspack/tracing@1.2.3)(@swc/helpers@0.5.15))(webpack@5.95.0) + webpack: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + transitivePeerDependencies: + - supports-color + scroll-into-view-if-needed@2.2.20: dependencies: compute-scroll-into-view: 1.0.11 @@ -15798,6 +18220,8 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 + secure-json-parse@2.7.0: {} + selderee@0.11.0: dependencies: parseley: 0.12.1 @@ -15809,6 +18233,8 @@ snapshots: '@types/node-forge': 1.3.11 node-forge: 1.3.1 + semver-store@0.3.0: {} + semver@5.7.2: optional: true @@ -15820,6 +18246,24 @@ snapshots: semver@7.6.3: {} + send@0.17.2: + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.8.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + transitivePeerDependencies: + - supports-color + send@0.18.0: dependencies: debug: 2.6.9 @@ -15838,6 +18282,8 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-javascript@1.9.1: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -15863,6 +18309,10 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15917,6 +18367,10 @@ snapshots: sisteransi@1.0.5: {} + slash@1.0.0: {} + + slash@2.0.0: {} + slash@3.0.0: {} slash@5.1.0: {} @@ -15937,6 +18391,13 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.4 + sonic-boom@1.4.1: + dependencies: + atomic-sleep: 1.0.0 + flatstr: 1.0.12 + + source-list-map@2.0.1: {} + source-map-js@1.2.1: {} source-map-loader@5.0.0(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.95.0))): @@ -15967,6 +18428,15 @@ snapshots: space-separated-tokens@2.0.2: {} + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + spdy-transport@3.0.0: dependencies: debug: 4.4.0 @@ -15988,8 +18458,16 @@ snapshots: transitivePeerDependencies: - supports-color + split2@2.2.0: + dependencies: + through2: 2.0.5 + sprintf-js@1.0.3: {} + ssri@5.3.0: + dependencies: + safe-buffer: 5.2.1 + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -16006,6 +18484,13 @@ snapshots: std-env@3.8.0: {} + stream-each@1.2.3: + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.3 + + stream-shift@1.0.3: {} + string-argv@0.3.2: {} string-length@4.0.2: @@ -16018,6 +18503,8 @@ snapshots: char-regex: 2.0.1 strip-ansi: 7.1.0 + string-similarity@4.0.4: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -16095,6 +18582,10 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -16140,8 +18631,25 @@ snapshots: transitivePeerDependencies: - ts-node + tapable@1.1.3: {} + tapable@2.2.1: {} + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + terser-webpack-plugin@5.3.10(@swc/core@1.10.1(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack-cli@5.1.4(webpack@5.95.0))): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -16209,8 +18717,19 @@ snapshots: dependencies: tslib: 2.8.1 + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through@2.3.8: {} + thunky@1.1.0: {} + tiny-lru@2.0.0: {} + + tiny-lru@8.0.2: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} @@ -16232,10 +18751,16 @@ snapshots: dependencies: tldts-core: 6.1.50 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.3 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.3: {} + tmpl@1.0.5: {} to-regex-range@5.0.1: @@ -16263,6 +18788,8 @@ snapshots: dependencies: tldts: 6.1.50 + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -16407,6 +18934,8 @@ snapshots: type-fest@0.21.3: {} + type-fest@0.8.1: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -16414,6 +18943,10 @@ snapshots: type@2.7.2: {} + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typedarray@0.0.6: {} typescript@4.9.5: {} @@ -16424,6 +18957,11 @@ snapshots: ufo@1.5.4: {} + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + undici-types@6.19.8: {} undici@5.28.4: @@ -16440,6 +18978,14 @@ snapshots: trough: 2.2.0 vfile: 5.3.7 + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + unist-util-generated@2.0.1: {} unist-util-is@5.2.1: @@ -16738,10 +19284,23 @@ snapshots: webassembly-feature@1.3.0: {} + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} + webpack-assets-manifest@3.1.1(webpack@5.95.0): + dependencies: + chalk: 2.4.2 + lodash.get: 4.4.2 + lodash.has: 4.5.2 + mkdirp: 0.5.6 + schema-utils: 1.0.0 + tapable: 1.1.3 + webpack: 5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(webpack-cli@5.1.4) + webpack-sources: 1.4.3 + webpack-bundle-analyzer@4.6.1: dependencies: acorn: 8.14.0 @@ -16878,6 +19437,8 @@ snapshots: - supports-color - utf-8-validate + webpack-fix-style-only-entries@0.6.1: {} + webpack-merge@5.9.0: dependencies: clone-deep: 4.0.1 @@ -16889,6 +19450,11 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 + webpack-sources@1.4.3: + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + webpack-sources@3.2.3: {} webpack@5.95.0(@swc/core@1.10.1(@swc/helpers@0.5.15))(esbuild@0.23.1)(webpack-cli@5.1.4(webpack@5.95.0)): @@ -17018,12 +19584,19 @@ snapshots: tr46: 5.0.0 webidl-conversions: 7.0.0 + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 + which-module@2.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -17076,6 +19649,13 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 @@ -17085,6 +19665,8 @@ snapshots: ws@8.18.0: {} + ws@8.5.0: {} + xml-js@1.6.11: dependencies: sax: 1.3.0 @@ -17101,8 +19683,12 @@ snapshots: dependencies: cuint: 0.2.2 + y18n@4.0.3: {} + y18n@5.0.8: {} + yallist@2.1.2: {} + yallist@3.1.1: {} yallist@4.0.0: {} @@ -17114,8 +19700,27 @@ snapshots: argparse: 1.0.10 glob: 7.2.3 + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -17126,6 +19731,11 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c35fa6fddc3a..af83a149bd4f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,3 +17,5 @@ packages: - "tests/bench" # this following is used to test resolve in monorepo - "packages/rspack-test-tools/tests/normalCases/resolve/pnpm-workspace/packages/*" + # this following is used to test sri plugin + - "tests/plugin-test/sri-plugin/examples/*" diff --git a/tests/e2e/cases/vue3/src/index.html b/tests/e2e/cases/vue3/src/index.html index 127a457455b3..e41563682b68 100644 --- a/tests/e2e/cases/vue3/src/index.html +++ b/tests/e2e/cases/vue3/src/index.html @@ -1,12 +1,15 @@ - - - - - Document - - -
- - + + + + + + Document + + + +
+ + + \ No newline at end of file diff --git a/tests/plugin-test/README.md b/tests/plugin-test/README.md index b45beab57aef..156033b9918c 100644 --- a/tests/plugin-test/README.md +++ b/tests/plugin-test/README.md @@ -4,6 +4,7 @@ > - [mini-css-extract-plugin/test](https://github.com/webpack-contrib/mini-css-extract-plugin/tree/master/test) > - [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin/tree/master/test) > - [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin/tree/main/spec) +> - [webpack-subresource-integrity](https://github.com/waysact/webpack-subresource-integrity) ## Credits @@ -12,3 +13,4 @@ Thanks to: - The [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) project created by [@sokra](https://github.com/sokra) - The [copy-webpack-plugin](https://github.com/webpack-contrib/copy-webpack-plugin) project created by [@kevlened](https://github.com/kevlened) - The [html-webpack-plugin](https://github.com/jantimon/html-webpack-plugin) project created by [@jantimon](https://github.com/jantimon) +- The [webpack-subresource-integrity](https://github.com/waysact/webpack-subresource-integrity) project created by [@jscheid](https://github.com/jscheid) diff --git a/tests/plugin-test/jest.config.js b/tests/plugin-test/jest.config.js index fffb92266ebf..d0d20fed1398 100644 --- a/tests/plugin-test/jest.config.js +++ b/tests/plugin-test/jest.config.js @@ -1,22 +1,20 @@ const path = require("path"); - - const root = path.resolve(__dirname, "../"); /** @type {import('jest').Config} */ const config = { + preset: "ts-jest", testEnvironment: "../../scripts/test/patch-node-env.cjs", testMatch: [ "/**/*.test.js", "/**/*.test.ts" ], transform: { - '^.+\\.ts?$': '@swc/jest', - }, + "^.+\\.(ts)?$": ["ts-jest", { tsconfig: "/tsconfig.json" }] + }, testTimeout: process.env.CI ? 60000 : 30000, prettierPath: require.resolve("prettier-2"), cache: false, - transformIgnorePatterns: [root], setupFilesAfterEnv: ["/setupTestEnv.js"], snapshotFormat: { escapeString: true, @@ -26,6 +24,7 @@ const config = { updateSnapshot: process.argv.includes("-u") || process.argv.includes("--updateSnapshot") }, + extensionsToTreatAsEsm: [".mts"] }; module.exports = config; diff --git a/tests/plugin-test/package.json b/tests/plugin-test/package.json index 2a198444f1b1..152cea1a6ece 100644 --- a/tests/plugin-test/package.json +++ b/tests/plugin-test/package.json @@ -11,18 +11,38 @@ "repository": "web-infra-dev/rspack", "devDependencies": { "@rspack/core": "workspace:*", - "@swc/core": "1.10.1", - "@swc/jest": "^0.2.37", "@webdiscus/pug-loader": "^2.11.1", + "@types/cross-spawn": "^6.0.2", + "@types/tmp": "^0.2.3", + "before-build-webpack": "0.2.15", "css-loader": "^7.1.2", + "cross-spawn": "^7.0.3", + "expect": "^29.7.0", "file-loader": "^6.2.0", "html-loader": "2.1.1", + "html-webpack-plugin": "5.6.3", + "pug-loader": "2.4.0", "sass-embedded": "^1.77.8", "sass-loader": "^16.0.0", "jsdom": "^25.0.0", "del": "^6.0.0", "lodash": "^4.17.21", - "memfs": "4.17.0" + "memfs": "4.17.0", + "tmp": "^0.2.1", + "tmp-promise": "^3.0.3", + "@types/connect": "^3.4.35", + "@types/fastify-static": "^0.14.0", + "@types/node": "^14.17.5", + "@types/puppeteer": "^5.4.5", + "@types/serve-static": "^1.13.10", + "connect": "^3.7.0", + "fastify": "^3.29.5", + "fastify-graceful-shutdown": "^3.4.0", + "fastify-static": "^4.7.0", + "get-port": "^5.1.1", + "http-shutdown": "^1.2.2", + "puppeteer": "^13.5.1", + "serve-static": "^1.15.0" }, "dependencies": {} } \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/README.md b/tests/plugin-test/sri-plugin/README.md new file mode 100644 index 000000000000..3a441039601d --- /dev/null +++ b/tests/plugin-test/sri-plugin/README.md @@ -0,0 +1,9 @@ +/** + * The test code is modified based on + * https://github.com/waysact/webpack-subresource-integrity/tree/main/webpack-subresource-integrity/src/__tests__ + * + * MIT Licensed + * Author Julian Scheid @jscheid + * Copyright (c) 2015-present Waysact Pty Ltd + * https://github.com/waysact/webpack-subresource-integrity/blob/main/LICENSE + */ \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/__fixtures__/simple-project/src/index.js b/tests/plugin-test/sri-plugin/__fixtures__/simple-project/src/index.js new file mode 100644 index 000000000000..eb09b08827ef --- /dev/null +++ b/tests/plugin-test/sri-plugin/__fixtures__/simple-project/src/index.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-console +console.log("ok"); diff --git a/tests/plugin-test/sri-plugin/__fixtures__/unresolved/src/index.js b/tests/plugin-test/sri-plugin/__fixtures__/unresolved/src/index.js new file mode 100644 index 000000000000..827aeb96866d --- /dev/null +++ b/tests/plugin-test/sri-plugin/__fixtures__/unresolved/src/index.js @@ -0,0 +1 @@ +console.log("*-*-*-CHUNK-SRI-HASH-foo"); diff --git a/tests/plugin-test/sri-plugin/__mocks__/html-webpack-plugin.js b/tests/plugin-test/sri-plugin/__mocks__/html-webpack-plugin.js new file mode 100644 index 000000000000..402ad50121f8 --- /dev/null +++ b/tests/plugin-test/sri-plugin/__mocks__/html-webpack-plugin.js @@ -0,0 +1,5 @@ +module.exports = { + get getHooks() { + throw new Error("bogus hwp accessed"); + }, +}; diff --git a/tests/plugin-test/sri-plugin/examples.test.ts b/tests/plugin-test/sri-plugin/examples.test.ts new file mode 100644 index 000000000000..208736068f51 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples.test.ts @@ -0,0 +1,97 @@ +/** + * Copyright (c) 2015-present, Waysact Pty Ltd + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { readdirSync, readFileSync } from "fs"; +import spawn from "cross-spawn"; +import { join } from "path"; +import { rimraf } from "rimraf"; + +jest.unmock("html-webpack-plugin"); + +jest.setTimeout(120000); + +const DISABLED_CASES = [ + "hwp-externals", // TODO: html-webpack-externals-plugin failed + "lazy-hashes-cycles", // TODO: support hashLoading: "lazy" + "lazy-hashes-group", // TODO: support hashLoading: "lazy" + "lazy-hashes-multiple-parents", // TODO: support hashLoading: "lazy" + "lazy-hashes-simple", // TODO: support hashLoading: "lazy" + "no-error-invalid-config", // TODO: support compilation.hooks.renderManifest + "sourcemap-code-splitting", // TODO: sourcemap hash content failed + "webpack-assets-manifest", // TODO: support webpack-assets-manifest plugin + "webpack-fix-style-only-entries", // TODO: support webpack-assets-manifest plugin + "wsi-test-helper.js", +]; + +const DISABLED_RSPACK_CASES = [ + ...DISABLED_CASES, +]; + +const exampleDir = join(__dirname, "examples"); +const rspackCliBin = join(__dirname, "../../../packages/rspack-cli/bin/rspack.js"); + +function createTestCases(type: "webpack" | "rspack") { + readdirSync(exampleDir) + .filter(i => !(type === "rspack" ? DISABLED_RSPACK_CASES : DISABLED_CASES).includes(i)) + .forEach((example) => { + const exampleDirectory = join(exampleDir, example); + const configFile = "webpack.config.js"; + const configContent = readFileSync(join(exampleDirectory, configFile)); + if (type === "rspack" && !configContent.includes("createHtmlPlugin")) { + return; + } + test.concurrent(`${example}/${type}`, async () => { + rimraf.sync(join(exampleDirectory, "dist", type)); + await new Promise((resolve, reject) => { + const stdout: string[] = []; + const stderr: string[] = []; + // CHANGED: run rspack and remove coverage + const cmd = spawn( + "node", + [rspackCliBin, "build", "-c", configFile], + { + cwd: exampleDirectory, + stdio: "pipe", + env: { + HTML_PLUGIN: type, + ...process.env + } + } + ); + cmd.stdout?.on("data", (data) => { + stdout.push(data); + }); + cmd.stderr?.on("data", (data) => { + stderr.push(data); + }); + cmd.on("exit", (code) => { + if (code === 0) { + resolve(); + } else { + reject( + new Error( + `child process exited with code ${code}: ${stdout.join( + "" + )} ${stderr.join("")}` + ) + ); + } + }); + cmd.on("error", reject); + }); + await new Promise((resolve) => setTimeout(resolve, 0)); + }); + }); +} + +describe("sri-plugin/examples/webpack", () => { + createTestCases("webpack"); +}); + +describe("sri-plugin/examples/rspack", () => { + createTestCases("rspack"); +}); diff --git a/tests/plugin-test/sri-plugin/examples/basic/README.md b/tests/plugin-test/sri-plugin/examples/basic/README.md new file mode 100644 index 000000000000..9badb9178456 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/basic/README.md @@ -0,0 +1,3 @@ +# With HtmlWebpackPlugin #hwp + +This is a most basic test for use with HtmlWebpackPlugin diff --git a/tests/plugin-test/sri-plugin/examples/basic/index.js b/tests/plugin-test/sri-plugin/examples/basic/index.js new file mode 100644 index 000000000000..4f252c003683 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/basic/index.js @@ -0,0 +1 @@ +console.log("ok"); diff --git a/tests/plugin-test/sri-plugin/examples/basic/package.json b/tests/plugin-test/sri-plugin/examples/basic/package.json new file mode 100644 index 000000000000..077f09c31073 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/basic/package.json @@ -0,0 +1,13 @@ +{ + "name": "basic", + "description": "Basic test", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "expect": "^26.6.2", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/basic/webpack.config.js b/tests/plugin-test/sri-plugin/examples/basic/webpack.config.js new file mode 100644 index 000000000000..7c6b7e2f65d2 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/basic/webpack.config.js @@ -0,0 +1,28 @@ +const expect = require("expect"); +const { createIntegrityPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + entry: { + index: "./index.js", + }, + output: { + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createIntegrityPlugin({ + hashFuncNames: ["sha256"], + enabled: true, + }), + { + apply: (compiler) => { + compiler.hooks.done.tap("wsi-test", (stats) => { + expect( + !stats.toJson().assets.find((asset) => asset.name == "index.js") + .integrity + ).not.toBeNull(); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/disabled/README.md b/tests/plugin-test/sri-plugin/examples/disabled/README.md new file mode 100644 index 000000000000..ab2531ac8cc2 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/disabled/README.md @@ -0,0 +1,4 @@ +# Plugin Disabled + +Simple example showing that webpack-subresource-integrity doesn't add +an integrity checksum when `enabled` is set to `false`. diff --git a/tests/plugin-test/sri-plugin/examples/disabled/index.js b/tests/plugin-test/sri-plugin/examples/disabled/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/plugin-test/sri-plugin/examples/disabled/package.json b/tests/plugin-test/sri-plugin/examples/disabled/package.json new file mode 100644 index 000000000000..3247bac92443 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/disabled/package.json @@ -0,0 +1,14 @@ +{ + "name": "disabled", + "description": "Simple example showing that webpack-subresource-integrity doesn't add an integrity checksum when `enabled` is set to `false`.", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/disabled/webpack.config.js b/tests/plugin-test/sri-plugin/examples/disabled/webpack.config.js new file mode 100644 index 000000000000..c65e2149013f --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/disabled/webpack.config.js @@ -0,0 +1,29 @@ +const expect = require("expect"); +const { createIntegrityPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + mode: "production", + entry: "./index.js", + output: { + filename: "bundle.js", + path: getDist(__dirname), + }, + plugins: [ + createIntegrityPlugin({ + hashFuncNames: ["sha256"], + enabled: false, + }), + { + apply: (compiler) => { + compiler.hooks.done.tapPromise("wsi-test", async (stats) => { + expect(stats.compilation.warnings.length).toEqual(0); + expect( + Object.keys( + stats.toJson().assets.find((asset) => asset.name === "bundle.js") + ) + ).not.toContain("integrity"); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/README.md b/tests/plugin-test/sri-plugin/examples/dll-plugin/README.md new file mode 100644 index 000000000000..05a678cbc2c1 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/README.md @@ -0,0 +1,4 @@ +# DllPlugin Integration #hwp + +Demonstrates how assets generated by DllPlugin can be included with +SRI using html-webpack-plugin. diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/a.js b/tests/plugin-test/sri-plugin/examples/dll-plugin/a.js new file mode 100644 index 000000000000..6cd1d0075d40 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/alpha.js b/tests/plugin-test/sri-plugin/examples/dll-plugin/alpha.js new file mode 100644 index 000000000000..19f4abffe4d4 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/alpha.js @@ -0,0 +1 @@ +module.exports = "alpha"; diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/b.js b/tests/plugin-test/sri-plugin/examples/dll-plugin/b.js new file mode 100644 index 000000000000..dfbbeb621fa8 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/beta.js b/tests/plugin-test/sri-plugin/examples/dll-plugin/beta.js new file mode 100644 index 000000000000..fdd7f0dde4dc --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/beta.js @@ -0,0 +1 @@ +module.exports = "beta"; diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/c.jsx b/tests/plugin-test/sri-plugin/examples/dll-plugin/c.jsx new file mode 100644 index 000000000000..46c7130a8a1f --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/c.jsx @@ -0,0 +1 @@ +module.exports = 'ok'; diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/index.js b/tests/plugin-test/sri-plugin/examples/dll-plugin/index.js new file mode 100644 index 000000000000..87477268bae8 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/index.js @@ -0,0 +1,3 @@ +console.log(require("beta/beta")); +console.log(require("beta/b")); +console.log(require("beta/c.jsx")); diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/package.json b/tests/plugin-test/sri-plugin/examples/dll-plugin/package.json new file mode 100644 index 000000000000..fb0f99666523 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/package.json @@ -0,0 +1,15 @@ +{ + "name": "dll-plugin", + "description": "Demonstrates how assets generated by DllPlugin can be included with SRI using html-webpack-plugin.", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "before-build-webpack": "^0.2.12", + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/dll-plugin/webpack.config.js b/tests/plugin-test/sri-plugin/examples/dll-plugin/webpack.config.js new file mode 100644 index 000000000000..e22057198762 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dll-plugin/webpack.config.js @@ -0,0 +1,100 @@ +const { experiments: { SubresourceIntegrityPlugin } } = require("@rspack/core"); +const WebpackBeforeBuildPlugin = require("before-build-webpack"); +const webpack = require("@rspack/core"); +const path = require("path"); +const { RunInPuppeteerPlugin, createIntegrityPlugin, createHtmlPlugin, getHtmlPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + resolve: { + extensions: [".js", ".jsx"], + }, + entry: { + alpha: ["./alpha", "./a"], + beta: ["./beta", "./b", "./c"], + }, + output: { + filename: "MyDll.[name].js", + library: "[name]_[fullhash]", + path: getDist(__dirname), + }, + plugins: [ + new webpack.DllPlugin({ + path: path.join(getDist(__dirname), "[name]-manifest.json"), + name: "[name]_[fullhash]", + }), + new WebpackBeforeBuildPlugin( + function (_stats, callback) { + webpack( + { + mode: "production", + entry: { + index: "./index.js", + }, + output: { + path: getDist(__dirname), + crossOriginLoading: "anonymous", + }, + plugins: [ + new webpack.DllReferencePlugin({ + context: path.join(__dirname), + manifest: require(path.join( + getDist(__dirname), + "alpha-manifest.json" + )), // eslint-disable-line + }), + new webpack.DllReferencePlugin({ + scope: "beta", + manifest: require(path.join( + getDist(__dirname), + "beta-manifest.json" + )), // eslint-disable-line + extensions: [".js", ".jsx"], + }), + createHtmlPlugin(), + + { + apply: (compiler) => { + compiler.hooks.thisCompilation.tap( + "wsi-test", + (compilation) => { + const hooks = getHtmlPlugin().getHooks(compilation); + + hooks.alterAssetTags.tapPromise( + "wsi-test", + async (data) => { + ["MyDll.alpha.js", "MyDll.beta.js"].forEach((src) => { + data.assetTags.scripts.unshift({ + tagName: "script", + voidTag: false, + attributes: { defer: true, src }, + }); + }); + return data; + } + ); + } + ); + }, + }, + + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + enabled: true, + }), + + new RunInPuppeteerPlugin(), + ], + }, + function afterEmit(err, stats) { + if (err || stats.hasErrors() || stats.hasWarnings()) { + callback(err || new Error(stats.toString({ reason: true }))); + } else { + callback(); + } + } + ); + }, + ["done"] + ), + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-modified/README.md b/tests/plugin-test/sri-plugin/examples/dynamic-modified/README.md new file mode 100644 index 000000000000..d0480bf33469 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-modified/README.md @@ -0,0 +1,3 @@ +# With a modified dynamically loaded chunk #hwp + +Ensure that when a chunk is modified, it fails to load. diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-modified/corrupt.js b/tests/plugin-test/sri-plugin/examples/dynamic-modified/corrupt.js new file mode 100644 index 000000000000..30bee6c972fa --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-modified/corrupt.js @@ -0,0 +1 @@ +console.log("this should never load"); diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-modified/index.js b/tests/plugin-test/sri-plugin/examples/dynamic-modified/index.js new file mode 100644 index 000000000000..0e0c66026daa --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-modified/index.js @@ -0,0 +1,7 @@ +import("./corrupt") + .then(function error() { + console.log("error"); + }) + .catch(function ok() { + console.log("ok"); + }); diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-modified/package.json b/tests/plugin-test/sri-plugin/examples/dynamic-modified/package.json new file mode 100644 index 000000000000..56eca2beb691 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-modified/package.json @@ -0,0 +1,13 @@ +{ + "name": "dynamic-modified", + "description": "Ensure that when a chunk is modified, it fails to load.", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-modified/webpack.config.js b/tests/plugin-test/sri-plugin/examples/dynamic-modified/webpack.config.js new file mode 100644 index 000000000000..48dcbc7735d1 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-modified/webpack.config.js @@ -0,0 +1,44 @@ +const { RunInPuppeteerPlugin, createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); +const { writeFileSync } = require("fs"); +const { join } = require("path"); + +let gotError = false; + +module.exports = { + entry: { + index: "./index.js", + }, + output: { + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + }), + createHtmlPlugin(), + new RunInPuppeteerPlugin({ + onStart: (stats) => { + const otherAsset = Object.keys(stats.compilation.assets).find( + (key) => key !== "index.js" && key.endsWith(".js") + ); + writeFileSync(join(getDist(__dirname), otherAsset), 'console.log("corrupted");'); + }, + onConsoleError: (msg) => { + console.log(msg); + if ( + msg.match( + /Failed to find a valid digest in the 'integrity' attribute for resource/ + ) + ) { + gotError = true; + } + }, + onDone: () => { + if (!gotError) { + throw new Error("No error was raised"); + } + }, + }), + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/README.md b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/README.md new file mode 100644 index 000000000000..f4d610199d53 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/README.md @@ -0,0 +1,4 @@ +# With a dynamically loaded, named chunk #hwp + +Ensure that when a named chunk is loaded dynamically with Webpack 5, +it receives a SRI hash. diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/chunk.js b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/chunk.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/index.js b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/index.js new file mode 100644 index 000000000000..f28be760c976 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/index.js @@ -0,0 +1,38 @@ +const scriptsWithIntegrity = []; + +const observer = new MutationObserver((mutationsList) => { + Array.from(mutationsList).forEach((mutation) => { + Array.from(mutation.addedNodes || []).forEach((node) => { + if (node.nodeName === "SCRIPT") { + if ( + node.getAttribute("crossOrigin") === "anonymous" && + node + .getAttribute("integrity") + .match(/^sha256-[-A-Za-z0-9+/=]{44} sha384-[-A-Za-z0-9+/=]{64}$/) + ) { + scriptsWithIntegrity.push(node); + } + } + }); + }); +}); + +observer.observe(document.querySelector("head"), { childList: true }); + +import("./chunk") + .then(() => { + if ( + scriptsWithIntegrity.some( + (script) => + new URL(script.getAttribute("src")).pathname === "/chunk_js.js" + ) + ) { + console.log("ok"); + } else { + console.log("error"); + } + }) + .catch((e) => { + console.error(e); + console.log("error"); + }); diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/package.json b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/package.json new file mode 100644 index 000000000000..676a105b0339 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/package.json @@ -0,0 +1,13 @@ +{ + "name": "dynamic-named-chunks", + "description": "Ensure that when a named chunk is loaded dynamically with Webpack 5, it receives a SRI hash.", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/webpack.config.js b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/webpack.config.js new file mode 100644 index 000000000000..2c2a09670017 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/dynamic-named-chunks/webpack.config.js @@ -0,0 +1,21 @@ +const { RunInPuppeteerPlugin, createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + entry: { + index: "./index.js", + }, + output: { + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + optimization: { + chunkIds: "named", + }, + plugins: [ + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + }), + createHtmlPlugin(), + new RunInPuppeteerPlugin(), + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/electron-renderer/README.md b/tests/plugin-test/sri-plugin/examples/electron-renderer/README.md new file mode 100644 index 000000000000..a8dc54eff9fe --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/electron-renderer/README.md @@ -0,0 +1,3 @@ +# Electron Renderer target + +Ensure the plugin doesn't warn for electron-renderer targets. diff --git a/tests/plugin-test/sri-plugin/examples/electron-renderer/index.js b/tests/plugin-test/sri-plugin/examples/electron-renderer/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/plugin-test/sri-plugin/examples/electron-renderer/package.json b/tests/plugin-test/sri-plugin/examples/electron-renderer/package.json new file mode 100644 index 000000000000..31a436c854e8 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/electron-renderer/package.json @@ -0,0 +1,14 @@ +{ + "name": "electron-renderer", + "description": "Ensure the plugin doesn't warn for electron-renderer targets.", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/electron-renderer/webpack.config.js b/tests/plugin-test/sri-plugin/examples/electron-renderer/webpack.config.js new file mode 100644 index 000000000000..d4a40a14060e --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/electron-renderer/webpack.config.js @@ -0,0 +1,29 @@ +const expect = require("expect"); +const { createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + mode: "production", + entry: { + index: "./index.js", + }, + target: "electron-renderer", + output: { + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + enabled: true, + }), + createHtmlPlugin(), + { + apply: (compiler) => { + compiler.hooks.done.tapPromise("wsi-test", async (stats) => { + expect(stats.compilation.warnings.length).toEqual(0); + expect(stats.compilation.errors.length).toEqual(0); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/hwp-basic/index.js b/tests/plugin-test/sri-plugin/examples/hwp-basic/index.js new file mode 100644 index 000000000000..4f252c003683 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-basic/index.js @@ -0,0 +1 @@ +console.log("ok"); diff --git a/tests/plugin-test/sri-plugin/examples/hwp-basic/package.json b/tests/plugin-test/sri-plugin/examples/hwp-basic/package.json new file mode 100644 index 000000000000..9180d91c72fb --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-basic/package.json @@ -0,0 +1,13 @@ +{ + "name": "hwp-basic", + "description": "Basic test with html-webpack-plugin", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/hwp-basic/webpack.config.js b/tests/plugin-test/sri-plugin/examples/hwp-basic/webpack.config.js new file mode 100644 index 000000000000..a029a8fbbf80 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-basic/webpack.config.js @@ -0,0 +1,19 @@ +const { createIntegrityPlugin, createHtmlPlugin, RunInPuppeteerPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + entry: { + index: "./index.js", + }, + output: { + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createIntegrityPlugin({ + hashFuncNames: ["sha256"], + enabled: true, + }), + createHtmlPlugin(), + new RunInPuppeteerPlugin(), + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/README.md b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/README.md new file mode 100644 index 000000000000..13d282dea3cb --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/README.md @@ -0,0 +1,3 @@ +# HtmlWebpackPlugin and Custom Template #hwp + +Test case for issue #13 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.ejs b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.ejs new file mode 100644 index 000000000000..e00b31086cbf --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.ejs @@ -0,0 +1,14 @@ +<% for (let index in htmlWebpackPlugin.files.js) { %> + +<% } %> + +<% for (let index in htmlWebpackPlugin.files.css) { %> + +<% } %> diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.js b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.js new file mode 100644 index 000000000000..5f69ffd98ef6 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.js @@ -0,0 +1 @@ +require("./stylesheet.css"); diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.rspack.ejs b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.rspack.ejs new file mode 100644 index 000000000000..3bb2b7d3efc9 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/index.rspack.ejs @@ -0,0 +1,14 @@ +<% for _ in htmlRspackPlugin.files.js { %> + +<% } %> + +<% for _ in htmlRspackPlugin.files.css { %> + +<% } %> diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/package.json b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/package.json new file mode 100644 index 000000000000..11e43fc43625 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/package.json @@ -0,0 +1,18 @@ +{ + "name": "hwp-custom-template", + "description": "Test case for issue #13", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "css-loader": "^7.1.2", + "css-select": "^5.1.0", + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "htmlparser2": "^8.0.1", + "mini-css-extract-plugin": "^1.0.0", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/stylesheet.css b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/stylesheet.css new file mode 100644 index 000000000000..4cbd0069198b --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/stylesheet.css @@ -0,0 +1,4 @@ +body { + background-color: rgb(200, 201, 202); +} + diff --git a/tests/plugin-test/sri-plugin/examples/hwp-custom-template/webpack.config.js b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/webpack.config.js new file mode 100644 index 000000000000..4cfb61ba8230 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-custom-template/webpack.config.js @@ -0,0 +1,76 @@ +const { createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); +const { CssExtractRspackPlugin } = require("@rspack/core"); +const expect = require("expect"); +const htmlparser2 = require("htmlparser2"); +const { readFileSync } = require("fs"); +const { selectAll } = require("css-select"); +const { join } = require("path"); + +module.exports = { + mode: "production", + entry: "./index.js", + output: { + filename: "subdir/bundle.js", + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + module: { + rules: [ + { + test: /\.css$/, + use: [CssExtractRspackPlugin.loader, "css-loader"], + }, + ], + }, + plugins: [ + new CssExtractRspackPlugin({ + filename: "subdir/styles.css", + chunkFilename: "[id].css", + }), + createHtmlPlugin({ + hash: true, + inject: false, + filename: "admin.html", + template: process.env.HTML_PLUGIN === "rspack" ? "index.rspack.ejs" : "index.ejs", + }), + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"] + }), + { + apply: (compiler) => { + compiler.hooks.done.tap("wsi-test", (stats) => { + expect(stats.compilation.warnings.length).toEqual(0); + expect(stats.compilation.errors.length).toEqual(0); + + const jsIntegrity = stats + .toJson() + .assets.find( + (asset) => asset.name === "subdir/bundle.js" + ).integrity; + expect(jsIntegrity).toMatch(/^sha/); + + const cssIntegrity = stats + .toJson() + .assets.find( + (asset) => asset.name === "subdir/styles.css" + ).integrity; + expect(cssIntegrity).toMatch(/^sha/); + + const dom = htmlparser2.parseDocument( + readFileSync(join(getDist(__dirname), "admin.html"), "utf-8") + ); + + const scripts = selectAll("script", dom); + expect(scripts.length).toEqual(1); + expect(scripts[0].attribs.crossorigin).toEqual("anonymous"); + expect(scripts[0].attribs.integrity).toEqual(jsIntegrity); + + const links = selectAll("link", dom); + expect(links.length).toEqual(1); + expect(links[0].attribs.crossorigin).toEqual("anonymous"); + expect(links[0].attribs.integrity).toEqual(cssIntegrity); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/hwp-externals/README.md b/tests/plugin-test/sri-plugin/examples/hwp-externals/README.md new file mode 100644 index 000000000000..88bb9df91b69 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-externals/README.md @@ -0,0 +1,3 @@ +# HtmlWebpackExternalsPlugin #hwp + +Test case for issue #97 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-externals/index.js b/tests/plugin-test/sri-plugin/examples/hwp-externals/index.js new file mode 100644 index 000000000000..4f252c003683 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-externals/index.js @@ -0,0 +1 @@ +console.log("ok"); diff --git a/tests/plugin-test/sri-plugin/examples/hwp-externals/package.json b/tests/plugin-test/sri-plugin/examples/hwp-externals/package.json new file mode 100644 index 000000000000..e605cc2ac7d5 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-externals/package.json @@ -0,0 +1,17 @@ +{ + "name": "hwp-externals", + "description": "Test case for issue #97", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "css-select": "^5.1.0", + "expect": "^26.6.2", + "html-webpack-externals-plugin": "^3.8.0", + "html-webpack-plugin": "^5.5.0", + "htmlparser2": "^8.0.1", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/hwp-externals/webpack.config.js b/tests/plugin-test/sri-plugin/examples/hwp-externals/webpack.config.js new file mode 100644 index 000000000000..f1820eb46fb5 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-externals/webpack.config.js @@ -0,0 +1,58 @@ +const { createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); +const HtmlWebpackExternalsPlugin = require("html-webpack-externals-plugin"); +const expect = require("expect"); +const htmlparser2 = require("htmlparser2"); +const { readFileSync } = require("fs"); +const { selectAll } = require("css-select"); +const { join } = require("path"); +module.exports = { + mode: "production", + entry: "./index.js", + output: { + filename: "bundle.js", + publicPath: "/", + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createHtmlPlugin({ + inject: "body", + }), + new HtmlWebpackExternalsPlugin({ + externals: [ + { + module: "jquery", + entry: { + path: "https://code.jquery.com/jquery-3.2.1.js", + attributes: { + integrity: "sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE=", + crossorigin: "anonymous", + }, + }, + global: "jQuery", + }, + ], + }), + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + }), + { + apply: (compiler) => { + compiler.hooks.done.tapPromise("wsi-test", async (stats) => { + expect(stats.compilation.warnings.length).toEqual(0); + + const dom = htmlparser2.parseDocument( + readFileSync(join(getDist(__dirname), "index.html"), "utf-8") + ); + + const scripts = selectAll("script", dom); + expect(scripts.length).toEqual(2); + for (let i = 0; i < scripts.length; i += 1) { + expect(scripts[0].attribs.crossorigin).toEqual("anonymous"); + expect(scripts[0].attribs.integrity).toMatch(/^sha/); + } + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/README.md b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/README.md new file mode 100644 index 000000000000..c01d2d3d6e38 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/README.md @@ -0,0 +1,3 @@ +# HtmlWebpackPlugin and Output into Parent Directory #hwp + +Test case for issue #15 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/index.js b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/package.json b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/package.json new file mode 100644 index 000000000000..ef57788f4f9e --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/package.json @@ -0,0 +1,16 @@ +{ + "name": "hwp-output-parent-dir", + "description": "Test case for issue #15", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "css-select": "^5.1.0", + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "htmlparser2": "^8.0.1", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/webpack.config.js b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/webpack.config.js new file mode 100644 index 000000000000..99bac976ebd4 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-output-parent-dir/webpack.config.js @@ -0,0 +1,49 @@ +const path = require("path"); +const expect = require("expect"); +const htmlparser2 = require("htmlparser2"); +const { readFileSync } = require("fs"); +const { selectAll } = require("css-select"); +const { createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); + +module.exports = { + mode: "production", + entry: { + main: "./index.js", + }, + output: { + path: path.join(getDist(__dirname), "sub"), + filename: "bundle.js", + publicPath: "/", + crossOriginLoading: "anonymous", + }, + plugins: [ + createHtmlPlugin({ + filename: "../index.html", + chunks: ["main"], + }), + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + }), + { + apply: (compiler) => { + compiler.hooks.done.tapPromise("wsi-test", async (stats) => { + expect(stats.compilation.warnings.length).toEqual(0); + + const jsIntegrity = + stats.toJson().assets.find((asset) => asset.name === "bundle.js") + .integrity || stats.compilation.assets["bundle.js"].integrity; + expect(jsIntegrity).toMatch(/^sha/); + + const dom = htmlparser2.parseDocument( + readFileSync(path.join(getDist(__dirname), "index.html"), "utf-8") + ); + + const scripts = selectAll("script", dom); + expect(scripts.length).toEqual(1); + expect(scripts[0].attribs.crossorigin).toEqual("anonymous"); + expect(scripts[0].attribs.integrity).toEqual(jsIntegrity); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/hwp-public-path/README.md b/tests/plugin-test/sri-plugin/examples/hwp-public-path/README.md new file mode 100644 index 000000000000..614392b4dd5f --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-public-path/README.md @@ -0,0 +1,3 @@ +# HtmlWebpackPlugin and publicPath #hwp + +Test case for issue #11 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-public-path/index.js b/tests/plugin-test/sri-plugin/examples/hwp-public-path/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-public-path/package.json b/tests/plugin-test/sri-plugin/examples/hwp-public-path/package.json new file mode 100644 index 000000000000..2929fa9d33bf --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-public-path/package.json @@ -0,0 +1,16 @@ +{ + "name": "hwp-public-path", + "description": "Test case for issue #11", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "css-select": "^5.1.0", + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "htmlparser2": "^8.0.1", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/hwp-public-path/webpack.config.js b/tests/plugin-test/sri-plugin/examples/hwp-public-path/webpack.config.js new file mode 100644 index 000000000000..e6aabdf6514b --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-public-path/webpack.config.js @@ -0,0 +1,43 @@ +const expect = require("expect"); +const htmlparser2 = require("htmlparser2"); +const { readFileSync } = require("fs"); +const { selectAll } = require("css-select"); +const { createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); +const { join } = require("path"); + +module.exports = { + mode: "production", + entry: "./index.js", + output: { + filename: "bundle.js", + publicPath: "/", + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createHtmlPlugin(), + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + }), + { + apply: (compiler) => { + compiler.hooks.done.tapPromise("wsi-test", async (stats) => { + expect(stats.compilation.warnings.length).toEqual(0); + const jsIntegrity = + stats.toJson().assets.find((asset) => asset.name === "bundle.js") + .integrity || stats.compilation.assets["bundle.js"].integrity; + expect(jsIntegrity).toMatch(/^sha/); + + const dom = htmlparser2.parseDocument( + readFileSync(join(getDist(__dirname), "index.html"), "utf-8") + ); + + const scripts = selectAll("script", dom); + expect(scripts.length).toEqual(1); + expect(scripts[0].attribs.crossorigin).toEqual("anonymous"); + expect(scripts[0].attribs.integrity).toEqual(jsIntegrity); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/README.md b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/README.md new file mode 100644 index 000000000000..32455e10a5d2 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/README.md @@ -0,0 +1,4 @@ +# HtmlWebpackPlugin and Sub-Directories #hwp + +Test case for issue #9 + diff --git a/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/index.js b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/index.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/package.json b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/package.json new file mode 100644 index 000000000000..f0be0772125b --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/package.json @@ -0,0 +1,16 @@ +{ + "name": "hwp-subdirectories", + "description": "Test case for issue #9", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "css-select": "^5.1.0", + "expect": "^26.6.2", + "html-webpack-plugin": "^5.5.0", + "htmlparser2": "^8.0.1", + "nyc": "*", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/webpack.config.js b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/webpack.config.js new file mode 100644 index 000000000000..852b5d2abd4c --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/hwp-subdirectories/webpack.config.js @@ -0,0 +1,46 @@ +const expect = require("expect"); +const htmlparser2 = require("htmlparser2"); +const { readFileSync } = require("fs"); +const { selectAll } = require("css-select"); +const { createIntegrityPlugin, createHtmlPlugin, getDist } = require("../wsi-test-helper"); +const { join } = require("path"); + +module.exports = { + entry: "./index.js", + output: { + filename: "subdir/bundle.js", + crossOriginLoading: "anonymous", + path: getDist(__dirname), + }, + plugins: [ + createHtmlPlugin({ + hash: true, + filename: "assets/admin.html", + }), + createIntegrityPlugin({ + hashFuncNames: ["sha256", "sha384"], + }), + { + apply: (compiler) => { + compiler.hooks.done.tapPromise("wsi-test", async (stats) => { + const jsIntegrity = + stats + .toJson() + .assets.find((asset) => asset.name === "subdir/bundle.js") + .integrity || + stats.compilation.assets["subdir/bundle.js"].integrity; + expect(jsIntegrity).toMatch(/^sha/); + + const dom = htmlparser2.parseDocument( + readFileSync(join(getDist(__dirname), "assets/admin.html"), "utf-8") + ); + + const scripts = selectAll("script", dom); + expect(scripts.length).toEqual(1); + expect(scripts[0].attribs.crossorigin).toEqual("anonymous"); + expect(scripts[0].attribs.integrity).toEqual(jsIntegrity); + }); + }, + }, + ], +}; diff --git a/tests/plugin-test/sri-plugin/examples/issue-147/README.md b/tests/plugin-test/sri-plugin/examples/issue-147/README.md new file mode 100644 index 000000000000..58fd5ead9421 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/issue-147/README.md @@ -0,0 +1,3 @@ +# Doesn't throw error when a processed tag has no attributes #hwp + +Test for https://github.com/waysact/webpack-subresource-integrity/issues/147 diff --git a/tests/plugin-test/sri-plugin/examples/issue-147/async.js b/tests/plugin-test/sri-plugin/examples/issue-147/async.js new file mode 100644 index 000000000000..4f252c003683 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/issue-147/async.js @@ -0,0 +1 @@ +console.log("ok"); diff --git a/tests/plugin-test/sri-plugin/examples/issue-147/index.js b/tests/plugin-test/sri-plugin/examples/issue-147/index.js new file mode 100644 index 000000000000..c7bda8f36b10 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/issue-147/index.js @@ -0,0 +1 @@ +import("./async"); diff --git a/tests/plugin-test/sri-plugin/examples/issue-147/package.json b/tests/plugin-test/sri-plugin/examples/issue-147/package.json new file mode 100644 index 000000000000..a655d20a4a9e --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/issue-147/package.json @@ -0,0 +1,14 @@ +{ + "name": "issue-147", + "description": "Test for https://github.com/waysact/webpack-subresource-integrity/issues/147", + "version": "1.0.0", + "license": "MIT", + "private": true, + "devDependencies": { + "html-webpack-plugin": "^5.5.0", + "nyc": "*", + "script-ext-html-webpack-plugin": "^2.1.5", + "webpack": "^5.95.0", + "webpack-cli": "5.1.4" + } +} \ No newline at end of file diff --git a/tests/plugin-test/sri-plugin/examples/issue-147/webpack.config.js b/tests/plugin-test/sri-plugin/examples/issue-147/webpack.config.js new file mode 100644 index 000000000000..dfde2e5a5920 --- /dev/null +++ b/tests/plugin-test/sri-plugin/examples/issue-147/webpack.config.js @@ -0,0 +1,33 @@ +const { createHtmlPlugin, createIntegrityPlugin, getDist } = require("../wsi-test-helper"); +const path = require("path"); +const ScriptExtHtmlWebpackPlugin = require("script-ext-html-webpack-plugin"); + +module.exports = () => ({ + entry: { + app: path.resolve(__dirname, "index"), + }, + output: { + path: path.join(getDist(__dirname), "inline"), + crossOriginLoading: "anonymous", + }, + optimization: { + runtimeChunk: { + // Put webpack runtime code in a single separate chunk called "runtime.js" + name: "runtime", + }, + }, + plugins: [ + createHtmlPlugin({ + inject: "body", + }), + new ScriptExtHtmlWebpackPlugin({ + inline: { + // Inline "runtime.js" as a