Validate and canonicalize one rule as a client sends it. Numbers are
rounded to whole minutes; empty strings read as absent; id is kept only
when it is a non-empty string. isValidTimeZone is injected because the
check needs Intl, which the caller may want to stub or skip.
Validate and canonicalize one rule as a client sends it. Numbers are rounded to whole minutes; empty strings read as absent;
idis kept only when it is a non-empty string.isValidTimeZoneis injected because the check needsIntl, which the caller may want to stub or skip.