PageSourceSearch

https://boajs.dev/assets/js/70a958de.93e2bdc0.js

js boajs.dev collected 2026-10-02 03:07:11 UTC 50,938 bytes, 918 lines download raw bytes

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&#39;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.