Skip to content

Commit f252606

Browse files
committed
Add lockfile.
1 parent 2b5d5e1 commit f252606

File tree

5 files changed

+194
-9
lines changed

5 files changed

+194
-9
lines changed

Cargo.lock

Lines changed: 109 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

toolchains/javascript/CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
#### 🚀 Updates
6+
7+
- Added Deno support.
8+
- Can customize `packageManager` with `deno`.
9+
- Will parse `deno.json` and `deno.jsonc` manifest files.
10+
- Will parse `deno.lock` lock files.
11+
- Will install dependencies with `deno install`.
12+
- Added workspace member caching to reduce fs operations.
13+
- Updated `install_dependencies` and `setup_environment` to take project toolchain configuration into account.
14+
315
## 0.1.1
416

517
#### 🚀 Updates

toolchains/javascript/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ starbase_utils = { workspace = true, features = ["json", "yaml"] }
2929

3030
# Lockfiles
3131
chaste-pnpm = "0.5.0"
32+
deno_lockfile = "0.31.2"
3233
package-lock-json-parser = "0.4.0"
3334
yarn-lock-parser = "0.11.0"
3435

toolchains/javascript/src/lockfiles/deno.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,60 @@
1+
use super::parse_version_spec;
2+
use deno_lockfile::LockfileContent;
3+
use moon_pdk::{AnyResult, VirtualPath};
4+
use moon_pdk_api::{LockDependency, ParseLockOutput};
15
use serde::Deserialize;
6+
use starbase_utils::json::{self, JsonValue};
7+
8+
// Reference: https://github.com/denoland/fresh/blob/main/deno.lock
9+
pub fn parse_deno_lock(path: &VirtualPath, output: &mut ParseLockOutput) -> AnyResult<()> {
10+
let lockfile_content: JsonValue = json::read_file(path)?;
11+
let lockfile = LockfileContent::from_json(lockfile_content)?;
12+
13+
for (key, value) in lockfile.packages.jsr {
14+
output
15+
.dependencies
16+
.entry(format!("jsr:{}", key.name))
17+
.or_default()
18+
.push(LockDependency {
19+
hash: Some(value.integrity),
20+
// Version is fully qualified
21+
version: parse_version_spec(key.version.to_string())?,
22+
..Default::default()
23+
});
24+
}
25+
26+
for (key, value) in lockfile.packages.npm {
27+
let (name, version) = parse_name_and_version(&key);
28+
29+
output
30+
.dependencies
31+
.entry(format!("npm:{name}"))
32+
.or_default()
33+
.push(LockDependency {
34+
hash: value.integrity,
35+
// Version is fully qualified
36+
version: parse_version_spec(version)?,
37+
..Default::default()
38+
});
39+
}
40+
41+
Ok(())
42+
}
43+
44+
fn parse_name_and_version(value: &str) -> (&str, &str) {
45+
// Remove parents: @babel/[email protected]_@[email protected]
46+
let value = value.split('_').next().unwrap();
47+
48+
// Split on @ but preserve scope: @babel/[email protected]
49+
if let Some(index) = value.rfind('@')
50+
&& index != 0
51+
{
52+
return (&value[0..index], &value[index + 1..]);
53+
}
54+
55+
// No version? Provide a fake value
56+
(value, "0.0.0")
57+
}
258

359
#[derive(Default, Deserialize)]
460
#[serde(default)]

toolchains/javascript/src/tier2.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use extism_pdk::*;
66
use moon_common::path::paths_are_equal;
77
use moon_config::DependencyScope;
88
use moon_pdk::{
9-
get_host_environment, load_toolchain_config, locate_root_many, locate_root_many_with_check,
10-
parse_toolchain_config_schema,
9+
get_host_environment, load_project_toolchain_config, load_toolchain_config, locate_root_many,
10+
locate_root_many_with_check, parse_toolchain_config_schema,
1111
};
1212
use moon_pdk_api::*;
1313
use nodejs_package_json::{VersionProtocol, WorkspaceProtocol};
@@ -310,10 +310,13 @@ pub fn install_dependencies(
310310
};
311311

312312
let env = get_host_environment()?;
313-
let package_manager_config =
314-
load_toolchain_config::<SharedPackageManagerConfig>(package_manager.to_string())?;
315313
let mut inherit_install_args = true;
316314

315+
let package_manager_config: SharedPackageManagerConfig = match &input.project {
316+
Some(project) => load_project_toolchain_config(&project.id, package_manager.to_string())?,
317+
None => load_toolchain_config(package_manager.to_string())?,
318+
};
319+
317320
// Install
318321
let mut command = match package_manager {
319322
JavaScriptPackageManager::Bun => {
@@ -331,7 +334,7 @@ pub fn install_dependencies(
331334
cmd
332335
}
333336
JavaScriptPackageManager::Deno => {
334-
let cmd = ExecCommandInput::new("deno", ["install"]);
337+
ExecCommandInput::new("deno", ["install"])
335338

336339
// if input.production {
337340
// cmd.args.push("--production".into());
@@ -341,8 +344,6 @@ pub fn install_dependencies(
341344
// cmd.args.push("--filter".into());
342345
// cmd.args.push(package_name);
343346
// }
344-
345-
cmd
346347
}
347348
JavaScriptPackageManager::Npm => {
348349
let mut cmd = ExecCommandInput::new(
@@ -485,6 +486,7 @@ pub fn parse_lock(Json(input): Json<ParseLockInput>) -> FnResult<Json<ParseLockO
485486
match input.path.file_name().and_then(|name| name.to_str()) {
486487
Some("bun.lock") => parse_bun_lock(&input.path, &mut output)?,
487488
Some("bun.lockb") => parse_bun_lockb(&input.path, &mut output)?,
489+
Some("deno.lock") => parse_deno_lock(&input.path, &mut output)?,
488490
Some("package-lock.json" | "npm-shrinkwrap.json") => {
489491
parse_package_lock_json(&input.path, &mut output)?
490492
}
@@ -596,8 +598,13 @@ pub fn setup_environment(
596598
&& let Some(package_manager) = config.package_manager
597599
&& package_manager.is_for_node()
598600
{
599-
let package_manager_config =
600-
load_toolchain_config::<SharedPackageManagerConfig>(package_manager.to_string())?;
601+
let package_manager_config: SharedPackageManagerConfig = match &input.project {
602+
Some(project) => {
603+
load_project_toolchain_config(&project.id, package_manager.to_string())?
604+
}
605+
None => load_toolchain_config(package_manager.to_string())?,
606+
};
607+
601608
let package_path = input.root.join("package.json");
602609

603610
if package_path.exists()

0 commit comments

Comments
 (0)