0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

feat: support npm specifiers in deno info for display text output only (#16470)

This commit is contained in:
David Sherret 2022-10-28 16:19:55 -04:00 committed by GitHub
parent 2c674dcd20
commit edaceecec7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 591 additions and 556 deletions

View file

@ -1212,6 +1212,7 @@ TypeScript compiler cache: Subdirectory containing TS compiler output.",
.arg(no_config_arg())
.arg(config_arg())
.arg(import_map_arg())
.arg(local_npm_arg())
.arg(
Arg::new("json")
.long("json")
@ -2512,6 +2513,7 @@ fn info_parse(flags: &mut Flags, matches: &clap::ArgMatches) {
import_map_arg_parse(flags, matches);
location_arg_parse(flags, matches);
ca_file_arg_parse(flags, matches);
local_npm_args_parse(flags, matches);
let json = matches.is_present("json");
flags.subcommand = DenoSubcommand::Info(InfoFlags {
file: matches.value_of("file").map(|f| f.to_string()),

View file

@ -1,7 +1,8 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
use deno_core::anyhow::Context;
use deno_core::error::{uri_error, AnyError};
use deno_core::error::uri_error;
use deno_core::error::AnyError;
pub use deno_core::normalize_path;
use deno_core::ModuleSpecifier;
use deno_runtime::deno_crypto::rand;
@ -9,8 +10,11 @@ use deno_runtime::deno_node::PathClean;
use std::borrow::Cow;
use std::env::current_dir;
use std::fs::OpenOptions;
use std::io::{Error, ErrorKind, Write};
use std::path::{Path, PathBuf};
use std::io::Error;
use std::io::ErrorKind;
use std::io::Write;
use std::path::Path;
use std::path::PathBuf;
use walkdir::WalkDir;
pub fn atomic_write_file<T: AsRef<[u8]>>(
@ -573,6 +577,20 @@ pub fn root_url_to_safe_local_dirname(root: &ModuleSpecifier) -> PathBuf {
result
}
/// Gets the total size (in bytes) of a directory.
pub fn dir_size(path: &Path) -> std::io::Result<u64> {
let entries = std::fs::read_dir(path)?;
let mut total = 0;
for entry in entries {
let entry = entry?;
total += match entry.metadata()? {
data if data.is_dir() => dir_size(&entry.path())?,
data => data.len(),
};
}
Ok(total)
}
#[cfg(test)]
mod tests {
use super::*;

View file

@ -697,6 +697,13 @@ impl NpmResolution {
Ok(snapshot)
}
pub fn resolve_package_from_id(
&self,
id: &NpmPackageId,
) -> Option<NpmResolutionPackage> {
self.snapshot.read().package_from_id(id).cloned()
}
pub fn resolve_package_from_package(
&self,
name: &str,

View file

@ -15,6 +15,7 @@ use crate::lockfile::Lockfile;
use crate::npm::cache::should_sync_download;
use crate::npm::resolution::NpmResolutionSnapshot;
use crate::npm::NpmCache;
use crate::npm::NpmPackageId;
use crate::npm::NpmPackageReq;
use crate::npm::NpmResolutionPackage;
@ -36,6 +37,8 @@ pub trait InnerNpmPackageResolver: Send + Sync {
specifier: &ModuleSpecifier,
) -> Result<PathBuf, AnyError>;
fn package_size(&self, package_id: &NpmPackageId) -> Result<u64, AnyError>;
fn has_packages(&self) -> bool;
fn add_package_reqs(

View file

@ -15,6 +15,7 @@ use deno_core::url::Url;
use deno_runtime::deno_node::PackageJson;
use deno_runtime::deno_node::TYPES_CONDITIONS;
use crate::fs_util;
use crate::lockfile::Lockfile;
use crate::npm::resolution::NpmResolution;
use crate::npm::resolution::NpmResolutionSnapshot;
@ -110,6 +111,11 @@ impl InnerNpmPackageResolver for GlobalNpmPackageResolver {
Ok(self.package_folder(&pkg_id))
}
fn package_size(&self, package_id: &NpmPackageId) -> Result<u64, AnyError> {
let package_folder = self.package_folder(package_id);
Ok(fs_util::dir_size(&package_folder)?)
}
fn has_packages(&self) -> bool {
self.resolution.has_packages()
}

View file

@ -177,6 +177,22 @@ impl InnerNpmPackageResolver for LocalNpmPackageResolver {
Ok(package_root_path)
}
fn package_size(&self, package_id: &NpmPackageId) -> Result<u64, AnyError> {
match self.resolution.resolve_package_from_id(package_id) {
Some(package) => Ok(fs_util::dir_size(
// package is stored at:
// node_modules/.deno/<package_id>/node_modules/<package_name>
&self
.root_node_modules_path
.join(".deno")
.join(package.id.to_string())
.join("node_modules")
.join(package.id.name),
)?),
None => bail!("Could not find package folder for '{}'", package_id),
}
}
fn has_packages(&self) -> bool {
self.resolution.has_packages()
}

View file

@ -27,6 +27,7 @@ use crate::lockfile::Lockfile;
use self::common::InnerNpmPackageResolver;
use self::local::LocalNpmPackageResolver;
use super::NpmCache;
use super::NpmPackageId;
use super::NpmPackageReq;
use super::NpmRegistryApi;
use super::NpmResolutionSnapshot;
@ -212,6 +213,14 @@ impl NpmPackageResolver {
Ok(path)
}
/// Attempts to get the package size in bytes.
pub fn package_size(
&self,
package_id: &NpmPackageId,
) -> Result<u64, AnyError> {
self.inner.package_size(package_id)
}
/// Gets if the provided specifier is in an npm package.
pub fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool {
self
@ -301,10 +310,14 @@ impl NpmPackageResolver {
self.unstable,
self.no_npm,
self.local_node_modules_path.clone(),
Some(self.inner.snapshot()),
Some(self.snapshot()),
)
}
pub fn snapshot(&self) -> NpmResolutionSnapshot {
self.inner.snapshot()
}
pub fn lock(&self, lockfile: &mut Lockfile) -> Result<(), AnyError> {
self.inner.lock(lockfile)
}

View file

@ -733,6 +733,31 @@ itest!(compile_errors {
http_server: true,
});
itest!(info_chalk {
args: "info --quiet --unstable npm/cjs_with_deps/main.js",
output: "npm/cjs_with_deps/main.info.out",
exit_code: 0,
envs: env_vars(),
http_server: true,
});
itest!(info_chalk_node_modules_dir {
args: "info --quiet --unstable --node-modules-dir $TESTDATA/npm/cjs_with_deps/main.js",
output: "npm/cjs_with_deps/main.info.out",
exit_code: 0,
envs: env_vars(),
http_server: true,
temp_cwd: true,
});
itest!(info_cli_chalk {
args: "info --quiet --unstable npm:chalk@4",
output: "npm/deno_info_chalk.out",
exit_code: 0,
envs: env_vars(),
http_server: true,
});
fn env_vars_no_sync_download() -> Vec<(String, String)> {
vec![
("DENO_NODE_COMPAT_URL".to_string(), util::std_file_url()),

View file

@ -1,6 +1,7 @@
local: [WILDCARD]https[WILDCARD]localhost_PORT5545[WILDCARD]
type: TypeScript
dependencies: 8 unique (total [WILDCARD])
dependencies: 8 unique
size: [WILDCARD]
https://localhost:5545/cert/cafile_info.ts ([WILDCARD])
├── https://localhost:5545/subdir/mt_application_ecmascript.j2.js ([WILDCARD])

View file

@ -1,5 +1,7 @@
[WILDCARD]
local: [WILDCARD]031_info_ts_error.ts
type: TypeScript
dependencies: 0 unique (total [WILDCARD])
dependencies: 0 unique
size: [WILDCARD]
[WILDCARD]031_info_ts_error.ts ([WILDCARD])

View file

@ -1,7 +1,8 @@
[WILDCARD]
local: [WILDCARD]http[WILDCARD]127.0.0.1_PORT4545[WILDCARD]
type: TypeScript
dependencies: 8 unique (total [WILDCARD])
dependencies: 8 unique
size: [WILDCARD]
http://127.0.0.1:4545/run/048_media_types_jsx.ts ([WILDCARD])
├── http://localhost:4545/subdir/mt_application_ecmascript_jsx.j2.jsx ([WILDCARD])

View file

@ -1,6 +1,7 @@
local: [WILDCARD]005_more_imports.ts
type: TypeScript
dependencies: 3 unique (total [WILDCARD])
dependencies: 3 unique
size: [WILDCARD]
file://[WILDCARD]/005_more_imports.ts ([WILDCARD])
└─┬ file://[WILDCARD]/subdir/mod1.ts ([WILDCARD])

View file

@ -1,5 +1,7 @@
[WILDCARD]
local: [WILDCARD]test.ts
type: TypeScript
dependencies: 7 unique (total [WILDCARD])
dependencies: 7 unique
size: [WILDCARD]
[WILDCARD]

View file

@ -1,6 +1,7 @@
local: [WILDCARD]mod.ts
type: TypeScript
dependencies: 1 unique (total [WILDCARD])
dependencies: 1 unique
size: [WILDCARD]
file://[WILDCARD]/mod.ts ([WILDCARD])
└── file://[WILDCARD]/types.d.ts ([WILDCARD])

View file

@ -1,6 +1,7 @@
local: [WILDCARD]error_009_missing_js_module.js
type: JavaScript
dependencies: 0 unique (total 26B)
dependencies: 0 unique
size: 26B
file://[WILDCARD]/error_009_missing_js_module.js (26B)
└── file://[WILDCARD]/bad-module.js (missing)

View file

@ -1,6 +1,7 @@
local: [WILDCARD]info_recursive_imports_test.ts
type: TypeScript
dependencies: 4 unique (total [WILDCARD])
dependencies: 4 unique
size: [WILDCARD]
file://[WILDCARD]/info_recursive_imports_test.ts ([WILDCARD])
└─┬ file://[WILDCARD]/recursive_imports/A.ts ([WILDCARD])

View file

@ -1,5 +1,7 @@
local: [WILDCARD]info_type_import.ts
type: TypeScript
dependencies: 1 unique (total [WILDCARD])
dependencies: 1 unique
size: [WILDCARD]
[WILDCARD]info_type_import.ts ([WILDCARD])
└── [WILDCARD]type_and_code.ts ([WILDCARD])

View file

@ -1,7 +1,8 @@
[WILDCARD]
local: [WILDCARD]http[WILDCARD]127.0.0.1_PORT4545[WILDCARD]
type: TypeScript
dependencies: 8 unique (total [WILDCARD])
dependencies: 8 unique
size: [WILDCARD]
http://127.0.0.1:4545/run/019_media_types.ts ([WILDCARD])
├── http://localhost:4545/subdir/mt_application_ecmascript.j2.js ([WILDCARD])

View file

@ -1,7 +1,8 @@
[WILDCARD]
local: [WILDCARD]type_directives_01.ts
type: TypeScript
dependencies: 2 unique (total [WILDCARD])
dependencies: 2 unique
size: [WILDCARD]
[WILDCARD]/type_directives_01.ts ([WILDCARD])
└─┬ http://127.0.0.1:4545/xTypeScriptTypes.js ([WILDCARD])

View file

@ -1,6 +1,7 @@
Warning the configuration file "[WILDCARD]/deno-override.json" contains an entry for "importMap" that is being ignored.
local: [WILDCARD]test.ts
type: TypeScript
dependencies: 0 unique (total [WILDCARD])
dependencies: 0 unique
size: [WILDCARD]
file:///[WILDCARD]/test.ts ([WILDCARD])

View file

@ -0,0 +1,22 @@
local: [WILDCARD]main.js
type: JavaScript
dependencies: 14 unique
size: [WILDCARD]
file:///[WILDCARD]/npm/cjs_with_deps/main.js ([WILDCARD])
├─┬ npm:chai@4.3 - 4.3.6 ([WILDCARD])
│ ├── npm:assertion-error@1.1.0 ([WILDCARD])
│ ├── npm:check-error@1.0.2 ([WILDCARD])
│ ├─┬ npm:deep-eql@3.0.1 ([WILDCARD])
│ │ └── npm:type-detect@4.0.8 ([WILDCARD])
│ ├── npm:get-func-name@2.0.0 ([WILDCARD])
│ ├─┬ npm:loupe@2.3.4 ([WILDCARD])
│ │ └── npm:get-func-name@2.0.0 ([WILDCARD])
│ ├── npm:pathval@1.1.1 ([WILDCARD])
│ └── npm:type-detect@4.0.8 ([WILDCARD])
└─┬ npm:chalk@4 - 4.1.2 ([WILDCARD])
├─┬ npm:ansi-styles@4.3.0 ([WILDCARD])
│ └─┬ npm:color-convert@2.0.1 ([WILDCARD])
│ └── npm:color-name@1.1.4 ([WILDCARD])
└─┬ npm:supports-color@7.2.0 ([WILDCARD])
└── npm:has-flag@4.0.0 ([WILDCARD])

View file

@ -0,0 +1,10 @@
type: Unknown
dependencies: 5 unique
size: [WILDCARD]
npm:chalk@4 - 4.1.2 ([WILDCARD])
├─┬ npm:ansi-styles@4.3.0 ([WILDCARD])
│ └─┬ npm:color-convert@2.0.1 ([WILDCARD])
│ └── npm:color-name@1.1.4 ([WILDCARD])
└─┬ npm:supports-color@7.2.0 ([WILDCARD])
└── npm:has-flag@4.0.0 ([WILDCARD])

View file

@ -1,6 +1,7 @@
local: [WILDCARD]017_import_redirect.ts
type: TypeScript
dependencies: 1 unique (total 278B)
dependencies: 1 unique
size: 278B
file:///[WILDCARD]/017_import_redirect.ts ([WILDCARD])
└── https://gist.githubusercontent.com/ry/f12b2aa3409e6b52645bc346a9e22929/raw/79318f239f51d764384a8bded8d7c6a833610dde/print_hello.ts ([WILDCARD])

File diff suppressed because it is too large Load diff