summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/compat/mod.rs18
-rw-r--r--cli/lsp/testing/execution.rs3
-rw-r--r--cli/main.rs26
-rw-r--r--cli/node/analyze.rs30
-rw-r--r--cli/node/mod.rs83
-rw-r--r--cli/npm/mod.rs1
-rw-r--r--cli/npm/registry.rs97
-rw-r--r--cli/npm/resolution.rs89
-rw-r--r--cli/npm/version_req.rs219
-rw-r--r--cli/proc_state.rs16
-rw-r--r--cli/tests/integration/npm_tests.rs37
-rw-r--r--cli/tests/testdata/npm/cjs_sub_path/main.js2
-rw-r--r--cli/tests/testdata/npm/cjs_with_deps/main.js2
-rw-r--r--cli/tests/testdata/npm/deno_run_non_existent.out2
-rw-r--r--cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgzbin0 -> 6665 bytes
-rw-r--r--cli/tests/testdata/npm/registry/mkdirp/registry.json1865
-rw-r--r--cli/tools/bench.rs3
-rw-r--r--cli/tools/test.rs3
-rw-r--r--cli/worker.rs38
-rw-r--r--ext/node/02_require.js7
-rw-r--r--test_util/src/lib.rs18
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
new file mode 100644
index 000000000..bf8eca6e2
--- /dev/null
+++ b/cli/tests/testdata/npm/registry/mkdirp/mkdirp-1.0.4.tgz
Binary files differ
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[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](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[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](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[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](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[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](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[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](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!(