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:
parent
2c674dcd20
commit
edaceecec7
24 changed files with 591 additions and 556 deletions
|
@ -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()),
|
||||
|
|
|
@ -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::*;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()),
|
||||
|
|
3
cli/tests/testdata/cert/cafile_info.ts.out
vendored
3
cli/tests/testdata/cert/cafile_info.ts.out
vendored
|
@ -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])
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
[WILDCARD]
|
||||
local: [WILDCARD]test.ts
|
||||
type: TypeScript
|
||||
dependencies: 7 unique (total [WILDCARD])
|
||||
dependencies: 7 unique
|
||||
size: [WILDCARD]
|
||||
|
||||
[WILDCARD]
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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])
|
||||
|
|
4
cli/tests/testdata/info/info_type_import.out
vendored
4
cli/tests/testdata/info/info_type_import.out
vendored
|
@ -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])
|
||||
|
|
3
cli/tests/testdata/info/multiple_imports.out
vendored
3
cli/tests/testdata/info/multiple_imports.out
vendored
|
@ -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])
|
||||
|
|
3
cli/tests/testdata/info/types_header.out
vendored
3
cli/tests/testdata/info/types_header.out
vendored
|
@ -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])
|
||||
|
|
|
@ -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])
|
||||
|
|
22
cli/tests/testdata/npm/cjs_with_deps/main.info.out
vendored
Normal file
22
cli/tests/testdata/npm/cjs_with_deps/main.info.out
vendored
Normal 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])
|
10
cli/tests/testdata/npm/deno_info_chalk.out
vendored
Normal file
10
cli/tests/testdata/npm/deno_info_chalk.out
vendored
Normal 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])
|
|
@ -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
Loading…
Add table
Reference in a new issue