commit 5843fe3d2f22eff03d62dc7810cd71396a4404cc
parent d4e910c321e256c8cc035243eaf312eebc047bfd
Author: triesap <tyson@radroots.org>
Date: Wed, 24 Jun 2026 06:58:06 +0000
dto: close core registry binding output
- render registry declarations in stable exported-name order
- remove the core binding crate dependency on the hand-written binding model
- retarget core binding tests to the generated package artifact
- regenerate core TypeScript output from source descriptors
Diffstat:
3 files changed, 17 insertions(+), 120 deletions(-)
diff --git a/crates/core_bindings/Cargo.toml b/crates/core_bindings/Cargo.toml
@@ -10,5 +10,4 @@ homepage.workspace = true
publish = false
[dependencies]
-radroots_sdk_binding_model = { path = "../binding_model" }
radroots_core = { workspace = true }
diff --git a/crates/core_bindings/src/lib.rs b/crates/core_bindings/src/lib.rs
@@ -1,122 +1,16 @@
pub use radroots_core as upstream;
-use radroots_sdk_binding_model as ts;
-
-pub fn types_module() -> ts::TsModule {
- ts::module(vec![
- ts::type_alias("RadrootsCoreCurrency", ts::string()),
- ts::type_alias("RadrootsCoreDecimal", ts::string()),
- ts::type_alias(
- "RadrootsCoreDiscount",
- ts::object(vec![
- ts::field("scope", ts::reference("RadrootsCoreDiscountScope")),
- ts::field("threshold", ts::reference("RadrootsCoreDiscountThreshold")),
- ts::field("value", ts::reference("RadrootsCoreDiscountValue")),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreDiscountScope",
- ts::union(vec![
- ts::string_literal("bin"),
- ts::string_literal("order_total"),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreDiscountThreshold",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("bin_count")),
- ts::field(
- "amount",
- ts::object(vec![
- ts::field("bin_id", ts::string()),
- ts::field("min", ts::number()),
- ]),
- ),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("order_quantity")),
- ts::field(
- "amount",
- ts::object(vec![ts::field(
- "min",
- ts::reference("RadrootsCoreQuantity"),
- )]),
- ),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreDiscountValue",
- ts::union(vec![
- ts::object(vec![
- ts::field("kind", ts::string_literal("money_per_bin")),
- ts::field("amount", ts::reference("RadrootsCoreMoney")),
- ]),
- ts::object(vec![
- ts::field("kind", ts::string_literal("percent")),
- ts::field("amount", ts::reference("RadrootsCorePercent")),
- ]),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreMoney",
- ts::object(vec![
- ts::field("amount", ts::string()),
- ts::field("currency", ts::string()),
- ]),
- ),
- ts::type_alias(
- "RadrootsCorePercent",
- ts::object(vec![ts::field("value", ts::string())]),
- ),
- ts::type_alias(
- "RadrootsCoreQuantity",
- ts::object(vec![
- ts::field("amount", ts::string()),
- ts::field("unit", ts::reference("RadrootsCoreUnit")),
- ts::field("label", ts::nullable(ts::string())),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreQuantityPrice",
- ts::object(vec![
- ts::field("amount", ts::reference("RadrootsCoreMoney")),
- ts::field("quantity", ts::reference("RadrootsCoreQuantity")),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreUnit",
- ts::union(vec![
- ts::string_literal("each"),
- ts::string_literal("kg"),
- ts::string_literal("g"),
- ts::string_literal("oz"),
- ts::string_literal("lb"),
- ts::string_literal("l"),
- ts::string_literal("ml"),
- ]),
- ),
- ts::type_alias(
- "RadrootsCoreUnitDimension",
- ts::union(vec![
- ts::string_literal("count"),
- ts::string_literal("mass"),
- ts::string_literal("volume"),
- ]),
- ),
- ])
-}
-
#[cfg(test)]
mod tests {
- use super::types_module;
+ const GENERATED_TYPES_TS: &str =
+ include_str!("../../../packages/core-bindings/src/generated/types.ts");
#[test]
- fn preserves_core_type_exports() {
- let rendered = types_module().render();
- assert!(rendered.contains("export type RadrootsCoreMoney"));
- assert!(rendered.contains("export type RadrootsCoreQuantityPrice"));
- assert!(rendered.contains("\"each\""));
+ fn generated_core_types_are_source_rendered() {
+ assert!(GENERATED_TYPES_TS.contains("export type RadrootsCoreMoney"));
+ assert!(GENERATED_TYPES_TS.contains("export type RadrootsCoreQuantityPrice"));
+ assert!(GENERATED_TYPES_TS.contains("export type RadrootsCoreUnitDimension"));
+ assert!(GENERATED_TYPES_TS.contains("label?: string | null"));
+ assert!(!GENERATED_TYPES_TS.contains("label: string | null"));
}
}
diff --git a/tools/sdk_xtask_import/src/dto_render.rs b/tools/sdk_xtask_import/src/dto_render.rs
@@ -81,11 +81,15 @@ pub fn render_registry_types(
) -> Result<DtoTypesModule, String> {
let mut imports = BTreeMap::<String, BTreeSet<String>>::new();
let mut declarations = Vec::new();
+ let mut type_defs = registry
+ .types_by_id
+ .iter()
+ .filter(|(type_id, _)| !options.external_imports.contains_key(type_id))
+ .collect::<Vec<_>>();
- for (type_id, type_def) in ®istry.types_by_id {
- if options.external_imports.contains_key(type_id) {
- continue;
- }
+ type_defs.sort_by(|(_, left), (_, right)| type_name(left).cmp(type_name(right)));
+
+ for (type_id, type_def) in type_defs {
declarations.push(render_type_def(
*type_id,
type_def,
@@ -617,7 +621,7 @@ mod tests {
);
assert_eq!(
rendered.body_ts(),
- "export type Envelope<T> = { value: T, };\n\nexport type SyntheticThing = { external: ExternalThing, maybeCount?: string | null, point: [number, number], envelope: Envelope<ExternalThing>, };\n\nexport type SyntheticMode = \"ready\" | \"done\";\n\nexport type SyntheticEvent = { type: \"created\", payload: { id: string, }, } | { type: \"archived\", payload: { reason?: string | null, }, };"
+ "export type Envelope<T> = { value: T, };\n\nexport type SyntheticEvent = { type: \"created\", payload: { id: string, }, } | { type: \"archived\", payload: { reason?: string | null, }, };\n\nexport type SyntheticMode = \"ready\" | \"done\";\n\nexport type SyntheticThing = { external: ExternalThing, maybeCount?: string | null, point: [number, number], envelope: Envelope<ExternalThing>, };"
);
}