summaryrefslogtreecommitdiff
path: root/test_util/src/npm.rs
diff options
context:
space:
mode:
authorAsher Gomez <ashersaupingomez@gmail.com>2024-02-20 00:34:24 +1100
committerGitHub <noreply@github.com>2024-02-19 06:34:24 -0700
commit2b279ad630651e973d5a31586f58809f005bc925 (patch)
tree3e3cbeb4126643c75381dd5422e8603a7488bb8a /test_util/src/npm.rs
parenteb542bc185c6c4ce1847417a2dfdf04862cd86db (diff)
chore: move `test_util` to `tests/util/server` (#22444)
As discussed with @mmastrac. --------- Signed-off-by: Asher Gomez <ashersaupingomez@gmail.com> Co-authored-by: Matt Mastracci <matthew@mastracci.com>
Diffstat (limited to 'test_util/src/npm.rs')
-rw-r--r--test_util/src/npm.rs179
1 files changed, 0 insertions, 179 deletions
diff --git a/test_util/src/npm.rs b/test_util/src/npm.rs
deleted file mode 100644
index 7469e9b9e..000000000
--- a/test_util/src/npm.rs
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-
-use std::collections::HashMap;
-use std::fs;
-
-use anyhow::Context;
-use anyhow::Result;
-use base64::prelude::BASE64_STANDARD;
-use base64::Engine;
-use flate2::write::GzEncoder;
-use flate2::Compression;
-use once_cell::sync::Lazy;
-use parking_lot::Mutex;
-use tar::Builder;
-
-use crate::testdata_path;
-
-pub static CUSTOM_NPM_PACKAGE_CACHE: Lazy<CustomNpmPackageCache> =
- Lazy::new(CustomNpmPackageCache::default);
-
-struct CustomNpmPackage {
- pub registry_file: String,
- pub tarballs: HashMap<String, Vec<u8>>,
-}
-
-/// Creates tarballs and a registry json file for npm packages
-/// in the `testdata/npm/registry/@denotest` directory.
-#[derive(Default)]
-pub struct CustomNpmPackageCache(Mutex<HashMap<String, CustomNpmPackage>>);
-
-impl CustomNpmPackageCache {
- pub fn tarball_bytes(
- &self,
- name: &str,
- version: &str,
- ) -> Result<Option<Vec<u8>>> {
- Ok(
- self
- .get_package_property(name, |p| p.tarballs.get(version).cloned())?
- .flatten(),
- )
- }
-
- pub fn registry_file(&self, name: &str) -> Result<Option<Vec<u8>>> {
- self.get_package_property(name, |p| p.registry_file.as_bytes().to_vec())
- }
-
- fn get_package_property<TResult>(
- &self,
- package_name: &str,
- func: impl FnOnce(&CustomNpmPackage) -> TResult,
- ) -> Result<Option<TResult>> {
- // it's ok if multiple threads race here as they will do the same work twice
- if !self.0.lock().contains_key(package_name) {
- match get_npm_package(package_name)? {
- Some(package) => {
- self.0.lock().insert(package_name.to_string(), package);
- }
- None => return Ok(None),
- }
- }
- Ok(self.0.lock().get(package_name).map(func))
- }
-}
-
-fn get_npm_package(package_name: &str) -> Result<Option<CustomNpmPackage>> {
- let package_folder = testdata_path().join("npm/registry").join(package_name);
- if !package_folder.exists() {
- return Ok(None);
- }
-
- // read all the package's versions
- let mut tarballs = HashMap::new();
- let mut versions = serde_json::Map::new();
- let mut latest_version = semver::Version::parse("0.0.0").unwrap();
- for entry in fs::read_dir(&package_folder)? {
- let entry = entry?;
- let file_type = entry.file_type()?;
- if !file_type.is_dir() {
- continue;
- }
- let version = entry.file_name().to_string_lossy().to_string();
- let version_folder = package_folder.join(&version);
-
- // create the tarball
- let mut tarball_bytes = Vec::new();
- {
- let mut encoder =
- GzEncoder::new(&mut tarball_bytes, Compression::default());
- {
- let mut builder = Builder::new(&mut encoder);
- builder
- .append_dir_all("package", &version_folder)
- .with_context(|| {
- format!("Error adding tarball for directory: {}", version_folder)
- })?;
- builder.finish()?;
- }
- encoder.finish()?;
- }
-
- // get tarball hash
- let tarball_checksum = get_tarball_checksum(&tarball_bytes);
-
- // create the registry file JSON for this version
- let mut dist = serde_json::Map::new();
- dist.insert(
- "integrity".to_string(),
- format!("sha512-{tarball_checksum}").into(),
- );
- dist.insert("shasum".to_string(), "dummy-value".into());
- dist.insert(
- "tarball".to_string(),
- format!(
- "http://localhost:4545/npm/registry/{package_name}/{version}.tgz"
- )
- .into(),
- );
-
- tarballs.insert(version.clone(), tarball_bytes);
- let package_json_path = version_folder.join("package.json");
- let package_json_text = fs::read_to_string(&package_json_path)
- .with_context(|| {
- format!("Error reading package.json at {}", package_json_path)
- })?;
- let mut version_info: serde_json::Map<String, serde_json::Value> =
- serde_json::from_str(&package_json_text)?;
- version_info.insert("dist".to_string(), dist.into());
-
- if let Some(maybe_optional_deps) = version_info.get("optionalDependencies")
- {
- if let Some(optional_deps) = maybe_optional_deps.as_object() {
- if let Some(maybe_deps) = version_info.get("dependencies") {
- if let Some(deps) = maybe_deps.as_object() {
- let mut cloned_deps = deps.to_owned();
- for (key, value) in optional_deps {
- cloned_deps.insert(key.to_string(), value.to_owned());
- }
- version_info.insert(
- "dependencies".to_string(),
- serde_json::to_value(cloned_deps).unwrap(),
- );
- }
- } else {
- version_info.insert(
- "dependencies".to_string(),
- serde_json::to_value(optional_deps).unwrap(),
- );
- }
- }
- }
-
- versions.insert(version.clone(), version_info.into());
- let version = semver::Version::parse(&version)?;
- if version.cmp(&latest_version).is_gt() {
- latest_version = version;
- }
- }
-
- let mut dist_tags = serde_json::Map::new();
- dist_tags.insert("latest".to_string(), latest_version.to_string().into());
-
- // create the registry file for this package
- let mut registry_file = serde_json::Map::new();
- registry_file.insert("name".to_string(), package_name.to_string().into());
- registry_file.insert("versions".to_string(), versions.into());
- registry_file.insert("dist-tags".to_string(), dist_tags.into());
- Ok(Some(CustomNpmPackage {
- registry_file: serde_json::to_string(&registry_file).unwrap(),
- tarballs,
- }))
-}
-
-fn get_tarball_checksum(bytes: &[u8]) -> String {
- use sha2::Digest;
- let mut hasher = sha2::Sha512::new();
- hasher.update(bytes);
- BASE64_STANDARD.encode(hasher.finalize())
-}