diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-08-23 10:39:19 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-23 10:39:19 -0400 |
commit | e7367044d933ee3518ae583a43876a0ddab5b17e (patch) | |
tree | e557e3ea4faad632bcfafa6539f3bd0115dc6426 | |
parent | 362af63c6f45e98948536d08d2d6195af87f729c (diff) |
feat: binary npm commands (#15542)
-rw-r--r-- | cli/compat/mod.rs | 18 | ||||
-rw-r--r-- | cli/lsp/testing/execution.rs | 3 | ||||
-rw-r--r-- | cli/main.rs | 26 | ||||
-rw-r--r-- | cli/node/analyze.rs | 30 | ||||
-rw-r--r-- | cli/node/mod.rs | 83 | ||||
-rw-r--r-- | cli/npm/mod.rs | 1 | ||||
-rw-r--r-- | cli/npm/registry.rs | 97 | ||||
-rw-r--r-- | cli/npm/resolution.rs | 89 | ||||
-rw-r--r-- | cli/npm/version_req.rs | 219 | ||||
-rw-r--r-- | cli/proc_state.rs | 16 | ||||
-rw-r--r-- | cli/tests/integration/npm_tests.rs | 37 | ||||
-rw-r--r-- | cli/tests/testdata/npm/cjs_sub_path/main.js | 2 | ||||
-rw-r--r-- | cli/tests/testdata/npm/cjs_with_deps/main.js | 2 | ||||
-rw-r--r-- | cli/tests/testdata/npm/deno_run_non_existent.out | 2 | ||||
-rw-r--r-- | cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz | bin | 0 -> 6665 bytes | |||
-rw-r--r-- | cli/tests/testdata/npm/registry/mkdirp/registry.json | 1865 | ||||
-rw-r--r-- | cli/tools/bench.rs | 3 | ||||
-rw-r--r-- | cli/tools/test.rs | 3 | ||||
-rw-r--r-- | cli/worker.rs | 38 | ||||
-rw-r--r-- | ext/node/02_require.js | 7 | ||||
-rw-r--r-- | test_util/src/lib.rs | 18 |
21 files changed, 2376 insertions, 183 deletions
diff --git a/cli/compat/mod.rs b/cli/compat/mod.rs index ab8a1ff2d..02fdb5604 100644 --- a/cli/compat/mod.rs +++ b/cli/compat/mod.rs @@ -112,24 +112,6 @@ pub fn try_resolve_builtin_module(specifier: &str) -> Option<Url> { } } -#[allow(unused)] -pub fn load_cjs_module_from_ext_node( - js_runtime: &mut JsRuntime, - module: &str, - main: bool, -) -> Result<(), AnyError> { - let source_code = &format!( - r#"(function loadCjsModule(module) {{ - Deno[Deno.internal].require.Module._load(module, null, {main}); - }})('{module}');"#, - main = main, - module = escape_for_single_quote_string(module), - ); - - js_runtime.execute_script(&located_script_name!(), source_code)?; - Ok(()) -} - pub fn load_cjs_module( js_runtime: &mut JsRuntime, module: &str, diff --git a/cli/lsp/testing/execution.rs b/cli/lsp/testing/execution.rs index dde834221..950f2a96e 100644 --- a/cli/lsp/testing/execution.rs +++ b/cli/lsp/testing/execution.rs @@ -164,7 +164,8 @@ async fn test_specifier( stdout: StdioPipe::File(sender.stdout()), stderr: StdioPipe::File(sender.stderr()), }, - ); + ) + .await?; worker.run_lsp_test_specifier(mode).await?; } diff --git a/cli/main.rs b/cli/main.rs index d38403384..b784ed3d5 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -91,6 +91,7 @@ use deno_runtime::permissions::Permissions; use deno_runtime::tokio_util::run_local; use log::debug; use log::info; +use npm::NpmPackageReference; use std::env; use std::io::Read; use std::io::Write; @@ -323,7 +324,8 @@ async fn install_command( permissions, vec![], Default::default(), - ); + ) + .await?; // First, fetch and compile the module; this step ensures that the module exists. worker.preload_main_module().await?; tools::installer::install(flags, install_flags)?; @@ -412,7 +414,8 @@ async fn eval_command( permissions, vec![], Default::default(), - ); + ) + .await?; // Create a dummy source file. let source_code = if eval_flags.print { format!("console.log({})", eval_flags.code) @@ -694,7 +697,8 @@ async fn repl_command( Permissions::from_options(&ps.options.permissions_options())?, vec![], Default::default(), - ); + ) + .await?; worker.setup_repl().await?; tools::repl::run( &ps, @@ -714,7 +718,8 @@ async fn run_from_stdin(flags: Flags) -> Result<i32, AnyError> { Permissions::from_options(&ps.options.permissions_options())?, vec![], Default::default(), - ); + ) + .await?; let mut source = Vec::new(); std::io::stdin().read_to_end(&mut source)?; @@ -758,7 +763,8 @@ async fn run_with_watch(flags: Flags, script: String) -> Result<i32, AnyError> { permissions, vec![], Default::default(), - ); + ) + .await?; worker.run_for_watcher().await?; Ok(()) @@ -797,8 +803,13 @@ async fn run_command( // TODO(bartlomieju): actually I think it will also fail if there's an import // map specified and bare specifier is used on the command line - this should // probably call `ProcState::resolve` instead - let main_module = resolve_url_or_path(&run_flags.script)?; let ps = ProcState::build(flags).await?; + let main_module = if NpmPackageReference::from_str(&run_flags.script).is_ok() + { + ModuleSpecifier::parse(&run_flags.script)? + } else { + resolve_url_or_path(&run_flags.script)? + }; let permissions = Permissions::from_options(&ps.options.permissions_options())?; let mut worker = create_main_worker( @@ -807,7 +818,8 @@ async fn run_command( permissions, vec![], Default::default(), - ); + ) + .await?; let exit_code = worker.run().await?; Ok(exit_code) diff --git a/cli/node/analyze.rs b/cli/node/analyze.rs index 9da2cbf4b..270615cca 100644 --- a/cli/node/analyze.rs +++ b/cli/node/analyze.rs @@ -74,7 +74,15 @@ pub fn esm_code_with_node_globals( write!(result, "var {0} = {1}.{0};", global, global_this_expr).unwrap(); } - result.push_str(parsed_source.text_info().text_str()); + let file_text = parsed_source.text_info().text_str(); + // strip the shebang + let file_text = if file_text.starts_with("#!/") { + let start_index = file_text.find('\n').unwrap_or(file_text.len()); + &file_text[start_index..] + } else { + file_text + }; + result.push_str(file_text); Ok(result) } @@ -158,4 +166,24 @@ mod tests { assert!(r.contains("var process = globalThis.process;")); assert!(r.contains("export const x = 1;")); } + + #[test] + fn test_esm_code_with_node_globals_with_shebang() { + let r = esm_code_with_node_globals( + &ModuleSpecifier::parse("https://example.com/foo/bar.js").unwrap(), + "#!/usr/bin/env node\nexport const x = 1;".to_string(), + ) + .unwrap(); + assert_eq!( + r, + concat!( + "var globalThis = Deno[Deno.internal].node.globalThis;var Buffer = globalThis.Buffer;", + "var clearImmediate = globalThis.clearImmediate;var clearInterval = globalThis.clearInterval;", + "var clearTimeout = globalThis.clearTimeout;var global = globalThis.global;", + "var process = globalThis.process;var setImmediate = globalThis.setImmediate;", + "var setInterval = globalThis.setInterval;var setTimeout = globalThis.setTimeout;\n", + "export const x = 1;" + ), + ); + } } diff --git a/cli/node/mod.rs b/cli/node/mod.rs index 2af4f2308..385c6cfa2 100644 --- a/cli/node/mod.rs +++ b/cli/node/mod.rs @@ -6,6 +6,7 @@ use std::path::PathBuf; use deno_ast::MediaType; use deno_ast::ModuleSpecifier; +use deno_core::anyhow::bail; use deno_core::anyhow::Context; use deno_core::error::generic_error; use deno_core::error::AnyError; @@ -31,6 +32,7 @@ use crate::compat; use crate::file_fetcher::FileFetcher; use crate::npm::GlobalNpmPackageResolver; use crate::npm::NpmPackageReference; +use crate::npm::NpmPackageReq; use crate::npm::NpmPackageResolver; mod analyze; @@ -185,6 +187,87 @@ pub fn node_resolve_npm_reference( Ok(Some(resolve_response)) } +pub fn node_resolve_binary_export( + pkg_req: &NpmPackageReq, + bin_name: Option<&str>, + npm_resolver: &GlobalNpmPackageResolver, +) -> Result<ResolveResponse, AnyError> { + let pkg = npm_resolver.resolve_package_from_deno_module(pkg_req)?; + let package_folder = pkg.folder_path; + let package_json_path = package_folder.join("package.json"); + let package_json = PackageJson::load(npm_resolver, package_json_path)?; + let bin = match &package_json.bin { + Some(bin) => bin, + None => bail!( + "package {} did not have a 'bin' property in its package.json", + pkg.id + ), + }; + let bin_entry = match bin { + Value::String(_) => { + if bin_name.is_some() && bin_name.unwrap() != pkg_req.name { + None + } else { + Some(bin) + } + } + Value::Object(o) => { + if let Some(bin_name) = bin_name { + o.get(bin_name) + } else if o.len() == 1 { + o.values().next() + } else { + o.get(&pkg_req.name) + } + }, + _ => bail!("package {} did not have a 'bin' property with a string or object value in its package.json", pkg.id), + }; + let bin_entry = match bin_entry { + Some(e) => e, + None => bail!( + "package {} did not have a 'bin' entry for {} in its package.json", + pkg.id, + bin_name.unwrap_or(&pkg_req.name), + ), + }; + let bin_entry = match bin_entry { + Value::String(s) => s, + _ => bail!( + "package {} had a non-string sub property of 'bin' in its package.json", + pkg.id + ), + }; + + let url = + ModuleSpecifier::from_file_path(package_folder.join(bin_entry)).unwrap(); + + let resolve_response = url_to_resolve_response(url, npm_resolver)?; + // TODO(bartlomieju): skipped checking errors for commonJS resolution and + // "preserveSymlinksMain"/"preserveSymlinks" options. + Ok(resolve_response) +} + +pub fn load_cjs_module_from_ext_node( + js_runtime: &mut JsRuntime, + module: &str, + main: bool, +) -> Result<(), AnyError> { + fn escape_for_single_quote_string(text: &str) -> String { + text.replace('\\', r"\\").replace('\'', r"\'") + } + + let source_code = &format!( + r#"(function loadCjsModule(module) {{ + Deno[Deno.internal].require.Module._load(module, null, {main}); + }})('{module}');"#, + main = main, + module = escape_for_single_quote_string(module), + ); + + js_runtime.execute_script(&located_script_name!(), source_code)?; + Ok(()) +} + fn package_config_resolve( package_subpath: &str, package_dir: &Path, diff --git a/cli/npm/mod.rs b/cli/npm/mod.rs index 7de0f39ee..0e5c07914 100644 --- a/cli/npm/mod.rs +++ b/cli/npm/mod.rs @@ -4,6 +4,7 @@ mod cache; mod registry; mod resolution; mod tarball; +mod version_req; use std::io::ErrorKind; use std::path::Path; diff --git a/cli/npm/registry.rs b/cli/npm/registry.rs index e04531017..3b7dd4251 100644 --- a/cli/npm/registry.rs +++ b/cli/npm/registry.rs @@ -23,7 +23,7 @@ use crate::fs_util; use crate::http_cache::CACHE_PERM; use super::cache::NpmCache; -use super::resolution::NpmVersionMatcher; +use super::version_req::NpmVersionReq; // npm registry docs: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md @@ -320,98 +320,3 @@ impl NpmRegistryApi { name_folder_path.join("registry.json") } } - -/// A version requirement found in an npm package's dependencies. -pub struct NpmVersionReq { - raw_text: String, - comparators: Vec<semver::VersionReq>, -} - -impl NpmVersionReq { - pub fn parse(text: &str) -> Result<NpmVersionReq, AnyError> { - // semver::VersionReq doesn't support spaces between comparators - // and it doesn't support using || for "OR", so we pre-process - // the version requirement in order to make this work. - let raw_text = text.to_string(); - let part_texts = text.split("||").collect::<Vec<_>>(); - let mut comparators = Vec::with_capacity(part_texts.len()); - for part in part_texts { - comparators.push(npm_version_req_parse_part(part)?); - } - Ok(NpmVersionReq { - raw_text, - comparators, - }) - } -} - -impl NpmVersionMatcher for NpmVersionReq { - fn matches(&self, version: &semver::Version) -> bool { - self.comparators.iter().any(|c| c.matches(version)) - } - - fn version_text(&self) -> String { - self.raw_text.to_string() - } -} - -fn npm_version_req_parse_part( - text: &str, -) -> Result<semver::VersionReq, AnyError> { - let text = text.trim(); - let text = text.strip_prefix('v').unwrap_or(text); - let mut chars = text.chars().enumerate().peekable(); - let mut final_text = String::new(); - while chars.peek().is_some() { - let (i, c) = chars.next().unwrap(); - let is_greater_or_less_than = c == '<' || c == '>'; - if is_greater_or_less_than || c == '=' { - if i > 0 { - final_text = final_text.trim().to_string(); - // add a comma to make semver::VersionReq parse this - final_text.push(','); - } - final_text.push(c); - let next_char = chars.peek().map(|(_, c)| c); - if is_greater_or_less_than && matches!(next_char, Some('=')) { - let c = chars.next().unwrap().1; // skip - final_text.push(c); - } - } else { - final_text.push(c); - } - } - Ok(semver::VersionReq::parse(&final_text)?) -} - -#[cfg(test)] -mod test { - use super::*; - - struct NpmVersionReqTester(NpmVersionReq); - - impl NpmVersionReqTester { - fn matches(&self, version: &str) -> bool { - self.0.matches(&semver::Version::parse(version).unwrap()) - } - } - - #[test] - pub fn npm_version_req_with_v() { - assert!(NpmVersionReq::parse("v1.0.0").is_ok()); - } - - #[test] - pub fn npm_version_req_ranges() { - let tester = NpmVersionReqTester( - NpmVersionReq::parse(">= 2.1.2 < 3.0.0 || 5.x").unwrap(), - ); - assert!(!tester.matches("2.1.1")); - assert!(tester.matches("2.1.2")); - assert!(tester.matches("2.9.9")); - assert!(!tester.matches("3.0.0")); - assert!(tester.matches("5.0.0")); - assert!(tester.matches("5.1.0")); - assert!(!tester.matches("6.1.0")); - } -} diff --git a/cli/npm/resolution.rs b/cli/npm/resolution.rs index d92004db0..b945a1e0b 100644 --- a/cli/npm/resolution.rs +++ b/cli/npm/resolution.rs @@ -8,12 +8,14 @@ use deno_ast::ModuleSpecifier; use deno_core::anyhow::bail; use deno_core::anyhow::Context; use deno_core::error::AnyError; +use deno_core::futures; use deno_core::parking_lot::RwLock; use super::registry::NpmPackageInfo; use super::registry::NpmPackageVersionDistInfo; use super::registry::NpmPackageVersionInfo; use super::registry::NpmRegistryApi; +use super::version_req::SpecifierVersionReq; /// The version matcher used for npm schemed urls is more strict than /// the one used by npm packages. @@ -28,38 +30,6 @@ pub struct NpmPackageReference { pub sub_path: Option<String>, } -#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] -pub struct NpmPackageReq { - pub name: String, - pub version_req: Option<semver::VersionReq>, -} - -impl std::fmt::Display for NpmPackageReq { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match &self.version_req { - Some(req) => write!(f, "{}@{}", self.name, req), - None => write!(f, "{}", self.name), - } - } -} - -impl NpmVersionMatcher for NpmPackageReq { - fn matches(&self, version: &semver::Version) -> bool { - match &self.version_req { - Some(req) => req.matches(version), - None => version.pre.is_empty(), - } - } - - fn version_text(&self) -> String { - self - .version_req - .as_ref() - .map(|v| format!("{}", v)) - .unwrap_or_else(|| "non-prerelease".to_string()) - } -} - impl NpmPackageReference { pub fn from_specifier( specifier: &ModuleSpecifier, @@ -77,7 +47,7 @@ impl NpmPackageReference { let (name, version_req) = match specifier.rsplit_once('@') { Some((name, version_req)) => ( name, - match semver::VersionReq::parse(version_req) { + match SpecifierVersionReq::parse(version_req) { Ok(v) => Some(v), Err(_) => None, // not a version requirement }, @@ -105,6 +75,38 @@ impl std::fmt::Display for NpmPackageReference { } } +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] +pub struct NpmPackageReq { + pub name: String, + pub version_req: Option<SpecifierVersionReq>, +} + +impl std::fmt::Display for NpmPackageReq { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match &self.version_req { + Some(req) => write!(f, "{}@{}", self.name, req), + None => write!(f, "{}", self.name), + } + } +} + +impl NpmVersionMatcher for NpmPackageReq { + fn matches(&self, version: &semver::Version) -> bool { + match &self.version_req { + Some(req) => req.matches(version), + None => version.pre.is_empty(), + } + } + + fn version_text(&self) -> String { + self + .version_req + .as_ref() + .map(|v| format!("{}", v)) + .unwrap_or_else(|| "non-prerelease".to_string()) + } +} + #[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)] pub struct NpmPackageId { pub name: String, @@ -314,6 +316,27 @@ impl NpmResolution { ordering => ordering, }); + // cache all the dependencies' registry infos in parallel when this env var isn't set + if std::env::var("DENO_UNSTABLE_NPM_SYNC_DOWNLOAD") != Ok("1".to_string()) + { + let handles = deps + .iter() + .map(|dep| { + let name = dep.name.clone(); + let api = self.api.clone(); + tokio::task::spawn(async move { + // it's ok to call this without storing the result, because + // NpmRegistryApi will cache the package info in memory + api.package_info(&name).await + }) + }) + .collect::<Vec<_>>(); + let results = futures::future::join_all(handles).await; + for result in results { + result??; // surface the first error + } + } + // now resolve them for dep in deps { // check if an existing dependency matches this diff --git a/cli/npm/version_req.rs b/cli/npm/version_req.rs new file mode 100644 index 000000000..24f3788ad --- /dev/null +++ b/cli/npm/version_req.rs @@ -0,0 +1,219 @@ +// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. + +use std::borrow::Cow; + +use deno_core::anyhow::bail; +use deno_core::error::AnyError; +use once_cell::sync::Lazy; +use regex::Regex; + +use super::resolution::NpmVersionMatcher; + +static MINOR_SPECIFIER_RE: Lazy<Regex> = + Lazy::new(|| Regex::new(r#"^[0-9]+\.[0-9]+$"#).unwrap()); + +/// Version requirement found in npm specifiers. +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] +pub struct SpecifierVersionReq(semver::VersionReq); + +impl std::fmt::Display for SpecifierVersionReq { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +impl SpecifierVersionReq { + // in order to keep using semver, we do some pre-processing to change the behavior + pub fn parse(text: &str) -> Result<Self, AnyError> { + // for now, we don't support these scenarios + if text.contains("||") { + bail!("not supported '||'"); + } + if text.contains(',') { + bail!("not supported ','"); + } + // force exact versions to be matched exactly + let text = if semver::Version::parse(text).is_ok() { + Cow::Owned(format!("={}", text)) + } else { + Cow::Borrowed(text) + }; + // force requirements like 1.2 to be ~1.2 instead of ^1.2 + let text = if MINOR_SPECIFIER_RE.is_match(&text) { + Cow::Owned(format!("~{}", text)) + } else { + text + }; + Ok(Self(semver::VersionReq::parse(&text)?)) + } + + pub fn matches(&self, version: &semver::Version) -> bool { + self.0.matches(version) + } +} + +/// A version requirement found in an npm package's dependencies. +pub struct NpmVersionReq { + raw_text: String, + comparators: Vec<semver::VersionReq>, +} + +impl NpmVersionReq { + pub fn parse(text: &str) -> Result<NpmVersionReq, AnyError> { + // semver::VersionReq doesn't support spaces between comparators + // and it doesn't support using || for "OR", so we pre-process + // the version requirement in order to make this work. + let raw_text = text.to_string(); + let part_texts = text.split("||").collect::<Vec<_>>(); + let mut comparators = Vec::with_capacity(part_texts.len()); + for part in part_texts { + comparators.push(npm_version_req_parse_part(part)?); + } + Ok(NpmVersionReq { + raw_text, + comparators, + }) + } +} + +impl NpmVersionMatcher for NpmVersionReq { + fn matches(&self, version: &semver::Version) -> bool { + self.comparators.iter().any(|c| c.matches(version)) + } + + fn version_text(&self) -> String { + self.raw_text.to_string() + } +} + +fn npm_version_req_parse_part( + text: &str, +) -> Result<semver::VersionReq, AnyError> { + let text = text.trim(); + let text = text.strip_prefix('v').unwrap_or(text); + // force exact versions to be matched exactly + let text = if semver::Version::parse(text).is_ok() { + Cow::Owned(format!("={}", text)) + } else { + Cow::Borrowed(text) + }; + // force requirements like 1.2 to be ~1.2 instead of ^1.2 + let text = if MINOR_SPECIFIER_RE.is_match(&text) { + Cow::Owned(format!("~{}", text)) + } else { + text + }; + let mut chars = text.chars().enumerate().peekable(); + let mut final_text = String::new(); + while chars.peek().is_some() { + let (i, c) = chars.next().unwrap(); + let is_greater_or_less_than = c == '<' || c == '>'; + if is_greater_or_less_than || c == '=' { + if i > 0 { + final_text = final_text.trim().to_string(); + // add a comma to make semver::VersionReq parse this + final_text.push(','); + } + final_text.push(c); + let next_char = chars.peek().map(|(_, c)| c); + if is_greater_or_less_than && matches!(next_char, Some('=')) { + let c = chars.next().unwrap().1; // skip + final_text.push(c); + } + } else { + final_text.push(c); + } + } + Ok(semver::VersionReq::parse(&final_text)?) +} + +#[cfg(test)] +mod tests { + use super::*; + + struct VersionReqTester(SpecifierVersionReq); + + impl VersionReqTester { + fn new(text: &str) -> Self { + Self(SpecifierVersionReq::parse(text).unwrap()) + } + + fn matches(&self, version: &str) -> bool { + self.0.matches(&semver::Version::parse(version).unwrap()) + } + } + + #[test] + fn version_req_exact() { + let tester = VersionReqTester::new("1.0.1"); + assert!(!tester.matches("1.0.0")); + assert!(tester.matches("1.0.1")); + assert!(!tester.matches("1.0.2")); + assert!(!tester.matches("1.1.1")); + } + + #[test] + fn version_req_minor() { + let tester = VersionReqTester::new("1.1"); + assert!(!tester.matches("1.0.0")); + assert!(tester.matches("1.1.0")); + assert!(tester.matches("1.1.1")); + assert!(!tester.matches("1.2.0")); + assert!(!tester.matches("1.2.1")); + } + + struct NpmVersionReqTester(NpmVersionReq); + + impl NpmVersionReqTester { + fn new(text: &str) -> Self { + Self(NpmVersionReq::parse(text).unwrap()) + } + + fn matches(&self, version: &str) -> bool { + self.0.matches(&semver::Version::parse(version).unwrap()) + } + } + + #[test] + pub fn npm_version_req_with_v() { + assert!(NpmVersionReq::parse("v1.0.0").is_ok()); + } + + #[test] + pub fn npm_version_req_exact() { + let tester = NpmVersionReqTester::new("2.1.2"); + assert!(!tester.matches("2.1.1")); + assert!(tester.matches("2.1.2")); + assert!(!tester.matches("2.1.3")); + + let tester = NpmVersionReqTester::new("2.1.2 || 2.1.5"); + assert!(!tester.matches("2.1.1")); + assert!(tester.matches("2.1.2")); + assert!(!tester.matches("2.1.3")); + assert!(!tester.matches("2.1.4")); + assert!(tester.matches("2.1.5")); + assert!(!tester.matches("2.1.6")); + } + + #[test] + pub fn npm_version_req_minor() { + let tester = NpmVersionReqTester::new("1.1"); + assert!(!tester.matches("1.0.0")); + assert!(tester.matches("1.1.0")); + assert!(tester.matches("1.1.1")); + assert!(!tester.matches("1.2.0")); + assert!(!tester.matches("1.2.1")); + } + + #[test] + pub fn npm_version_req_ranges() { + let tester = NpmVersionReqTester::new(">= 2.1.2 < 3.0.0 || 5.x"); + assert!(!tester.matches("2.1.1")); + assert!(tester.matches("2.1.2")); + assert!(tester.matches("2.9.9")); + assert!(!tester.matches("3.0.0")); + assert!(tester.matches("5.0.0")); + assert!(tester.matches("5.1.0")); + assert!(!tester.matches("6.1.0")); + } +} diff --git a/cli/proc_state.rs b/cli/proc_state.rs index bed42b9b4..ee9098c76 100644 --- a/cli/proc_state.rs +++ b/cli/proc_state.rs @@ -443,12 +443,7 @@ impl ProcState { .add_package_reqs(npm_package_references) .await?; self.npm_resolver.cache_packages().await?; - - // add the builtin node modules to the graph data - let node_std_graph = self - .create_graph(vec![(compat::MODULE_ALL_URL.clone(), ModuleKind::Esm)]) - .await?; - self.graph_data.write().add_graph(&node_std_graph, false); + self.prepare_node_std_graph().await?; } // type check if necessary @@ -492,6 +487,15 @@ impl ProcState { Ok(()) } + /// Add the builtin node modules to the graph data. + pub async fn prepare_node_std_graph(&self) -> Result<(), AnyError> { + let node_std_graph = self + .create_graph(vec![(compat::MODULE_ALL_URL.clone(), ModuleKind::Esm)]) + .await?; + self.graph_data.write().add_graph(&node_std_graph, false); + Ok(()) + } + fn handle_node_resolve_result( &self, result: Result<Option<ResolveResponse>, AnyError>, diff --git a/cli/tests/integration/npm_tests.rs b/cli/tests/integration/npm_tests.rs index 7a2b249a1..b8f384bf7 100644 --- a/cli/tests/integration/npm_tests.rs +++ b/cli/tests/integration/npm_tests.rs @@ -151,19 +151,48 @@ fn cached_only_after_first_run() { .spawn() .unwrap(); - eprintln!("DENO DIR: {}", deno_dir.path().display()); - std::mem::forget(deno_dir); let output = deno.wait_with_output().unwrap(); let stderr = String::from_utf8_lossy(&output.stderr); let stdout = String::from_utf8_lossy(&output.stdout); - eprintln!("stderr {}", stderr); - eprintln!("stdout {}", stdout); assert!(output.status.success()); assert!(stderr.is_empty()); assert_contains!(stdout, "createChalk: chalk"); } #[test] +fn deno_run_cjs_module() { + let _server = http_server(); + + let deno_dir = util::new_deno_dir(); + + let deno = util::deno_cmd_with_deno_dir(&deno_dir) + .current_dir(deno_dir.path()) + .arg("run") + .arg("--unstable") + .arg("--allow-read") + .arg("--allow-env") + .arg("--allow-write") + .arg("npm:mkdirp@1.0.4") + .arg("test_dir") + .env("NO_COLOR", "1") + .envs(env_vars()) + .spawn() + .unwrap(); + let output = deno.wait_with_output().unwrap(); + assert!(output.status.success()); + + assert!(deno_dir.path().join("test_dir").exists()); +} + +itest!(deno_run_non_existent { + args: "run --unstable npm:mkdirp@0.5.125", + output: "npm/deno_run_non_existent.out", + envs: env_vars(), + http_server: true, + exit_code: 1, +}); + +#[test] fn ensure_registry_files_local() { // ensures the registry files all point at local tarballs let registry_dir_path = util::testdata_path().join("npm").join("registry"); diff --git a/cli/tests/testdata/npm/cjs_sub_path/main.js b/cli/tests/testdata/npm/cjs_sub_path/main.js index ba3cce8db..b71360959 100644 --- a/cli/tests/testdata/npm/cjs_sub_path/main.js +++ b/cli/tests/testdata/npm/cjs_sub_path/main.js @@ -2,7 +2,7 @@ // and also get the parent directory index.js file using require("..") import Ajv from "npm:ajv@~8.11"; import addFormats from "npm:ajv-formats@2.1.1"; -import { expect } from "npm:chai@4.2"; +import { expect } from "npm:chai@4.3"; const ajv = new Ajv(); addFormats(ajv); diff --git a/cli/tests/testdata/npm/cjs_with_deps/main.js b/cli/tests/testdata/npm/cjs_with_deps/main.js index 420136c92..568726874 100644 --- a/cli/tests/testdata/npm/cjs_with_deps/main.js +++ b/cli/tests/testdata/npm/cjs_with_deps/main.js @@ -1,5 +1,5 @@ import chalk from "npm:chalk@4"; -import { expect } from "npm:chai@4.2"; +import { expect } from "npm:chai@4.3"; console.log(chalk.green("chalk cjs loads")); diff --git a/cli/tests/testdata/npm/deno_run_non_existent.out b/cli/tests/testdata/npm/deno_run_non_existent.out new file mode 100644 index 000000000..6d406d8f9 --- /dev/null +++ b/cli/tests/testdata/npm/deno_run_non_existent.out @@ -0,0 +1,2 @@ +Download http://localhost:4545/npm/registry/mkdirp +error: Could not find npm package 'mkdirp' matching =0.5.125. Try retreiving the latest npm package information by running with --reload diff --git a/cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz b/cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz Binary files differnew file mode 100644 index 000000000..bf8eca6e2 --- /dev/null +++ b/cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz diff --git a/cli/tests/testdata/npm/registry/mkdirp/registry.json b/cli/tests/testdata/npm/registry/mkdirp/registry.json new file mode 100644 index 000000000..6a8ef8f7e --- /dev/null +++ b/cli/tests/testdata/npm/registry/mkdirp/registry.json @@ -0,0 +1,1865 @@ +{ + "_id": "mkdirp", + "_rev": "518-d0a20d69da0329be9aceb467c82bc44e", + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "dist-tags": { "latest": "1.0.4", "legacy": "0.5.6" }, + "versions": { + "0.0.1": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.1", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "modules": { "index": "./index" }, + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.1", + "_nodeSupported": true, + "_npmVersion": "0.2.12-1", + "_nodeVersion": "v0.2.5", + "dist": { + "shasum": "3fbd9f4711a5234233dc6c9d7a052d4b9f83b416", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.1.tgz", + "integrity": "sha512-HQy0wosZ9vTZbcDvhhkHErQlJE5Nn1YJbgtOUzmBQlZyXP043eySHBGXk0mE4o5MSB+yz+Emwj/MUTy2uQXImA==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIAIcPDTfY1LIJCsKCP865wx57jL+ZZMMPXyZ5wTyNfk8AiA7ZobdgVCspw/Hv+4Z/FSH9nAKEKRYrtnXDo576SCD5Q==" + } + ] + }, + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.0.2": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.2", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.2", + "_engineSupported": true, + "_npmVersion": "0.2.18", + "_nodeVersion": "v0.3.8-pre", + "directories": {}, + "files": [""], + "_defaultsLoaded": true, + "dist": { + "shasum": "d9438082daac12691c71d64076706c8a5c3511b6", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.2.tgz", + "integrity": "sha512-rNey95QC2ZVqHABQxdx1rnOtSu+eq2DQlSu172/xvnAYXxhihtuJnnZ4+bFgXMJAGWo2+qqejTipwfPYsceikA==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQDk1QmjWXzO9m1bjc55U74bg1HmcGcRYUueatyYvPVf/AIgP52EbHjo+I4/HI1nZFpcQMLkm2P5et1WFSwS2cA7ypQ=" + } + ] + }, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.0.3": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.3", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "expresso" }, + "devDependencies": { "expresso": "0.7.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.3", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.10", + "_nodeVersion": "v0.5.0-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "5a7d88a26857023759ffee7fe4c0b28b0f0066b9", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.3.tgz", + "integrity": "sha512-y4EOEX7XAmN0n8CDL5wytcj9Z5x3FsvaFQH0VCy3KChSNvUb598ZTEFOs6JnhCb7Gshp1gDyAlqp75mABSAaHQ==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIARrUo4zBGBGjiiusCqs8ecrrGwuPbvTqKAvY10nKK4IAiEAvecaYKkAMAZ7L7qExW4uCSGw1sInuPGVFdsLiAWV3eQ=" + } + ] + }, + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.0.4": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.4", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "expresso" }, + "devDependencies": { "expresso": "0.7.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.4", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.10", + "_nodeVersion": "v0.5.0-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "fbb491deec0b9b00869f52582e5f431b3681d2f5", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.4.tgz", + "integrity": "sha512-Lucz34RG1e4w1e+htz7wlxyl3FwlRqu1Eone957NT/PgEzTUDVe/7h3j32zri8QQi9Hw/ed7VDtq8ZmSphaDJw==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIGWLZ1Qe0Dz1ABS5IUIFgHhS0FRrR4/DEXUqSKG3u4v1AiEAoT0GFPar+7DNF6N8vaQPKxi3Q3xGCShLLLhB1sdk6s4=" + } + ] + }, + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.0.5": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.5", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "expresso" }, + "devDependencies": { "expresso": "0.7.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.5", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.10", + "_nodeVersion": "v0.5.0-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "375facfa634b17dcdf734c56f59ddae5102811c8", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.5.tgz", + "integrity": "sha512-nu8UF+SW9iIgy3/keZzKtsanSVIP7ntI8A61nFWbTokT0bZXAaVjXzQ/RRtX8DVr+3CAdsFV/KnevwYgPAAjpg==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQDrpencNtblj7vmJWu4bYHINSrTRiaUPOx5OdV5N6tyLQIgGb/xhy401KTIbL2cLQRT6yk1V8ycmJ3ZLT/oz1z5wNk=" + } + ] + }, + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.0.6": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.6", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "expresso" }, + "devDependencies": { "expresso": "0.7.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.6", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.10", + "_nodeVersion": "v0.5.0-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "0965de71060cf5e237ffa795243cb5d9a78d335b", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.6.tgz", + "integrity": "sha512-7ZUkNRk48VSNMMXGW8orFDLUKdRcTTfEIq9rcVBpLfgFT8PFzD2AgIqYXBj+uBA0LhJIcTG3WgzjOyoKXaN77g==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQCN+yZTX6mD/3DS2zqzsgfGIcRrhCGPBpZ45ch6aWj5LQIgBSVEnL5Vn3ZrqUlqY2WdjCB3nq9uGejtcz3zgsnxWuQ=" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.0.7": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.0.7", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "node node_modules/tap/bin/tap.js test/*.js" }, + "devDependencies": { "tap": "0.0.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.0.7", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.10", + "_nodeVersion": "v0.5.0-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "d89b4f0e4c3e5e5ca54235931675e094fe1a5072", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.0.7.tgz", + "integrity": "sha512-r4Ml2CH2Kl4B0+Lwq1SVru0vjMxdtR+UEb938WTQcsnU+EJz8dUV/HY0LTZh466nUSljia9cvqW3LZLWs3l8LQ==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIBPskUl8nlr0fFKbYB3YMO3LG3NEERcSqymtugtC2HLHAiEA+A2bIeQEx1f1Hxkb0ZqaY+OEN025ArpSwrPd26r1Rck=" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.1.0": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.1.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "0.0.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.1.0", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.101", + "_nodeVersion": "v0.4.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "53212930f7bd75f187b6c8688eb0a5fd69b7d118", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.1.0.tgz", + "integrity": "sha512-ow1qN/eaqDjNrPB8XGt2mdTkSDNFOW1ron/H3A3qXGkb+mYuhiDLvk3eH0VlMaPGcz/gNEqOgkuxdqEXqwZN7g==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIHg8crUBdLL0xuihpwGbAE3n3/ZyyPgyrmPmGpy8va8bAiB3EXe/faowTselcFw6oRdC00bYDwIJUEvFa43kzbZfeg==" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.2.0": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.2.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "0.0.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.2.0", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.101", + "_nodeVersion": "v0.4.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "29dd87f198880b568d1efce0980e7231b048f3aa", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.2.0.tgz", + "integrity": "sha512-qXdycG9bh+1WgmITVghj8nQX89g2OKEI1QK7LnfhVf1WG3aQqCA0DEU8TszfCoQ+65/qXiav26oXQsTWyXXT5w==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIClp6VkKCXbwD2rPOioh8vuWiMaeUok4s3KedhWU8K60AiBicwJW2Ze+fLoz0bBEzCe69jEHEjO3FCud8HKHq3LSng==" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.2.1": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.2.1", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "0.0.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.2.1", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.101", + "_nodeVersion": "v0.4.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "2ef920435c8511e135137a33f18a9e40cf9dd166", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.2.1.tgz", + "integrity": "sha512-WaFtVpAohqQ9xUaEkJ5LBpy9JFxYhsOyyh5QOyWiKZFfaufioXB65Tb38SklJ91RjvoEhH96PQXG1wcO7kM0lQ==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQDCHqhntAIMZMsEBwJdaQMHOTa8TEL7upHWkR114itAKwIgWu77qH/aN0n5MNpDPwz2LGZqHDhEZf/KxSWkH8Oknd8=" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.2.2": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.2.2", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "0.0.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.2.2", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.106", + "_nodeVersion": "v0.4.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "7235f2a2062aaf3619189b9f4772114c30944498", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.2.2.tgz", + "integrity": "sha512-Sw4mJdYA5ryJGV3fnaafloGUh0qKdOicht1HCc58mCD+OD1iVrh+AppTmiveJFhrtb3+Ji+7sVLHK8wchTmV2g==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCICVAJtFkLVxPOIV0E41nckfk0+RnMwJLB2jIsTZ1PB/DAiAoIC3WNQclfu0+A+bqAI4le/K6JULCOubqIVWd2aTz7w==" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.3.0": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "0.0.x" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.3.0", + "dependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.0.106", + "_nodeVersion": "v0.4.12", + "_defaultsLoaded": true, + "dist": { + "shasum": "1bbf5ab1ba827af23575143490426455f481fe1e", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQDQIQTjmIANYqvxUk8GwvHFuhrBnDCwpUIn0/WpiNZe7wIgZCnmHYn7pKW43j49YLnkKpo5bphWQzPM+NmGTxvWuaM=" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.3.1": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.1", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "~0.2.4" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.3.1", + "dependencies": {}, + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.1", + "_nodeVersion": "v0.6.11", + "_defaultsLoaded": true, + "dist": { + "shasum": "bee3db22a2aa1c81d4b4c0db39c7da9888799593", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.3.1.tgz", + "integrity": "sha512-wKuQTWc9aojLmcUo248LuWtbHZE26ftrcwYIdeNzASRdimIG56C9KCHJ+BxNmI/38NepT+eM6DNnNyZtMHKa4Q==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIGgpCplJJ/IPWdiHCQV1M9fj69FBasLMoLjbvLHx1lf1AiEAqSe+EYTTKN1msNiJ4fR5KcQ2L0CdRw3mwUGYzk3DewU=" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.3.2": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.2", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "~0.2.4" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.3.2", + "dependencies": {}, + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.1", + "_nodeVersion": "v0.6.11", + "_defaultsLoaded": true, + "dist": { + "shasum": "4bfb891e9c48b93d6b567f2c3cf2dd3f56bcdef8", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.3.2.tgz", + "integrity": "sha512-pc+27TvK2K/zCoLgoqHbCDndezId7Gbb00HjFACfXlFqOmbi+JyghsLmjiAGfDYrbGxQIlAWPM2UId3nx6JHOQ==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEYCIQDjul1hqfOLrWhzfv9d/zHaxkTiFSbwpB0IDLP/VKOAzQIhAMW4Ax6e8IIQ6AgNrIAPdG+LPutGnmDTrMkVaL57YUyz" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.3.3": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.3", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "~0.2.4" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "_id": "mkdirp@0.3.3", + "dependencies": {}, + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.19", + "_nodeVersion": "v0.6.11", + "_defaultsLoaded": true, + "dist": { + "shasum": "595e251c1370c3a68bab2136d0e348b8105adf13", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.3.3.tgz", + "integrity": "sha512-Oamd41MnZw/yuxtarGf3MFbHzFqQY4S17DcN+rATh2t5MKuCtG7vVVRG+RUT6g9+hr47DIVucIHGOUlwmJRvDA==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIC2VML6DmpDe/r19tAfa1U9GzmuWlb7zd3k/U/hd4KKeAiAwbwEt509dg1B/vJmj/pvJsQfOhnzOEir0IOPP81Huww==" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.3.4": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.4", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "~0.2.4" }, + "license": "MIT/X11", + "engines": { "node": "*" }, + "_id": "mkdirp@0.3.4", + "dist": { + "shasum": "f8c81d213b7299a031f193a57d752a17d2f6c7d8", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.3.4.tgz", + "integrity": "sha512-sZObLj65ImOahHTaycVJF559muyAvv1hYyBQSfVfZq9ajpgY9Da+cRQzbXDfsKJTwUMUABRjBMDHieYqbHKx0g==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIH6kla6BNNvTYX+P5eLrwIu/O5Lg//yBKYAtbmBh+Oz5AiAeFLIs7Qa7hnE835dxCtjV+TacCLcVB695ZXE3a2UuQg==" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.3.5": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.3.5", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "~0.4.0" }, + "license": "MIT", + "_id": "mkdirp@0.3.5", + "dist": { + "shasum": "de3e5f8961c88c787ee1368df849ac4413eca8d7", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIHCYOtCeVqYQsc6pjdMG5eSSM1Cw11O/l/uDeDWW7Ie0AiEAlx6zO36wF3ew/mtVOSaOV4kgh+D+73A7bUrwVDQPtNA=" + } + ] + }, + "_from": ".", + "_npmVersion": "1.2.2", + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.4.0": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.4.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "devDependencies": { "tap": "~0.4.0" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.4.0", + "dist": { + "shasum": "291ac2a2d43a19c478662577b5be846fe83b5923", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.4.0.tgz", + "integrity": "sha512-l4/GdhkYnvcQxztcZecGWmF2TYbk6R52LS75hV0bzpZA+pvEJfeVtJrOU1hUFFZT9GihgEcFc65zmP2ZtNRtSg==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIGRtUk6XrLRXQVHsEA0QW3mRYinEFS9W66hiUwduKqKqAiEAph9SSegXkZ5YInizZbBi2dXDqktYGxA4Y79nda65CRI=" + } + ] + }, + "_from": ".", + "_npmVersion": "1.4.3", + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.4.1": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.4.1", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "http://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "0.0.8" }, + "devDependencies": { "tap": "~0.4.0" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.4.1", + "dist": { + "shasum": "4d467afabfdf8ae460c2da656eae8f7b21af4558", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.4.1.tgz", + "integrity": "sha512-SaDX797Hg7C+3kHofgmPnqppj4Rp609u18iYeaWK7JXPSpqfYKLr1TjNEKb/kUFbs2dgS65t0PUcc6i01dF7Wg==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIGsGnw8Ad1+Yv4BoOmOUei2a3Viwyihjks+cqHDBAd7VAiA49SlkyuFvmePbQh9D9ghJDQJdxl9bBY3lFi6OwyPxYw==" + } + ] + }, + "_from": ".", + "_npmVersion": "1.4.3", + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.4.2": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.4.2", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "0.0.8" }, + "devDependencies": { "tap": "~0.4.0" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.4.2", + "dist": { + "shasum": "427c8c18ece398b932f6f666f4e1e5b7740e78c8", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.4.2.tgz", + "integrity": "sha512-aiwEvGvWUEFscNrK7RnxM++ltHpm/dzoVZicG8jqFK0yr3FgSUJ174D3b9kackdgHLuRb9cWapcUCoXVELD0Pg==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQCjm+XpnlSQCh96XEs71onSWss2HblAMI6nQvScBVUdFgIgB7+v0JUM9bLlW2VspcqeJyRH7NWKEA3M638Ml8fq1B0=" + } + ] + }, + "_from": ".", + "_npmVersion": "1.4.3", + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.5.0": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "0.0.8" }, + "devDependencies": { "tap": "~0.4.0", "mock-fs": "~2.2.0" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.5.0", + "dist": { + "shasum": "1d73076a6df986cd9344e15e71fcc05a4c9abf12", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.0.tgz", + "integrity": "sha512-xjjNGy+ry1lhtIKcr2PT6ok3aszhQfgrUDp4OZLHacgRgFmF6XR9XCOJVcXlVGQonIqXcK1DvqgKKQOPWYGSfw==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQDzJnxAoy1oo5PiesxWQ88orv/Z1Kp+MettH3fagHAJ0AIgHesBmlz15PP6e45unLqXb4A0jKbuNTStl57VNfdGXAw=" + } + ] + }, + "_from": ".", + "_npmVersion": "1.4.3", + "_npmUser": { "name": "substack", "email": "mail@substack.net" }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.5.1": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.1", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "index.js", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git+https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "0.0.8" }, + "devDependencies": { "tap": "1", "mock-fs": "2 >=2.7.0" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "gitHead": "d4eff0f06093aed4f387e88e9fc301cb76beedc7", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp#readme", + "_id": "mkdirp@0.5.1", + "_shasum": "30057438eac6cf7f8c4767f38648d6697d75c903", + "_from": ".", + "_npmVersion": "2.9.0", + "_nodeVersion": "2.0.0", + "_npmUser": { "name": "substack", "email": "substack@gmail.com" }, + "dist": { + "shasum": "30057438eac6cf7f8c4767f38648d6697d75c903", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEYCIQCVMvQjmuRzc+OOzteA80cKoZYuNI2SYZa/GkpDH3IKawIhAK6h9L4SqSDNQ0mE2y4fD+QXO1piwcEwogQ9lYKeSEKM" + } + ] + }, + "maintainers": [{ "name": "substack", "email": "mail@substack.net" }], + "directories": {}, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "1.0.0": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "1.0.0", + "main": "index.js", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-mkdirp.git" + }, + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "tap": { "check-coverage": true, "coverage-map": "map.js" }, + "devDependencies": { "require-inject": "^1.4.4", "tap": "^14.10.6" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "engines": { "node": ">=10" }, + "gitHead": "1b64c7bdb6eb4d28ac4c019e19f9a93a8338c14d", + "bugs": { "url": "https://github.com/isaacs/node-mkdirp/issues" }, + "homepage": "https://github.com/isaacs/node-mkdirp#readme", + "_id": "mkdirp@1.0.0", + "_nodeVersion": "13.4.0", + "_npmVersion": "6.13.6", + "dist": { + "integrity": "sha512-4Pb+8NJ5DdvaWD797hKOM28wMXsObb4HppQdIwKUHFiB69ICZ4wktOE+qsGGBy7GtwgYNizp0R9KEy4zKYBLMg==", + "shasum": "8487b07699b70c9b06fce47b3ce28d8176c13c75", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-1.0.0.tgz", + "fileCount": 39, + "unpackedSize": 51158, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeK1EjCRA9TVsSAnZWagAA3dIP/isRDRiVFfvRTok8YZa2\nU7DHcBjKLouQm0ZXy0WqfodlzqwPGRCZwMgeWNsb4S01UPTewUC1jd/zmMtt\nV1YoyhCDCojNCQY0X2mfijSeGk9LkrnQsYbcIsg+IP4QVmx4y3KC0yCvP9YM\nay0uE9YQLe253erLqObHvzbHJl3V+pDi1rGZ8xufoOCzf1tyBpVzkwjnQlLa\nahZ8mrXB+kS1Du/yCQYHHuVuNkxBIdPKy/02SNQXfao79i/BXM9dzFmv/rq8\nA6mVat4YHQiLZ1XMk+aqCXuIrVeR6P5Slwwqf6nhIIXa6hocRGOHBkLPxOuB\n1rG3ycUb/tnPabEObRIf5V48L43/OoMiSMOVCK3LjqHQ1GgOe5A7gWfLgsW4\nsn6EEhI3nwO/dAnpBzaF0p/h6Tnkj5AqCWR7zI6Tftl2UX+KSekkt6AaEr4G\n04/GSnb+FYDZ9teauzx2Dg9dBC4KCTZnW49TfViDXjXyQO3OxW6uqWKg83fd\nyB306YdF6Lj3O2tL+qqxU6uzG9nugKO2/cshpF169+1dT6OFBx5XLDWj8pPV\nUCJhReoSd/LXcGWzZ9AfUsPbQK9yFt/Ub0+mdpkYeiTg78+FXlSKSdoaEBtR\nPutFdd1usyYhXXOqg0rwmhrBe4AZ5sHz56BZCvhg9Gpq/Guu5i8Nv+EdARxm\nHLKG\r\n=CCXU\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIH/yH27EWlpLHZXGZX491S8EIoaEY4De6HK/uHzgGcIzAiEAgghUcrFFMTp3x83lerOieAnyiiQKWIyRAixP37JBeV0=" + } + ] + }, + "maintainers": [ + { "email": "i@izs.me", "name": "isaacs" }, + { "email": "substack@gmail.com", "name": "substack" } + ], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_1.0.0_1579897122471_0.9445186710087152" + }, + "_hasShrinkwrap": false + }, + "1.0.1": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "1.0.1", + "main": "index.js", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-mkdirp.git" + }, + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "tap": { "check-coverage": true, "coverage-map": "map.js" }, + "devDependencies": { "require-inject": "^1.4.4", "tap": "^14.10.6" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "engines": { "node": ">=10" }, + "gitHead": "ab8b7548c444aab9b883f83f23806a6ff641ed72", + "bugs": { "url": "https://github.com/isaacs/node-mkdirp/issues" }, + "homepage": "https://github.com/isaacs/node-mkdirp#readme", + "_id": "mkdirp@1.0.1", + "_nodeVersion": "13.4.0", + "_npmVersion": "6.13.6", + "dist": { + "integrity": "sha512-epSaAwmT1sXxKNHFtzxrNEepE0qneey1uVReE15tN3Zvba3ifzx01eStvvvyb8dQeI50CVuGZ5qnSk2wMtsysg==", + "shasum": "57828231711628a8a303f455bb7d79b32d9c9d4f", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-1.0.1.tgz", + "fileCount": 12, + "unpackedSize": 19083, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeK1GOCRA9TVsSAnZWagAAxVcP/iQv0DL9YSzDmkGXwOmX\nVw7YJsamnCnqqs1yLdbZVFfWKpc96DP1lckMUuENiTzoDHeoj3aen3Bs7Dh/\n+pSWoUxKIHkqqt1N++9cOLUk9z15pv8/TdNM8iMwcB6LN0IS//4PuQTKYqiC\nDJoNo0npu55ONZGSBLM6A+/tu0pN1l6sVNSk3IKXlR9CbL1ndjns2NP9UlTa\n9O/mpr8kdX4+2sv8SJU9f2FQsVBg99SeLyqsC2YvB1Bfws45SQo7DO8KBpKX\nQGJiQus3yB4/1JGX1O2XwUuwrGZn7/ZFksCKnqt0u4A7GPC2NGH8EhTSilFB\nopNzIMlhIvRbv4jfqqm7XsaIbhM52IiDvENignnUioz0VUiFjhSHvnxT2w2O\n051BmMSEPqc/yKTHVx640W4h78XMiDIDMaIR1yOSGYI/zrd15mzSDyTdkouL\nWkUy6RLrYKFrLVQNjj4Vt5KbM1W4KiDYNOrTsrPEOkAmB8XDmYlXPeVCb0AX\nkAjdbaCy7HRlOUKpYlUbkNA3y3Jzjkbt/wmfB5ZsA72L/QJk7PR+Q3a/+prU\n58c57mVQxvkOJnPgQPGSjWvpm0QM43DDahSeYvjN2G9PxMj5JiyNwYU8eyNU\nn+drSIcdvHIYPeL1ry1CAvFQEeXDCXmgI92m0diswZOYvENH7N33qxXWUUWa\nWyyZ\r\n=F+br\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIBkf1v0bbrSievAnzMw7gyP/zuY6lLCbNhTXqwFHvwyzAiEA937Oue/4P1g6w1nDGKjbNNNDINF5n6I1auqipZEXWxo=" + } + ] + }, + "maintainers": [ + { "email": "i@izs.me", "name": "isaacs" }, + { "email": "substack@gmail.com", "name": "substack" } + ], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_1.0.1_1579897230300_0.6147991442490592" + }, + "_hasShrinkwrap": false + }, + "1.0.2": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "1.0.2", + "main": "index.js", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-mkdirp.git" + }, + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "tap": { "check-coverage": true, "coverage-map": "map.js" }, + "devDependencies": { "require-inject": "^1.4.4", "tap": "^14.10.6" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "engines": { "node": ">=10" }, + "gitHead": "6a061db3ded59fb867557116e6c5070e6916e557", + "bugs": { "url": "https://github.com/isaacs/node-mkdirp/issues" }, + "homepage": "https://github.com/isaacs/node-mkdirp#readme", + "_id": "mkdirp@1.0.2", + "_nodeVersion": "13.4.0", + "_npmVersion": "6.13.6", + "dist": { + "integrity": "sha512-N2REVrJ/X/jGPfit2d7zea2J1pf7EAR5chIUcfHffAZ7gmlam5U65sAm76+o4ntQbSRdTjYf7qZz3chuHlwXEA==", + "shasum": "5ccd93437619ca7050b538573fc918327eba98fb", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-1.0.2.tgz", + "fileCount": 12, + "unpackedSize": 19084, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeK1IaCRA9TVsSAnZWagAAC80P/jvpXscoPfndU9oDDNIe\n9YoGhXYq4zrl1Qb3dwqW7h6Q/UmYqFR53OfSl3crPbhf+CLsTVZh9xSdquMs\nJvyjAbIygAk+ciDnclQpJArR18YYd+k3NvLToUXNdgXqgpeiCpUrOLF8zpy0\nDfM4ud39hMImrgv73wklj0Oc2YV0H/XOZE5BT7WfAYuqJ8U8T689ywFp2MUf\niivson0GBpX2CGLwp+L98K8IDz7T1x1WnYWYaL8VeFt4l/XQnGRRh0WchjOp\nikV/Mv3pdfOS6sAE7Ie+D624ZYxd+utUPWwP33Q10h/PFnnbhxQreUb0tOTC\nVkUJPPQV/sssZ9s9qNgH5Nb3sY6eGWXChhHw2lZ+Nlrf1oyrDnV2dwYI3wdn\nOkMHo72jiwlKZ7i74VII0BXVrko72VPXoJ10/JH7n0IXaEuzkrfbsHeiVFDw\nTAYnI1Kbk0f/UJUQzP2mtCQDKLnHw/z67oz33diaP99xsxmiXh3rRR54HmX4\njkZ6wjQ6LUOBZ1V5HusG4Yd84NeYETQ9dRY7waxblxHVHr30QW/03AFlySQQ\nt8eDYvz/tC+G5/21pHtLCnx2F/vwDGgPaQDytfPKKRz2tOZp3yDe0gAXo5N7\nf8jrUkDuptHrAODS7KNnkUbk5SswL0rsfnItPFpt4XWf1FDw1sT+2xHONpui\nHmnO\r\n=5E1g\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQCmzEvnpNBks7e+8HBDYM2ocO/ceHQE2pHN71iH47nQ9wIgWXUy3ocmKgmRUudJjStMNIcIaBVAeFiN6JjsGxpXaDk=" + } + ] + }, + "maintainers": [ + { "email": "i@izs.me", "name": "isaacs" }, + { "email": "substack@gmail.com", "name": "substack" } + ], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_1.0.2_1579897370197_0.3887508695089861" + }, + "_hasShrinkwrap": false + }, + "1.0.3": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "1.0.3", + "main": "index.js", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-mkdirp.git" + }, + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "tap": { "check-coverage": true, "coverage-map": "map.js" }, + "devDependencies": { "require-inject": "^1.4.4", "tap": "^14.10.6" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "engines": { "node": ">=10" }, + "gitHead": "9f29fc8c09b806cdb88e1f6699b31d7969b510dc", + "bugs": { "url": "https://github.com/isaacs/node-mkdirp/issues" }, + "homepage": "https://github.com/isaacs/node-mkdirp#readme", + "_id": "mkdirp@1.0.3", + "_nodeVersion": "13.4.0", + "_npmVersion": "6.13.6", + "dist": { + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "shasum": "4cf2e30ad45959dddea53ad97d518b6c8205e1ea", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-1.0.3.tgz", + "fileCount": 12, + "unpackedSize": 19130, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeK1sGCRA9TVsSAnZWagAA7F4P/0xsz0O16oRicTgxQ8Ef\nRfrdeJeagGaI6qfo1gE5UL7dYWK2eL8/XNWKfRL/k9tN9JX/mTkEKcCdBkhk\n4l0tpOY1pZJPu5O6tW/Swl5i+swANNxs1Tdqdotts3dCzAfOULbemde/YIJj\nVobppuFiCjOZ1WoxFfhfHWChFR4a2coMzu8VXOJCJq57gM//nHiUg5yUtAxd\nBF5Ycm2d5guzQdhs37hHGfukiBv9XaO+8FuraDEMMVtFCjQnJhhYVKRq5u0y\nW3rx0IA+5pdaJzKab01bBz3fVMT+eTBFj201+3jky3J9vFXHi2azDSALFn3W\n/je5Qn6o/69tVqOt+GFOkSmL3PNDKgXbnlB//cjf19ziNFXYl5/ExhVmCHLc\nKDrDfRFzjkjchoiTYLFVH/WX79WgKKsM//2N0J69zljvidmGFqdYOzT57/Lk\nDBxG8JLKHFnKSmOZLVHxmfT3RnFY5phvtKWuVIT6G8QV2lczEe5d8GZAgzUR\nPyNhHPJPhpqeZpKmQ/smwV+imuzKn+GU95qf4ck/dQ6uCtUdaLOiHLwfegMf\n4qvmh7HJpkfk2fYAYV5x4Y+2OfNXLZNOvSMGID/MgJ8WBF5Qyz8shrGCzNat\ndIY0hQpeEvdzpeV4Hq6/+xaeJ4x+L1jA09Tk2Txw6/cOcserohhurvpUJ5s6\n0SEi\r\n=aA1p\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIGa+5sHpvZOuG+rs/LVdlGnQVIbhUtTfFjs6VhyKsrRSAiAyG2kefL7RHhTktrfKnmx9mvZgGKJMtY6Moghmdut9Dw==" + } + ] + }, + "maintainers": [ + { "email": "i@izs.me", "name": "isaacs" }, + { "email": "substack@gmail.com", "name": "substack" } + ], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_1.0.3_1579899654395_0.05416104013537226" + }, + "_hasShrinkwrap": false + }, + "0.5.2": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.2", + "publishConfig": { "tag": "legacy" }, + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "index.js", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git+https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "^1.2.5" }, + "devDependencies": { "mock-fs": "^3.7.0", "tap": "^5.4.2" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories that\n don't yet exist.\n \n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m, --mode If a directory needs to be created, set the mode as an octal\n permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "gitHead": "b2e7ba0dd8ac7029735969c5a6062d49e839b30d", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp#readme", + "_id": "mkdirp@0.5.2", + "_nodeVersion": "13.10.1", + "_npmVersion": "6.13.7", + "dist": { + "integrity": "sha512-jczt4BrifxW743wRHJ05AnqIF52sDrHCAjTO66cFQStG1/jHMLFSGdAa3Rec21jdEObaPugcXfbh6Ammt2VQsw==", + "shasum": "2e7138d794dfbd097d74c84c410c3edd9eec479f", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.2.tgz", + "fileCount": 84, + "unpackedSize": 238925, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecPpxCRA9TVsSAnZWagAAuEUP/3W7GzvkixthBZxxTNDW\nQTOv8W2CmOR+bwXVHEW95OKsbh8V4vcnZ6sDyFTqP4tZ/Br+TDSROnlXxu6n\npVhhaDQ/t5j4qmSUP5Jn1KwjvAb0zWWIJHMJ+KDegchVb1xKn+aKTPbvQPbz\nWbU8upX40rbl0zqd+ZhJKx1am2xcEflaRe0bmAXnQO38C5Uu7xLi00VTmHLm\nJj1/KFdGTgr8ba2TGZvB8xhSh/WjAmLlm0XFO1OTbEtfpwJcab2k+G+dZKk6\nBFfNItE2N08ppwCG0iY2DGi3G9Emqh/XnLBgYrkxBxy05JDUi/v+bz8NuDkA\nIHkKhzRLFY5ZEYklX9giIuyNPxEULhBY13Skgq8hB24tZi3yPADUE8jzOljz\nnyBJARbpunpOnmpCM8smeTBx01vE5cFACgddKPe5HeM2+MaqNWYUjO5N9GVD\nAvkZv3i/4Ap7836XxuiWDErMDK0WMyclaVXeRvsBxDMq3Rd4D1leTgz+1FKs\n849emi7Ojmfa7Vo6nRf6zty/yYVMck+/VNcKSITjoSEP7xyYdH+AuR7oT4C3\nvX84Twg+j+OSApgU/Za2IfO9NlA9Wvy3o/ibY9Ez/I9GtC9S6dV0aIlylsPO\n+f0dgujGVb9XWGSuEnWwfF0zBCOKdzu0P1LsG0AIlNFLNKQENBopIX5zOu/L\n+12b\r\n=hDKo\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIBRnTnkbRqePR/FUHleMXx0d/q4nQ/3hVgXcYE9hiaSIAiA6xnyf0zBYyv7kLyaBxdNIqO5VDf86mxwbVWz8ov9TKA==" + } + ] + }, + "maintainers": [ + { "email": "i@izs.me", "name": "isaacs" }, + { "email": "substack@gmail.com", "name": "substack" } + ], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_0.5.2_1584462448629_0.04027690349544977" + }, + "_hasShrinkwrap": false, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.5.3": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.3", + "publishConfig": { "tag": "legacy" }, + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "index.js", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git+https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "^1.2.5" }, + "devDependencies": { "mock-fs": "^3.7.0", "tap": "^5.4.2" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories that\n don't yet exist.\n \n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m, --mode If a directory needs to be created, set the mode as an octal\n permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "gitHead": "d784e70d1eb3fc73bcda52f22f57ec55c00c2525", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp#readme", + "_id": "mkdirp@0.5.3", + "_nodeVersion": "13.10.1", + "_npmVersion": "6.13.7", + "dist": { + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "shasum": "5a514b7179259287952881e94410ec5465659f8c", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.3.tgz", + "fileCount": 6, + "unpackedSize": 7559, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecPqyCRA9TVsSAnZWagAATvcQAJGnQf0PNBHPrlJoeNpR\n/fL18ar6/fwQ38/2W4IwITUclQb0xaV6r7lfIkOzveDx3DXOZI/EaTUBdVY9\nVuqozPcHgSVAxLrS+ScXBSp15lDXnqQwgYsE1AjG6S4EFepvTKjYQto9ZORg\nw4LVxupl5Yqw1+8bDTycXZ8DT9VZz0DB6/h75is27yRfbhpKIHyoH9e3lyOu\nR6pIa9A6cMK4ezM8otrr9V6OPej6h1vIMXW0nPCh4K5/7r6Ajqi83CH1BK5s\nBvNoto7cNOHUZQmKDrTsfxYo/zHXxbeY7oA6pwcg2ZKm124UtA7Vrds9HScO\nlqf5Uv7k80KdBJ7cNsoKJBBX0/wDbTD1YUY0gTcojsmFSwn6m22V2HOnpsd9\nyInBFo6/Rp9NSTH7xR/CVpSycnyCLy71KuEUfi5Rypvj46c5zapqMAxQ0b3c\nHKxlzVLTH36xpBLOq8MWh2ddWMZfL0XJA7iEPOHKfwSgO/WkT5/N6Qk2LZ8M\nqWk1L8p/g5tAVCmYCU4P/CXe0ka8XZ9ubqg76rD3XazDCULS0EStBnxY/XUE\ntzBXBXhVv9eeudtZgjWIBxNNPoEPrNsW3/1reX1ab10qdbz8BsIGNzYcZVSg\nEyIq8E5WtZ94Mr0b/Y99Ni9isCT/RySvYQ1BTnGLsvqaF4IH8YbHP+UDMYAQ\nKCkY\r\n=l2Wn\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIQDAbLB3WtXDK8zdqBHS0BGQYmK05wM2VnMHo8t7yjQiIQIgItzOhOVRxt4jkF1b/54gtnzSAOR13fWCestXGOt2/Yg=" + } + ] + }, + "maintainers": [ + { "email": "i@izs.me", "name": "isaacs" }, + { "email": "substack@gmail.com", "name": "substack" } + ], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_0.5.3_1584462513748_0.0257106127685085" + }, + "_hasShrinkwrap": false, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "0.5.4": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.4", + "publishConfig": { "tag": "legacy" }, + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "index.js", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git+https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "^1.2.5" }, + "devDependencies": { "mock-fs": "^3.7.0", "tap": "^5.4.2" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories that\n don't yet exist.\n \n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m, --mode If a directory needs to be created, set the mode as an octal\n permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "gitHead": "42a012cc6dbd4648790f380df88190bb697dbb9c", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp#readme", + "_id": "mkdirp@0.5.4", + "_nodeVersion": "13.10.1", + "_npmVersion": "6.13.7", + "dist": { + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "shasum": "fd01504a6797ec5c9be81ff43d204961ed64a512", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.4.tgz", + "fileCount": 6, + "unpackedSize": 7617, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeePd/CRA9TVsSAnZWagAAF9sQAKIMYrwLQQPHflBZSXKm\nkbTBW+owq0NpOT4vxuh65C0A2u4Q5+5cwB4h3e+qk9tEcboaABaP32qTYKy7\nsqILBVbDGsHE94Kmx+uuDjjEhWG3sQCuWNDzbu66SusRMyaBunhuW2y/t6GV\nuLgyF2qOdOLP9QJ8pKuaAuTux5Zv5F9LolfXWBrKHpqV2nqHVwRFzd/yq7zE\nWnDXT/MAEkRHH5xfIzNL0EQsi73WDfwkGNVXw5i8OvLwfvbZQo7zvdrbcwSP\nuD0OKRj2pmPmMGcuZsqKOWmxYZA4WDSD37aDS7Rw/hnCF55T4UU76ggbfr1M\n33w2aSipHgfpMCrUlYfpSRqWFENMzKmk3tPLb1DPkjmWvaKst0BR5UvC1Vqq\nHxhw+J9rVjojqgtMIo2Ihs/dMT/kuHv1BjlQ1zzucz1WtgCVvLRWs1W4RWdo\ni9tNml6YN2Cr0IqxpBRVHtAm26zHw8dQFUFG0Bmj671RNhWrL5igXDnVXk95\n/eSYtDoiaeIcwmTDrMHPmRIeNP+C8s362Th9FHofSd3qZ2wUlPL6LfEfIxs3\nudzrwdMtapwjMgJ8xoAfdJuIo/UecCvfXvRe/qjLDSe3ZcMh9EmYoO86inb8\nnSAzbBpCkzF4OzKwdL8v1HzywzXDA48acYwqFsDFHmYv8AHmQkRiIxBnXGsy\nM2UD\r\n=v0+5\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEUCIHPqenKL/xbhnMVpcCqesbuYx4gDSO57E9AfazY8kQCAAiEA9XYsL7nNfHVmJ5YkLIy8HHz23jSXPnhs3E/HFrb1YUA=" + } + ] + }, + "maintainers": [{ "email": "i@izs.me", "name": "isaacs" }], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_0.5.4_1584985983142_0.3659078906393478" + }, + "_hasShrinkwrap": false, + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)" + }, + "1.0.4": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "1.0.4", + "main": "index.js", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-mkdirp.git" + }, + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "tap": { "check-coverage": true, "coverage-map": "map.js" }, + "devDependencies": { "require-inject": "^1.4.4", "tap": "^14.10.7" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "engines": { "node": ">=10" }, + "gitHead": "b694079b54a0a59ef150c54b29c7c24e90d642f5", + "bugs": { "url": "https://github.com/isaacs/node-mkdirp/issues" }, + "homepage": "https://github.com/isaacs/node-mkdirp#readme", + "_id": "mkdirp@1.0.4", + "_nodeVersion": "13.10.1", + "_npmVersion": "6.14.4", + "dist": { + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "shasum": "3eb5ed62622756d79a5f0e2a221dfebad75c2f7e", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-1.0.4.tgz", + "fileCount": 12, + "unpackedSize": 19088, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeh2xNCRA9TVsSAnZWagAAFiMQAIeSoosHZP0eVV6P64NS\nnXRn6I82OfqeOhU9DmWKLO4csIwPiBfLE+ZL4C0bHxeWllyD1HJYB755v38Y\nG8g+GgdkCKeUDSGsL5kcVWXclMydN14FooYF5vjiXig+WNFevum7Ul8Sduvy\np+/o95aKK4Q2xu9JGEVFmmhRF7dKUsb1Q6npcDrdmrDODWHfKQ6t6DXDW3M/\nXYZ/UblSBLOQkiqDKpilB+WWbLe95KOk7pPX8v1dZR94h9RTVoVkDXXX3TLQ\nJAPJ1FrYcIWfBZS3OgbbWo3Baer97ysxBc9zDpXJC3gHbrRMDJnbhnvcxnt/\n41l7zwnPF9JX0gV2Ol8FUSvAfE7FWDQzlpqxfn13g+gPmU42RbKBh4fuhw63\nMTPcvxwjTrDkLecTcbvaNv9WtZN8mJyFhxzjvYPr24ewwsdxj0q7fTMHWMhX\n2edEhaQ1sJVQV49rSPwJwE7+mZK/2D1accQIPa4PdePLTC6LSzviAROJz8eB\ntrcRY5kS3rTJA+Kdw8vByeWV1/eavBMNJL69gdYBgKfX6E0WiXb0YdFSX9DB\njT4CoKYPPKjUrsQdO4NcPPRgmnAlHS9U5nIPbxAhn40eb9hTs9GgN3ZnZcgL\nr4LkQaku79npoNqW2vmxJSJ9axe2qUYE6OycAlKbGiHqP36k3e9GNcK7c9aU\npS9s\r\n=RHg1\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEYCIQDNuJhaaCaHNTxRGetPL84WE6k+gY1o8Coz5VmqOTt1QQIhANxhVGEedRGkz/XJ09hKdbosKA7vcaWhTzyAHJ8CNaSu" + } + ] + }, + "maintainers": [{ "email": "i@izs.me", "name": "isaacs" }], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_1.0.4_1585933388669_0.38878898110354276" + }, + "_hasShrinkwrap": false + }, + "0.5.5": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.5", + "publishConfig": { "tag": "legacy" }, + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "index.js", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git+https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "^1.2.5" }, + "devDependencies": { "mock-fs": "^3.7.0", "tap": "^5.4.2" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories that\n don't yet exist.\n \n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m, --mode If a directory needs to be created, set the mode as an octal\n permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "gitHead": "049cf185c9e91727bc505b796a2d16a4fe70d64d", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp#readme", + "_id": "mkdirp@0.5.5", + "_nodeVersion": "13.10.1", + "_npmVersion": "6.14.4", + "dist": { + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "shasum": "d91cefd62d1436ca0f41620e251288d420099def", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.5.tgz", + "fileCount": 6, + "unpackedSize": 7531, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeh256CRA9TVsSAnZWagAAlzoP/iLuWMWGqLMB70xGqJjf\nCnzJKbwcC2F1ek5f5gL7VLncqA5AoOER5pGmiLw9AhDFU/CK40uutHnujivh\nBNuO+uoweFrBsgS0bKCUBdSWzVABItvv3eJ2l6j7s9mbhiZgmu7weOT0WMcs\nZi1nmsMDeyqxCZUIwz2FJFOlU3QdaiuaXCnW8L/VaxdwUgy7rlLbu4qCKYlP\n8IdkkSUpXksaw6KE7QfFOmc+lM62CaNxIzto/B03ovHaUAUQrAeow8Ly/n8j\nhg+CiTScKeBvjKwMskoeYdV56cDsMQLyLLivlQt+AMN2KcHcE0qqvsvgxGwe\nBXTfvW9hpVsYLj6rICcMkU9yHSRlRkQ4fAInXSwvpzzzIPfavd9zSuFbyMsF\nzcZBEgZu0gbilehWhwwvTZ3Bd8WwxliKnkfgVLN+cOO69JSXJCXwIA7n3N06\nGQVKrGqDkLfKD6nSHy8krDknY0MvOhCDcwy2fNh1IdWMFnmF80x5Huhmxr55\npTkwxQr3IGOyePRqu5B2pXIW7HscnAerXAkccyX/FzmUlw3UIaPlPjNnUJDR\nopPRUYOAMHkg0LtrtVnPQCK0YU+siUzIDSjXnYV/fR0416r+RQXhemdgO6Ey\nqx8tIHVSvdKBLOaCzZYuqkDOIJgWC/qwCudv3Hxbj1gwEcCb3X5IvoK/1ok3\nt18G\r\n=XnRj\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIAyOMjxgaCuZrTxxNZzCeH6m2ulH5/y5hazB+iSO+XAUAiB7O2mTbf4XYm80di/EW5Uih9K30BR6DHgeJU2VO1AEGQ==" + } + ] + }, + "maintainers": [{ "email": "i@izs.me", "name": "isaacs" }], + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_0.5.5_1585933946291_0.6504650567992927" + }, + "_hasShrinkwrap": false + }, + "0.5.6": { + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.6", + "publishConfig": { "tag": "legacy" }, + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "index.js", + "keywords": ["mkdir", "directory"], + "repository": { + "type": "git", + "url": "git+https://github.com/substack/node-mkdirp.git" + }, + "scripts": { "test": "tap test/*.js" }, + "dependencies": { "minimist": "^1.2.6" }, + "devDependencies": { "tap": "^16.0.1" }, + "bin": { "mkdirp": "bin/cmd.js" }, + "license": "MIT", + "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories that\n don't yet exist.\n \n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m, --mode If a directory needs to be created, set the mode as an octal\n permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n", + "readmeFilename": "readme.markdown", + "gitHead": "92f086d2e28c6848951776fbe8ecadcf54c80c29", + "bugs": { "url": "https://github.com/substack/node-mkdirp/issues" }, + "homepage": "https://github.com/substack/node-mkdirp#readme", + "_id": "mkdirp@0.5.6", + "_nodeVersion": "17.6.0", + "_npmVersion": "8.5.3", + "dist": { + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "shasum": "7def03d2432dcae4ba1d611445c48396062255f6", + "tarball": "http://localhost:4545/npm/registry/mkdirp/mkdirp-0.5.6.tgz", + "fileCount": 6, + "unpackedSize": 7688, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiOmA/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqmkBAAo8qxsdtWDWH93Zld3CvA9oCCnBG8dUjrmESZJ55xUvtGfgG/\r\nIBfnNB1vhJslO6RvGQtb4yOUJ9B05dm6C+UXgIBaLpan+hXfPlnGEHOBYd/p\r\nLUaAUsvuMkae82291zZ64n940YfEVUEWDCGF0sCvyxn8PSz/P0E0MCUmgskk\r\n6v+zvG97veWGPPH41CW9SUe6lzw4bunaRIJAr2nktLQjK391NlctJKbklhPy\r\nLVfzJsnHVP0rWjrGZBExywIm4Uzp6eb5yMx4TNEPa9HeXusuwBzEew7CNSEB\r\ngvSf+w6TsoQIgeprQqWklSwHeDWeOgOaIMCaX1UFgzEzC+3YrHMBcwz14dH9\r\n5p3jTq+QC1+PRJa/0ohmdu9vGTFvO9fhrdzpHfsQxTCcskaphslBDf11v9BI\r\nju37bOXztCMC4ZUpLGLTqJil8OCo9aRfuY6LoT7KxHSIqBRQsLahrRT8+SIO\r\n4ecjLd5EczUPh1ugp3eQtyMf3SXFtIU24E/Du/xF745+M4fADE8uZC162aFh\r\nGFCkqSScw8nNLjwVvjwLH2E0N7d+lLs1QliShE925EH8U9bA2P4svSL/6thu\r\nQs8pZTqH0fQ//GsasuKJQBM5f+EzFCZlywprAfpIOiOGIbOULzVRs+Fdk4AM\r\nLpkGPdicU5FWBsk+nybYXOW1SuM0ATZGJ8U=\r\n=dgxS\r\n-----END PGP SIGNATURE-----\r\n", + "signatures": [ + { + "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA", + "sig": "MEQCIGp8gRGHAk1oGjmM+vufuiMPMuG9W1dtGZ5lB4/VS2wCAiAVEZaPZLMogqxTio0VsNqZryQ7lhWUYeMNCR+nob1q1Q==" + } + ] + }, + "_npmUser": { "name": "isaacs", "email": "i@izs.me" }, + "directories": {}, + "maintainers": [{ "name": "isaacs", "email": "i@izs.me" }], + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mkdirp_0.5.6_1647992894912_0.4921061677907226" + }, + "_hasShrinkwrap": false + } + }, + "maintainers": [{ "name": "isaacs", "email": "i@izs.me" }], + "time": { + "modified": "2022-06-19T23:29:13.770Z", + "created": "2011-01-06T02:54:36.080Z", + "0.0.1": "2011-01-06T02:54:36.496Z", + "0.0.2": "2011-02-14T20:11:44.988Z", + "0.0.3": "2011-06-20T04:02:44.361Z", + "0.0.4": "2011-06-29T00:28:32.272Z", + "0.0.5": "2011-06-29T18:22:05.839Z", + "0.0.6": "2011-08-20T21:37:10.730Z", + "0.0.7": "2011-09-10T22:50:08.879Z", + "0.1.0": "2011-11-06T06:32:23.379Z", + "0.2.0": "2011-11-16T05:32:17.036Z", + "0.2.1": "2011-11-16T09:26:51.089Z", + "0.2.2": "2012-01-08T05:02:35.484Z", + "0.3.0": "2012-01-20T02:20:42.042Z", + "0.3.1": "2012-03-31T19:51:38.912Z", + "0.3.2": "2012-04-30T08:52:12.424Z", + "0.3.3": "2012-06-05T15:54:31.889Z", + "0.3.4": "2012-08-20T12:27:24.983Z", + "0.3.5": "2013-02-22T11:44:25.486Z", + "0.4.0": "2014-04-22T22:21:21.058Z", + "0.4.1": "2014-05-04T02:20:59.368Z", + "0.4.2": "2014-05-06T01:40:35.608Z", + "0.5.0": "2014-05-06T02:28:23.769Z", + "0.5.1": "2015-05-14T02:27:01.553Z", + "1.0.0": "2020-01-24T20:18:42.630Z", + "1.0.1": "2020-01-24T20:20:30.453Z", + "1.0.2": "2020-01-24T20:22:50.327Z", + "1.0.3": "2020-01-24T21:00:54.556Z", + "0.5.2": "2020-03-17T16:27:28.746Z", + "0.5.3": "2020-03-17T16:28:33.897Z", + "0.5.4": "2020-03-23T17:53:03.257Z", + "1.0.4": "2020-04-03T17:03:08.825Z", + "0.5.5": "2020-04-03T17:12:26.436Z", + "0.5.6": "2022-03-22T23:48:15.108Z" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/node-mkdirp.git" + }, + "users": { + "pid": true, + "dodo": true, + "tellnes": true, + "fgribreau": true, + "jswartwood": true, + "m42am": true, + "superjoe": true, + "chrisdickinson": true, + "michaelnisi": true, + "dannydulai": true, + "dbrockman": true, + "jpoehls": true, + "chilts": true, + "jamesmgreene": true, + "forbeslindesay": true, + "mvolkmann": true, + "kastor": true, + "florianwendelborn": true, + "werle": true, + "pana": true, + "isaacs": true, + "polotek": true, + "timur.shemsedinov": true, + "jacques": true, + "cilindrox": true, + "greelgorke": true, + "esundahl": true, + "alanbhamilton": true, + "coderaiser": true, + "seldo": true, + "tarcio": true, + "biggora": true, + "jifeng": true, + "leventkaragol": true, + "maxzhang": true, + "cocopas": true, + "peterbeno": true, + "jacoborus": true, + "zeusdeux": true, + "redmed": true, + "jacksontian": true, + "solodu": true, + "davidrlee": true, + "sdolard": true, + "krry": true, + "tchey": true, + "atd": true, + "fill": true, + "omrilotan": true, + "pingjiang": true, + "bmpvieira": true, + "buster": true, + "yourhoneysky": true, + "asantiago": true, + "caudralys": true, + "ali1k": true, + "peckzeg": true, + "shieldax": true, + "ryanj": true, + "mihaiv": true, + "lupus": true, + "ycloud": true, + "nayrangnu": true, + "larixk": true, + "masonwan": true, + "f124275809": true, + "cellule": true, + "pdilyard": true, + "hzapata": true, + "tmypawa": true, + "benoror": true, + "mpcref": true, + "kulakowka": true, + "trusktr": true, + "jakeginnivan": true, + "pnevares": true, + "seanjh": true, + "pstoev": true, + "subchen": true, + "schnittstabil": true, + "rbartoli": true, + "shaneli": true, + "itonyyo": true, + "icirellik": true, + "akiva": true, + "mysticatea": true, + "kelerliao": true, + "wangnan0610": true, + "mjwilliams": true, + "jasoncmcg": true, + "nwinant": true, + "khaledkaram": true, + "marcghorayeb": true, + "elrolito": true, + "shriek": true, + "garrickajo": true, + "ddffx": true, + "mattms": true, + "axelav": true, + "ocd_lionel": true, + "kappuccino": true, + "emiljohansson": true, + "pirijan": true, + "ugarz": true, + "nice_body": true, + "sixertoy": true, + "mikend": true, + "nketchum": true, + "evan2x": true, + "jasonevrtt": true, + "parkerproject": true, + "gamr": true, + "incendiary": true, + "alectic": true, + "anhulife": true, + "galenandrew": true, + "rwhogg": true, + "jermspeaks": true, + "snowdream": true, + "pandao": true, + "wkaifang": true, + "dongxu": true, + "h0ward": true, + "kikna": true, + "ambdxtrch": true, + "flozz": true, + "ericwbailey": true, + "leahcimic": true, + "bojand": true, + "hacksalot": true, + "bjmin": true, + "sammkj": true, + "dolymood": true, + "behrangsa": true, + "acewinnielee": true, + "coolhanddev": true, + "kontrax": true, + "dankle": true, + "grantcarthew": true, + "kmck": true, + "vutran": true, + "donvercety": true, + "chris-me": true, + "bwade231": true, + "baoang": true, + "nhz.io": true, + "zoxon": true, + "klombomb": true, + "rwnet": true, + "igorpupkinable": true, + "spanser": true, + "zhouanbo": true, + "recursion_excursion": true, + "teaera": true, + "guananddu": true, + "potnox": true, + "fleischer": true, + "spacerockzero": true, + "xieranmaya": true, + "daip": true, + "farskipper": true, + "james3299": true, + "nickytonline": true, + "joneszhuchinagd": true, + "manxisuo": true, + "morrelinko": true, + "junjiansyu": true, + "ivanempire": true, + "jgrl": true, + "superchenney": true, + "hingsir": true, + "kempfcreative": true, + "nickeltobias": true, + "marsking": true, + "amdsouza92": true, + "lotuslwb": true, + "razr9": true, + "unapersona": true, + "i-erokhin": true, + "miga": true, + "programmer.severson": true, + "raigorx": true, + "aicest": true, + "csbun": true, + "narven": true, + "zhoutk": true, + "davidnyhuis": true, + "wuyangwang": true, + "sqrtthree": true, + "troygizzi": true, + "eijs": true, + "qddegtya": true, + "yangtze": true, + "jhal81": true, + "ahvonenj": true, + "mojaray2k": true, + "chazmatazz": true, + "rocket0191": true, + "langri-sha": true, + "anchnk": true, + "honingwon": true, + "jaeger": true, + "rylan_yan": true, + "bobxuyang": true, + "tangweikun": true, + "seangenabe": true, + "tancy": true, + "weerd": true, + "tmurngon": true, + "makediff": true, + "joris-van-der-wel": true, + "stretchgz": true, + "aravindnc": true, + "jimzhuangdev": true, + "fouadsemaan": true, + "daizch": true, + "abdihaikal": true, + "chirag8642": true, + "nachbar90": true, + "soulchainer": true, + "allenmoore": true, + "gberto": true, + "x372563572": true, + "dockawash": true, + "cygik": true, + "shuoshubao": true, + "shaomingquan": true, + "yong_a": true, + "ognjen.jevremovic": true, + "junos": true, + "yikuo": true, + "tazjel": true, + "jeremyscalpello": true, + "theaklair": true, + "omegga": true, + "chinawolf_wyp": true, + "xueboren": true, + "stefano_magrassi": true, + "kevinhassan": true, + "cloudychris": true, + "pablopap": true, + "rxmth": true, + "pmbenjamin": true, + "papasavva": true, + "sibawite": true, + "icris": true, + "pddivine": true, + "nisimjoseph": true, + "santhoshbabu": true, + "jon_shen": true, + "nbuchanan": true, + "xingtao": true, + "land-melon": true, + "someok": true, + "raycharles": true, + "shreyawhiz": true, + "princetoad": true, + "tedyhy": true, + "liangtongzhuo": true, + "madsummer": true, + "drdoof": true, + "prayashm": true, + "manojkhannakm": true, + "yl2014": true, + "jasonmelgoza": true, + "lukvonstrom": true, + "wangfeia": true, + "thangakumar": true, + "neo1": true, + "marcfiedler": true, + "didierfranc": true, + "whathejoe": true, + "abuelwafa": true, + "xfloops": true, + "noccer": true, + "d-band": true, + "largepuma": true, + "dm7": true, + "isayme": true, + "faraoman": true, + "bsdllc": true, + "npm-packages": true, + "tonerbarato": true, + "vision_tecnologica": true, + "maycon_ribeiro": true, + "zhenguo.zhao": true, + "suryasaripalli": true, + "iceriver2": true, + "colageno": true, + "colleowino": true, + "gemini5": true, + "robinblomberg": true, + "jream": true, + "thomas.miele": true, + "vapeadores": true, + "krabello": true, + "xtygah14three": true, + "zhouguotao": true, + "lijsh": true, + "kkho595": true, + "rethinkflash": true, + "spanishtights": true, + "highgravity": true, + "asw20": true, + "nilz3ro": true, + "banzeh": true, + "zollero": true, + "rochejul": true, + "araiden10": true, + "cueedee": true, + "tcrowe": true, + "shiva127": true, + "vorg": true, + "stormcrows": true, + "alexc1212": true, + "gamersdelight": true, + "tdmalone": true, + "jmoser-amr": true, + "zuojiang": true, + "neaker15668": true, + "marcovossen": true, + "xtx1130": true, + "jorycn": true, + "iainhallam": true, + "khaihoangdev": true, + "tienda_sexstar": true, + "azulejosmetrosubway": true, + "yakumat": true, + "edwardxyt": true, + "tomgao365": true, + "netoperatorwibby": true, + "laoshaw": true, + "pftom": true, + "nrrb": true, + "alicebox": true, + "axelrindle": true, + "heartnett": true, + "wisetc": true, + "wujianfu": true, + "diogocapela": true, + "zhealth": true, + "markh817": true, + "xiaobing": true, + "waiwaiku": true, + "bcowgi11": true + }, + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "license": "MIT", + "readme": "", + "readmeFilename": "", + "homepage": "https://github.com/isaacs/node-mkdirp#readme", + "bugs": { "url": "https://github.com/isaacs/node-mkdirp/issues" } +} diff --git a/cli/tools/bench.rs b/cli/tools/bench.rs index 3d52e4226..ccff3d615 100644 --- a/cli/tools/bench.rs +++ b/cli/tools/bench.rs @@ -362,7 +362,8 @@ async fn bench_specifier( ps.options.unstable(), )], Default::default(), - ); + ) + .await?; worker.run_bench_specifier().await } diff --git a/cli/tools/test.rs b/cli/tools/test.rs index da44eba7c..265b39b57 100644 --- a/cli/tools/test.rs +++ b/cli/tools/test.rs @@ -723,7 +723,8 @@ async fn test_specifier( stdout: StdioPipe::File(sender.stdout()), stderr: StdioPipe::File(sender.stderr()), }, - ); + ) + .await?; worker.run_test_specifier(mode).await } diff --git a/cli/worker.rs b/cli/worker.rs index b2cc508bb..2069690e0 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -10,6 +10,7 @@ use deno_core::located_script_name; use deno_core::serde_json::json; use deno_core::Extension; use deno_core::ModuleId; +use deno_graph::source::ResolveResponse; use deno_runtime::colors; use deno_runtime::ops::worker_host::CreateWebWorkerCb; use deno_runtime::ops::worker_host::WorkerEventCb; @@ -26,6 +27,7 @@ use crate::errors; use crate::fmt_errors::format_js_error; use crate::module_loader::CliModuleLoader; use crate::node; +use crate::npm::NpmPackageReference; use crate::ops; use crate::proc_state::ProcState; use crate::tools; @@ -35,6 +37,7 @@ use crate::version; pub struct CliMainWorker { main_module: ModuleSpecifier, + is_main_cjs: bool, worker: MainWorker, ps: ProcState, } @@ -99,8 +102,14 @@ impl CliMainWorker { true, )?; } + } else if self.is_main_cjs { + node::initialize_runtime(&mut self.worker.js_runtime).await?; + node::load_cjs_module_from_ext_node( + &mut self.worker.js_runtime, + &self.main_module.to_file_path().unwrap().to_string_lossy(), + true, + )?; } else { - // Regular ES module execution self.execute_main_module_possibly_with_npm().await?; } @@ -438,13 +447,31 @@ impl CliMainWorker { } } -pub fn create_main_worker( +pub async fn create_main_worker( ps: &ProcState, main_module: ModuleSpecifier, permissions: Permissions, mut custom_extensions: Vec<Extension>, stdio: deno_runtime::ops::io::Stdio, -) -> CliMainWorker { +) -> Result<CliMainWorker, AnyError> { + let (main_module, is_main_cjs) = if let Ok(package_ref) = + NpmPackageReference::from_specifier(&main_module) + { + ps.npm_resolver + .add_package_reqs(vec![package_ref.req.clone()]) + .await?; + ps.npm_resolver.cache_packages().await?; + ps.prepare_node_std_graph().await?; + let resolve_response = node::node_resolve_binary_export( + &package_ref.req, + package_ref.sub_path.as_deref(), + &ps.npm_resolver, + )?; + let is_main_cjs = matches!(resolve_response, ResolveResponse::CommonJs(_)); + (resolve_response.to_result()?, is_main_cjs) + } else { + (main_module, false) + }; let module_loader = CliModuleLoader::new(ps.clone()); let maybe_inspector_server = ps.maybe_inspector_server.clone(); @@ -518,11 +545,12 @@ pub fn create_main_worker( permissions, options, ); - CliMainWorker { + Ok(CliMainWorker { main_module, + is_main_cjs, worker, ps: ps.clone(), - } + }) } fn create_web_worker_preload_module_callback( diff --git a/ext/node/02_require.js b/ext/node/02_require.js index 1fcd0167c..d71ea611a 100644 --- a/ext/node/02_require.js +++ b/ext/node/02_require.js @@ -403,11 +403,14 @@ paths.push(denoDirPath); } } - paths.push(...ops.op_require_resolve_lookup_paths( + const lookupPathsResult = ops.op_require_resolve_lookup_paths( request, parent?.paths, parent?.filename ?? "", - )); + ); + if (lookupPathsResult) { + paths.push(...lookupPathsResult); + } return paths; }; diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs index 038045a5c..1e80c0d1d 100644 --- a/test_util/src/lib.rs +++ b/test_util/src/lib.rs @@ -963,7 +963,7 @@ async fn main_server( return Ok(file_resp); } else if should_download_npm_packages() { if let Err(err) = - download_npm_registry_file(&file_path, is_tarball).await + download_npm_registry_file(req.uri(), &file_path, is_tarball).await { return Response::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) @@ -992,15 +992,21 @@ fn should_download_npm_packages() -> bool { } async fn download_npm_registry_file( + uri: &hyper::Uri, file_path: &PathBuf, is_tarball: bool, ) -> Result<(), anyhow::Error> { - let package_name = file_path - .parent() - .unwrap() - .file_name() + let url_parts = uri + .path() + .strip_prefix("/npm/registry/") .unwrap() - .to_string_lossy(); + .split('/') + .collect::<Vec<_>>(); + let package_name = if url_parts[0].starts_with('@') { + url_parts.into_iter().take(2).collect::<Vec<_>>().join("/") + } else { + url_parts.into_iter().take(1).collect::<Vec<_>>().join("/") + }; let url = if is_tarball { let file_name = file_path.file_name().unwrap().to_string_lossy(); format!( |