1"use strict"; 2(globalThis["webpackChunkboajs_dev"] ||= []).push([[6182],{ 3 4/***/ 4885 5(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 6 7// ESM COMPAT FLAG 8__webpack_require__.r(__webpack_exports__); 9 10// EXPORTS 11__webpack_require__.d(__webpack_exports__, { 12 assets: () => (/* binding */ _2025_09_24_temporal_release_assets), 13 contentTitle: () => (/* binding */ contentTitle), 14 "default": () => (/* binding */ MDXContent), 15 frontMatter: () => (/* binding */ frontMatter), 16 metadata: () => (/* reexport */ site_blog_2025_09_24_temporal_release_index_md_70a), 17 toc: () => (/* binding */ toc) 18}); 19 20// EXTERNAL MODULE: ./node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/home/runner/work/boa-dev.github.io/boa-dev.github.io/node_modules/file-loader/dist/cjs.js!./blog/2025-09-24-temporal-release/img/clock-banner.jpg 21var clock_banner_namespaceFn = () => { 22 return __webpack_require__(2614); 23}; 24 25// MODULE: ./node_modules/url-loader/dist/cjs.js?limit=10000&name=assets/images/[name]-[contenthash].[ext]&fallback=/home/runner/work/boa-dev.github.io/boa-dev.github.io/node_modules/file-loader/dist/cjs.js!./blog/2025-09-24-temporal-release/img/temporal-dependencies.png 26var temporal_dependencies_namespaceFn = /*#__PURE__*/__webpack_require__.cw(function(module, __webpack_exports__) { 27/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "assets/images/temporal-dependencies-a58cc2be2f3604ca72f9dd7dae52e1eb.png"); 28/* harmony export */ __webpack_require__.d(__webpack_exports__, [ 29/* harmony export */ "A", 0, /* export default binding */ __WEBPACK_DEFAULT_EXPORT__ 30/* harmony export */ ]); 31 32}); 33 34// EXTERNAL MODULE: ./.docusaurus/docusaurus-plugin-content-blog/default/site-blog-2025-09-24-temporal-release-index-md-70a.json 35var site_blog_2025_09_24_temporal_release_index_md_70a = __webpack_require__(9999); 36// EXTERNAL MODULE: ./node_modules/react/jsx-runtime.js 37var jsx_runtime = __webpack_require__(4848); 38// EXTERNAL MODULE: ./node_modules/@mdx-js/react/lib/index.js 39var lib = __webpack_require__(8453); 40;// ./blog/2025-09-24-temporal-release/index.md 41 42 43const frontMatter = { 44 layout: 'post', 45 tags: [ 46 'post' 47 ], 48 title: 'Temporal_rs is here! The datetime library powering Temporal in Boa, Kiesel, and V8', 49 description: 'Temporal_rs is here! The datetime library powering Temporal in Boa, Kiesel, and V8', 50 authors: 'temporal-dev' 51}; 52const contentTitle = undefined; 53 54const _2025_09_24_temporal_release_assets = { 55"authorsImageUrls": [undefined], 56}; 57 58 59 60const toc = [{ 61 "value": "Why v0.1? Why not v1.0?", 62 "id": "why-v01-why-not-v10", 63 "level": 3 64}, { 65 "value": "Some background and history", 66 "id": "some-background-and-history", 67 "level": 2 68}, { 69 "value": "Temporal API overview", 70 "id": "temporal-api-overview", 71 "level": 2 72}, { 73 "value": "<code>temporal_rs</code> design overview", 74 "id": "temporal_rs-design-overview", 75 "level": 2 76}, { 77 "value": "Time zone data", 78 "id": "time-zone-data", 79 "level": 3 80}, { 81 "value": "Using <code>temporal_rs</code>", 82 "id": "using-temporal_rs", 83 "level": 2 84}, { 85 "value": "Setup", 86 "id": "setup", 87 "level": 3 88}, { 89 "value": "Some examples", 90 "id": "some-examples", 91 "level": 3 92}, { 93 "value": "Retrieve today's date", 94 "id": "retrieve-todays-date", 95 "level": 4 96}, { 97 "value": "Date operations available", 98 "id": "date-operations-available", 99 "level": 4 100}, { 101 "value": "Working with dates and time zones", 102 "id": "working-with-dates-and-time-zones", 103 "level": 4 104}, { 105 "value": "FFI and engine adoption", 106 "id": "ffi-and-engine-adoption", 107 "level": 2 108}, { 109 "value": "Conclusion", 110 "id": "conclusion", 111 "level": 2 112}, { 113 "value": "Special thanks", 114 "id": "special-thanks", 115 "level": 2 116}, { 117 "value": "Discussion", 118 "id": "discussion", 119 "level": 2 120}, { 121 "value": "How can you support Boa?", 122 "id": "how-can-you-support-boa", 123 "level": 2 124}]; 125function _createMdxContent(props) { 126 const _components = { 127 a: "a", 128 blockquote: "blockquote", 129 code: "code", 130 em: "em", 131 h2: "h2", 132 h3: "h3", 133 h4: "h4", 134 img: "img", 135 li: "li", 136 ol: "ol", 137 p: "p", 138 pre: "pre", 139 strong: "strong", 140 table: "table", 141 tbody: "tbody", 142 td: "td", 143 th: "th", 144 thead: "thead", 145 tr: "tr", 146 ul: "ul", 147 ...(0,lib/* useMDXComponents */.R)(), 148 ...props.components 149 }; 150 return (0,jsx_runtime.jsxs)(jsx_runtime.Fragment, { 151 children: [(0,jsx_runtime.jsx)(_components.p, { 152 children: (0,jsx_runtime.jsx)(_components.img, { 153 alt: "clock banner", 154 src: (clock_banner_namespaceFn()/* default */.A) + "", 155 width: "3010", 156 height: "1024" 157 }) 158 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 159 children: ["After 2 years of development, we're pleased to announce the\nrelease of ", (0,jsx_runtime.jsx)(_components.a, { 160 href: "https://crates.io/crates/temporal_rs",
161 children: (0,jsx_runtime.jsx)(_components.code, { 162 children: "temporal_rs" 163 }) 164 }), ". A calendar and time zone aware Rust date/time\nlibrary based on ECMAScript's ", (0,jsx_runtime.jsx)(_components.a, { 165 href: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal", 166 children: "Temporal API" 167 }), "."] 168 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 169 children: [(0,jsx_runtime.jsx)(_components.code, { 170 children: "temporal_rs" 171 }), " is a highly conformant implementation of the Temporal API\nin Rust that can be used in native Rust code or embedded into ECMAScript\nengines / interpreters to support their implementations, which we first\nannounced in our\n", (0,jsx_runtime.jsx)(_components.a, { 172 href: "/blog/2025/06/15/temporal-impl-1", 173 children: "Temporal blog post" 174 }), ", if you're\ninterested in learning more about small implementation details."] 175 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 176 children: ["Currently, ", (0,jsx_runtime.jsx)(_components.code, { 177 children: "temporal_rs" 178 }), " v0.1 is being used by Boa, ", (0,jsx_runtime.jsx)(_components.a, { 179 href: "https://kiesel.dev/", 180 children: "Kiesel" 181 }), ",\n", (0,jsx_runtime.jsx)(_components.a, { 182 href: "https://v8.dev/", 183 children: "V8" 184 }), ", and ", (0,jsx_runtime.jsx)(_components.a, { 185 href: "https://github.com/Sharktheone/yavashark", 186 children: "Yavashark" 187 }), " for their Temporal\nimplementations (more on that later) and is ", (0,jsx_runtime.jsx)(_components.a, { 188 href: "https://chromestatus.com/feature/5668291307634688", 189 children: "estimated" 190 }), " to land unflagged in ", (0,jsx_runtime.jsx)(_components.strong, { 191 children: "Chromium v144" 192 }), "."] 193 }), "\n", (0,jsx_runtime.jsx)(_components.h3, { 194 id: "why-v01-why-not-v10", 195 children: "Why v0.1? Why not v1.0?" 196 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 197 children: ["Right now the ", (0,jsx_runtime.jsx)(_components.a, { 198 href: "https://github.com/tc39/proposal-temporal", 199 children: "Temporal proposal" 200 }), " is at Stage 3 (4 being the final stage) in the standards process. Although unlikely,\nwe want to remain on a minor version to catch any changes which come in (mostly bug fixes) before the proposal reaches stage 4\nand thus complete. We expect that to happen in Q1 2026."] 201 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 202 children: "Fear not! temporal_rs passes over 4000 specification tests, is stable and ready to use." 203 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 204 children: ["To celebrate the release of ", (0,jsx_runtime.jsx)(_components.code, { 205 children: "temporal_rs" 206 }), ", we'll cover a short\nbackground of the Temporal implementation in Boa and why ", (0,jsx_runtime.jsx)(_components.code, { 207 children: "temporal_rs" 208 }), "\nwas split into its own crate, we'll go over the library's general\ndesign, and then we'll walk through a couple brief examples of using\n", (0,jsx_runtime.jsx)(_components.code, { 209 children: "temporal_rs" 210 }), " before finally talking about the FFI and engine adoption."] 211 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 212 id: "some-background-and-history", 213 children: "Some background and history" 214 }), "\n", (0,jsx_runtime.jsxs)(_components.blockquote, { 215 children: ["\n", (0,jsx_runtime.jsx)(_components.p, { 216 children: (0,jsx_runtime.jsx)(_components.em, { 217 children: "\"Temporal is the single biggest addition to ECMAScript since ES6\"" 218 }) 219 }), "\n", (0,jsx_runtime.jsx)("cite", { 220 children: "Jason Williams, TC39 Delegate" 221 }), "\n"] 222 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 223 children: "In this section, we'll reflect on the overall implementation, some\ngeneral difficulties we had along with lessons learned." 224 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 225 children: ["The temporal implementation in Boa began over two years ago and\nculminated in an absolutely massive PR,\n", (0,jsx_runtime.jsx)(_components.a, { 226 href: "https://github.com/boa-dev/boa/pull/3277", 227 children: "#3277" 228 }), "."] 229 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 230 children: "The PR itself stubbed out a lot of the methods, implemented some\nDuration and Instant functionality, and started the support for custom\ncalendars. There were, however, 2 major takeaways from this PR:" 231 }), "\n", (0,jsx_runtime.jsxs)(_components.ul, { 232 children: ["\n", (0,jsx_runtime.jsx)(_components.li, { 233 children: "Temporal is a massive specification update, it's the single biggest addition to ECMAScript since ES6." 234 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 235 children: ["There is a lot of room to potentially optimize Temporal if we do not deal with\n", (0,jsx_runtime.jsx)(_components.c
235ode, { 236 children: "JsValue" 237 }), " directly."] 238 }), "\n"] 239 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 240 children: ["After a couple weeks, the question came up amongst maintainers of not just Boa, but also other engines:\n\"", (0,jsx_runtime.jsx)(_components.em, { 241 children: "could we separate the datetime logic and implementation off into a completely\nseparate library?" 242 }), "\" Sure."] 243 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 244 children: ["The first commit of then ", (0,jsx_runtime.jsx)(_components.code, { 245 children: "boa_temporal" 246 }), " occurred in PR\n", (0,jsx_runtime.jsx)(_components.a, { 247 href: "https://github.com/boa-dev/boa/pull/3461", 248 children: "#3461" 249 }), ", which moved the\nmajority of the existing functionality into a separate crate with the\nprimary concern at the time of being able to support custom calendars,\nwhich was then ported into its\n", (0,jsx_runtime.jsx)(_components.a, { 250 href: "https://github.com/boa-dev/temporal/pull/1", 251 children: "own repository later" 252 }), " a\ncouple months later."] 253 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 254 children: ["These early versions of ", (0,jsx_runtime.jsx)(_components.code, { 255 children: "temporal_rs" 256 }), " were vastly different than the 0.1\nrelease version, and it can be easily seen with a short glance through\nthe first PR. ", (0,jsx_runtime.jsx)(_components.code, { 257 children: "temporal_rs" 258 }), " needed to support custom calendars and time\nzones. In order to do this, each calendar was generic on a\n", (0,jsx_runtime.jsx)(_components.code, { 259 children: "CalendarProtocol" 260 }), " trait."] 261 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 262 children: ["So to create a new date in the early versions of ", (0,jsx_runtime.jsx)(_components.code, { 263 children: "temporal_rs" 264 }), ", you\nwould have something like the following code:"] 265 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 266 children: (0,jsx_runtime.jsx)(_components.code, { 267 className: "language-rust", 268 children: "use temporal_rs::{Date, Calendar, options::ArithmeticOverflow};\nlet date = Date::new_with_overflow(\n 2025,\n 9,\n 21,\n Calendar::<()>::from_str(\"iso8601\").unwrap(),\n ArithmeticOverflow::Reject\n).unwrap();\n" 269 }) 270 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 271 children: ["Luckily, custom calendars and time zones were removed from the\nspecification in the first half of 2024, so ", (0,jsx_runtime.jsx)(_components.code, { 272 children: "temporal_rs" 273 }), " was able to\nremove that support, which greatly benefited the entire API. For\ninstance, here's the same code in the 0.1 version of ", (0,jsx_runtime.jsx)(_components.code, { 274 children: "temporal_rs" 275 }), ":"] 276 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 277 children: (0,jsx_runtime.jsx)(_components.code, { 278 className: "language-rust", 279 children: "use temporal_rs::PlainDate;\nlet date = PlainDate::try_new_iso(2025, 9, 21).unwrap();\n" 280 }) 281 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 282 children: "That was 2024 though, we're in September of 2025, so what's happened\nsince the crate was initially split off from Boa over a year and a half\nago? Well, plenty!" 283 }), "\n", (0,jsx_runtime.jsxs)(_components.ul, { 284 children: ["\n", (0,jsx_runtime.jsxs)(_components.li, { 285 children: ["In early 2024 the internal algorithm for ", (0,jsx_runtime.jsx)(_components.code, { 286 children: "Duration" 287 }), " was overhauled in\nthe specification, so ", (0,jsx_runtime.jsx)(_components.code, { 288 children: "temporal_rs" 289 }), " had a complete rewrite of\n", (0,jsx_runtime.jsx)(_components.code, { 290 children: "Duration" 291 }), "."] 292 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 293 children: [(0,jsx_runtime.jsx)(_components.code, { 294 children: "Duration" 295 }
295), " moved from using ", (0,jsx_runtime.jsx)(_components.code, { 296 children: "f64" 297 }), " internally to ", (0,jsx_runtime.jsx)(_components.code, { 298 children: "FiniteF64" 299 }), ", and then\nto non-floating-point integers."] 300 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 301 children: ["We moved from a large ", (0,jsx_runtime.jsx)(_components.code, { 302 children: "TemporalFields" 303 }), " type to \"Partial\" objects,\nwhich better represent JavaScript property bags."] 304 }), "\n", (0,jsx_runtime.jsx)(_components.li, { 305 children: "A good portion of missing method implementations were added as well." 306 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 307 children: ["Internal utility methods were moved to the ", (0,jsx_runtime.jsx)(_components.a, { 308 href: "https://arxiv.org/abs/2102.06959", 309 children: "Neri-Schneider algorithms" 310 }), "."] 311 }), "\n"] 312 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 313 children: ["In general, the implementation was moving along at a pretty decent pace,\nand would continue to do so well into roughly April of 2025 (mostly\nhelped along by a group of students from the University of Bergen who\nbegan helping with the implementation in January 2025), but there were\ntwo final hurdles: time zone data and ", (0,jsx_runtime.jsx)(_components.code, { 314 children: "ZonedDateTime" 315 }), "."] 316 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 317 children: ["Time zones and time zone data are a topic for a completely different\nblog post in the future. But suffice to say, it took a little bit of\ntime, and ", (0,jsx_runtime.jsx)(_components.code, { 318 children: "ZonedDateTime" 319 }), " was developed alongside the time zone data."] 320 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 321 children: ["This work began in November 2024, by stubbing out the general support of\ntime zone data sourcing and ", (0,jsx_runtime.jsx)(_components.code, { 322 children: "ZonedDateTime" 323 }), ". Then, after almost 10\nmonths of general work, the last major updates to time zone data\nsourcing were merged at the beginning of September in PR\n", (0,jsx_runtime.jsx)(_components.a, { 324 href: "https://github.com/boa-dev/temporal/pull/537", 325 children: "#537" 326 }), " and\n", (0,jsx_runtime.jsx)(_components.a, { 327 href: "https://github.com/boa-dev/temporal/pull/538", 328 children: "#538" 329 }), ". As a result, we\nwere finally able to stabilize ", (0,jsx_runtime.jsx)(_components.code, { 330 children: "temporal_rs" 331 }), "'s API for a 0.1 release."] 332 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 333 children: ["That's it for our brief background on ", (0,jsx_runtime.jsx)(_components.code, { 334 children: "temporal_rs" 335 }), "."] 336 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 337 children: "Date and time is hard, and there is a lot that goes into it, especially\nwhen it comes to calendars and time zones. But that's what makes it\ninteresting!" 338 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 339 id: "temporal-api-overview", 340 children: "Temporal API overview" 341 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 342 children: ["The Temporal API focuses on a group of 8 date and time types, each of\nwhich corresponds to a different aspect of date and time with varying\nsupport for calendars and time zones, which are, unsurprisingly,\nrepresented in ", (0,jsx_runtime.jsx)(_components.code, { 343 children: "temporal_rs" 344 }), " by the ", (0,jsx_runtime.jsx)(_components.code, { 345 children: "Calendar" 346 }), " and ", (0,jsx_runtime.jsx)(_components.code, { 347 children: "TimeZone" 348 }), " types."] 349 }), "\n", (0,jsx_runtime.jsxs)(_components.table, { 350 children: [(0,jsx_runtime.jsx)(_components.thead, { 351 children: (0,jsx_runtime.jsxs)(_components.tr, { 352 children: [(0,jsx_runtime.jsx)(_components.th, { 353 children: "Temporal type" 354 }), (0,jsx_runtime.jsx)(_components.th, { 355 children: "Category" 356 }), (0,jsx_runtime.jsx)(_components.th, { 357 children: "Calendar support" 358 }), (0,jsx_runtime.jsx)(_components.th, { 359 children: "Time zone support" 360 })] 361 }) 362 }), (0,jsx_runtime.jsxs)(_components.tbody, { 363 children: [(0,jsx_runtime.jsxs)(_components.tr, { 364 children: [(0,jsx_runtime.jsx)(_components.td, {
365 children: (0,jsx_runtime.jsx)(_components.code, { 366 children: "PlainDate" 367 }) 368 }), (0,jsx_runtime.jsx)(_components.td, { 369 children: "Calendar date" 370 }), (0,jsx_runtime.jsx)(_components.td, { 371 children: "yes" 372 }), (0,jsx_runtime.jsx)(_components.td, { 373 children: "no" 374 })] 375 }), (0,jsx_runtime.jsxs)(_components.tr, { 376 children: [(0,jsx_runtime.jsx)(_components.td, { 377 children: (0,jsx_runtime.jsx)(_components.code, { 378 children: "PlainTime" 379 }) 380 }), (0,jsx_runtime.jsx)(_components.td, { 381 children: "Wall-clock time" 382 }), (0,jsx_runtime.jsx)(_components.td, { 383 children: "no" 384 }), (0,jsx_runtime.jsx)(_components.td, { 385 children: "no" 386 })] 387 }), (0,jsx_runtime.jsxs)(_components.tr, { 388 children: [(0,jsx_runtime.jsx)(_components.td, { 389 children: (0,jsx_runtime.jsx)(_components.code, { 390 children: "PlainDateTime" 391 }) 392 }), (0,jsx_runtime.jsx)(_components.td, { 393 children: "Calendar date and wall-clock time" 394 }), (0,jsx_runtime.jsx)(_components.td, { 395 children: "yes" 396 }), (0,jsx_runtime.jsx)(_components.td, { 397 children: "no" 398 })] 399 }), (0,jsx_runtime.jsxs)(_components.tr, { 400 children: [(0,jsx_runtime.jsx)(_components.td, { 401 children: (0,jsx_runtime.jsx)(_components.code, { 402 children: "ZonedDateTime" 403 }) 404 }), (0,jsx_runtime.jsx)(_components.td, { 405 children: "Calendar date and exact time" 406 }), (0,jsx_runtime.jsx)(_components.td, { 407 children: "yes" 408 }), (0,jsx_runtime.jsx)(_components.td, { 409 children: "yes" 410 })] 411 }), (0,jsx_runtime.jsxs)(_components.tr, { 412 children: [(0,jsx_runtime.jsx)(_components.td, { 413 children: (0,jsx_runtime.jsx)(_components.code, { 414 children: "Instant" 415 }) 416 }), (0,jsx_runtime.jsx)(_components.td, { 417 children: "Exact time" 418 }), (0,jsx_runtime.jsx)(_components.td, { 419 children: "no" 420 }), (0,jsx_runtime.jsx)(_components.td, { 421 children: "no" 422 })] 423 }), (0,jsx_runtime.jsxs)(_components.tr, { 424 children: [(0,jsx_runtime.jsx)(_components.td, { 425 children: (0,jsx_runtime.jsx)(_components.code, { 426 children: "Duration" 427 }) 428 }), (0,jsx_runtime.jsx)(_components.td, { 429 children: "Time span" 430 }), (0,jsx_runtime.jsx)(_components.td, { 431 children: "no" 432 }), (0,jsx_runtime.jsx)(_components.td, { 433 children: "no" 434 })] 435 }), (0,jsx_runtime.jsxs)(_components.tr, { 436 children: [(0,jsx_runtime.jsx)(_components.td, { 437 children: (0,jsx_runtime.jsx)(_components.code, { 438 children: "PlainYearMonth" 439 }) 440 }), (0,jsx_runtime.jsx)(_components.td, { 441 children: "Calendar date" 442 }), (0,jsx_runtime.jsx)(_components.td, { 443 children: "yes" 444 }), (0,jsx_runtime.jsx)(_components.td, { 445 children: "no" 446 })] 447 }), (0,jsx_runtime.jsxs)(_components.tr, { 448 children: [(0,jsx_runtime.jsx)(_components.td, { 449 children: (0,jsx_runtime.jsx)(_components.code, { 450 children: "PlainMonthDay" 451 }) 452 }), (0,jsx_runtime.jsx)(_components.td, { 453 children: "Calendar date" 454 }), (0,jsx_runtime.jsx)(_components.td, { 455 children: "yes" 456 }), (0,jsx_runtime.jsx)(_components.td, { 457 children: "no" 458 })] 459 })] 460 })] 461 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 462 children: ["There is also ", (0,jsx_runtime.jsx)(_components.code, { 463 children: "Now" 464 }), ", which provides access to the current host system\ntime. This can then be used to map the current ", (0,jsx_runtime.jsx)(_components.c
464ode, { 465 children: "Instant" 466 }), " to any of the\nabove Temporal types."] 467 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 468 children: ["The types in the same categories will share similar APIs that are\nrelated to that category. For instance, all types that support a\ncalendar date will have a ", (0,jsx_runtime.jsx)(_components.code, { 469 children: "with_calendar" 470 }), " method as well as calendar\ndate accessors. The exception being ", (0,jsx_runtime.jsx)(_components.code, { 471 children: "PlainYearMonth" 472 }), " and ", (0,jsx_runtime.jsx)(_components.code, { 473 children: "PlainMonthDay" 474 }), "\nwhich are missing their day and year, respectively ... for all intents\nand purposes."] 475 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 476 children: ["For a full view of the API, we recommend checking our\n", (0,jsx_runtime.jsx)(_components.a, { 477 href: "https://docs.rs/temporal_rs/latest/temporal_rs/", 478 children: "documentation" 479 }), "."] 480 }), "\n", (0,jsx_runtime.jsxs)(_components.h2, { 481 id: "temporal_rs-design-overview", 482 children: [(0,jsx_runtime.jsx)(_components.code, { 483 children: "temporal_rs" 484 }), " design overview"] 485 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 486 children: [(0,jsx_runtime.jsx)(_components.code, { 487 children: "temporal_rs" 488 }), " in general implements large portions of the specification\ndirectly in the codebase. However, it does still have some dependencies,\nwhich can be broken down into 4 main groups."] 489 }), "\n", (0,jsx_runtime.jsxs)(_components.ol, { 490 children: ["\n", (0,jsx_runtime.jsx)(_components.li, { 491 children: "Time zone data, for sourcing time zone data" 492 }), "\n", (0,jsx_runtime.jsx)(_components.li, { 493 children: "Calendrical calculations, for handling non-ISO calendar calculations" 494 }), "\n", (0,jsx_runtime.jsx)(_components.li, { 495 children: "RFC9557 parsing, for parsing of RFC9557's internet extended date/time\nformat (IXDTF)" 496 }), "\n", (0,jsx_runtime.jsx)(_components.li, { 497 children: "Utilities" 498 }), "\n"] 499 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 500 children: (0,jsx_runtime.jsx)(_components.img, { 501 alt: "Temporal dependency graph", 502 src: (temporal_dependencies_namespaceFn().A) + "", 503 width: "3240", 504 height: "1240" 505 }) 506 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 507 children: ["Notably, the dependencies that are highlighted in purple come from\n", (0,jsx_runtime.jsx)(_components.a, { 508 href: "https://github.com/unicode-org/icu4x", 509 children: "ICU4X" 510 }), ". ICU4X is a phenomenal Rust project that takes a new approach to\nUnicode's ICU in order to make a new, more modular version of ICU."] 511 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 512 children: ["While ICU4X provides the majority of the internationalization (i18n),\nUnicode, and formatting focused functionality, ", (0,jsx_runtime.jsx)(_components.code, { 513 children: "temporal_rs" 514 }), " builds on\ntop of ICU4X to provide an ECMAScript compliant date/time API for both\nnative Rust and ECMAScript implementers."] 515 }), "\n", (0,jsx_runtime.jsx)(_components.h3, { 516 id: "time-zone-data", 517 children: "Time zone data" 518 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 519 children: ["While we plan to go into time zones in a completely separate post, one\nof ", (0,jsx_runtime.jsx)(_components.code, { 520 children: "temporal_rs" 521 }), "'s primary design decisions was to offer a way to\ncustomize the source of time zone data, while also having an optional\ndefault source for convenience. The time zone data sourcing\nfunctionality is provided by ", (0,jsx_runtime.jsx)(_components.code, { 522 children: "timezone_provider" 523 }), ", a sister crate of\n", (0,jsx_runtime.jsx)(_components.code, { 524 children: "temporal_rs" 525 }), " that provides a project agnostic crate alongside default\ntrait implementations for sourcing time zone data."] 526 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 527 children: "We currently expose three types of provider implementations:" 528 }), "\n", (0,jsx_runtime.jsxs)(_components.ul, { 529 children: ["\n", (0,jsx_runtime.jsxs)(_components.li, {
530 children: [(0,jsx_runtime.jsx)(_components.code, { 531 children: "CompiledTzdbProvider" 532 }), " (current default), a provider that parses time\nzone data at runtime using data compiled into the binary."] 533 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 534 children: [(0,jsx_runtime.jsx)(_components.code, { 535 children: "FsTzdbProvider" 536 }), ", a provider that parses time zone data at runtime\nusing the file system time zone database (if it exists for that OS)."] 537 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 538 children: [(0,jsx_runtime.jsx)(_components.code, { 539 children: "ZoneInfo64TzdbProvider" 540 }), ", a provider using ICU's zoneinfo64 resource\nbundle."] 541 }), "\n"] 542 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 543 children: "We hope to have a zero copy compiled timezone provider available in the\nnear future." 544 }), "\n", (0,jsx_runtime.jsxs)(_components.h2, { 545 id: "using-temporal_rs", 546 children: ["Using ", (0,jsx_runtime.jsx)(_components.code, { 547 children: "temporal_rs" 548 })] 549 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 550 children: ["Let's dive into using ", (0,jsx_runtime.jsx)(_components.code, { 551 children: "temporal_rs" 552 }), " from Rust."] 553 }), "\n", (0,jsx_runtime.jsx)(_components.h3, { 554 id: "setup", 555 children: "Setup" 556 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 557 children: ["First, add ", (0,jsx_runtime.jsx)(_components.code, { 558 children: "temporal_rs" 559 }), " as a dependency to your project using cargo:"] 560 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 561 children: (0,jsx_runtime.jsx)(_components.code, { 562 className: "language-bash", 563 children: "cargo add temporal_rs\n" 564 }) 565 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 566 children: ["Or include the below in your project's ", (0,jsx_runtime.jsx)(_components.code, { 567 children: "Cargo.toml" 568 }), "."] 569 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 570 children: (0,jsx_runtime.jsx)(_components.code, { 571 className: "language-toml", 572 children: "temporal_rs = \"0.1.0\"\n" 573 }) 574 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 575 children: ["By default, ", (0,jsx_runtime.jsx)(_components.code, { 576 children: "temporal_rs" 577 }), " will use a compiled time zone data provider\nthat compiles the time zone data into the binary. If you prefer to use\nthe file system time zone database or a zoneinfo64 resource bundle, you\ncan disable the compiled time zone data by setting\n", (0,jsx_runtime.jsx)(_components.code, { 578 children: "default-features = false" 579 }), "; you can import your preferred provider from\nthe ", (0,jsx_runtime.jsx)(_components.code, { 580 children: "timezone_provider" 581 }), " crate, then provide it to any API that requires\na time zone provider."] 582 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 583 children: ["For instance, to use the ", (0,jsx_runtime.jsx)(_components.code, { 584 children: "FsTzdbProvider" 585 }), ", your ", (0,jsx_runtime.jsx)(_components.code, { 586 children: "Cargo.toml" 587 }), " would look\nlike the following."] 588 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 589 children: (0,jsx_runtime.jsx)(_components.code, { 590 className: "language-toml", 591 children: "timezone_provider = { version = \"0.0.17\", features = [\"tzif\"] }\ntemporal_rs = { version = \"0.1.0\", default-features = false, features = [\"sys\"]}\n" 592 }) 593 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 594 children: ["The ", (0,jsx_runtime.jsx)(_components.code, { 595 children: "sys" 596 }), " feature for ", (0,jsx_runtime.jsx)(_components.code, { 597 children: "temporal_rs" 598 }), " enables the default implementation\nfor ", (0,jsx_runtime.jsx)(_components.code, { 599 children: "Now" 600 }), ", and the ", (0,jsx_runtime.jsx)(_components.code, { 601 children: "tzif" 602 }), " feature for ", (0,jsx_runtime.jsx)(_components.code, { 603 children: "timezone_provider" 604 }
604), " enables the\n", (0,jsx_runtime.jsx)(_components.code, { 605 children: "FsTzdbProvider" 606 }), "."] 607 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 608 children: ["Please note: ", (0,jsx_runtime.jsx)(_components.code, { 609 children: "timezone_provider" 610 }), " is still considered unstable for the\nnear future."] 611 }), "\n", (0,jsx_runtime.jsx)(_components.h3, { 612 id: "some-examples", 613 children: "Some examples" 614 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 615 children: ["The below examples will be using ", (0,jsx_runtime.jsx)(_components.code, { 616 children: "temporal_rs" 617 }), " with the default\nfeatures."] 618 }), "\n", (0,jsx_runtime.jsx)(_components.h4, { 619 id: "retrieve-todays-date", 620 children: "Retrieve today's date" 621 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 622 children: (0,jsx_runtime.jsx)(_components.code, { 623 className: "language-rust", 624 children: "use temporal_rs::Temporal;\n\n// We can easily retrieve today's date using `Temporal::now()`\nlet today = Temporal::now().plain_date_iso(None).unwrap()\n" 625 }) 626 }), "\n", (0,jsx_runtime.jsx)(_components.h4, { 627 id: "date-operations-available", 628 children: "Date operations available" 629 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 630 children: ["Temporal provides a nice API for working with date and date/time via\n", (0,jsx_runtime.jsx)(_components.code, { 631 children: "PlainDate" 632 }), " and ", (0,jsx_runtime.jsx)(_components.code, { 633 children: "PlainDateTime" 634 }), "."] 635 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 636 children: (0,jsx_runtime.jsx)(_components.code, { 637 className: "language-rust", 638 children: "use std::convert::TryFrom;\nuse temporal_rs::{Calendar, Temporal, options::DifferenceSettings, partial::PartialDuration};\n\n// We can get today's date\nlet today = Temporal::now().plain_date_iso(None).unwrap();\n\n// We can also add a Duration.\nlet partial = PartialDuration::empty().with_days(1);\nlet tomorrow = today.add(&partial.try_into().unwrap(), None).unwrap();\n\n// We can get the difference between two dates\nlet diff = today\n .since(&tomorrow, DifferenceSettings::default())\n .unwrap();\n\n// We can change the calendar\nlet tomorrow_japanese = tomorrow.with_calendar(Calendar::JAPANESE);\n\n// We can retrieve the calendar's RFC9557 string\nprintln!(\"{tomorrow_japanese}\"); // 2025-09-24[u-ca=japanese]\n" 639 }) 640 }), "\n", (0,jsx_runtime.jsx)(_components.h4, { 641 id: "working-with-dates-and-time-zones", 642 children: "Working with dates and time zones" 643 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 644 children: ["You can also easily work with dates and time zones with the\n", (0,jsx_runtime.jsx)(_components.code, { 645 children: "ZonedDateTime" 646 }), " type."] 647 }), "\n", (0,jsx_runtime.jsx)(_components.pre, { 648 children: (0,jsx_runtime.jsx)(_components.code, { 649 className: "language-rust", 650 children: "use temporal_rs::options::{DifferenceSettings, Disambiguation, OffsetDisambiguation, Unit};\nuse temporal_rs::{Calendar, Temporal, TimeZone, ZonedDateTime};\n\n// We can parse a ZonedDateTime from utf8 bytes.\nlet zdt = ZonedDateTime::from_utf8(\n b\"2025-03-01T11:16:10Z[America/Chicago][u-ca=iso8601]\",\n Disambiguation::Compatible,\n OffsetDisambiguation::Reject,\n)\n.unwrap();\n\n// We can get the current ZonedDateTime\nlet today = Temporal::now().zoned_date_time_iso(None).unwrap();\n\n// And we can easily get the difference between two `ZonedDateTime`s\nlet mut options = DifferenceSettings::default();\noptions.largest_unit = Some(Unit::Year);\nlet diff = today.since(&zdt, options).unwrap();\nprintln!(\"{diff}\"); // P6M23D\n\n// We can change the calendar for the `ZonedDateTime`\nlet today_coptic = today.with_calendar(Calendar::COPTIC);\nprintln!(\"{today_coptic}\"); // 2025-09-24T10:36:56.914365368-05:00[America/Chicago][u-ca=coptic]\n\n// We can also easily convert it into just the date.\nlet today_plain_date_coptic = today_coptic.to_plain_date();\nprintln!(\"{today_coptic}\"); // 2025-09-24[u-ca=coptic]\n" 651 }) 652 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 653 children: ["While we can extend these examples further, a more fun exercise for the\nreader would be to take a look at the ", (0,jsx_runtime.jsx)(_components.a, { 654 href: "https://tc39.es/proposal-temporal/docs/cookbook.html", 655 children: "Temporal cookbook" 656 }), ", as\nit displays the utility of the Temporal API using JavaScript and all of\nthese examples are now usable from Rust as well."] 657 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 658 id: "ffi-and-engine-adoption", 659 children: "FFI and engine adoption" 660 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 661 children: ["As previously stated, ", (0,jsx_runtime.jsx)(_components.c
661ode, { 662 children: "temporal_rs" 663 }), " is used in Boa, Kiesel, and V8.\nThere's just one thing, the latter of the two are ECMAScript\nimplementations written in Zig and C++, respectively, not Rust. This was\nmade possible through ", (0,jsx_runtime.jsx)(_components.code, { 664 children: "temporal_rs" 665 }), "'s FFI crate ", (0,jsx_runtime.jsx)(_components.code, { 666 children: "temporal_capi" 667 }), ", which\nprovides C and C++ bindings to ", (0,jsx_runtime.jsx)(_components.code, { 668 children: "temporal_rs" 669 }), "."] 670 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 671 children: ["The bindings are autogenerated via ", (0,jsx_runtime.jsx)(_components.a, { 672 href: "https://github.com/rust-diplomat/diplomat", 673 children: "Diplomat" 674 }), ", which is a\nproject for generating FFI definitions for Rust libraries. In general,\nit's a really cool project and we would definitely recommend checking it\nout if you're looking to generate FFI bindings for other languages for\nyour Rust library."] 675 }), "\n", (0,jsx_runtime.jsxs)(_components.blockquote, { 676 children: ["\n", (0,jsx_runtime.jsxs)(_components.p, { 677 children: ["\"", (0,jsx_runtime.jsx)(_components.em, { 678 children: "Diplomat made the FFI code extremely easy: I basically wrote the entire temporal_capi FFI layer over the course of a couple PRs, each of which probably took me ~15 minutes each of relatively mindless \"tab through docs, add API\" work. Diplomat is really good at this type of thing." 679 }), "\""] 680 }), "\n", (0,jsx_runtime.jsxs)("cite", { 681 children: ["Manishearth ", (0,jsx_runtime.jsx)(_components.a, { 682 href: "https://www.reddit.com/r/rust/comments/1logjzt/chromiumv8_implementing_temporal_api_via_rust/", 683 children: "Rust Reddit Q&A" 684 }), ":"] 685 }), "\n"] 686 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 687 children: "There is some added benefits to offering C and C++ bindings beyond the\nclassic: oh, let's (re)write it in Rust." 688 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 689 children: "First, this approach allows other languages and engines to benefit from\nRust's type system and memory safety guarantees without having to\nrewrite everything in Rust. It's a more modular and incremental approach\nthat provides some level of flexibility." 690 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 691 children: ["Secondly, with how large the API is, ", (0,jsx_runtime.jsx)(_components.code, { 692 children: "temporal_rs" 693 }), " streamlines the\nability to adopt the Temporal API for any current and future\nimplementations, since any future updates can be done primarily in one\nplace and then released downstream. ", (0,jsx_runtime.jsx)(_components.code, { 694 children: "temporal_rs" 695 }), " plus the engine\nspecific integration code, while not a small amount of code, is a\nrelatively trivial amount of work in comparison to a from scratch\nimplementation."] 696 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 697 children: ["Third, with adoption from multiple engines, ", (0,jsx_runtime.jsx)(_components.code, { 698 children: "temporal_rs" 699 }), " benefits via\nexternal test coverage beyond the native Rust unit tests. For instance,\nlooking at the engines that offer conformance numbers (Boa, Kiesel, and\nV8), each implementation ", (0,jsx_runtime.jsx)(_components.a, { 700 href: "https://test262.fyi/#", 701 children: "is currently north of 95% conformance" 702 }), " with V8\nreaching the highest at around 99% conformance. There is still a small\ndisparity in conformance, but this can be explained by the absence of\nsome related features, i.e. Boa still hasn't completed its\n", (0,jsx_runtime.jsx)(_components.code, { 703 children: "Intl.DateTimeFormat" 704 }), " implementation yet, so it fails all ECMA402\n", (0,jsx_runtime.jsx)(_components.code, { 705 children: "toLocaleString" 706 }), " tests. Nonetheless, we can still be fairly confident in\nthe general correctness of ", (0,jsx_runtime.jsx)(_components.c
706ode, { 707 children: "temporal_rs" 708 }), ", and any potential bugs will\nideally be found and addressed fairly quickly."] 709 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 710 children: ["In general, ", (0,jsx_runtime.jsx)(_components.code, { 711 children: "temporal_rs" 712 }), " is a pretty good reference case for setting up\na Rust library over FFI, being used in both a C++ and Zig codebase."] 713 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 714 id: "conclusion", 715 children: "Conclusion" 716 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 717 children: ["The 0.1 release of ", (0,jsx_runtime.jsx)(_components.code, { 718 children: "temporal_rs" 719 }), " is out. We expect the general API to\nremain fairly stable moving forward, with any non-patch bumps being for\nadded features. Feel free to try it out, and provide feedback / file any\nissues you come across. Although, we will make changes and semantic\nversioning bumps based on feedback or the Temporal specification."] 720 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 721 children: "Our current plan is to have any remaining issues addressed and the API\nfully stable, in preparation for the \"stabilization\" of Temporal and its\nsubsequent introduction to the ECMAScript specification. Once Temporal\nis \"stabilized\", we will move forward with a 1.0 release." 722 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 723 children: [(0,jsx_runtime.jsx)(_components.code, { 724 children: "temporal_rs" 725 }), " started as an interesting experiment in creating an engine\nagnostic library of the Temporal API that could also be usable as a\ndate/time library in native Rust code, but seeing the wide adoption\nwe've been getting from other engines, we can say that this project has\nbeen a great success! And with any luck, we hope this library will find\nits place in the Rust ecosystem as well."] 726 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 727 id: "special-thanks", 728 children: "Special thanks" 729 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 730 children: ["We'd like to thank all the ", (0,jsx_runtime.jsx)(_components.a, { 731 href: "https://github.com/boa-dev/temporal/graphs/contributors", 732 children: "contributors" 733 }), " to ", (0,jsx_runtime.jsx)(_components.code, { 734 children: "temporal_rs" 735 }), " for helping\nit get to v0.1."] 736 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 737 children: "Thanks to the University of Bergen students who helped drive some of the\nmajor conformance push earlier this year." 738 }), "\n", (0,jsx_runtime.jsx)(_components.p, { 739 children: "Also, a huge thanks to all the Temporal champions for all their work on\nthe specification, as well as the ICU4X project for their incredible\nongoing work on calendars and all things i18n related." 740 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 741 id: "discussion", 742 children: "Discussion" 743 }), "\n", (0,jsx_runtime.jsxs)(_components.ul, { 744 children: ["\n", (0,jsx_runtime.jsxs)(_components.li, { 745 children: ["Hackernews: ", (0,jsx_runtime.jsx)(_components.a, { 746 href: "https://news.ycombinator.com/item?id=45361826", 747 children: "https://news.ycombinator.com/item?id=45361826" 748 })] 749 }), "\n", (0,jsx_runtime.jsxs)(_components.li, { 750 children: ["Reddit: ", (0,jsx_runtime.jsx)(_components.a, { 751 href: "https://www.reddit.com/r/rust/comments/1npffdx/temporal_rs_is_here_the_datetime_library_powering/", 752 children: "https://www.reddit.com/r/rust/comments/1npffdx/temporal_rs_is_here_the_datetime_library_powering/" 753 })] 754 }), "\n"] 755 }), "\n", (0,jsx_runtime.jsx)(_components.h2, { 756 id: "how-can-you-support-boa", 757 children: "How can you support Boa?" 758 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 759 children: ["Boa is an independent JavaScript engine implementing the ECMAScript specification, and we rely on the\nsupport of the community to keep it going. If you want to support us, you can do so by donating to\nour ", (0,jsx_runtime.jsx)(_components.a, { 760 href: "https://opencollective.com/boa", 761 children: "open collective" 762 }), ". Proceeeds here go towards this very website, the domain name, and remunerating\nmembers of the team who have worked on the features released."] 763 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 764 children: ["If financial contribution is not your strength, you can contribute by asking to be assigned to one of\nour ", (0,jsx_runtime.jsx)(_components.a, { 765 href: "https://github.com/boa-dev/boa/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee", 766 children: "open issues" 767 }), ", and asking for mentoring if you don't know your way around the engine. Our\n", (0,jsx_runtime.jsx)(_components.a, { 768 href: "https://github.com/boa-dev/boa/blob/main/CONTRIBUTING.md", 769 children: "contribution guide" 770 }), " should help you here. If you are more used to working with JavaScript or frontend\nweb development, we also welcome help to improve our web presence, either in ", (0,jsx_runtime.jsx)(_components.a, { 771 href: "https://github.com/boa-dev/boa-dev.github.io", 772 children: "our website" 773 }), ", or in our\n", (0,jsx_runtime.jsx)(_components.a, { 774 href: "https://github.com/boa-dev/boa/issues/820", 775 children: "testing representation" 776 }), " page or benchmarks page. You can also contribute to our Criterion benchmark\ncomparison GitHub ", (0,jsx_runtime.jsx)(_components.a, { 777 href: "https://github.com/boa-dev/criterion-compare-action", 778 children: "action" 779 }), "."] 780 }), "\n", (0,jsx_runtime.jsxs)(_components.p, { 781 children: ["We are also looking to improve the documentation of the engine, both for developers of the engine\nitself and for users of the engine. Feel free to contact us in ", (0,jsx_runtime.jsx)(_components.a, { 782 href: "https://matrix.to/#/#boa:matrix.org",
783 children: "Matrix" 784 }), "."] 785 })] 786 }); 787} 788function MDXContent(props = {}) { 789 const {wrapper: MDXLayout} = { 790 ...(0,lib/* useMDXComponents */.R)(), 791 ...props.components 792 }; 793 return MDXLayout ? (0,jsx_runtime.jsx)(MDXLayout, { 794 ...props, 795 children: (0,jsx_runtime.jsx)(_createMdxContent, { 796 ...props 797 }) 798 }) : _createMdxContent(props); 799} 800 801 802 803/***/ }, 804 805/***/ 2614 806(__unused_webpack_module, __webpack_exports__, __webpack_require__) { 807 808/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "assets/images/clock-banner-081b36b0a312f4e359b5342ef753a0d6.jpg"); 809/* harmony export */ __webpack_require__.d(__webpack_exports__, [ 810/* harmony export */ "A", 0, /* export default binding */ __WEBPACK_DEFAULT_EXPORT__ 811/* harmony export */ ]); 812 813 814/***/ }, 815 816/***/ 8453 817(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { 818 819/* harmony export */ __webpack_require__.d(__webpack_exports__, { 820/* harmony export */ R: () => (/* binding */ useMDXComponents), 821/* harmony export */ x: () => (/* binding */ MDXProvider) 822/* harmony export */ }); 823/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6540); 824/** 825 * @import {MDXComponents} from 'mdx/types.js' 826 * @import {Component, ReactElement, ReactNode} from 'react' 827 */ 828 829/** 830 * @callback MergeComponents 831 * Custom merge function. 832 * @param {Readonly<MDXComponents>} currentComponents 833 * Current components from the context. 834 * @returns {MDXComponents} 835 * Additional components. 836 * 837 * @typedef Props 838 * Configuration for `MDXProvider`. 839 * @property {ReactNode | null | undefined} [children] 840 * Children (optional). 841 * @property {Readonly<MDXComponents> | MergeComponents | null | undefined} [components] 842 * Additional components to use or a function that creates them (optional). 843 * @property {boolean | null | undefined} [disableParentContext=false] 844 * Turn off outer component context (default: `false`). 845 */ 846 847 848 849/** @type {Readonly<MDXComponents>} */ 850const emptyComponents = {} 851 852const MDXContext = react__WEBPACK_IMPORTED_MODULE_0__.createContext(emptyComponents) 853 854/** 855 * Get current components from the MDX Context. 856 * 857 * @param {Readonly<MDXComponents> | MergeComponents | null | undefined} [components] 858 * Additional components to use or a function that creates them (optional). 859 * @returns {MDXComponents} 860 * Current components. 861 */ 862function useMDXComponents(components) { 863 const contextComponents = react__WEBPACK_IMPORTED_MODULE_0__.useContext(MDXContext) 864 865 // Memoize to avoid unnecessary top-level context changes 866 return react__WEBPACK_IMPORTED_MODULE_0__.useMemo( 867 function () { 868 // Custom merge via a function prop 869 if (typeof components === 'function') { 870 return components(contextComponents) 871 } 872 873 return {...contextComponents, ...components} 874 }, 875 [contextComponents, components] 876 ) 877} 878 879/** 880 * Provider for MDX context. 881 * 882 * @param {Readonly<Props>} properties 883 * Properties. 884 * @returns {ReactElement} 885 * Element. 886 * @satisfies {Component} 887 */ 888function MDXProvider(properties) { 889 /** @type {Readonly<MDXComponents>} */ 890 let allComponents 891 892 if (properties.disableParentContext) { 893 allComponents = 894 typeof properties.components === 'function' 895 ? properties.components(emptyComponents) 896 : properties.components || emptyComponents 897 } else { 898 allComponents = useMDXComponents(properties.components) 899 } 900 901 return react__WEBPACK_IMPORTED_MODULE_0__.createElement( 902 MDXContext.Provider, 903 {value: allComponents}, 904 properties.children 905 ) 906} 907 908 909/***/ }, 910 911/***/ 9999 912(module) { 913 914module.exports = /*#__PURE__*/JSON.parse('{"permalink":"/blog/2025/09/24/temporal-release","source":"@site/blog/2025-09-24-temporal-release/index.md","title":"Temporal_rs is here! The datetime library powering Temporal in Boa, Kiesel, and V8","description":"Temporal_rs is here! The datetime library powering Temporal in Boa, Kiesel, and V8","date":"2025-09-24T00:00:00.000Z","tags":[{"inline":true,"label":"post","permalink":"/blog/tags/post"}],"readingTime":14.68,"hasTruncateMarker":true,"authors":[{"name":"Temporal_rs Developers","url":"https://github.com/boa-dev/temporal","key":"temporal-dev","page":null}],"frontMatter":{"layout":"post","tags":["post"],"title":"Temporal_rs is here! The datetime library powering Temporal in Boa, Kiesel, and V8","description":"Temporal_rs is here! The datetime library powering Temporal in Boa, Kiesel, and V8","authors":"temporal-dev"},"unlisted":false,"prevItem":{"title":"Boa release v0.21","permalink":"/blog/2025/10/22/boa-release-21"},"nextItem":{"title":"Implementing Temporal, the new date/time API for JavaScript (and Rust!)","permalink":"/blog/2025/06/15/temporal-impl-1"}}'); 915 916/***/ } 917 918}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.