sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

commit 270964c32ea6cf9ba330d77e2714a0caaf2c3da2
parent beb99b13e992af5593e0255a7229a1a0c09a498b
Author: triesap <tyson@radroots.org>
Date:   Wed, 24 Jun 2026 07:38:26 +0000

dto: render events bindings from registry

- Switch events TypeScript type output to the dto registry renderer.

- Render external data enums and path-aware integer policy errors in xtask.

- Preserve core imports and SDK-local tuple wrapper declarations for events output.

- Remove the stale hand-authored events type module while keeping constants and kinds for RCLD-05.

Diffstat:
MCargo.lock | 39+++++++++++++++++++++++++++++++++++++++
Mcrates/events_bindings/src/lib.rs | 12++----------
Mcrates/events_bindings/src/model.rs | 1297-------------------------------------------------------------------------------
Mpackages/events-bindings/src/generated/types.ts | 2+-
Mtools/xtask/src/dto_render.rs | 120++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Mtools/xtask/src/dto_roots.rs | 69++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mtools/xtask/src/output.rs | 17++---------------
7 files changed, 212 insertions(+), 1344 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -500,6 +500,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] +name = "dto_bindgen" +version = "0.1.0" +source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c" +dependencies = [ + "dto_bindgen_backend_python", + "dto_bindgen_backend_ts", + "dto_bindgen_core", + "dto_bindgen_macros", + "sha2", +] + +[[package]] +name = "dto_bindgen_backend_python" +version = "0.1.0" +source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c" +dependencies = [ + "dto_bindgen_core", +] + +[[package]] +name = "dto_bindgen_backend_ts" +version = "0.1.0" +source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c" +dependencies = [ + "dto_bindgen_core", +] + +[[package]] name = "dto_bindgen_core" version = "0.1.0" source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c" @@ -514,6 +542,16 @@ dependencies = [ ] [[package]] +name = "dto_bindgen_macros" +version = "0.1.0" +source = "git+https://github.com/triesap/dto_bindgen?rev=96ed6c691aacab31860828d25da2e0167b13d92c#96ed6c691aacab31860828d25da2e0167b13d92c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "either" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1703,6 +1741,7 @@ dependencies = [ name = "radroots_events" version = "0.1.0-alpha.2" dependencies = [ + "dto_bindgen", "dto_bindgen_core", "hex", "radroots_core", diff --git a/crates/events_bindings/src/lib.rs b/crates/events_bindings/src/lib.rs @@ -2,19 +2,11 @@ pub use radroots_events as upstream; mod model; -pub use model::{constants_module, kinds_module, types_module}; +pub use model::{constants_module, kinds_module}; #[cfg(test)] mod tests { - use super::{constants_module, kinds_module, types_module}; - - #[test] - fn preserves_event_type_exports() { - let rendered = types_module().render(); - assert!(rendered.contains("export type RadrootsListing")); - assert!(rendered.contains("export type RadrootsJobInput")); - assert!(rendered.contains("export type RadrootsTradeOrderRequested")); - } + use super::{constants_module, kinds_module}; #[test] fn preserves_event_constant_exports() { diff --git a/crates/events_bindings/src/model.rs b/crates/events_bindings/src/model.rs @@ -1,1302 +1,5 @@ use radroots_sdk_binding_model::{self as ts, TsValue}; -pub fn types_module() -> ts::TsModule { - ts::module(vec![ - ts::type_alias( - "JobFeedbackStatus", - ts::union(vec![ - ts::string_literal("payment_required"), - ts::string_literal("processing"), - ts::string_literal("error"), - ts::string_literal("success"), - ts::string_literal("partial"), - ]), - ), - ts::type_alias( - "JobInputType", - ts::union(vec![ - ts::string_literal("url"), - ts::string_literal("event"), - ts::string_literal("job"), - ts::string_literal("text"), - ]), - ), - ts::type_alias( - "JobPaymentRequest", - ts::object(vec![ - ts::field("amount_sat", ts::number()), - ts::optional_field("bolt11", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsAccountClaim", - ts::object(vec![ - ts::field("username", ts::string()), - ts::field("pubkey", ts::string()), - ts::optional_field("nip05", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias_params( - "RadrootsActiveTradeEnvelope", - &["T"], - ts::object(vec![ - ts::field("version", ts::number()), - ts::field("domain", ts::reference("RadrootsTradeDomain")), - ts::field("type", ts::reference("RadrootsActiveTradeMessageType")), - ts::field("order_id", ts::string()), - ts::field("listing_addr", ts::string()), - ts::field("payload", ts::reference("T")), - ]), - ), - ts::type_alias( - "RadrootsActiveTradeMessageType", - ts::union(vec![ - ts::string_literal("TradeOrderRequested"), - ts::string_literal("TradeOrderDecision"), - ts::string_literal("TradeOrderRevisionProposed"), - ts::string_literal("TradeOrderRevisionDecision"), - ts::string_literal("TradeOrderCancelled"), - ]), - ), - ts::type_alias( - "RadrootsAppData", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("content", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsComment", - ts::object(vec![ - ts::field("root", ts::reference("RadrootsNostrEventRef")), - ts::field("parent", ts::reference("RadrootsNostrEventRef")), - ts::field("content", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsCoop", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("name", ts::string()), - ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("website", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("picture", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("banner", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "location", - ts::union(vec![ts::reference("RadrootsCoopLocation"), ts::null()]), - ), - ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsCoopLocation", - ts::object(vec![ - ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])), - ts::field("gcs", ts::reference("RadrootsGcsLocation")), - ]), - ), - ts::type_alias( - "RadrootsCoopRef", - ts::object(vec![ - ts::field("pubkey", ts::string()), - ts::field("d_tag", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsDocument", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("doc_type", ts::string()), - ts::field("title", ts::string()), - ts::field("version", ts::string()), - ts::optional_field("summary", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("effective_at", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("body_markdown", ts::union(vec![ts::string(), ts::null()])), - ts::field("subject", ts::reference("RadrootsDocumentSubject")), - ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsDocumentSubject", - ts::object(vec![ - ts::field("pubkey", ts::string()), - ts::optional_field("address", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsFarm", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("name", ts::string()), - ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("website", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("picture", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("banner", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "location", - ts::union(vec![ts::reference("RadrootsFarmLocation"), ts::null()]), - ), - ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsFarmLocation", - ts::object(vec![ - ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "gcs", - ts::union(vec![ts::reference("RadrootsGcsLocation"), ts::null()]), - ), - ]), - ), - ts::type_alias( - "RadrootsFarmRef", - ts::object(vec![ - ts::field("pubkey", ts::string()), - ts::field("d_tag", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsFollow", - ts::object(vec![ts::field( - "list", - ts::array(ts::reference("RadrootsFollowProfile")), - )]), - ), - ts::type_alias( - "RadrootsFollowProfile", - ts::object(vec![ - ts::field("published_at", ts::number()), - ts::field("public_key", ts::string()), - ts::optional_field("relay_url", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("contact_name", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsGcsLocation", - ts::object(vec![ - ts::field("lat", ts::number()), - ts::field("lng", ts::number()), - ts::field("geohash", ts::string()), - ts::field("point", ts::reference("RadrootsGeoJsonPoint")), - ts::field("polygon", ts::reference("RadrootsGeoJsonPolygon")), - ts::optional_field("accuracy", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("altitude", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("tag_0", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("label", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("area", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("elevation", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("soil", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("climate", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("gc_id", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("gc_name", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("gc_admin1_id", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("gc_admin1_name", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("gc_country_id", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("gc_country_name", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsGeoChat", - ts::object(vec![ - ts::field("geohash", ts::string()), - ts::field("content", ts::string()), - ts::optional_field("nickname", ts::union(vec![ts::string(), ts::null()])), - ts::field("teleported", ts::boolean()), - ]), - ), - ts::type_alias( - "RadrootsGeoJsonPoint", - ts::object(vec![ - ts::field("type", ts::string()), - ts::field("coordinates", ts::tuple(vec![ts::number(), ts::number()])), - ]), - ), - ts::type_alias( - "RadrootsGeoJsonPolygon", - ts::object(vec![ - ts::field("type", ts::string()), - ts::field( - "coordinates", - ts::array(ts::array(ts::tuple(vec![ts::number(), ts::number()]))), - ), - ]), - ), - ts::type_alias( - "RadrootsGiftWrap", - ts::object(vec![ - ts::field("recipient", ts::reference("RadrootsGiftWrapRecipient")), - ts::field("content", ts::string()), - ts::optional_field("expiration", ts::union(vec![ts::number(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsGiftWrapRecipient", - ts::object(vec![ - ts::field("public_key", ts::string()), - ts::optional_field("relay_url", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsJobFeedback", - ts::object(vec![ - ts::field("kind", ts::number()), - ts::field("status", ts::reference("JobFeedbackStatus")), - ts::optional_field("extra_info", ts::union(vec![ts::string(), ts::null()])), - ts::field("request_event", ts::reference("RadrootsNostrEventPtr")), - ts::optional_field("customer_pubkey", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "payment", - ts::union(vec![ts::reference("JobPaymentRequest"), ts::null()]), - ), - ts::optional_field("content", ts::union(vec![ts::string(), ts::null()])), - ts::field("encrypted", ts::boolean()), - ]), - ), - ts::type_alias( - "RadrootsJobInput", - ts::object(vec![ - ts::field("data", ts::string()), - ts::field("input_type", ts::reference("JobInputType")), - ts::optional_field("relay", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("marker", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsJobParam", - ts::object(vec![ - ts::field("key", ts::string()), - ts::field("value", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsJobRequest", - ts::object(vec![ - ts::field("kind", ts::number()), - ts::field("inputs", ts::array(ts::reference("RadrootsJobInput"))), - ts::optional_field("output", ts::union(vec![ts::string(), ts::null()])), - ts::field("params", ts::array(ts::reference("RadrootsJobParam"))), - ts::optional_field("bid_sat", ts::union(vec![ts::number(), ts::null()])), - ts::field("relays", ts::array(ts::string())), - ts::field("providers", ts::array(ts::string())), - ts::field("topics", ts::array(ts::string())), - ts::field("encrypted", ts::boolean()), - ]), - ), - ts::type_alias( - "RadrootsJobResult", - ts::object(vec![ - ts::field("kind", ts::number()), - ts::field("request_event", ts::reference("RadrootsNostrEventPtr")), - ts::optional_field("request_json", ts::union(vec![ts::string(), ts::null()])), - ts::field("inputs", ts::array(ts::reference("RadrootsJobInput"))), - ts::optional_field("customer_pubkey", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "payment", - ts::union(vec![ts::reference("JobPaymentRequest"), ts::null()]), - ), - ts::optional_field("content", ts::union(vec![ts::string(), ts::null()])), - ts::field("encrypted", ts::boolean()), - ]), - ), - ts::type_alias( - "RadrootsList", - ts::object(vec![ - ts::field("content", ts::string()), - ts::field("entries", ts::array(ts::reference("RadrootsListEntry"))), - ]), - ), - ts::type_alias( - "RadrootsListEntry", - ts::object(vec![ - ts::field("tag", ts::string()), - ts::field("values", ts::array(ts::string())), - ]), - ), - ts::type_alias( - "RadrootsListSet", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("content", ts::string()), - ts::field("entries", ts::array(ts::reference("RadrootsListEntry"))), - ts::optional_field("title", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("description", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("image", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsListing", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("farm", ts::reference("RadrootsFarmRef")), - ts::field("product", ts::reference("RadrootsListingProduct")), - ts::field("primary_bin_id", ts::string()), - ts::field("bins", ts::array(ts::reference("RadrootsListingBin"))), - ts::optional_field( - "resource_area", - ts::union(vec![ts::reference("RadrootsResourceAreaRef"), ts::null()]), - ), - ts::optional_field( - "plot", - ts::union(vec![ts::reference("RadrootsPlotRef"), ts::null()]), - ), - ts::optional_field( - "discounts", - ts::union(vec![ - ts::array(ts::reference("RadrootsCoreDiscount")), - ts::null(), - ]), - ), - ts::optional_field( - "inventory_available", - ts::union(vec![ts::reference("RadrootsCoreDecimal"), ts::null()]), - ), - ts::optional_field( - "availability", - ts::union(vec![ - ts::reference("RadrootsListingAvailability"), - ts::null(), - ]), - ), - ts::optional_field( - "delivery_method", - ts::union(vec![ - ts::reference("RadrootsListingDeliveryMethod"), - ts::null(), - ]), - ), - ts::optional_field( - "location", - ts::union(vec![ts::reference("RadrootsListingLocation"), ts::null()]), - ), - ts::optional_field( - "images", - ts::union(vec![ - ts::array(ts::reference("RadrootsListingImage")), - ts::null(), - ]), - ), - ]), - ), - ts::type_alias( - "RadrootsListingAvailability", - ts::union(vec![ - ts::object(vec![ - ts::field("kind", ts::string_literal("window")), - ts::field( - "amount", - ts::object(vec![ - ts::optional_field("start", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("end", ts::union(vec![ts::number(), ts::null()])), - ]), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("status")), - ts::field( - "amount", - ts::object(vec![ts::field( - "status", - ts::reference("RadrootsListingStatus"), - )]), - ), - ]), - ]), - ), - ts::type_alias( - "RadrootsListingBin", - ts::object(vec![ - ts::field("bin_id", ts::string()), - ts::field("quantity", ts::reference("RadrootsCoreQuantity")), - ts::field( - "price_per_canonical_unit", - ts::reference("RadrootsCoreQuantityPrice"), - ), - ts::optional_field( - "display_amount", - ts::union(vec![ts::reference("RadrootsCoreDecimal"), ts::null()]), - ), - ts::optional_field( - "display_unit", - ts::union(vec![ts::reference("RadrootsCoreUnit"), ts::null()]), - ), - ts::optional_field("display_label", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "display_price", - ts::union(vec![ts::reference("RadrootsCoreMoney"), ts::null()]), - ), - ts::optional_field( - "display_price_unit", - ts::union(vec![ts::reference("RadrootsCoreUnit"), ts::null()]), - ), - ]), - ), - ts::type_alias( - "RadrootsListingDeliveryMethod", - ts::union(vec![ - ts::object(vec![ts::field("kind", ts::string_literal("pickup"))]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("local_delivery"), - )]), - ts::object(vec![ts::field("kind", ts::string_literal("shipping"))]), - ts::object(vec![ - ts::field("kind", ts::string_literal("other")), - ts::field( - "amount", - ts::object(vec![ts::field("method", ts::string())]), - ), - ]), - ]), - ), - ts::type_alias( - "RadrootsListingImage", - ts::object(vec![ - ts::field("url", ts::string()), - ts::optional_field( - "size", - ts::union(vec![ts::reference("RadrootsListingImageSize"), ts::null()]), - ), - ]), - ), - ts::type_alias( - "RadrootsListingImageSize", - ts::object(vec![ - ts::field("w", ts::number()), - ts::field("h", ts::number()), - ]), - ), - ts::type_alias( - "RadrootsListingLocation", - ts::object(vec![ - ts::field("primary", ts::string()), - ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("lat", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("lng", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field("geohash", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsListingProduct", - ts::object(vec![ - ts::field("key", ts::string()), - ts::field("title", ts::string()), - ts::field("category", ts::string()), - ts::optional_field("summary", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("process", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("lot", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("location", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("profile", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("year", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsListingProductTagKeys", - ts::readonly_tuple(vec![ - ts::string_literal("key"), - ts::string_literal("title"), - ts::string_literal("category"), - ts::string_literal("summary"), - ts::string_literal("process"), - ts::string_literal("lot"), - ts::string_literal("location"), - ts::string_literal("profile"), - ts::string_literal("year"), - ]), - ), - ts::type_alias( - "RadrootsListingStatus", - ts::union(vec![ - ts::object(vec![ts::field("kind", ts::string_literal("active"))]), - ts::object(vec![ts::field("kind", ts::string_literal("sold"))]), - ts::object(vec![ - ts::field("kind", ts::string_literal("other")), - ts::field("amount", ts::object(vec![ts::field("value", ts::string())])), - ]), - ]), - ), - ts::type_alias( - "RadrootsMessage", - ts::object(vec![ - ts::field( - "recipients", - ts::array(ts::reference("RadrootsMessageRecipient")), - ), - ts::field("content", ts::string()), - ts::optional_field( - "reply_to", - ts::union(vec![ts::reference("RadrootsNostrEventPtr"), ts::null()]), - ), - ts::optional_field("subject", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsMessageFile", - ts::object(vec![ - ts::field( - "recipients", - ts::array(ts::reference("RadrootsMessageRecipient")), - ), - ts::field("file_url", ts::string()), - ts::optional_field( - "reply_to", - ts::union(vec![ts::reference("RadrootsNostrEventPtr"), ts::null()]), - ), - ts::optional_field("subject", ts::union(vec![ts::string(), ts::null()])), - ts::field("file_type", ts::string()), - ts::field("encryption_algorithm", ts::string()), - ts::field("decryption_key", ts::string()), - ts::field("decryption_nonce", ts::string()), - ts::field("encrypted_hash", ts::string()), - ts::optional_field("original_hash", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("size", ts::union(vec![ts::number(), ts::null()])), - ts::optional_field( - "dimensions", - ts::union(vec![ - ts::reference("RadrootsMessageFileDimensions"), - ts::null(), - ]), - ), - ts::optional_field("blurhash", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("thumb", ts::union(vec![ts::string(), ts::null()])), - ts::field("fallbacks", ts::array(ts::string())), - ]), - ), - ts::type_alias( - "RadrootsMessageFileDimensions", - ts::object(vec![ - ts::field("w", ts::number()), - ts::field("h", ts::number()), - ]), - ), - ts::type_alias( - "RadrootsMessageRecipient", - ts::object(vec![ - ts::field("public_key", ts::string()), - ts::optional_field("relay_url", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsNostrEvent", - ts::object(vec![ - ts::field("id", ts::string()), - ts::field("author", ts::string()), - ts::field("created_at", ts::number()), - ts::field("kind", ts::number()), - ts::field("tags", ts::array(ts::array(ts::string()))), - ts::field("content", ts::string()), - ts::field("sig", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsNostrEventPtr", - ts::object(vec![ - ts::field("id", ts::string()), - ts::optional_field("relays", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsNostrEventRef", - ts::object(vec![ - ts::field("id", ts::string()), - ts::field("author", ts::string()), - ts::field("kind", ts::number()), - ts::optional_field("d_tag", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "relays", - ts::union(vec![ts::array(ts::string()), ts::null()]), - ), - ]), - ), - ts::type_alias( - "RadrootsPlot", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("farm", ts::reference("RadrootsFarmRef")), - ts::field("name", ts::string()), - ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "location", - ts::union(vec![ts::reference("RadrootsPlotLocation"), ts::null()]), - ), - ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsPlotLocation", - ts::object(vec![ - ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])), - ts::field("gcs", ts::reference("RadrootsGcsLocation")), - ]), - ), - ts::type_alias( - "RadrootsPlotRef", - ts::object(vec![ - ts::field("pubkey", ts::string()), - ts::field("d_tag", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsPost", - ts::object(vec![ts::field("content", ts::string())]), - ), - ts::type_alias( - "RadrootsProfile", - ts::object(vec![ - ts::field("name", ts::string()), - ts::optional_field("display_name", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("nip05", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("website", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("picture", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("banner", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("lud06", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("lud16", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("bot", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsProfileType", - ts::union(vec![ - ts::string_literal("individual"), - ts::string_literal("farm"), - ts::string_literal("coop"), - ts::string_literal("any"), - ts::string_literal("radrootsd"), - ]), - ), - ts::type_alias( - "RadrootsReaction", - ts::object(vec![ - ts::field("root", ts::reference("RadrootsNostrEventRef")), - ts::field("content", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsRelayDocument", - ts::object(vec![ - ts::optional_field("name", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("description", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("pubkey", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("contact", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field( - "supported_nips", - ts::union(vec![ts::array(ts::number()), ts::null()]), - ), - ts::optional_field("software", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("version", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsResourceArea", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("name", ts::string()), - ts::optional_field("about", ts::union(vec![ts::string(), ts::null()])), - ts::field("location", ts::reference("RadrootsResourceAreaLocation")), - ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsResourceAreaLocation", - ts::object(vec![ - ts::optional_field("primary", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("city", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("region", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("country", ts::union(vec![ts::string(), ts::null()])), - ts::field("gcs", ts::reference("RadrootsGcsLocation")), - ]), - ), - ts::type_alias( - "RadrootsResourceAreaRef", - ts::object(vec![ - ts::field("pubkey", ts::string()), - ts::field("d_tag", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsResourceHarvestCap", - ts::object(vec![ - ts::field("d_tag", ts::string()), - ts::field("resource_area", ts::reference("RadrootsResourceAreaRef")), - ts::field("product", ts::reference("RadrootsResourceHarvestProduct")), - ts::field("start", ts::bigint()), - ts::field("end", ts::bigint()), - ts::field("cap_quantity", ts::reference("RadrootsCoreQuantity")), - ts::optional_field( - "display_amount", - ts::union(vec![ts::reference("RadrootsCoreDecimal"), ts::null()]), - ), - ts::optional_field( - "display_unit", - ts::union(vec![ts::reference("RadrootsCoreUnit"), ts::null()]), - ), - ts::optional_field("display_label", ts::union(vec![ts::string(), ts::null()])), - ts::optional_field("tags", ts::union(vec![ts::array(ts::string()), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsResourceHarvestProduct", - ts::object(vec![ - ts::field("key", ts::string()), - ts::optional_field("category", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsSeal", - ts::object(vec![ts::field("content", ts::string())]), - ), - ts::type_alias( - "RadrootsTradeAnswer", - ts::object(vec![ts::field("question_id", ts::string())]), - ), - ts::type_alias( - "RadrootsTradeDiscountDecision", - ts::union(vec![ - ts::object(vec![ - ts::field("kind", ts::string_literal("accept")), - ts::field( - "amount", - ts::object(vec![ts::field( - "value", - ts::reference("RadrootsCoreDiscountValue"), - )]), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("decline")), - ts::field( - "amount", - ts::object(vec![ts::optional_field( - "reason", - ts::union(vec![ts::string(), ts::null()]), - )]), - ), - ]), - ]), - ), - ts::type_alias( - "RadrootsTradeDiscountOffer", - ts::object(vec![ - ts::field("discount_id", ts::string()), - ts::field("value", ts::reference("RadrootsCoreDiscountValue")), - ]), - ), - ts::type_alias( - "RadrootsTradeDiscountRequest", - ts::object(vec![ - ts::field("discount_id", ts::string()), - ts::field("value", ts::reference("RadrootsCoreDiscountValue")), - ]), - ), - ts::type_alias("RadrootsTradeDomain", ts::string_literal("trade:listing")), - ts::type_alias( - "RadrootsTradeEconomicActor", - ts::union(vec![ - ts::string_literal("buyer"), - ts::string_literal("seller"), - ]), - ), - ts::type_alias( - "RadrootsTradeEconomicEffect", - ts::union(vec![ - ts::string_literal("increase"), - ts::string_literal("decrease"), - ]), - ), - ts::type_alias( - "RadrootsTradeEconomicLineKind", - ts::union(vec![ - ts::string_literal("listing_discount"), - ts::string_literal("basket_adjustment"), - ts::string_literal("revision_adjustment"), - ]), - ), - ts::type_alias_params( - "RadrootsTradeEnvelope", - &["T"], - ts::object(vec![ - ts::field("version", ts::number()), - ts::field("domain", ts::reference("RadrootsTradeDomain")), - ts::field("type", ts::reference("RadrootsTradeMessageType")), - ts::optional_field("order_id", ts::union(vec![ts::string(), ts::null()])), - ts::field("listing_addr", ts::string()), - ts::field("payload", ts::reference("T")), - ]), - ), - ts::type_alias( - "RadrootsTradeInventoryCommitment", - ts::object(vec![ - ts::field("bin_id", ts::string()), - ts::field("bin_count", ts::number()), - ]), - ), - ts::type_alias( - "RadrootsTradeListingCancel", - ts::object(vec![ts::optional_field( - "reason", - ts::union(vec![ts::string(), ts::null()]), - )]), - ), - ts::type_alias( - "RadrootsTradeListingParseError", - ts::union(vec![ - ts::object(vec![ts::field("InvalidKind", ts::number())]), - ts::object(vec![ts::field("MissingTag", ts::string())]), - ts::object(vec![ts::field("InvalidTag", ts::string())]), - ts::object(vec![ts::field("InvalidNumber", ts::string())]), - ts::string_literal("InvalidUnit"), - ts::string_literal("InvalidCurrency"), - ts::object(vec![ts::field("InvalidJson", ts::string())]), - ts::object(vec![ts::field("InvalidDiscount", ts::string())]), - ]), - ), - ts::type_alias( - "RadrootsTradeListingValidateRequest", - ts::object(vec![ts::optional_field( - "listing_event", - ts::union(vec![ts::reference("RadrootsNostrEventPtr"), ts::null()]), - )]), - ), - ts::type_alias( - "RadrootsTradeListingValidateResult", - ts::object(vec![ - ts::field("valid", ts::boolean()), - ts::field( - "errors", - ts::array(ts::reference("RadrootsTradeListingValidationError")), - ), - ]), - ), - ts::type_alias( - "RadrootsTradeListingValidationError", - ts::union(vec![ - ts::object(vec![ - ts::field("kind", ts::string_literal("invalid_kind")), - ts::field("amount", ts::object(vec![ts::field("kind", ts::number())])), - ]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_listing_id"), - )]), - ts::object(vec![ - ts::field("kind", ts::string_literal("listing_event_not_found")), - ts::field( - "amount", - ts::object(vec![ts::field("listing_addr", ts::string())]), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("listing_event_fetch_failed")), - ts::field( - "amount", - ts::object(vec![ts::field("listing_addr", ts::string())]), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("parse_error")), - ts::field( - "amount", - ts::object(vec![ts::field( - "error", - ts::reference("RadrootsTradeListingParseError"), - )]), - ), - ]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("invalid_seller"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_farm_profile"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_farm_record"), - )]), - ts::object(vec![ts::field("kind", ts::string_literal("missing_title"))]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_description"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_product_type"), - )]), - ts::object(vec![ts::field("kind", ts::string_literal("missing_bins"))]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_primary_bin"), - )]), - ts::object(vec![ts::field("kind", ts::string_literal("invalid_bin"))]), - ts::object(vec![ts::field("kind", ts::string_literal("missing_price"))]), - ts::object(vec![ts::field("kind", ts::string_literal("invalid_price"))]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_inventory"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("invalid_inventory"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_availability"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_location"), - )]), - ts::object(vec![ts::field( - "kind", - ts::string_literal("missing_delivery_method"), - )]), - ]), - ), - ts::type_alias( - "RadrootsTradeMessagePayload", - ts::union(vec![ - ts::object(vec![ - ts::field("kind", ts::string_literal("listing_validate_request")), - ts::field( - "amount", - ts::reference("RadrootsTradeListingValidateRequest"), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("listing_validate_result")), - ts::field( - "amount", - ts::reference("RadrootsTradeListingValidateResult"), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("trade_order_requested")), - ts::field("amount", ts::reference("RadrootsTradeOrderRequested")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("order_response")), - ts::field("amount", ts::reference("RadrootsTradeOrderResponse")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("order_revision")), - ts::field("amount", ts::reference("RadrootsTradeOrderRevision")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("order_revision_accept")), - ts::field( - "amount", - ts::reference("RadrootsTradeOrderRevisionResponse"), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("order_revision_decline")), - ts::field( - "amount", - ts::reference("RadrootsTradeOrderRevisionResponse"), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("question")), - ts::field("amount", ts::reference("RadrootsTradeQuestion")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("answer")), - ts::field("amount", ts::reference("RadrootsTradeAnswer")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("discount_request")), - ts::field("amount", ts::reference("RadrootsTradeDiscountRequest")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("discount_offer")), - ts::field("amount", ts::reference("RadrootsTradeDiscountOffer")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("discount_accept")), - ts::field("amount", ts::reference("RadrootsTradeDiscountDecision")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("discount_decline")), - ts::field("amount", ts::reference("RadrootsTradeDiscountDecision")), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("cancel")), - ts::field("amount", ts::reference("RadrootsTradeListingCancel")), - ]), - ]), - ), - ts::type_alias( - "RadrootsTradeMessageType", - ts::union(vec![ - ts::string_literal("listing_validate_request"), - ts::string_literal("listing_validate_result"), - ts::string_literal("order_request"), - ts::string_literal("order_response"), - ts::string_literal("order_revision"), - ts::string_literal("order_revision_accept"), - ts::string_literal("order_revision_decline"), - ts::string_literal("question"), - ts::string_literal("answer"), - ts::string_literal("discount_request"), - ts::string_literal("discount_offer"), - ts::string_literal("discount_accept"), - ts::string_literal("discount_decline"), - ts::string_literal("cancel"), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderCancelled", - ts::object(vec![ - ts::field("order_id", ts::string()), - ts::field("listing_addr", ts::string()), - ts::field("buyer_pubkey", ts::string()), - ts::field("seller_pubkey", ts::string()), - ts::field("reason", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderChange", - ts::union(vec![ - ts::object(vec![ - ts::field("kind", ts::string_literal("bin_count")), - ts::field( - "amount", - ts::object(vec![ - ts::field("item_index", ts::number()), - ts::field("bin_count", ts::number()), - ]), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("item_add")), - ts::field( - "amount", - ts::object(vec![ts::field( - "item", - ts::reference("RadrootsTradeOrderItem"), - )]), - ), - ]), - ts::object(vec![ - ts::field("kind", ts::string_literal("item_remove")), - ts::field( - "amount", - ts::object(vec![ts::field("item_index", ts::number())]), - ), - ]), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderDecision", - ts::union(vec![ - ts::object(vec![ - ts::field("decision", ts::string_literal("accepted")), - ts::field( - "inventory_commitments", - ts::array(ts::reference("RadrootsTradeInventoryCommitment")), - ), - ]), - ts::object(vec![ - ts::field("decision", ts::string_literal("declined")), - ts::field("reason", ts::string()), - ]), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderDecisionEvent", - ts::object(vec![ - ts::field("order_id", ts::string()), - ts::field("listing_addr", ts::string()), - ts::field("buyer_pubkey", ts::string()), - ts::field("seller_pubkey", ts::string()), - ts::field("decision", ts::reference("RadrootsTradeOrderDecision")), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderEconomicItem", - ts::object(vec![ - ts::field("bin_id", ts::string()), - ts::field("bin_count", ts::number()), - ts::field("quantity_amount", ts::reference("RadrootsCoreDecimal")), - ts::field("quantity_unit", ts::reference("RadrootsCoreUnit")), - ts::field("unit_price_amount", ts::reference("RadrootsCoreDecimal")), - ts::field("unit_price_currency", ts::reference("RadrootsCoreCurrency")), - ts::field("line_subtotal", ts::reference("RadrootsCoreMoney")), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderEconomicLine", - ts::object(vec![ - ts::field("id", ts::string()), - ts::field("kind", ts::reference("RadrootsTradeEconomicLineKind")), - ts::field("actor", ts::reference("RadrootsTradeEconomicActor")), - ts::field("effect", ts::reference("RadrootsTradeEconomicEffect")), - ts::field("amount", ts::reference("RadrootsCoreMoney")), - ts::field("reason", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderEconomicTotals", - ts::object(vec![ - ts::field("subtotal", ts::reference("RadrootsCoreMoney")), - ts::field("discount_total", ts::reference("RadrootsCoreMoney")), - ts::field("adjustment_total", ts::reference("RadrootsCoreMoney")), - ts::field("total", ts::reference("RadrootsCoreMoney")), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderEconomics", - ts::object(vec![ - ts::field("quote_id", ts::string()), - ts::field("quote_version", ts::number()), - ts::field("pricing_basis", ts::reference("RadrootsTradePricingBasis")), - ts::field("currency", ts::reference("RadrootsCoreCurrency")), - ts::field( - "items", - ts::array(ts::reference("RadrootsTradeOrderEconomicItem")), - ), - ts::field( - "discounts", - ts::array(ts::reference("RadrootsTradeOrderEconomicLine")), - ), - ts::field( - "adjustments", - ts::array(ts::reference("RadrootsTradeOrderEconomicLine")), - ), - ts::field("subtotal", ts::reference("RadrootsCoreMoney")), - ts::field("discount_total", ts::reference("RadrootsCoreMoney")), - ts::field("adjustment_total", ts::reference("RadrootsCoreMoney")), - ts::field("total", ts::reference("RadrootsCoreMoney")), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderItem", - ts::object(vec![ - ts::field("bin_id", ts::string()), - ts::field("bin_count", ts::number()), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderRequested", - ts::object(vec![ - ts::field("order_id", ts::string()), - ts::field("listing_addr", ts::string()), - ts::field("buyer_pubkey", ts::string()), - ts::field("seller_pubkey", ts::string()), - ts::field("items", ts::array(ts::reference("RadrootsTradeOrderItem"))), - ts::field("economics", ts::reference("RadrootsTradeOrderEconomics")), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderResponse", - ts::object(vec![ - ts::field("accepted", ts::boolean()), - ts::optional_field("reason", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderRevision", - ts::object(vec![ - ts::field("revision_id", ts::string()), - ts::field( - "changes", - ts::array(ts::reference("RadrootsTradeOrderChange")), - ), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderRevisionDecision", - ts::union(vec![ - ts::object(vec![ts::field("decision", ts::string_literal("accepted"))]), - ts::object(vec![ - ts::field("decision", ts::string_literal("declined")), - ts::field("reason", ts::string()), - ]), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderRevisionDecisionEvent", - ts::object(vec![ - ts::field("revision_id", ts::string()), - ts::field("order_id", ts::string()), - ts::field("listing_addr", ts::string()), - ts::field("buyer_pubkey", ts::string()), - ts::field("seller_pubkey", ts::string()), - ts::field("root_event_id", ts::string()), - ts::field("prev_event_id", ts::string()), - ts::field( - "decision", - ts::reference("RadrootsTradeOrderRevisionDecision"), - ), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderRevisionProposed", - ts::object(vec![ - ts::field("revision_id", ts::string()), - ts::field("order_id", ts::string()), - ts::field("listing_addr", ts::string()), - ts::field("buyer_pubkey", ts::string()), - ts::field("seller_pubkey", ts::string()), - ts::field("root_event_id", ts::string()), - ts::field("prev_event_id", ts::string()), - ts::field("items", ts::array(ts::reference("RadrootsTradeOrderItem"))), - ts::field("economics", ts::reference("RadrootsTradeOrderEconomics")), - ts::field("reason", ts::string()), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderRevisionResponse", - ts::object(vec![ - ts::field("accepted", ts::boolean()), - ts::optional_field("reason", ts::union(vec![ts::string(), ts::null()])), - ]), - ), - ts::type_alias( - "RadrootsTradeOrderStatus", - ts::union(vec![ - ts::string_literal("draft"), - ts::string_literal("validated"), - ts::string_literal("requested"), - ts::string_literal("questioned"), - ts::string_literal("revised"), - ts::string_literal("accepted"), - ts::string_literal("declined"), - ts::string_literal("cancelled"), - ]), - ), - ts::type_alias( - "RadrootsTradePricingBasis", - ts::string_literal("listing_event"), - ), - ts::type_alias( - "RadrootsTradeQuestion", - ts::object(vec![ts::field("question_id", ts::string())]), - ), - ts::type_alias( - "RadrootsTradeTransportLane", - ts::union(vec![ - ts::string_literal("service"), - ts::string_literal("public"), - ]), - ), - ]) -} - pub fn constants_module() -> ts::TsModule { ts::module(vec![ ts::import_type(&["RadrootsListingProductTagKeys"], "./types.js"), diff --git a/packages/events-bindings/src/generated/types.ts b/packages/events-bindings/src/generated/types.ts @@ -75,7 +75,7 @@ export type RadrootsListEntry = { tag: string, values: Array<string>, }; export type RadrootsListSet = { d_tag: string, content: string, entries: Array<RadrootsListEntry>, title?: string | null, description?: string | null, image?: string | null, }; -export type RadrootsListing = { d_tag: string, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, }; +export type RadrootsListing = { d_tag: string, published_at?: number | null, farm: RadrootsFarmRef, product: RadrootsListingProduct, primary_bin_id: string, bins: Array<RadrootsListingBin>, resource_area?: RadrootsResourceAreaRef | null, plot?: RadrootsPlotRef | null, discounts?: Array<RadrootsCoreDiscount> | null, inventory_available?: RadrootsCoreDecimal | null, availability?: RadrootsListingAvailability | null, delivery_method?: RadrootsListingDeliveryMethod | null, location?: RadrootsListingLocation | null, images?: Array<RadrootsListingImage> | null, }; export type RadrootsListingAvailability = { kind: "window", amount: { start?: number | null, end?: number | null, }, } | { kind: "status", amount: { status: RadrootsListingStatus, }, }; diff --git a/tools/xtask/src/dto_render.rs b/tools/xtask/src/dto_render.rs @@ -141,36 +141,79 @@ fn render_enum( imports: &mut BTreeMap<String, BTreeSet<String>>, ) -> Result<String, String> { match &def.repr { - EnumRepr::External - if def - .variants - .iter() - .all(|variant| matches!(variant.shape, VariantShape::Unit)) => - { - let variants = def - .variants - .iter() - .map(|variant| quote_string(&variant.wire_name)) - .collect::<Vec<_>>(); - Ok(format!( - "export type {} = {};", - enum_type_name(def), - render_union(variants) - )) - } + EnumRepr::External => render_external_enum(def, registry, options, imports), EnumRepr::Internal { tag } => { render_tagged_enum(def, tag, None, registry, options, imports) } EnumRepr::Adjacent { tag, content } => { render_tagged_enum(def, tag, Some(content.as_str()), registry, options, imports) } - EnumRepr::External | EnumRepr::Untagged => Err(format!( + EnumRepr::Untagged => Err(format!( "unsupported enum representation for {}", enum_type_name(def) )), } } +fn render_external_enum( + def: &EnumDef, + registry: &Registry, + options: &DtoRegistryRenderOptions, + imports: &mut BTreeMap<String, BTreeSet<String>>, +) -> Result<String, String> { + let variants = def + .variants + .iter() + .map(|variant| render_external_variant(def, variant, registry, options, imports)) + .collect::<Result<Vec<_>, _>>()?; + Ok(format!( + "export type {} = {};", + enum_type_name(def), + render_union(variants) + )) +} + +fn render_external_variant( + def: &EnumDef, + variant: &VariantDef, + registry: &Registry, + options: &DtoRegistryRenderOptions, + imports: &mut BTreeMap<String, BTreeSet<String>>, +) -> Result<String, String> { + let rendered: Result<String, String> = match &variant.shape { + VariantShape::Unit => Ok(quote_string(&variant.wire_name)), + VariantShape::Newtype(ty) => Ok(format!( + "{{ {}: {}, }}", + render_property_name(&variant.wire_name), + render_type_ref(ty, None, registry, options, imports)? + )), + VariantShape::Tuple(items) => { + let rendered = items + .iter() + .map(|item| render_type_ref(item, None, registry, options, imports)) + .collect::<Result<Vec<_>, _>>()?; + Ok(format!( + "{{ {}: [{}], }}", + render_property_name(&variant.wire_name), + rendered.join(", ") + )) + } + VariantShape::Struct(fields) => Ok(format!( + "{{ {}: {}, }}", + render_property_name(&variant.wire_name), + render_object_fields(fields, registry, options, imports)? + )), + }; + + rendered.map_err(|error| { + format!( + "{error} while rendering external enum {}.{}", + enum_type_name(def), + variant.rust_name + ) + }) +} + fn render_tagged_enum( def: &EnumDef, tag: &str, @@ -292,7 +335,13 @@ fn render_object_field( } else { "?" }; - let mut value = render_type_ref(&field.ty, field.int_repr, registry, options, imports)?; + let mut value = render_type_ref(&field.ty, field.int_repr, registry, options, imports) + .map_err(|error| { + format!( + "{error} while rendering field {} at {}", + field.target.typescript, field.source + ) + })?; if field.presence.nullable { value = render_nullable(value); } @@ -644,7 +693,7 @@ mod tests { assert_eq!( error, - "large integer field requires explicit numeric policy" + "large integer field requires explicit numeric policy while rendering field value at src/dto.rs:1:1" ); } @@ -715,4 +764,35 @@ mod tests { "export type Counter = { value: number, };\n\nexport type TransparentCounters = { maybeCount?: string | null, countList: Array<string>, fixedCounts: [string, string], byKey: Record<string, string>, namedCounter: Counter, };" ); } + + #[test] + fn renders_external_data_enums() { + let mut registry = Registry::new(); + registry.register_type( + RustTypeId::new("sdk", "ParseError"), + TypeDef::Enum( + EnumDef::new("ParseError", "ParseError", EnumRepr::External, span()) + .with_variant(VariantDef::new( + "InvalidKind", + "InvalidKind", + VariantShape::Newtype(TypeRef::Primitive(Primitive::U32)), + span(), + )) + .with_variant(VariantDef::new( + "InvalidUnit", + "InvalidUnit", + VariantShape::Unit, + span(), + )), + ), + ); + + let rendered = render_registry_types(&registry, &DtoRegistryRenderOptions::default()) + .expect("registry renders"); + + assert_eq!( + rendered.body_ts(), + "export type ParseError = { InvalidKind: number, } | \"InvalidUnit\";" + ); + } } diff --git a/tools/xtask/src/dto_roots.rs b/tools/xtask/src/dto_roots.rs @@ -1,4 +1,4 @@ -use dto_bindgen_core::{Registry, RootDescriptor, build_registry}; +use dto_bindgen_core::{Registry, RootDescriptor, RustTypeId, TypeId, build_registry}; use crate::dto_render::{DtoRegistryRenderOptions, DtoTypesModule, render_registry_types}; @@ -118,6 +118,20 @@ pub fn core_types_module() -> Result<DtoTypesModule, String> { )) } +pub fn events_types_module() -> Result<DtoTypesModule, String> { + let root_set = + package_root_set("events").ok_or_else(|| "missing events DTO roots".to_owned())?; + let registry = root_set.registry(); + let rendered = render_registry_types( + &registry, + &core_import_options(&registry, DtoRegistryRenderOptions::default()), + )?; + Ok(DtoTypesModule::new( + rendered.imports_ts().unwrap_or_default(), + with_events_sdk_wrappers(rendered.body_ts()), + )) +} + fn core_roots() -> Vec<RootDescriptor> { radroots_core::dto::dto_roots().into_iter().collect() } @@ -126,6 +140,59 @@ fn events_roots() -> Vec<RootDescriptor> { radroots_events::dto::dto_roots().into_iter().collect() } +fn core_import_options( + registry: &Registry, + mut options: DtoRegistryRenderOptions, +) -> DtoRegistryRenderOptions { + for export_name in [ + "RadrootsCoreCurrency", + "RadrootsCoreDecimal", + "RadrootsCoreDiscount", + "RadrootsCoreDiscountScope", + "RadrootsCoreDiscountThreshold", + "RadrootsCoreDiscountValue", + "RadrootsCoreMoney", + "RadrootsCorePercent", + "RadrootsCoreQuantity", + "RadrootsCoreQuantityPrice", + "RadrootsCoreUnit", + "RadrootsCoreUnitDimension", + ] { + if let Some(type_id) = core_type_id(registry, export_name) { + options = options.with_external_type(type_id, export_name, "@radroots/core-bindings"); + } + } + options +} + +fn core_type_id(registry: &Registry, rust_ident: &str) -> Option<TypeId> { + registry + .rust_id_to_type_id + .get(&RustTypeId::new("radroots_core", rust_ident)) + .copied() +} + +fn with_events_sdk_wrappers(body: &str) -> String { + let mut declarations = body + .split("\n\n") + .filter(|declaration| !declaration.trim().is_empty()) + .map(str::to_owned) + .collect::<Vec<_>>(); + declarations.push( + "export type RadrootsListingProductTagKeys = readonly [\"key\", \"title\", \"category\", \"summary\", \"process\", \"lot\", \"location\", \"profile\", \"year\"];" + .to_owned(), + ); + declarations.sort_by(|left, right| declaration_name(left).cmp(declaration_name(right))); + declarations.join("\n\n") +} + +fn declaration_name(declaration: &str) -> &str { + declaration + .strip_prefix("export type ") + .and_then(|rest| rest.split([' ', '<']).next()) + .unwrap_or(declaration) +} + #[cfg(test)] mod tests { use super::{ diff --git a/tools/xtask/src/output.rs b/tools/xtask/src/output.rs @@ -88,8 +88,8 @@ pub fn package_outputs() -> Result<Vec<PackageOutput>, String> { }, PackageOutput { spec: spec_by_key("events"), - types_ts: Some(TsSource::Module(radroots_events_bindings::types_module())), - types_imports_ts: Some(EVENTS_TYPES_IMPORTS_TS), + types_ts: Some(TsSource::DtoRegistry(dto_roots::events_types_module()?)), + types_imports_ts: None, constants_ts: Some(TsSource::Module( radroots_events_bindings::constants_module(), )), @@ -166,19 +166,6 @@ fn combined_imports(first: Option<&str>, second: Option<&str>) -> Option<String> } } -const EVENTS_TYPES_IMPORTS_TS: &str = r#"import type { - RadrootsCoreCurrency, - RadrootsCoreDecimal, - RadrootsCoreDiscount, - RadrootsCoreDiscountValue, - RadrootsCoreMoney, - RadrootsCoreQuantity, - RadrootsCoreQuantityPrice, - RadrootsCoreUnit, -} from "@radroots/core-bindings"; - -"#; - const REPLICA_DB_SCHEMA_TYPES_IMPORTS_TS: &str = r#"import type { IResult, IResultList,