diff --git a/.chronus/changes/fix-duration-milliseconds-example-serialization-2026-8-19-18-30-0.md b/.chronus/changes/fix-duration-milliseconds-example-serialization-2026-8-19-18-30-0.md new file mode 100644 index 00000000000..85335fcc319 --- /dev/null +++ b/.chronus/changes/fix-duration-milliseconds-example-serialization-2026-8-19-18-30-0.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/compiler" +--- + +Fix `duration` example values being serialized verbatim as an ISO 8601 string instead of a numeric value when encoded with `@encode("milliseconds", ...)` diff --git a/packages/compiler/src/lib/examples.ts b/packages/compiler/src/lib/examples.ts index 48f3dbc6455..9445029cd97 100644 --- a/packages/compiler/src/lib/examples.ts +++ b/packages/compiler/src/lib/examples.ts @@ -310,6 +310,12 @@ const ScalarSerializers = { } else { return duration.total({ unit: "seconds" }); } + case "milliseconds": + if (isInteger(encodeAs.type)) { + return Math.floor(duration.total({ unit: "milliseconds" })); + } else { + return duration.total({ unit: "milliseconds" }); + } default: return duration.toString(); } diff --git a/packages/compiler/test/decorators/examples.test.ts b/packages/compiler/test/decorators/examples.test.ts index 34753df117a..c3877df2241 100644 --- a/packages/compiler/test/decorators/examples.test.ts +++ b/packages/compiler/test/decorators/examples.test.ts @@ -477,6 +477,16 @@ describe("json serialization of examples", () => { expect: 0.5, encode: `@encode("seconds", float32)`, }, + { + value: `duration.fromISO("PT5M")`, + expect: 300000, + encode: `@encode("milliseconds", int32)`, + }, + { + value: `duration.fromISO("PT0.5S")`, + expect: 500, + encode: `@encode("milliseconds", float32)`, + }, ], ], ];