Skip to content

Commit f79b789

Browse files
committed
feat(registry): add .npmrc config support for custom registries and auth
1 parent d47e748 commit f79b789

File tree

10 files changed

+628
-72
lines changed

10 files changed

+628
-72
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ include = ["src/**/*.rs"]
1313

1414
[dev-dependencies]
1515
ctor = "0.6.3"
16+
tempfile = "3"
1617

1718
[dependencies]
1819
async-trait = "0.1.89"
@@ -27,6 +28,7 @@ itertools = "0.14.0"
2728
lazy_static = "1.5.0"
2829
log = "0.4.29"
2930
node-semver = "2.2.0"
31+
npmrc-config-rs = "0.1.1"
3032
regex = { version = "1.12.3", default-features = false, features = ["std"] }
3133
reqwest = { version = "0.12", features = [
3234
"json",

src/commands/update.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
use {
2-
crate::{
3-
commands::{ui, ui::LINE_ENDING},
4-
context::Context,
5-
version_group::VersionGroupVariant,
6-
},
7-
log::{error, warn},
2+
crate::{commands::ui, context::Context, version_group::VersionGroupVariant},
3+
log::error,
84
};
95

106
pub fn run(ctx: Context) -> i32 {
@@ -50,9 +46,6 @@ pub fn run(ctx: Context) -> i32 {
5046
ctx.failed_updates.iter().for_each(|name| {
5147
error!("Failed to fetch {name}");
5248
});
53-
warn!(
54-
"Syncpack does not yet support custom npm registries{LINE_ENDING} Subscribe to https://github.com/JamieMason/syncpack/issues/220"
55-
);
5649
} else if !was_outdated {
5750
ui::util::print_no_issues_found();
5851
}

src/dependency.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ use {
2323
#[path = "dependency_test.rs"]
2424
mod dependency_test;
2525

26-
/// URL information for fetching package metadata from npm registry.
26+
/// Information for fetching package metadata from npm registry.
2727
/// Used by the update command to fetch available versions.
2828
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
2929
pub struct UpdateUrl {
30-
/// The name of the dependency
30+
/// The name of the dependency as used in package.json
3131
pub internal_name: String,
32-
/// Registry URL, e.g., "https://registry.npmjs.org/react"
33-
pub url: String,
32+
/// The actual npm package name (may differ from internal_name for aliases)
33+
pub package_name: String,
3434
}
3535

3636
/// All instances of a single dependency name within a version group.

src/instance.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,10 @@ impl Instance {
301301
Specifier::Alias(alias) => {
302302
let aliased_name = &alias.name;
303303
if !aliased_name.is_empty() {
304-
if aliased_name.starts_with("@jsr/") {
304+
if aliased_name.starts_with("@jsr/") || aliased_name == actual_name {
305305
Some(UpdateUrl {
306306
internal_name: internal_name.clone(),
307-
url: format!("https://npm.jsr.io/{aliased_name}"),
308-
})
309-
} else if aliased_name == actual_name {
310-
Some(UpdateUrl {
311-
internal_name: internal_name.clone(),
312-
url: format!("https://registry.npmjs.org/{actual_name}"),
307+
package_name: aliased_name.clone(),
313308
})
314309
} else {
315310
debug!("'{aliased_name}' in '{raw}' does not equal the instance name '{actual_name}', skipping update as this might create mismatches");
@@ -320,17 +315,10 @@ impl Instance {
320315
}
321316
}
322317
Specifier::Exact(_) | Specifier::Range(_) | Specifier::Major(_) | Specifier::Minor(_) | Specifier::Latest(_) => {
323-
if actual_name.starts_with("@jsr/") {
324-
Some(UpdateUrl {
325-
internal_name: internal_name.clone(),
326-
url: format!("https://npm.jsr.io/{actual_name}"),
327-
})
328-
} else {
329-
Some(UpdateUrl {
330-
internal_name: internal_name.clone(),
331-
url: format!("https://registry.npmjs.org/{actual_name}"),
332-
})
333-
}
318+
Some(UpdateUrl {
319+
internal_name: internal_name.clone(),
320+
package_name: actual_name.clone(),
321+
})
334322
}
335323
_ => None,
336324
}

src/instance_test.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,47 +36,57 @@ fn returns_correct_registry_update_url() {
3636
.get_update_url()
3737
};
3838

39+
// Local packages should not have update URLs
3940
assert_eq!(get_update_url_by_name("local-package"), None);
41+
42+
// Direct JSR package
4043
assert_eq!(
4144
get_update_url_by_name("@jsr/luca__cases"),
4245
Some(UpdateUrl {
4346
internal_name: "@jsr/luca__cases".to_string(),
44-
url: "https://npm.jsr.io/@jsr/luca__cases".to_string()
47+
package_name: "@jsr/luca__cases".to_string()
4548
})
4649
);
50+
51+
// npm package with alias (aliased name matches actual name)
4752
assert_eq!(
4853
get_update_url_by_name("@lit-labs/ssr"),
4954
Some(UpdateUrl {
5055
internal_name: "@lit-labs/ssr".to_string(),
51-
url: "https://registry.npmjs.org/@lit-labs/ssr".to_string()
56+
package_name: "@lit-labs/ssr".to_string()
5257
})
5358
);
59+
60+
// Aliased JSR package - uses the JSR aliased name
5461
assert_eq!(
5562
get_update_url_by_name("@luca/cases"),
5663
Some(UpdateUrl {
5764
internal_name: "@luca/cases".to_string(),
58-
url: "https://npm.jsr.io/@jsr/luca__cases".to_string()
65+
package_name: "@jsr/luca__cases".to_string()
5966
})
6067
);
68+
6169
assert_eq!(
6270
get_update_url_by_name("@std/fmt"),
6371
Some(UpdateUrl {
6472
internal_name: "@std/fmt".to_string(),
65-
url: "https://npm.jsr.io/@jsr/std__fmt".to_string()
73+
package_name: "@jsr/std__fmt".to_string()
6674
})
6775
);
6876
assert_eq!(
6977
get_update_url_by_name("@std/yaml"),
7078
Some(UpdateUrl {
7179
internal_name: "@std/yaml".to_string(),
72-
url: "https://npm.jsr.io/@jsr/std__yaml".to_string()
80+
package_name: "@jsr/std__yaml".to_string()
7381
})
7482
);
83+
84+
// Regular npm package with alias
7585
assert_eq!(
7686
get_update_url_by_name("lit"),
7787
Some(UpdateUrl {
7888
internal_name: "lit".to_string(),
79-
url: "https://registry.npmjs.org/lit".to_string()
89+
package_name: "lit".to_string()
8090
})
8191
);
8292
}

0 commit comments

Comments
 (0)