Skip to content

Commit dab9549

Browse files
Daniel MacoveiDaniel Macovei
authored andcommitted
updated wasm-pkg-tools
1 parent f751497 commit dab9549

File tree

8 files changed

+347
-182
lines changed

8 files changed

+347
-182
lines changed

Cargo.lock

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

src/commands/add.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::{
22
fs,
33
path::{Path, PathBuf},
4-
sync::Arc,
54
};
65

76
use anyhow::{bail, Context, Result};
@@ -126,7 +125,7 @@ impl AddCommand {
126125

127126
async fn resolve_version(
128127
&self,
129-
client: Arc<CachingClient<FileCache>>,
128+
client: CachingClient<FileCache>,
130129
name: &PackageRef,
131130
) -> Result<String> {
132131
let mut resolver = DependencyResolver::new_with_client(client, None)?;

src/commands/new.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::{
44
fs,
55
path::{Path, PathBuf},
66
process::Command,
7-
sync::Arc,
87
};
98

109
use anyhow::{bail, Context, Result};
@@ -526,7 +525,7 @@ world example {{
526525
/// `DependencyResolution` instead so we can actually resolve the dependency.
527526
async fn resolve_target(
528527
&self,
529-
client: Arc<CachingClient<FileCache>>,
528+
client: CachingClient<FileCache>,
530529
target: Option<metadata::Target>,
531530
) -> Result<Option<(DependencyResolution, Option<String>)>> {
532531
match target {

src/commands/update.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use terminal_link::Link as TerminalLink;
99
use wasm_pkg_core::{
1010
lock::{LockFile, LockedPackageVersion},
1111
resolver::{DependencyResolver, RegistryPackage},
12-
wit::add_packages_to_resolver,
1312
};
1413

1514
use crate::{
@@ -88,7 +87,7 @@ impl UpdateCommand {
8887
{
8988
let target_deps = section.target.dependencies();
9089
for (name, dep) in target_deps.iter() {
91-
match dep {
90+
match &dep.0 {
9291
wasm_pkg_core::resolver::Dependency::Package(RegistryPackage {
9392
version,
9493
..
@@ -99,7 +98,7 @@ impl UpdateCommand {
9998
}
10099
}
101100
for (name, dep) in section.dependencies.iter() {
102-
match dep {
101+
match &dep.0 {
103102
wasm_pkg_core::resolver::Dependency::Package(RegistryPackage {
104103
version,
105104
..
@@ -111,7 +110,7 @@ impl UpdateCommand {
111110
}
112111
}
113112
let mut resolver = DependencyResolver::new_with_client(client, None)?;
114-
add_packages_to_resolver(&mut resolver, new_packages).await?;
113+
resolver.add_packages(new_packages).await?;
115114
let deps = resolver.resolve().await?;
116115

117116
let mut new_lock_file = LockFile::from_dependencies(&deps, "wkg.lock").await?;

src/config.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ use parse_arg::{iter_short, match_arg};
2626
use semver::Version;
2727
use std::fmt;
2828
use std::str::FromStr;
29-
use std::sync::Arc;
3029
use std::{collections::BTreeMap, fmt::Display, path::PathBuf};
3130
use toml_edit::DocumentMut;
3231
use wasm_pkg_client::caching::{CachingClient, FileCache};
@@ -525,11 +524,11 @@ impl Config {
525524
&self,
526525
cache: Option<PathBuf>,
527526
offline: bool,
528-
) -> anyhow::Result<Arc<CachingClient<FileCache>>> {
529-
Ok(Arc::new(CachingClient::new(
527+
) -> anyhow::Result<CachingClient<FileCache>> {
528+
Ok(CachingClient::new(
530529
(!offline).then(|| Client::new(self.pkg_config.clone())),
531530
FileCache::new(cache_dir(cache)?).await?,
532-
)))
531+
))
533532
}
534533
}
535534

src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use std::{
1111
io::{BufRead, BufReader, Read, Seek, SeekFrom},
1212
path::{Path, PathBuf},
1313
process::{Command, Stdio},
14-
sync::Arc,
1514
time::SystemTime,
1615
};
1716

@@ -135,7 +134,7 @@ impl From<&str> for CargoCommand {
135134
///
136135
/// Returns any relevant output components.
137136
pub async fn run_cargo_command(
138-
client: Arc<CachingClient<FileCache>>,
137+
client: CachingClient<FileCache>,
139138
config: &Config,
140139
metadata: &Metadata,
141140
packages: &[PackageComponentMetadata<'_>],
@@ -731,7 +730,7 @@ pub fn load_component_metadata<'a>(
731730
}
732731

733732
async fn generate_bindings(
734-
client: Arc<CachingClient<FileCache>>,
733+
client: CachingClient<FileCache>,
735734
config: &Config,
736735
packages: &[PackageComponentMetadata<'_>],
737736
) -> Result<HashMap<String, HashMap<String, String>>> {
@@ -778,7 +777,7 @@ async fn generate_bindings(
778777
}
779778

780779
async fn create_resolution_map<'a>(
781-
client: Arc<CachingClient<FileCache>>,
780+
client: CachingClient<FileCache>,
782781
packages: &'a [PackageComponentMetadata<'_>],
783782
lock_file: &LockFile,
784783
) -> Result<PackageResolutionMap<'a>> {
@@ -1064,7 +1063,7 @@ fn add_registry_metadata(package: &Package, bytes: &[u8], path: &Path) -> Result
10641063
/// Publish a component for the given workspace and publish options.
10651064
pub async fn publish(
10661065
config: &Config,
1067-
client: Arc<CachingClient<FileCache>>,
1066+
client: CachingClient<FileCache>,
10681067
options: &PublishOptions<'_>,
10691068
) -> Result<()> {
10701069
if options.dry_run {

src/metadata.rs

Lines changed: 114 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use cargo_metadata::Package;
1212
use semver::{Version, VersionReq};
1313
use serde::{
1414
de::{self, value::MapAccessDeserializer},
15-
Deserialize,
15+
Deserialize, Serialize
1616
};
1717
use serde_json::from_value;
1818
use url::Url;
@@ -169,17 +169,17 @@ pub enum Target {
169169
/// [select-world]: https://docs.rs/wit-parser/latest/wit_parser/struct.Resolve.html#method.select_world
170170
world: Option<String>,
171171
/// The dependencies of the wit document being targeted.
172-
dependencies: HashMap<PackageRef, Dependency>,
172+
dependencies: HashMap<PackageRef, WasmDependency>,
173173
},
174174
}
175175

176176
impl Target {
177177
/// Gets the dependencies of the target.
178-
pub fn dependencies(&self) -> Cow<HashMap<PackageRef, Dependency>> {
178+
pub fn dependencies(&self) -> Cow<HashMap<PackageRef, WasmDependency>> {
179179
match self {
180180
Self::Package { name, package, .. } => Cow::Owned(HashMap::from_iter([(
181181
name.clone(),
182-
Dependency::Package(package.clone()),
182+
WasmDependency(Dependency::Package(package.clone())),
183183
)])),
184184
Self::Local { dependencies, .. } => Cow::Borrowed(dependencies),
185185
}
@@ -271,7 +271,7 @@ impl<'de> Deserialize<'de> for Target {
271271
world: Option<String>,
272272
registry: Option<String>,
273273
path: Option<PathBuf>,
274-
dependencies: HashMap<PackageRef, Dependency>,
274+
dependencies: HashMap<PackageRef, WasmDependency>,
275275
}
276276

277277
let entry = Entry::deserialize(MapAccessDeserializer::new(map))?;
@@ -326,6 +326,112 @@ impl<'de> Deserialize<'de> for Target {
326326
}
327327
}
328328

329+
#[derive(Debug, Clone)]
330+
pub struct WasmDependency(pub Dependency);
331+
332+
impl Serialize for WasmDependency {
333+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
334+
where
335+
S: serde::Serializer,
336+
{
337+
match &self.0 {
338+
Dependency::Package(package) => {
339+
if package.name.is_none() && package.registry.is_none() {
340+
let version = package.version.to_string();
341+
version.trim_start_matches('^').serialize(serializer)
342+
} else {
343+
#[derive(Serialize)]
344+
struct Entry<'a> {
345+
package: Option<&'a PackageRef>,
346+
version: &'a str,
347+
registry: Option<&'a str>,
348+
}
349+
350+
Entry {
351+
package: package.name.as_ref(),
352+
version: package.version.to_string().trim_start_matches('^'),
353+
registry: package.registry.as_deref(),
354+
}
355+
.serialize(serializer)
356+
}
357+
}
358+
Dependency::Local(path) => {
359+
#[derive(Serialize)]
360+
struct Entry<'a> {
361+
path: &'a PathBuf,
362+
}
363+
364+
Entry { path }.serialize(serializer)
365+
}
366+
}
367+
}
368+
}
369+
370+
impl<'de> Deserialize<'de> for WasmDependency {
371+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
372+
where
373+
D: serde::Deserializer<'de>,
374+
{
375+
struct Visitor;
376+
377+
impl<'de> de::Visitor<'de> for Visitor {
378+
type Value = WasmDependency;
379+
380+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
381+
write!(formatter, "a string or a table")
382+
}
383+
384+
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
385+
where
386+
E: de::Error,
387+
{
388+
Ok(WasmDependency(Dependency::Package(
389+
s.parse().map_err(de::Error::custom)?,
390+
)))
391+
}
392+
393+
fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
394+
where
395+
A: de::MapAccess<'de>,
396+
{
397+
#[derive(Default, Deserialize)]
398+
#[serde(default, deny_unknown_fields)]
399+
struct Entry {
400+
path: Option<PathBuf>,
401+
package: Option<PackageRef>,
402+
version: Option<VersionReq>,
403+
registry: Option<String>,
404+
}
405+
406+
let entry = Entry::deserialize(MapAccessDeserializer::new(map))?;
407+
408+
match (entry.path, entry.package, entry.version, entry.registry) {
409+
(Some(path), None, None, None) => Ok(WasmDependency(Dependency::Local(path))),
410+
(None, name, Some(version), registry) => {
411+
Ok(WasmDependency(Dependency::Package(RegistryPackage {
412+
name,
413+
version,
414+
registry,
415+
})))
416+
}
417+
(Some(_), None, Some(_), _) => Err(de::Error::custom(
418+
"cannot specify both `path` and `version` fields in a dependency entry",
419+
)),
420+
(Some(_), None, None, Some(_)) => Err(de::Error::custom(
421+
"cannot specify both `path` and `registry` fields in a dependency entry",
422+
)),
423+
(Some(_), Some(_), _, _) => Err(de::Error::custom(
424+
"cannot specify both `path` and `package` fields in a dependency entry",
425+
)),
426+
(None, None, _, _) => Err(de::Error::missing_field("package")),
427+
(None, Some(_), None, _) => Err(de::Error::missing_field("version")),
428+
}
429+
}
430+
}
431+
432+
deserializer.deserialize_any(Visitor)
433+
}
434+
}
329435
/// Represents the `package.metadata.component` section in `Cargo.toml`.
330436
#[derive(Default, Debug, Clone, Deserialize)]
331437
#[serde(default, deny_unknown_fields)]
@@ -337,7 +443,7 @@ pub struct ComponentSection {
337443
/// The path to the WASI adapter to use.
338444
pub adapter: Option<PathBuf>,
339445
/// The dependencies of the component.
340-
pub dependencies: HashMap<PackageRef, Dependency>,
446+
pub dependencies: HashMap<PackageRef, WasmDependency>,
341447
/// The registries to use for the component.
342448
pub registries: HashMap<String, Url>,
343449
/// The configuration for bindings generation.
@@ -415,14 +521,14 @@ impl ComponentMetadata {
415521
}
416522

417523
for dependency in dependencies.values_mut() {
418-
if let Dependency::Local(path) = dependency {
524+
if let Dependency::Local(path) = &mut dependency.0 {
419525
*path = manifest_dir.join(path.as_path());
420526
}
421527
}
422528
}
423529

424530
for dependency in section.dependencies.values_mut() {
425-
if let Dependency::Local(path) = dependency {
531+
if let Dependency::Local(path) = &mut dependency.0 {
426532
*path = manifest_dir.join(path.as_path());
427533
}
428534
}

src/registry.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! Module for interacting with component registries.
2-
use std::{collections::HashMap, sync::Arc};
2+
use std::collections::HashMap;
33

44
use anyhow::Result;
55
use cargo_metadata::PackageId;
@@ -10,7 +10,7 @@ use wasm_pkg_client::{
1010
};
1111
use wasm_pkg_core::{
1212
lock::{LockFile, LockedPackage, LockedPackageVersion},
13-
resolver::{DependencyResolution, DependencyResolutionMap, DependencyResolver},
13+
resolver::{Dependency, DependencyResolution, DependencyResolutionMap, DependencyResolver},
1414
};
1515

1616
use crate::metadata::ComponentMetadata;
@@ -31,7 +31,7 @@ impl<'a> PackageDependencyResolution<'a> {
3131
///
3232
/// Returns `Ok(None)` if the package is not a component package.
3333
pub async fn new(
34-
client: Arc<CachingClient<FileCache>>,
34+
client: CachingClient<FileCache>,
3535
metadata: &'a ComponentMetadata,
3636
lock_file: &LockFile,
3737
) -> Result<PackageDependencyResolution<'a>> {
@@ -51,7 +51,7 @@ impl<'a> PackageDependencyResolution<'a> {
5151
}
5252

5353
async fn resolve_target_deps(
54-
client: Arc<CachingClient<FileCache>>,
54+
client: CachingClient<FileCache>,
5555
metadata: &ComponentMetadata,
5656
lock_file: &LockFile,
5757
) -> Result<DependencyResolutionMap> {
@@ -63,14 +63,17 @@ impl<'a> PackageDependencyResolution<'a> {
6363
let mut resolver = DependencyResolver::new_with_client(client, Some(lock_file))?;
6464

6565
for (name, dependency) in target_deps.iter() {
66-
resolver.add_dependency(name, dependency).await?;
66+
resolver.add_shallow_dependency(name, &dependency.0).await?;
6767
}
68+
// for (name, dependency) in target_deps.iter() {
69+
// resolver.add_dependency(name, &dependency.0).await?;
70+
// }
6871

6972
resolver.resolve().await
7073
}
7174

7275
async fn resolve_deps(
73-
client: Arc<CachingClient<FileCache>>,
76+
client: CachingClient<FileCache>,
7477
metadata: &ComponentMetadata,
7578
lock_file: &LockFile,
7679
) -> Result<DependencyResolutionMap> {
@@ -81,7 +84,11 @@ impl<'a> PackageDependencyResolution<'a> {
8184
let mut resolver = DependencyResolver::new_with_client(client, Some(lock_file))?;
8285

8386
for (name, dependency) in &metadata.section.dependencies {
84-
resolver.add_dependency(name, dependency).await?;
87+
if let Dependency::Local(path) = dependency.clone().0 {
88+
resolver.add_shallow_dependency(name, &Dependency::Local(path)).await?;
89+
90+
}
91+
resolver.add_dependency(name, &dependency.0).await?;
8592
}
8693

8794
resolver.resolve().await

0 commit comments

Comments
 (0)