Skip to content

Commit e2b20a1

Browse files
fcenedesfcenedese
andauthored
feat: Update deps for OpenIdConnect and Reqwest (#593)
This PR updates openidconnect to 4.0.0 and Reqwest to his latest. It required to change a couple of things. but all tests are ok. it's based on the previous PR splitting into 2 crates it should close #589 , #591 , #539 --------- Co-authored-by: fcenedese <[email protected]>
1 parent be389ca commit e2b20a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1435
-597
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
Cargo.lock
33
temp*
44
src/api/generated
5+
crates/zitadel-gen/src/api/
56
.idea

Cargo.toml

Lines changed: 11 additions & 215 deletions
Original file line numberDiff line numberDiff line change
@@ -1,217 +1,13 @@
1-
[package]
2-
name = "zitadel"
3-
description = "An implementation of ZITADEL API access and authentication in Rust."
4-
version = "0.0.0-development"
5-
edition = "2021"
6-
license = "MIT OR Apache-2.0"
7-
authors = ["Christoph Bühler <[email protected]>"]
8-
repository = "https://github.com/buehler/zitadel-rust"
9-
keywords = ["ZITADEL", "gRPC", "clients", "authentication", "oidc"]
10-
categories = ["authentication", "api-bindings"]
11-
include = [
12-
"src/**/*.rs",
13-
"Cargo.toml",
14-
"LICENSE*",
15-
"README.md",
16-
]
17-
18-
[features]
19-
default = ["tls-roots"]
20-
21-
## Feature that enables support for the [actix framework](https://actix.rs/).
22-
actix = ["credentials", "oidc", "dep:actix-web"]
23-
24-
## The API feature enables all gRPC service clients to access the ZITADEL API.
25-
api = [
26-
"api-admin-v1",
27-
"api-auth-v1",
28-
"api-management-v1",
29-
"api-system-v1",
30-
"api-oidc-v2",
31-
"api-org-v2",
32-
"api-session-v2",
33-
"api-settings-v2",
34-
"api-user-v2"
1+
[workspace]
2+
resolver = "2"
3+
members = [
4+
"crates/zitadel",
5+
"crates/zitadel-gen",
356
]
36-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
37-
api-admin-v1 = ["api-common", "zitadel-admin-v1" ]
38-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
39-
api-auth-v1 = ["api-common", "zitadel-auth-v1" ]
40-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
41-
api-management-v1 = ["api-common", "zitadel-v1-v1" ]
42-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
43-
api-system-v1 = ["api-common", "zitadel-system-v1", "zitadel-authn-v1" ]
44-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
45-
api-oidc-v2 = ["api-common", "zitadel-oidc-v2" ]
46-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
47-
api-org-v2 = ["api-common", "zitadel-org-v2", "zitadel-user-v2" ]
48-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
49-
api-session-v2 = ["api-common", "zitadel-session-v2" ]
50-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
51-
api-settings-v2 = ["api-common", "zitadel-settings-v2" ]
52-
## The API feature enables all gRPC service clients to access the respective ZITADEL API.
53-
api-user-v2 = ["api-common", "zitadel-user-v2" ]
54-
api-common = ["dep:prost", "dep:prost-types", "dep:tonic", "dep:tonic-types", "dep:pbjson-types" ]
55-
56-
tls-roots = ["tonic/tls-roots"]
57-
tls-webpki-roots = ["tonic/tls-webpki-roots"]
58-
59-
60-
## Feature that enables support for the [axum framework](https://docs.rs/axum/latest/axum/).
61-
axum = ["credentials", "oidc", "dep:axum", "dep:axum-extra"]
62-
63-
## The credentials feature enables special credentials helpers for ZITADEL.
64-
## For example, it allows the user to create a ZITADEL service account and
65-
## authenticate against ZITADEL.
66-
credentials = ["dep:jsonwebtoken", "dep:openidconnect", "dep:reqwest", "dep:serde", "dep:serde_json", "dep:serde_urlencoded", "dep:time"]
67-
68-
## The interceptors feature enables specific gRPC interceptors and
69-
## new convenience functions to create a gRPC client with interceptors.
70-
## The interceptors provide easy access to an authenticated ZITADEL API client.
71-
## The interceptors work with the credentials from this crate.
72-
interceptors = ["credentials", "dep:time", "dep:tokio"]
73-
74-
## This feature enables caching of the OIDC discovery and introspection results.
75-
## By default, only the in-memory cache is available. To use a different cache,
76-
## enable specific features of this crate, or implement your own cache with
77-
## the trait.
78-
introspection_cache = ["dep:async-trait", "dep:time", "dep:moka"]
79-
80-
## The OIDC module enables basic OIDC (OpenID Connect) features to communicate
81-
## with ZITADEL. Two examples are the `discover` and `introspect` functions.
82-
## The OIDC features are required for some of the web framework features.
83-
oidc = ["credentials", "dep:base64-compat"]
84-
85-
## Feature that enables support for the [rocket framework](https://rocket.rs/).
86-
## It enables authentication features for rocket in the form of route guards.
87-
## Refer to the rocket module for more information.
88-
rocket = ["credentials", "oidc", "dep:rocket"]
89-
90-
## Feature that enables support for the [rocket okapi](https://github.com/GREsau/okapi).
91-
rocket_okapi = ["rocket", "dep:rocket_okapi", "dep:schemars"]
927

93-
# @@protoc_deletion_point(features)
94-
# This section is automatically generated by protoc-gen-prost-crate.
95-
# Changes in this area may be lost on regeneration.
96-
proto_full = ["zitadel-action-v1","zitadel-admin-v1","zitadel-app-v1","zitadel-auth-v1","zitadel-authn-v1","zitadel-change-v1","zitadel-event-v1","zitadel-feature-v1","zitadel-feature-v2","zitadel-feature-v2beta","zitadel-idp-v1","zitadel-idp-v2","zitadel-instance-v1","zitadel-management-v1","zitadel-member-v1","zitadel-metadata-v1","zitadel-milestone-v1","zitadel-object-v2","zitadel-object-v2beta","zitadel-object-v3alpha","zitadel-oidc-v2","zitadel-oidc-v2beta","zitadel-org-v1","zitadel-org-v2","zitadel-org-v2beta","zitadel-policy-v1","zitadel-project-v1","zitadel-protoc_gen_zitadel-v2","zitadel-quota-v1","zitadel-resources-action-v3alpha","zitadel-resources-object-v3alpha","zitadel-resources-user-v3alpha","zitadel-resources-userschema-v3alpha","zitadel-resources-webkey-v3alpha","zitadel-session-v2","zitadel-session-v2beta","zitadel-settings-object-v3alpha","zitadel-settings-v1","zitadel-settings-v2","zitadel-settings-v2beta","zitadel-system-v1","zitadel-text-v1","zitadel-user-v1","zitadel-user-v2","zitadel-user-v2beta","zitadel-v1","zitadel-v1-v1"]
97-
"zitadel-action-v1" = ["zitadel-v1"]
98-
"zitadel-admin-v1" = ["zitadel-event-v1","zitadel-idp-v1","zitadel-instance-v1","zitadel-management-v1","zitadel-member-v1","zitadel-milestone-v1","zitadel-org-v1","zitadel-policy-v1","zitadel-settings-v1","zitadel-text-v1","zitadel-v1","zitadel-v1-v1"]
99-
"zitadel-app-v1" = ["zitadel-v1"]
100-
"zitadel-auth-v1" = ["zitadel-change-v1","zitadel-idp-v1","zitadel-metadata-v1","zitadel-org-v1","zitadel-policy-v1","zitadel-user-v1","zitadel-v1"]
101-
"zitadel-authn-v1" = ["zitadel-v1"]
102-
"zitadel-change-v1" = ["zitadel-v1"]
103-
"zitadel-event-v1" = ["zitadel-v1"]
104-
"zitadel-feature-v1" = []
105-
"zitadel-feature-v2" = ["zitadel-object-v2"]
106-
"zitadel-feature-v2beta" = ["zitadel-object-v2beta"]
107-
"zitadel-idp-v1" = ["zitadel-v1"]
108-
"zitadel-idp-v2" = ["zitadel-object-v2"]
109-
"zitadel-instance-v1" = ["zitadel-v1"]
110-
"zitadel-management-v1" = ["zitadel-action-v1","zitadel-app-v1","zitadel-authn-v1","zitadel-change-v1","zitadel-idp-v1","zitadel-member-v1","zitadel-metadata-v1","zitadel-org-v1","zitadel-policy-v1","zitadel-project-v1","zitadel-text-v1","zitadel-user-v1","zitadel-v1"]
111-
"zitadel-member-v1" = ["zitadel-user-v1","zitadel-v1"]
112-
"zitadel-metadata-v1" = ["zitadel-v1"]
113-
"zitadel-milestone-v1" = []
114-
"zitadel-object-v2" = []
115-
"zitadel-object-v2beta" = []
116-
"zitadel-object-v3alpha" = []
117-
"zitadel-oidc-v2" = ["zitadel-object-v2"]
118-
"zitadel-oidc-v2beta" = ["zitadel-object-v2beta"]
119-
"zitadel-org-v1" = ["zitadel-v1"]
120-
"zitadel-org-v2" = ["zitadel-object-v2"]
121-
"zitadel-org-v2beta" = ["zitadel-object-v2beta"]
122-
"zitadel-policy-v1" = ["zitadel-idp-v1","zitadel-v1"]
123-
"zitadel-project-v1" = ["zitadel-v1"]
124-
"zitadel-protoc_gen_zitadel-v2" = []
125-
"zitadel-quota-v1" = []
126-
"zitadel-resources-action-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
127-
"zitadel-resources-object-v3alpha" = ["zitadel-object-v3alpha"]
128-
"zitadel-resources-user-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
129-
"zitadel-resources-userschema-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
130-
"zitadel-resources-webkey-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
131-
"zitadel-session-v2" = ["zitadel-object-v2","zitadel-v1"]
132-
"zitadel-session-v2beta" = ["zitadel-object-v2beta","zitadel-v1"]
133-
"zitadel-settings-object-v3alpha" = ["zitadel-object-v3alpha"]
134-
"zitadel-settings-v1" = ["zitadel-v1"]
135-
"zitadel-settings-v2" = ["zitadel-object-v2"]
136-
"zitadel-settings-v2beta" = ["zitadel-object-v2beta"]
137-
"zitadel-system-v1" = ["zitadel-feature-v1","zitadel-instance-v1","zitadel-member-v1","zitadel-quota-v1","zitadel-v1"]
138-
"zitadel-text-v1" = ["zitadel-v1"]
139-
"zitadel-user-v1" = ["zitadel-v1"]
140-
"zitadel-user-v2" = ["zitadel-object-v2"]
141-
"zitadel-user-v2beta" = ["zitadel-object-v2beta"]
142-
"zitadel-v1" = []
143-
"zitadel-v1-v1" = ["zitadel-authn-v1","zitadel-idp-v1","zitadel-management-v1","zitadel-org-v1","zitadel-v1"]
144-
# @@protoc_insertion_point(features)
145-
146-
[dependencies]
147-
actix-web = { version = "4.5.1", optional = true }
148-
async-trait = { version = "0.1.80", optional = true }
149-
axum = { version = "0.8.0", optional = true, features = ["macros"] }
150-
axum-extra = { version = "0.11.0", optional = true, features = ["typed-header"] }
151-
base64-compat = { version = "1", optional = true }
152-
custom_error = "1.9.2"
153-
document-features = { version = "0.2.8", optional = true }
154-
jsonwebtoken = { version = "9.3.0", optional = true }
155-
moka = { version = "0.12.8", features = ["future"], optional = true }
156-
openidconnect = { version = "3.5.0", optional = true }
157-
pbjson-types = { version = "0.7.0", optional = true }
158-
prost = { version = "0.13.1", optional = true }
159-
prost-types = { version = "0.13.1", optional = true }
160-
reqwest = { version = "0.11.27", features = ["json", "rustls-tls"], default-features = false, optional = true }
161-
rocket = { version = "0.5.0", optional = true }
162-
serde = { version = "1.0.200", features = ["derive"], optional = true }
163-
serde_json = { version = "1.0.116", optional = true }
164-
serde_urlencoded = { version = "0.7.1", optional = true }
165-
time = { version = "0.3.36", optional = true }
166-
tokio = { version = "1.37.0", optional = true, features = [
167-
"macros",
168-
"rt-multi-thread",
169-
] }
170-
tonic = { version = "0.12.1", features = [
171-
"tls",
172-
], optional = true }
173-
rocket_okapi = { version = "0.9.0", optional = true, default-features = false }
174-
schemars = {version = "0.8.21", optional = true}
175-
tonic-types = { version = "0.12.1", optional = true }
176-
177-
[dev-dependencies]
178-
chrono = "0.4.38"
179-
tokio = { version = "1.37.0", features = ["macros", "rt-multi-thread"] }
180-
tower = { version = "0.5.0" }
181-
http-body-util = "0.1.0"
182-
183-
[package.metadata.docs.rs]
184-
all-features = true
185-
186-
187-
[[example]]
188-
name = "actix_webapi_oauth_interception_basic"
189-
required-features = ["actix"]
190-
191-
[[example]]
192-
name = "axum_webapi_oauth_interception_basic"
193-
required-features = ["axum"]
194-
195-
[[example]]
196-
name = "fetch_profile_with_pat"
197-
required-features = ["api", "interceptors"]
198-
199-
[[example]]
200-
name = "fetch_profile_with_service_account"
201-
required-features = ["api", "interceptors"]
202-
203-
[[example]]
204-
name = "rocket_webapi_oauth_interception_basic"
205-
required-features = ["rocket"]
206-
207-
[[example]]
208-
name = "rocket_webapi_oauth_interception_jwtprofile_cached"
209-
required-features = ["rocket", "introspection_cache"]
210-
211-
[[example]]
212-
name = "rocket_webapi_oauth_interception_jwtprofile"
213-
required-features = ["rocket"]
214-
215-
[[example]]
216-
name = "service_account_authentication"
217-
required-features = ["credentials"]
8+
[workspace.package]
9+
version = "0.1.0"
10+
authors = ["Christoph Bühler <[email protected]>"]
11+
description = "Rust Microservices for labs gallery"
12+
license = "MIT OR Apache-2.0"
13+
edition = "2021"

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,21 @@ The following features are present:
1111

1212
### Example
1313

14-
There exist a few examples in the `examples` directory.
14+
There exist a few examples in the `zitadel-examples` crate.
1515
Go there to see the library in action, or head over to the
1616
[documentation](https://docs.rs/zitadel/latest/zitadel/) to see the full API documentation.
1717

18+
### Compatibility Matrix
19+
20+
| ZITADEL Version | Rust Version | zitadel-rust Version | zitadel-gen Version |
21+
|-----------------|--------------|----------------------|---------------------|
22+
| 2.69.1 | 1.80.0+ | 5.5.2 | 2.69.1 |
23+
1824
### Development
1925

2026
After you clone the repository, you need ["just"](https://just.systems) to run
21-
certain tasks. Generating the gRPC clients is done via `just generate-grpc` or `just`
27+
certain tasks.
28+
Generating the gRPC clients is done via `just generate-grpc` or `just`
2229
(as it is configured to be the default action for just).
2330

2431
For the generation to complete successfully, you need to have ["buf"](https://buf.build)
@@ -34,7 +41,6 @@ Required tooling:
3441
- `protoc-gen-prost-crate`: `cargo install protoc-gen-prost-crate`
3542

3643
Installing the tools is also partially available via `just install-tools`.
37-
3844
#### License
3945

4046
<sup>

buf.gen.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ managed:
44
enabled: true
55
plugins:
66
- plugin: prost
7-
out: src/api/generated
7+
out: crates/zitadel-gen/src/api/
88
opt:
99
- compile_well_known_types
1010
- extern_path=.google.protobuf=::pbjson_types
1111
- plugin: tonic
12-
out: src/api/generated
12+
out: crates/zitadel-gen/src/api/
1313
opt:
1414
- compile_well_known_types
1515
- extern_path=.google.protobuf=::pbjson_types
1616
- no_server
1717
- name: prost-crate
18-
out: .
18+
out: ./crates/zitadel-gen
1919
strategy: all
2020
opt:
21-
- gen_crate
22-
- include_file=src/api/generated/mod.rs
21+
- gen_crate=./crates/zitadel-gen/Cargo.toml
22+
- include_file=src/api/mod.rs

crates/zitadel-gen/Cargo.toml

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
[package]
2+
name = "zitadel-gen"
3+
version = "2.69.1"
4+
edition = "2021"
5+
6+
7+
[features]
8+
# @@protoc_deletion_point(features)
9+
# This section is automatically generated by protoc-gen-prost-crate.
10+
# Changes in this area may be lost on regeneration.
11+
proto_full = ["zitadel-action-v1","zitadel-admin-v1","zitadel-app-v1","zitadel-auth-v1","zitadel-authn-v1","zitadel-change-v1","zitadel-event-v1","zitadel-feature-v1","zitadel-feature-v2","zitadel-feature-v2beta","zitadel-idp-v1","zitadel-idp-v2","zitadel-instance-v1","zitadel-management-v1","zitadel-member-v1","zitadel-metadata-v1","zitadel-milestone-v1","zitadel-object-v2","zitadel-object-v2beta","zitadel-object-v3alpha","zitadel-oidc-v2","zitadel-oidc-v2beta","zitadel-org-v1","zitadel-org-v2","zitadel-org-v2beta","zitadel-policy-v1","zitadel-project-v1","zitadel-protoc_gen_zitadel-v2","zitadel-quota-v1","zitadel-resources-action-v3alpha","zitadel-resources-debug_events-v3alpha","zitadel-resources-object-v3alpha","zitadel-resources-user-v3alpha","zitadel-resources-userschema-v3alpha","zitadel-resources-webkey-v3alpha","zitadel-saml-v2","zitadel-session-v2","zitadel-session-v2beta","zitadel-settings-object-v3alpha","zitadel-settings-v1","zitadel-settings-v2","zitadel-settings-v2beta","zitadel-system-v1","zitadel-text-v1","zitadel-user-v1","zitadel-user-v2","zitadel-user-v2beta","zitadel-v1","zitadel-v1-v1"]
12+
"zitadel-action-v1" = ["zitadel-v1"]
13+
"zitadel-admin-v1" = ["zitadel-event-v1","zitadel-idp-v1","zitadel-instance-v1","zitadel-management-v1","zitadel-member-v1","zitadel-milestone-v1","zitadel-org-v1","zitadel-policy-v1","zitadel-settings-v1","zitadel-text-v1","zitadel-v1","zitadel-v1-v1"]
14+
"zitadel-app-v1" = ["zitadel-v1"]
15+
"zitadel-auth-v1" = ["zitadel-change-v1","zitadel-idp-v1","zitadel-metadata-v1","zitadel-org-v1","zitadel-policy-v1","zitadel-user-v1","zitadel-v1"]
16+
"zitadel-authn-v1" = ["zitadel-v1"]
17+
"zitadel-change-v1" = ["zitadel-v1"]
18+
"zitadel-event-v1" = ["zitadel-v1"]
19+
"zitadel-feature-v1" = []
20+
"zitadel-feature-v2" = ["zitadel-object-v2"]
21+
"zitadel-feature-v2beta" = ["zitadel-object-v2beta"]
22+
"zitadel-idp-v1" = ["zitadel-v1"]
23+
"zitadel-idp-v2" = ["zitadel-object-v2"]
24+
"zitadel-instance-v1" = ["zitadel-v1"]
25+
"zitadel-management-v1" = ["zitadel-action-v1","zitadel-app-v1","zitadel-authn-v1","zitadel-change-v1","zitadel-idp-v1","zitadel-member-v1","zitadel-metadata-v1","zitadel-org-v1","zitadel-policy-v1","zitadel-project-v1","zitadel-text-v1","zitadel-user-v1","zitadel-v1"]
26+
"zitadel-member-v1" = ["zitadel-user-v1","zitadel-v1"]
27+
"zitadel-metadata-v1" = ["zitadel-v1"]
28+
"zitadel-milestone-v1" = []
29+
"zitadel-object-v2" = []
30+
"zitadel-object-v2beta" = []
31+
"zitadel-object-v3alpha" = []
32+
"zitadel-oidc-v2" = ["zitadel-object-v2"]
33+
"zitadel-oidc-v2beta" = ["zitadel-object-v2beta"]
34+
"zitadel-org-v1" = ["zitadel-v1"]
35+
"zitadel-org-v2" = ["zitadel-object-v2"]
36+
"zitadel-org-v2beta" = ["zitadel-object-v2beta"]
37+
"zitadel-policy-v1" = ["zitadel-idp-v1","zitadel-v1"]
38+
"zitadel-project-v1" = ["zitadel-v1"]
39+
"zitadel-protoc_gen_zitadel-v2" = []
40+
"zitadel-quota-v1" = []
41+
"zitadel-resources-action-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
42+
"zitadel-resources-debug_events-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
43+
"zitadel-resources-object-v3alpha" = ["zitadel-object-v3alpha"]
44+
"zitadel-resources-user-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
45+
"zitadel-resources-userschema-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
46+
"zitadel-resources-webkey-v3alpha" = ["zitadel-object-v3alpha","zitadel-resources-object-v3alpha"]
47+
"zitadel-saml-v2" = ["zitadel-object-v2"]
48+
"zitadel-session-v2" = ["zitadel-object-v2","zitadel-v1"]
49+
"zitadel-session-v2beta" = ["zitadel-object-v2beta","zitadel-v1"]
50+
"zitadel-settings-object-v3alpha" = ["zitadel-object-v3alpha"]
51+
"zitadel-settings-v1" = ["zitadel-v1"]
52+
"zitadel-settings-v2" = ["zitadel-idp-v2","zitadel-object-v2"]
53+
"zitadel-settings-v2beta" = ["zitadel-object-v2beta"]
54+
"zitadel-system-v1" = ["zitadel-feature-v1","zitadel-instance-v1","zitadel-member-v1","zitadel-quota-v1","zitadel-v1"]
55+
"zitadel-text-v1" = ["zitadel-v1"]
56+
"zitadel-user-v1" = ["zitadel-v1"]
57+
"zitadel-user-v2" = ["zitadel-object-v2"]
58+
"zitadel-user-v2beta" = ["zitadel-object-v2beta"]
59+
"zitadel-v1" = []
60+
"zitadel-v1-v1" = ["zitadel-authn-v1","zitadel-idp-v1","zitadel-management-v1","zitadel-org-v1","zitadel-v1"]
61+
# @@protoc_insertion_point(features)
62+
63+
[dependencies]
64+
anyhow = "1.0"
65+
pbjson-types = { version = "0.7.0"}
66+
prost = { version = "0.13.1", default-features = false, features = ["std"] }
67+
prost-types = { version = "0.13.1", default-features = false }
68+
regex = { version = "1.5.5", default-features = false }
69+
tonic = "0.12.0"
70+
71+
[build-dependencies]
72+
tonic-build = "0.12.0"
73+
prost-build = { version = "0.13.1", default-features = false }
74+
pbjson-build = "0.7.0"

0 commit comments

Comments
 (0)