js_sys/
lib.rs

1//! Bindings to JavaScript's standard, built-in objects, including their methods
2//! and properties.
3//!
4//! This does *not* include any Web, Node, or any other JS environment
5//! APIs. Only the things that are guaranteed to exist in the global scope by
6//! the ECMAScript standard.
7//!
8//! <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects>
9//!
10//! ## A Note About `camelCase`, `snake_case`, and Naming Conventions
11//!
12//! JavaScript's global objects use `camelCase` naming conventions for functions
13//! and methods, but Rust style is to use `snake_case`. These bindings expose
14//! the Rust style `snake_case` name. Additionally, acronyms within a method
15//! name are all lower case, where as in JavaScript they are all upper case. For
16//! example, `decodeURI` in JavaScript is exposed as `decode_uri` in these
17//! bindings.
18
19#![doc(html_root_url = "https://docs.rs/js-sys/0.2")]
20#![cfg_attr(not(feature = "std"), no_std)]
21#![cfg_attr(target_feature = "atomics", feature(thread_local))]
22
23extern crate alloc;
24
25use alloc::string::String;
26use alloc::vec::Vec;
27use core::cmp::Ordering;
28use core::convert::{self, Infallible, TryFrom};
29use core::f64;
30use core::fmt;
31use core::iter::{self, Product, Sum};
32use core::mem::{self, MaybeUninit};
33use core::ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Neg, Not, Rem, Shl, Shr, Sub};
34use core::str;
35use core::str::FromStr;
36
37pub use wasm_bindgen;
38use wasm_bindgen::prelude::*;
39
40// When adding new imports:
41//
42// * Keep imports in alphabetical order.
43//
44// * Rename imports with `js_name = ...` according to the note about `camelCase`
45//   and `snake_case` in the module's documentation above.
46//
47// * Include the one sentence summary of the import from the MDN link in the
48//   module's documentation above, and the MDN link itself.
49//
50// * If a function or method can throw an exception, make it catchable by adding
51//   `#[wasm_bindgen(catch)]`.
52//
53// * Add a new `#[test]` into the appropriate file in the
54//   `crates/js-sys/tests/wasm/` directory. If the imported function or method
55//   can throw an exception, make sure to also add test coverage for that case.
56//
57// * Arguments that are `JsValue`s or imported JavaScript types should be taken
58//   by reference.
59
60macro_rules! forward_deref_unop {
61    (impl $imp:ident, $method:ident for $t:ty) => {
62        impl $imp for $t {
63            type Output = <&'static $t as $imp>::Output;
64
65            #[inline]
66            fn $method(self) -> Self::Output {
67                $imp::$method(&self)
68            }
69        }
70    };
71}
72
73macro_rules! forward_deref_binop {
74    (impl $imp:ident, $method:ident for $t:ty) => {
75        impl<'a> $imp<$t> for &'a $t {
76            type Output = <&'static $t as $imp<&'static $t>>::Output;
77
78            #[inline]
79            fn $method(self, other: $t) -> Self::Output {
80                $imp::$method(self, &other)
81            }
82        }
83
84        impl $imp<&$t> for $t {
85            type Output = <&'static $t as $imp<&'static $t>>::Output;
86
87            #[inline]
88            fn $method(self, other: &$t) -> Self::Output {
89                $imp::$method(&self, other)
90            }
91        }
92
93        impl $imp<$t> for $t {
94            type Output = <&'static $t as $imp<&'static $t>>::Output;
95
96            #[inline]
97            fn $method(self, other: $t) -> Self::Output {
98                $imp::$method(&self, &other)
99            }
100        }
101    };
102}
103
104macro_rules! forward_js_unop {
105    (impl $imp:ident, $method:ident for $t:ty) => {
106        impl $imp for &$t {
107            type Output = $t;
108
109            #[inline]
110            fn $method(self) -> Self::Output {
111                $imp::$method(JsValue::as_ref(self)).unchecked_into()
112            }
113        }
114
115        forward_deref_unop!(impl $imp, $method for $t);
116    };
117}
118
119macro_rules! forward_js_binop {
120    (impl $imp:ident, $method:ident for $t:ty) => {
121        impl $imp<&$t> for &$t {
122            type Output = $t;
123
124            #[inline]
125            fn $method(self, other: &$t) -> Self::Output {
126                $imp::$method(JsValue::as_ref(self), JsValue::as_ref(other)).unchecked_into()
127            }
128        }
129
130        forward_deref_binop!(impl $imp, $method for $t);
131    };
132}
133
134macro_rules! sum_product {
135    ($($a:ident)*) => ($(
136        impl Sum for $a {
137            #[inline]
138            fn sum<I: iter::Iterator<Item=Self>>(iter: I) -> Self {
139                iter.fold(
140                    $a::from(0),
141                    |a, b| a + b,
142                )
143            }
144        }
145
146        impl Product for $a {
147            #[inline]
148            fn product<I: iter::Iterator<Item=Self>>(iter: I) -> Self {
149                iter.fold(
150                    $a::from(1),
151                    |a, b| a * b,
152                )
153            }
154        }
155
156        impl<'a> Sum<&'a $a> for $a {
157            fn sum<I: iter::Iterator<Item=&'a Self>>(iter: I) -> Self {
158                iter.fold(
159                    $a::from(0),
160                    |a, b| a + b,
161                )
162            }
163        }
164
165        impl<'a> Product<&'a $a> for $a {
166            #[inline]
167            fn product<I: iter::Iterator<Item=&'a Self>>(iter: I) -> Self {
168                iter.fold(
169                    $a::from(1),
170                    |a, b| a * b,
171                )
172            }
173        }
174    )*)
175}
176
177macro_rules! partialord_ord {
178    ($t:ident) => {
179        impl PartialOrd for $t {
180            #[inline]
181            fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
182                Some(self.cmp(other))
183            }
184
185            #[inline]
186            fn lt(&self, other: &Self) -> bool {
187                JsValue::as_ref(self).lt(JsValue::as_ref(other))
188            }
189
190            #[inline]
191            fn le(&self, other: &Self) -> bool {
192                JsValue::as_ref(self).le(JsValue::as_ref(other))
193            }
194
195            #[inline]
196            fn ge(&self, other: &Self) -> bool {
197                JsValue::as_ref(self).ge(JsValue::as_ref(other))
198            }
199
200            #[inline]
201            fn gt(&self, other: &Self) -> bool {
202                JsValue::as_ref(self).gt(JsValue::as_ref(other))
203            }
204        }
205
206        impl Ord for $t {
207            #[inline]
208            fn cmp(&self, other: &Self) -> Ordering {
209                if self == other {
210                    Ordering::Equal
211                } else if self.lt(other) {
212                    Ordering::Less
213                } else {
214                    Ordering::Greater
215                }
216            }
217        }
218    };
219}
220
221#[wasm_bindgen]
222extern "C" {
223    /// The `decodeURI()` function decodes a Uniform Resource Identifier (URI)
224    /// previously created by `encodeURI` or by a similar routine.
225    ///
226    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURI)
227    #[wasm_bindgen(catch, js_name = decodeURI)]
228    pub fn decode_uri(encoded: &str) -> Result<JsString, JsValue>;
229
230    /// The `decodeURIComponent()` function decodes a Uniform Resource Identifier (URI) component
231    /// previously created by `encodeURIComponent` or by a similar routine.
232    ///
233    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent)
234    #[wasm_bindgen(catch, js_name = decodeURIComponent)]
235    pub fn decode_uri_component(encoded: &str) -> Result<JsString, JsValue>;
236
237    /// The `encodeURI()` function encodes a Uniform Resource Identifier (URI)
238    /// by replacing each instance of certain characters by one, two, three, or
239    /// four escape sequences representing the UTF-8 encoding of the character
240    /// (will only be four escape sequences for characters composed of two
241    /// "surrogate" characters).
242    ///
243    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI)
244    #[wasm_bindgen(js_name = encodeURI)]
245    pub fn encode_uri(decoded: &str) -> JsString;
246
247    /// The `encodeURIComponent()` function encodes a Uniform Resource Identifier (URI) component
248    /// by replacing each instance of certain characters by one, two, three, or four escape sequences
249    /// representing the UTF-8 encoding of the character
250    /// (will only be four escape sequences for characters composed of two "surrogate" characters).
251    ///
252    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)
253    #[wasm_bindgen(js_name = encodeURIComponent)]
254    pub fn encode_uri_component(decoded: &str) -> JsString;
255
256    /// The `eval()` function evaluates JavaScript code represented as a string.
257    ///
258    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval)
259    #[wasm_bindgen(catch)]
260    pub fn eval(js_source_text: &str) -> Result<JsValue, JsValue>;
261
262    /// The global `isFinite()` function determines whether the passed value is a finite number.
263    /// If needed, the parameter is first converted to a number.
264    ///
265    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)
266    #[wasm_bindgen(js_name = isFinite)]
267    pub fn is_finite(value: &JsValue) -> bool;
268
269    /// The `parseInt()` function parses a string argument and returns an integer
270    /// of the specified radix (the base in mathematical numeral systems), or NaN on error.
271    ///
272    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
273    #[wasm_bindgen(js_name = parseInt)]
274    pub fn parse_int(text: &str, radix: u8) -> f64;
275
276    /// The `parseFloat()` function parses an argument and returns a floating point number,
277    /// or NaN on error.
278    ///
279    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)
280    #[wasm_bindgen(js_name = parseFloat)]
281    pub fn parse_float(text: &str) -> f64;
282
283    /// The `escape()` function computes a new string in which certain characters have been
284    /// replaced by a hexadecimal escape sequence.
285    ///
286    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape)
287    #[wasm_bindgen]
288    pub fn escape(string: &str) -> JsString;
289
290    /// The `unescape()` function computes a new string in which hexadecimal escape
291    /// sequences are replaced with the character that it represents. The escape sequences might
292    /// be introduced by a function like `escape`. Usually, `decodeURI` or `decodeURIComponent`
293    /// are preferred over `unescape`.
294    ///
295    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/unescape)
296    #[wasm_bindgen]
297    pub fn unescape(string: &str) -> JsString;
298}
299
300// Array
301#[wasm_bindgen]
302extern "C" {
303    #[wasm_bindgen(extends = Object, is_type_of = Array::is_array, typescript_type = "Array<any>")]
304    #[derive(Clone, Debug, PartialEq, Eq)]
305    pub type Array;
306
307    /// Creates a new empty array.
308    #[wasm_bindgen(constructor)]
309    pub fn new() -> Array;
310
311    /// Creates a new array with the specified length (elements are initialized to `undefined`).
312    #[wasm_bindgen(constructor)]
313    pub fn new_with_length(len: u32) -> Array;
314
315    /// Retrieves the element at the index, counting from the end if negative
316    /// (returns `undefined` if the index is out of range).
317    #[wasm_bindgen(method)]
318    pub fn at(this: &Array, index: i32) -> JsValue;
319
320    /// Retrieves the element at the index (returns `undefined` if the index is out of range).
321    #[wasm_bindgen(method, structural, indexing_getter)]
322    pub fn get(this: &Array, index: u32) -> JsValue;
323
324    /// Sets the element at the index (auto-enlarges the array if the index is out of range).
325    #[wasm_bindgen(method, structural, indexing_setter)]
326    pub fn set(this: &Array, index: u32, value: JsValue);
327
328    /// Deletes the element at the index (does nothing if the index is out of range).
329    ///
330    /// The element at the index is set to `undefined`.
331    ///
332    /// This does not resize the array, the array will still be the same length.
333    #[wasm_bindgen(method, structural, indexing_deleter)]
334    pub fn delete(this: &Array, index: u32);
335
336    /// The `Array.from()` method creates a new, shallow-copied `Array` instance
337    /// from an array-like or iterable object.
338    #[wasm_bindgen(static_method_of = Array)]
339    pub fn from(val: &JsValue) -> Array;
340
341    /// The `copyWithin()` method shallow copies part of an array to another
342    /// location in the same array and returns it, without modifying its size.
343    ///
344    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/copyWithin)
345    #[wasm_bindgen(method, js_name = copyWithin)]
346    pub fn copy_within(this: &Array, target: i32, start: i32, end: i32) -> Array;
347
348    /// The `concat()` method is used to merge two or more arrays. This method
349    /// does not change the existing arrays, but instead returns a new array.
350    ///
351    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)
352    #[wasm_bindgen(method)]
353    pub fn concat(this: &Array, array: &Array) -> Array;
354
355    /// The `every()` method tests whether all elements in the array pass the test
356    /// implemented by the provided function.
357    ///
358    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)
359    #[wasm_bindgen(method)]
360    pub fn every(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> bool;
361
362    /// The `fill()` method fills all the elements of an array from a start index
363    /// to an end index with a static value. The end index is not included.
364    ///
365    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)
366    #[wasm_bindgen(method)]
367    pub fn fill(this: &Array, value: &JsValue, start: u32, end: u32) -> Array;
368
369    /// The `filter()` method creates a new array with all elements that pass the
370    /// test implemented by the provided function.
371    ///
372    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
373    #[wasm_bindgen(method)]
374    pub fn filter(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> Array;
375
376    /// The `find()` method returns the value of the first element in the array that satisfies
377    ///  the provided testing function. Otherwise `undefined` is returned.
378    ///
379    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
380    #[wasm_bindgen(method)]
381    pub fn find(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> JsValue;
382
383    /// The `findIndex()` method returns the index of the first element in the array that
384    /// satisfies the provided testing function. Otherwise -1 is returned.
385    ///
386    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)
387    #[wasm_bindgen(method, js_name = findIndex)]
388    pub fn find_index(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> i32;
389
390    /// The `findLast()` method of Array instances iterates the array in reverse order
391    /// and returns the value of the first element that satisfies the provided testing function.
392    /// If no elements satisfy the testing function, undefined is returned.
393    ///
394    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast)
395    #[wasm_bindgen(method, js_name = findLast)]
396    pub fn find_last(
397        this: &Array,
398        predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool,
399    ) -> JsValue;
400
401    /// The `findLastIndex()` method of Array instances iterates the array in reverse order
402    /// and returns the index of the first element that satisfies the provided testing function.
403    /// If no elements satisfy the testing function, -1 is returned.
404    ///
405    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLastIndex)
406    #[wasm_bindgen(method, js_name = findLastIndex)]
407    pub fn find_last_index(
408        this: &Array,
409        predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool,
410    ) -> i32;
411
412    /// The `flat()` method creates a new array with all sub-array elements concatenated into it
413    /// recursively up to the specified depth.
414    ///
415    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)
416    #[wasm_bindgen(method)]
417    pub fn flat(this: &Array, depth: i32) -> Array;
418
419    /// The `flatMap()` method first maps each element using a mapping function, then flattens
420    /// the result into a new array.
421    ///
422    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap)
423    #[wasm_bindgen(method, js_name = flatMap)]
424    pub fn flat_map(
425        this: &Array,
426        callback: &mut dyn FnMut(JsValue, u32, Array) -> Vec<JsValue>,
427    ) -> Array;
428
429    /// The `forEach()` method executes a provided function once for each array element.
430    ///
431    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
432    #[wasm_bindgen(method, js_name = forEach)]
433    pub fn for_each(this: &Array, callback: &mut dyn FnMut(JsValue, u32, Array));
434
435    /// The `includes()` method determines whether an array includes a certain
436    /// element, returning true or false as appropriate.
437    ///
438    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)
439    #[wasm_bindgen(method)]
440    pub fn includes(this: &Array, value: &JsValue, from_index: i32) -> bool;
441
442    /// The `indexOf()` method returns the first index at which a given element
443    /// can be found in the array, or -1 if it is not present.
444    ///
445    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
446    #[wasm_bindgen(method, js_name = indexOf)]
447    pub fn index_of(this: &Array, value: &JsValue, from_index: i32) -> i32;
448
449    /// The `Array.isArray()` method determines whether the passed value is an Array.
450    ///
451    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
452    #[wasm_bindgen(static_method_of = Array, js_name = isArray)]
453    pub fn is_array(value: &JsValue) -> bool;
454
455    /// The `join()` method joins all elements of an array (or an array-like object)
456    /// into a string and returns this string.
457    ///
458    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join)
459    #[wasm_bindgen(method)]
460    pub fn join(this: &Array, delimiter: &str) -> JsString;
461
462    /// The `lastIndexOf()` method returns the last index at which a given element
463    /// can be found in the array, or -1 if it is not present. The array is
464    /// searched backwards, starting at fromIndex.
465    ///
466    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)
467    #[wasm_bindgen(method, js_name = lastIndexOf)]
468    pub fn last_index_of(this: &Array, value: &JsValue, from_index: i32) -> i32;
469
470    /// The length property of an object which is an instance of type Array
471    /// sets or returns the number of elements in that array. The value is an
472    /// unsigned, 32-bit integer that is always numerically greater than the
473    /// highest index in the array.
474    ///
475    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length)
476    #[wasm_bindgen(method, getter, structural)]
477    pub fn length(this: &Array) -> u32;
478
479    /// Sets the length of the array.
480    ///
481    /// If it is set to less than the current length of the array, it will
482    /// shrink the array.
483    ///
484    /// If it is set to more than the current length of the array, it will
485    /// increase the length of the array, filling the new space with empty
486    /// slots.
487    ///
488    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length)
489    #[wasm_bindgen(method, setter)]
490    pub fn set_length(this: &Array, value: u32);
491
492    /// `map()` calls a provided callback function once for each element in an array,
493    /// in order, and constructs a new array from the results. callback is invoked
494    /// only for indexes of the array which have assigned values, including undefined.
495    /// It is not called for missing elements of the array (that is, indexes that have
496    /// never been set, which have been deleted or which have never been assigned a value).
497    ///
498    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
499    #[wasm_bindgen(method)]
500    pub fn map(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> JsValue) -> Array;
501
502    /// The `Array.of()` method creates a new Array instance with a variable
503    /// number of arguments, regardless of number or type of the arguments.
504    ///
505    /// The difference between `Array.of()` and the `Array` constructor is in the
506    /// handling of integer arguments: `Array.of(7)` creates an array with a single
507    /// element, `7`, whereas `Array(7)` creates an empty array with a `length`
508    /// property of `7` (Note: this implies an array of 7 empty slots, not slots
509    /// with actual undefined values).
510    ///
511    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
512    ///
513    /// # Notes
514    ///
515    /// There are a few bindings to `of` in `js-sys`: `of1`, `of2`, etc...
516    /// with different arities.
517    #[wasm_bindgen(static_method_of = Array, js_name = of)]
518    pub fn of1(a: &JsValue) -> Array;
519
520    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
521    #[wasm_bindgen(static_method_of = Array, js_name = of)]
522    pub fn of2(a: &JsValue, b: &JsValue) -> Array;
523
524    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
525    #[wasm_bindgen(static_method_of = Array, js_name = of)]
526    pub fn of3(a: &JsValue, b: &JsValue, c: &JsValue) -> Array;
527
528    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
529    #[wasm_bindgen(static_method_of = Array, js_name = of)]
530    pub fn of4(a: &JsValue, b: &JsValue, c: &JsValue, d: &JsValue) -> Array;
531
532    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
533    #[wasm_bindgen(static_method_of = Array, js_name = of)]
534    pub fn of5(a: &JsValue, b: &JsValue, c: &JsValue, d: &JsValue, e: &JsValue) -> Array;
535
536    /// The `pop()` method removes the last element from an array and returns that
537    /// element. This method changes the length of the array.
538    ///
539    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)
540    #[wasm_bindgen(method)]
541    pub fn pop(this: &Array) -> JsValue;
542
543    /// The `push()` method adds one or more elements to the end of an array and
544    /// returns the new length of the array.
545    ///
546    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
547    #[wasm_bindgen(method)]
548    pub fn push(this: &Array, value: &JsValue) -> u32;
549
550    /// The `reduce()` method applies a function against an accumulator and each element in
551    /// the array (from left to right) to reduce it to a single value.
552    ///
553    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
554    #[wasm_bindgen(method)]
555    pub fn reduce(
556        this: &Array,
557        predicate: &mut dyn FnMut(JsValue, JsValue, u32, Array) -> JsValue,
558        initial_value: &JsValue,
559    ) -> JsValue;
560
561    /// The `reduceRight()` method applies a function against an accumulator and each value
562    /// of the array (from right-to-left) to reduce it to a single value.
563    ///
564    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight)
565    #[wasm_bindgen(method, js_name = reduceRight)]
566    pub fn reduce_right(
567        this: &Array,
568        predicate: &mut dyn FnMut(JsValue, JsValue, u32, Array) -> JsValue,
569        initial_value: &JsValue,
570    ) -> JsValue;
571
572    /// The `reverse()` method reverses an array in place. The first array
573    /// element becomes the last, and the last array element becomes the first.
574    ///
575    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)
576    #[wasm_bindgen(method)]
577    pub fn reverse(this: &Array) -> Array;
578
579    /// The `shift()` method removes the first element from an array and returns
580    /// that removed element. This method changes the length of the array.
581    ///
582    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
583    #[wasm_bindgen(method)]
584    pub fn shift(this: &Array) -> JsValue;
585
586    /// The `slice()` method returns a shallow copy of a portion of an array into
587    /// a new array object selected from begin to end (end not included).
588    /// The original array will not be modified.
589    ///
590    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
591    #[wasm_bindgen(method)]
592    pub fn slice(this: &Array, start: u32, end: u32) -> Array;
593
594    /// The `some()` method tests whether at least one element in the array passes the test implemented
595    /// by the provided function.
596    /// Note: This method returns false for any condition put on an empty array.
597    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
598    #[wasm_bindgen(method)]
599    pub fn some(this: &Array, predicate: &mut dyn FnMut(JsValue) -> bool) -> bool;
600
601    /// The `sort()` method sorts the elements of an array in place and returns
602    /// the array. The sort is not necessarily stable. The default sort
603    /// order is according to string Unicode code points.
604    ///
605    /// The time and space complexity of the sort cannot be guaranteed as it
606    /// is implementation dependent.
607    ///
608    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
609    #[wasm_bindgen(method)]
610    pub fn sort(this: &Array) -> Array;
611
612    /// The `splice()` method changes the contents of an array by removing existing elements and/or
613    /// adding new elements.
614    ///
615    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
616    #[wasm_bindgen(method)]
617    pub fn splice(this: &Array, start: u32, delete_count: u32, item: &JsValue) -> Array;
618
619    /// The `toLocaleString()` method returns a string representing the elements of the array.
620    /// The elements are converted to Strings using their toLocaleString methods and these
621    /// Strings are separated by a locale-specific String (such as a comma “,”).
622    ///
623    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString)
624    #[wasm_bindgen(method, js_name = toLocaleString)]
625    pub fn to_locale_string(this: &Array, locales: &JsValue, options: &JsValue) -> JsString;
626
627    /// The `toString()` method returns a string representing the specified array
628    /// and its elements.
629    ///
630    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString)
631    #[wasm_bindgen(method, js_name = toString)]
632    pub fn to_string(this: &Array) -> JsString;
633
634    /// The `unshift()` method adds one or more elements to the beginning of an
635    /// array and returns the new length of the array.
636    ///
637    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)
638    #[wasm_bindgen(method)]
639    pub fn unshift(this: &Array, value: &JsValue) -> u32;
640}
641
642/// Iterator returned by `Array::into_iter`
643#[derive(Debug, Clone)]
644pub struct ArrayIntoIter {
645    range: core::ops::Range<u32>,
646    array: Array,
647}
648
649impl core::iter::Iterator for ArrayIntoIter {
650    type Item = JsValue;
651
652    fn next(&mut self) -> Option<Self::Item> {
653        let index = self.range.next()?;
654        Some(self.array.get(index))
655    }
656
657    #[inline]
658    fn size_hint(&self) -> (usize, Option<usize>) {
659        self.range.size_hint()
660    }
661
662    #[inline]
663    fn count(self) -> usize
664    where
665        Self: Sized,
666    {
667        self.range.count()
668    }
669
670    #[inline]
671    fn last(self) -> Option<Self::Item>
672    where
673        Self: Sized,
674    {
675        let Self { range, array } = self;
676        range.last().map(|index| array.get(index))
677    }
678
679    #[inline]
680    fn nth(&mut self, n: usize) -> Option<Self::Item> {
681        self.range.nth(n).map(|index| self.array.get(index))
682    }
683}
684
685impl core::iter::DoubleEndedIterator for ArrayIntoIter {
686    fn next_back(&mut self) -> Option<Self::Item> {
687        let index = self.range.next_back()?;
688        Some(self.array.get(index))
689    }
690
691    fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
692        self.range.nth_back(n).map(|index| self.array.get(index))
693    }
694}
695
696impl core::iter::FusedIterator for ArrayIntoIter {}
697
698impl core::iter::ExactSizeIterator for ArrayIntoIter {}
699
700/// Iterator returned by `Array::iter`
701#[derive(Debug, Clone)]
702pub struct ArrayIter<'a> {
703    range: core::ops::Range<u32>,
704    array: &'a Array,
705}
706
707impl core::iter::Iterator for ArrayIter<'_> {
708    type Item = JsValue;
709
710    fn next(&mut self) -> Option<Self::Item> {
711        let index = self.range.next()?;
712        Some(self.array.get(index))
713    }
714
715    #[inline]
716    fn size_hint(&self) -> (usize, Option<usize>) {
717        self.range.size_hint()
718    }
719
720    #[inline]
721    fn count(self) -> usize
722    where
723        Self: Sized,
724    {
725        self.range.count()
726    }
727
728    #[inline]
729    fn last(self) -> Option<Self::Item>
730    where
731        Self: Sized,
732    {
733        let Self { range, array } = self;
734        range.last().map(|index| array.get(index))
735    }
736
737    #[inline]
738    fn nth(&mut self, n: usize) -> Option<Self::Item> {
739        self.range.nth(n).map(|index| self.array.get(index))
740    }
741}
742
743impl core::iter::DoubleEndedIterator for ArrayIter<'_> {
744    fn next_back(&mut self) -> Option<Self::Item> {
745        let index = self.range.next_back()?;
746        Some(self.array.get(index))
747    }
748
749    fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
750        self.range.nth_back(n).map(|index| self.array.get(index))
751    }
752}
753
754impl core::iter::FusedIterator for ArrayIter<'_> {}
755
756impl core::iter::ExactSizeIterator for ArrayIter<'_> {}
757
758impl Array {
759    /// Returns an iterator over the values of the JS array.
760    pub fn iter(&self) -> ArrayIter<'_> {
761        ArrayIter {
762            range: 0..self.length(),
763            array: self,
764        }
765    }
766
767    /// Converts the JS array into a new Vec.
768    pub fn to_vec(&self) -> Vec<JsValue> {
769        let len = self.length();
770
771        let mut output = Vec::with_capacity(len as usize);
772
773        for i in 0..len {
774            output.push(self.get(i));
775        }
776
777        output
778    }
779}
780
781impl core::iter::IntoIterator for Array {
782    type Item = JsValue;
783    type IntoIter = ArrayIntoIter;
784
785    fn into_iter(self) -> Self::IntoIter {
786        ArrayIntoIter {
787            range: 0..self.length(),
788            array: self,
789        }
790    }
791}
792
793// TODO pre-initialize the Array with the correct length using TrustedLen
794impl<A> core::iter::FromIterator<A> for Array
795where
796    A: AsRef<JsValue>,
797{
798    fn from_iter<T>(iter: T) -> Array
799    where
800        T: IntoIterator<Item = A>,
801    {
802        let mut out = Array::new();
803        out.extend(iter);
804        out
805    }
806}
807
808impl<A> core::iter::Extend<A> for Array
809where
810    A: AsRef<JsValue>,
811{
812    fn extend<T>(&mut self, iter: T)
813    where
814        T: IntoIterator<Item = A>,
815    {
816        for value in iter {
817            self.push(value.as_ref());
818        }
819    }
820}
821
822impl Default for Array {
823    fn default() -> Self {
824        Self::new()
825    }
826}
827
828// ArrayBuffer
829#[wasm_bindgen]
830extern "C" {
831    #[wasm_bindgen(extends = Object, typescript_type = "ArrayBuffer")]
832    #[derive(Clone, Debug, PartialEq, Eq)]
833    pub type ArrayBuffer;
834
835    /// The `ArrayBuffer` object is used to represent a generic,
836    /// fixed-length raw binary data buffer. You cannot directly
837    /// manipulate the contents of an `ArrayBuffer`; instead, you
838    /// create one of the typed array objects or a `DataView` object
839    /// which represents the buffer in a specific format, and use that
840    /// to read and write the contents of the buffer.
841    ///
842    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
843    #[wasm_bindgen(constructor)]
844    pub fn new(length: u32) -> ArrayBuffer;
845
846    /// The byteLength property of an object which is an instance of type ArrayBuffer
847    /// it's an accessor property whose set accessor function is undefined,
848    /// meaning that you can only read this property.
849    /// The value is established when the array is constructed and cannot be changed.
850    /// This property returns 0 if this ArrayBuffer has been detached.
851    ///
852    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/byteLength)
853    #[wasm_bindgen(method, getter, js_name = byteLength)]
854    pub fn byte_length(this: &ArrayBuffer) -> u32;
855
856    /// The `isView()` method returns true if arg is one of the `ArrayBuffer`
857    /// views, such as typed array objects or a DataView; false otherwise.
858    ///
859    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView)
860    #[wasm_bindgen(static_method_of = ArrayBuffer, js_name = isView)]
861    pub fn is_view(value: &JsValue) -> bool;
862
863    /// The `slice()` method returns a new `ArrayBuffer` whose contents
864    /// are a copy of this `ArrayBuffer`'s bytes from begin, inclusive,
865    /// up to end, exclusive.
866    ///
867    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice)
868    #[wasm_bindgen(method)]
869    pub fn slice(this: &ArrayBuffer, begin: u32) -> ArrayBuffer;
870
871    /// Like `slice()` but with the `end` argument.
872    ///
873    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice)
874    #[wasm_bindgen(method, js_name = slice)]
875    pub fn slice_with_end(this: &ArrayBuffer, begin: u32, end: u32) -> ArrayBuffer;
876}
877
878// SharedArrayBuffer
879#[wasm_bindgen]
880extern "C" {
881    #[wasm_bindgen(extends = Object, typescript_type = "SharedArrayBuffer")]
882    #[derive(Clone, Debug)]
883    pub type SharedArrayBuffer;
884
885    /// The `SharedArrayBuffer` object is used to represent a generic,
886    /// fixed-length raw binary data buffer, similar to the `ArrayBuffer`
887    /// object, but in a way that they can be used to create views
888    /// on shared memory. Unlike an `ArrayBuffer`, a `SharedArrayBuffer`
889    /// cannot become detached.
890    ///
891    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer)
892    #[wasm_bindgen(constructor)]
893    pub fn new(length: u32) -> SharedArrayBuffer;
894
895    /// The byteLength accessor property represents the length of
896    /// an `SharedArrayBuffer` in bytes. This is established when
897    /// the `SharedArrayBuffer` is constructed and cannot be changed.
898    ///
899    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/byteLength)
900    #[wasm_bindgen(method, getter, js_name = byteLength)]
901    pub fn byte_length(this: &SharedArrayBuffer) -> u32;
902
903    /// The `slice()` method returns a new `SharedArrayBuffer` whose contents
904    /// are a copy of this `SharedArrayBuffer`'s bytes from begin, inclusive,
905    /// up to end, exclusive.
906    ///
907    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/slice)
908    #[wasm_bindgen(method)]
909    pub fn slice(this: &SharedArrayBuffer, begin: u32) -> SharedArrayBuffer;
910
911    /// Like `slice()` but with the `end` argument.
912    ///
913    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/slice)
914    #[wasm_bindgen(method, js_name = slice)]
915    pub fn slice_with_end(this: &SharedArrayBuffer, begin: u32, end: u32) -> SharedArrayBuffer;
916}
917
918// Array Iterator
919#[wasm_bindgen]
920extern "C" {
921    /// The `keys()` method returns a new Array Iterator object that contains the
922    /// keys for each index in the array.
923    ///
924    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/keys)
925    #[wasm_bindgen(method)]
926    pub fn keys(this: &Array) -> Iterator;
927
928    /// The `entries()` method returns a new Array Iterator object that contains
929    /// the key/value pairs for each index in the array.
930    ///
931    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries)
932    #[wasm_bindgen(method)]
933    pub fn entries(this: &Array) -> Iterator;
934
935    /// The `values()` method returns a new Array Iterator object that
936    /// contains the values for each index in the array.
937    ///
938    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values)
939    #[wasm_bindgen(method)]
940    pub fn values(this: &Array) -> Iterator;
941}
942
943/// The `Atomics` object provides atomic operations as static methods.
944/// They are used with `SharedArrayBuffer` objects.
945///
946/// The Atomic operations are installed on an `Atomics` module. Unlike
947/// the other global objects, `Atomics` is not a constructor. You cannot
948/// use it with a new operator or invoke the `Atomics` object as a
949/// function. All properties and methods of `Atomics` are static
950/// (as is the case with the Math object, for example).
951/// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics)
952#[allow(non_snake_case)]
953pub mod Atomics {
954    use super::*;
955
956    #[wasm_bindgen]
957    extern "C" {
958        /// The static `Atomics.add()` method adds a given value at a given
959        /// position in the array and returns the old value at that position.
960        /// This atomic operation guarantees that no other write happens
961        /// until the modified value is written back.
962        ///
963        /// You should use `add_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
964        ///
965        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/add)
966        #[wasm_bindgen(js_namespace = Atomics, catch)]
967        pub fn add(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
968
969        /// The static `Atomics.add()` method adds a given value at a given
970        /// position in the array and returns the old value at that position.
971        /// This atomic operation guarantees that no other write happens
972        /// until the modified value is written back.
973        ///
974        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
975        ///
976        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/add)
977        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = add)]
978        pub fn add_bigint(typed_array: &JsValue, index: u32, value: i64) -> Result<i64, JsValue>;
979
980        /// The static `Atomics.and()` method computes a bitwise AND with a given
981        /// value at a given position in the array, and returns the old value
982        /// at that position.
983        /// This atomic operation guarantees that no other write happens
984        /// until the modified value is written back.
985        ///
986        /// You should use `and_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
987        ///
988        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/and)
989        #[wasm_bindgen(js_namespace = Atomics, catch)]
990        pub fn and(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
991
992        /// The static `Atomics.and()` method computes a bitwise AND with a given
993        /// value at a given position in the array, and returns the old value
994        /// at that position.
995        /// This atomic operation guarantees that no other write happens
996        /// until the modified value is written back.
997        ///
998        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
999        ///
1000        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/and)
1001        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = and)]
1002        pub fn and_bigint(typed_array: &JsValue, index: u32, value: i64) -> Result<i64, JsValue>;
1003
1004        /// The static `Atomics.compareExchange()` method exchanges a given
1005        /// replacement value at a given position in the array, if a given expected
1006        /// value equals the old value. It returns the old value at that position
1007        /// whether it was equal to the expected value or not.
1008        /// This atomic operation guarantees that no other write happens
1009        /// until the modified value is written back.
1010        ///
1011        /// You should use `compare_exchange_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1012        ///
1013        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/compareExchange)
1014        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = compareExchange)]
1015        pub fn compare_exchange(
1016            typed_array: &JsValue,
1017            index: u32,
1018            expected_value: i32,
1019            replacement_value: i32,
1020        ) -> Result<i32, JsValue>;
1021
1022        /// The static `Atomics.compareExchange()` method exchanges a given
1023        /// replacement value at a given position in the array, if a given expected
1024        /// value equals the old value. It returns the old value at that position
1025        /// whether it was equal to the expected value or not.
1026        /// This atomic operation guarantees that no other write happens
1027        /// until the modified value is written back.
1028        ///
1029        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1030        ///
1031        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/compareExchange)
1032        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = compareExchange)]
1033        pub fn compare_exchange_bigint(
1034            typed_array: &JsValue,
1035            index: u32,
1036            expected_value: i64,
1037            replacement_value: i64,
1038        ) -> Result<i64, JsValue>;
1039
1040        /// The static `Atomics.exchange()` method stores a given value at a given
1041        /// position in the array and returns the old value at that position.
1042        /// This atomic operation guarantees that no other write happens
1043        /// until the modified value is written back.
1044        ///
1045        /// You should use `exchange_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1046        ///
1047        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/exchange)
1048        #[wasm_bindgen(js_namespace = Atomics, catch)]
1049        pub fn exchange(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
1050
1051        /// The static `Atomics.exchange()` method stores a given value at a given
1052        /// position in the array and returns the old value at that position.
1053        /// This atomic operation guarantees that no other write happens
1054        /// until the modified value is written back.
1055        ///
1056        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1057        ///
1058        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/exchange)
1059        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = exchange)]
1060        pub fn exchange_bigint(
1061            typed_array: &JsValue,
1062            index: u32,
1063            value: i64,
1064        ) -> Result<i64, JsValue>;
1065
1066        /// The static `Atomics.isLockFree()` method is used to determine
1067        /// whether to use locks or atomic operations. It returns true,
1068        /// if the given size is one of the `BYTES_PER_ELEMENT` property
1069        /// of integer `TypedArray` types.
1070        ///
1071        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/isLockFree)
1072        #[wasm_bindgen(js_namespace = Atomics, js_name = isLockFree)]
1073        pub fn is_lock_free(size: u32) -> bool;
1074
1075        /// The static `Atomics.load()` method returns a value at a given
1076        /// position in the array.
1077        ///
1078        /// You should use `load_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1079        ///
1080        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/load)
1081        #[wasm_bindgen(js_namespace = Atomics, catch)]
1082        pub fn load(typed_array: &JsValue, index: u32) -> Result<i32, JsValue>;
1083
1084        /// The static `Atomics.load()` method returns a value at a given
1085        /// position in the array.
1086        ///
1087        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1088        ///
1089        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/load)
1090        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = load)]
1091        pub fn load_bigint(typed_array: &JsValue, index: i64) -> Result<i64, JsValue>;
1092
1093        /// The static `Atomics.notify()` method notifies up some agents that
1094        /// are sleeping in the wait queue.
1095        /// Note: This operation works with a shared `Int32Array` only.
1096        /// If `count` is not provided, notifies all the agents in the queue.
1097        ///
1098        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/notify)
1099        #[wasm_bindgen(js_namespace = Atomics, catch)]
1100        pub fn notify(typed_array: &Int32Array, index: u32) -> Result<u32, JsValue>;
1101
1102        /// Notifies up to `count` agents in the wait queue.
1103        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = notify)]
1104        pub fn notify_with_count(
1105            typed_array: &Int32Array,
1106            index: u32,
1107            count: u32,
1108        ) -> Result<u32, JsValue>;
1109
1110        /// The static `Atomics.or()` method computes a bitwise OR with a given value
1111        /// at a given position in the array, and returns the old value at that position.
1112        /// This atomic operation guarantees that no other write happens
1113        /// until the modified value is written back.
1114        ///
1115        /// You should use `or_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1116        ///
1117        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/or)
1118        #[wasm_bindgen(js_namespace = Atomics, catch)]
1119        pub fn or(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
1120
1121        /// The static `Atomics.or()` method computes a bitwise OR with a given value
1122        /// at a given position in the array, and returns the old value at that position.
1123        /// This atomic operation guarantees that no other write happens
1124        /// until the modified value is written back.
1125        ///
1126        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1127        ///
1128        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/or)
1129        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = or)]
1130        pub fn or_bigint(typed_array: &JsValue, index: u32, value: i64) -> Result<i64, JsValue>;
1131
1132        /// The static `Atomics.store()` method stores a given value at the given
1133        /// position in the array and returns that value.
1134        ///
1135        /// You should use `store_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1136        ///
1137        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/store)
1138        #[wasm_bindgen(js_namespace = Atomics, catch)]
1139        pub fn store(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
1140
1141        /// The static `Atomics.store()` method stores a given value at the given
1142        /// position in the array and returns that value.
1143        ///
1144        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1145        ///
1146        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/store)
1147        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = store)]
1148        pub fn store_bigint(typed_array: &JsValue, index: u32, value: i64) -> Result<i64, JsValue>;
1149
1150        /// The static `Atomics.sub()` method subtracts a given value at a
1151        /// given position in the array and returns the old value at that position.
1152        /// This atomic operation guarantees that no other write happens
1153        /// until the modified value is written back.
1154        ///
1155        /// You should use `sub_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1156        ///
1157        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/sub)
1158        #[wasm_bindgen(js_namespace = Atomics, catch)]
1159        pub fn sub(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
1160
1161        /// The static `Atomics.sub()` method subtracts a given value at a
1162        /// given position in the array and returns the old value at that position.
1163        /// This atomic operation guarantees that no other write happens
1164        /// until the modified value is written back.
1165        ///
1166        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1167        ///
1168        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/sub)
1169        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = sub)]
1170        pub fn sub_bigint(typed_array: &JsValue, index: u32, value: i64) -> Result<i64, JsValue>;
1171
1172        /// The static `Atomics.wait()` method verifies that a given
1173        /// position in an `Int32Array` still contains a given value
1174        /// and if so sleeps, awaiting a wakeup or a timeout.
1175        /// It returns a string which is either "ok", "not-equal", or "timed-out".
1176        /// Note: This operation only works with a shared `Int32Array`
1177        /// and may not be allowed on the main thread.
1178        ///
1179        /// You should use `wait_bigint` to operate on a `BigInt64Array`.
1180        ///
1181        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
1182        #[wasm_bindgen(js_namespace = Atomics, catch)]
1183        pub fn wait(typed_array: &Int32Array, index: u32, value: i32) -> Result<JsString, JsValue>;
1184
1185        /// The static `Atomics.wait()` method verifies that a given
1186        /// position in an `BigInt64Array` still contains a given value
1187        /// and if so sleeps, awaiting a wakeup or a timeout.
1188        /// It returns a string which is either "ok", "not-equal", or "timed-out".
1189        /// Note: This operation only works with a shared `BigInt64Array`
1190        /// and may not be allowed on the main thread.
1191        ///
1192        /// You should use `wait` to operate on a `Int32Array`.
1193        ///
1194        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
1195        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = wait)]
1196        pub fn wait_bigint(
1197            typed_array: &BigInt64Array,
1198            index: u32,
1199            value: i64,
1200        ) -> Result<JsString, JsValue>;
1201
1202        /// Like `wait()`, but with timeout
1203        ///
1204        /// You should use `wait_with_timeout_bigint` to operate on a `BigInt64Array`.
1205        ///
1206        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
1207        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = wait)]
1208        pub fn wait_with_timeout(
1209            typed_array: &Int32Array,
1210            index: u32,
1211            value: i32,
1212            timeout: f64,
1213        ) -> Result<JsString, JsValue>;
1214
1215        /// Like `wait()`, but with timeout
1216        ///
1217        /// You should use `wait_with_timeout` to operate on a `Int32Array`.
1218        ///
1219        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
1220        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = wait)]
1221        pub fn wait_with_timeout_bigint(
1222            typed_array: &BigInt64Array,
1223            index: u32,
1224            value: i64,
1225            timeout: f64,
1226        ) -> Result<JsString, JsValue>;
1227
1228        /// The static `Atomics.waitAsync()` method verifies that a given position in an
1229        /// `Int32Array` still contains a given value and if so sleeps, awaiting a
1230        /// wakeup or a timeout. It returns an object with two properties. The first
1231        /// property `async` is a boolean which if true indicates that the second
1232        /// property `value` is a promise. If `async` is false then value is a string
1233        /// whether equal to either "not-equal" or "timed-out".
1234        /// Note: This operation only works with a shared `Int32Array` and may be used
1235        /// on the main thread.
1236        ///
1237        /// You should use `wait_async_bigint` to operate on a `BigInt64Array`.
1238        ///
1239        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/waitAsync)
1240        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = waitAsync)]
1241        pub fn wait_async(
1242            typed_array: &Int32Array,
1243            index: u32,
1244            value: i32,
1245        ) -> Result<Object, JsValue>;
1246
1247        /// The static `Atomics.waitAsync()` method verifies that a given position in an
1248        /// `Int32Array` still contains a given value and if so sleeps, awaiting a
1249        /// wakeup or a timeout. It returns an object with two properties. The first
1250        /// property `async` is a boolean which if true indicates that the second
1251        /// property `value` is a promise. If `async` is false then value is a string
1252        /// whether equal to either "not-equal" or "timed-out".
1253        /// Note: This operation only works with a shared `BigInt64Array` and may be used
1254        /// on the main thread.
1255        ///
1256        /// You should use `wait_async` to operate on a `Int32Array`.
1257        ///
1258        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/waitAsync)
1259        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = waitAsync)]
1260        pub fn wait_async_bigint(
1261            typed_array: &BigInt64Array,
1262            index: u32,
1263            value: i64,
1264        ) -> Result<Object, JsValue>;
1265
1266        /// Like `waitAsync()`, but with timeout
1267        ///
1268        /// You should use `wait_async_with_timeout_bigint` to operate on a `BigInt64Array`.
1269        ///
1270        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/waitAsync)
1271        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = waitAsync)]
1272        pub fn wait_async_with_timeout(
1273            typed_array: &Int32Array,
1274            index: u32,
1275            value: i32,
1276            timeout: f64,
1277        ) -> Result<Object, JsValue>;
1278
1279        /// Like `waitAsync()`, but with timeout
1280        ///
1281        /// You should use `wait_async_with_timeout` to operate on a `Int32Array`.
1282        ///
1283        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/waitAsync)
1284        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = waitAsync)]
1285        pub fn wait_async_with_timeout_bigint(
1286            typed_array: &BigInt64Array,
1287            index: u32,
1288            value: i64,
1289            timeout: f64,
1290        ) -> Result<Object, JsValue>;
1291
1292        /// The static `Atomics.xor()` method computes a bitwise XOR
1293        /// with a given value at a given position in the array,
1294        /// and returns the old value at that position.
1295        /// This atomic operation guarantees that no other write happens
1296        /// until the modified value is written back.
1297        ///
1298        /// You should use `xor_bigint` to operate on a `BigInt64Array` or a `BigUint64Array`.
1299        ///
1300        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/xor)
1301        #[wasm_bindgen(js_namespace = Atomics, catch)]
1302        pub fn xor(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
1303
1304        /// The static `Atomics.xor()` method computes a bitwise XOR
1305        /// with a given value at a given position in the array,
1306        /// and returns the old value at that position.
1307        /// This atomic operation guarantees that no other write happens
1308        /// until the modified value is written back.
1309        ///
1310        /// This method is used to operate on a `BigInt64Array` or a `BigUint64Array`.
1311        ///
1312        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/xor)
1313        #[wasm_bindgen(js_namespace = Atomics, catch, js_name = xor)]
1314        pub fn xor_bigint(typed_array: &JsValue, index: u32, value: i64) -> Result<i64, JsValue>;
1315    }
1316}
1317
1318// BigInt
1319#[wasm_bindgen]
1320extern "C" {
1321    #[wasm_bindgen(extends = Object, is_type_of = |v| v.is_bigint(), typescript_type = "bigint")]
1322    #[derive(Clone, PartialEq, Eq)]
1323    pub type BigInt;
1324
1325    #[wasm_bindgen(catch, js_name = BigInt)]
1326    fn new_bigint(value: &JsValue) -> Result<BigInt, Error>;
1327
1328    #[wasm_bindgen(js_name = BigInt)]
1329    fn new_bigint_unchecked(value: &JsValue) -> BigInt;
1330
1331    /// Clamps a BigInt value to a signed integer value, and returns that value.
1332    ///
1333    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asIntN)
1334    #[wasm_bindgen(static_method_of = BigInt, js_name = asIntN)]
1335    pub fn as_int_n(bits: f64, bigint: &BigInt) -> BigInt;
1336
1337    /// Clamps a BigInt value to an unsigned integer value, and returns that value.
1338    ///
1339    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asUintN)
1340    #[wasm_bindgen(static_method_of = BigInt, js_name = asUintN)]
1341    pub fn as_uint_n(bits: f64, bigint: &BigInt) -> BigInt;
1342
1343    /// Returns a string with a language-sensitive representation of this BigInt value. Overrides the [`Object.prototype.toLocaleString()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toLocaleString) method.
1344    ///
1345    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toLocaleString)
1346    #[wasm_bindgen(method, js_name = toLocaleString)]
1347    pub fn to_locale_string(this: &BigInt, locales: &JsValue, options: &JsValue) -> JsString;
1348
1349    /// Returns a string representing this BigInt value in the specified radix (base). Overrides the [`Object.prototype.toString()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) method.
1350    ///
1351    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toString)
1352    #[wasm_bindgen(catch, method, js_name = toString)]
1353    pub fn to_string(this: &BigInt, radix: u8) -> Result<JsString, RangeError>;
1354
1355    #[wasm_bindgen(method, js_name = toString)]
1356    fn to_string_unchecked(this: &BigInt, radix: u8) -> String;
1357
1358    /// Returns this BigInt value. Overrides the [`Object.prototype.valueOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf) method.
1359    ///
1360    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/valueOf)
1361    #[wasm_bindgen(method, js_name = valueOf)]
1362    pub fn value_of(this: &BigInt, radix: u8) -> BigInt;
1363}
1364
1365impl BigInt {
1366    /// Creates a new BigInt value.
1367    ///
1368    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt)
1369    #[inline]
1370    pub fn new(value: &JsValue) -> Result<BigInt, Error> {
1371        new_bigint(value)
1372    }
1373
1374    /// Applies the binary `/` JS operator on two `BigInt`s, catching and returning any `RangeError` thrown.
1375    ///
1376    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Division)
1377    pub fn checked_div(&self, rhs: &Self) -> Result<Self, RangeError> {
1378        let result = JsValue::as_ref(self).checked_div(JsValue::as_ref(rhs));
1379
1380        if result.is_instance_of::<RangeError>() {
1381            Err(result.unchecked_into())
1382        } else {
1383            Ok(result.unchecked_into())
1384        }
1385    }
1386
1387    /// Applies the binary `**` JS operator on the two `BigInt`s.
1388    ///
1389    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation)
1390    #[inline]
1391    pub fn pow(&self, rhs: &Self) -> Self {
1392        JsValue::as_ref(self)
1393            .pow(JsValue::as_ref(rhs))
1394            .unchecked_into()
1395    }
1396
1397    /// Returns a tuple of this [`BigInt`]'s absolute value along with a
1398    /// [`bool`] indicating whether the [`BigInt`] was negative.
1399    fn abs(&self) -> (Self, bool) {
1400        if self < &BigInt::from(0) {
1401            (-self, true)
1402        } else {
1403            (self.clone(), false)
1404        }
1405    }
1406}
1407
1408macro_rules! bigint_from {
1409    ($($x:ident)*) => ($(
1410        impl From<$x> for BigInt {
1411            #[inline]
1412            fn from(x: $x) -> BigInt {
1413                new_bigint_unchecked(&JsValue::from(x))
1414            }
1415        }
1416
1417        impl PartialEq<$x> for BigInt {
1418            #[inline]
1419            fn eq(&self, other: &$x) -> bool {
1420                JsValue::from(self) == JsValue::from(BigInt::from(*other))
1421            }
1422        }
1423    )*)
1424}
1425bigint_from!(i8 u8 i16 u16 i32 u32 isize usize);
1426
1427macro_rules! bigint_from_big {
1428    ($($x:ident)*) => ($(
1429        impl From<$x> for BigInt {
1430            #[inline]
1431            fn from(x: $x) -> BigInt {
1432                JsValue::from(x).unchecked_into()
1433            }
1434        }
1435
1436        impl PartialEq<$x> for BigInt {
1437            #[inline]
1438            fn eq(&self, other: &$x) -> bool {
1439                self == &BigInt::from(*other)
1440            }
1441        }
1442
1443        impl TryFrom<BigInt> for $x {
1444            type Error = BigInt;
1445
1446            #[inline]
1447            fn try_from(x: BigInt) -> Result<Self, BigInt> {
1448                Self::try_from(JsValue::from(x)).map_err(JsCast::unchecked_into)
1449            }
1450        }
1451    )*)
1452}
1453bigint_from_big!(i64 u64 i128 u128);
1454
1455impl PartialEq<Number> for BigInt {
1456    #[inline]
1457    fn eq(&self, other: &Number) -> bool {
1458        JsValue::as_ref(self).loose_eq(JsValue::as_ref(other))
1459    }
1460}
1461
1462impl Not for &BigInt {
1463    type Output = BigInt;
1464
1465    #[inline]
1466    fn not(self) -> Self::Output {
1467        JsValue::as_ref(self).bit_not().unchecked_into()
1468    }
1469}
1470
1471forward_deref_unop!(impl Not, not for BigInt);
1472forward_js_unop!(impl Neg, neg for BigInt);
1473forward_js_binop!(impl BitAnd, bitand for BigInt);
1474forward_js_binop!(impl BitOr, bitor for BigInt);
1475forward_js_binop!(impl BitXor, bitxor for BigInt);
1476forward_js_binop!(impl Shl, shl for BigInt);
1477forward_js_binop!(impl Shr, shr for BigInt);
1478forward_js_binop!(impl Add, add for BigInt);
1479forward_js_binop!(impl Sub, sub for BigInt);
1480forward_js_binop!(impl Div, div for BigInt);
1481forward_js_binop!(impl Mul, mul for BigInt);
1482forward_js_binop!(impl Rem, rem for BigInt);
1483sum_product!(BigInt);
1484
1485partialord_ord!(BigInt);
1486
1487impl Default for BigInt {
1488    fn default() -> Self {
1489        BigInt::from(i32::default())
1490    }
1491}
1492
1493impl FromStr for BigInt {
1494    type Err = Error;
1495
1496    #[inline]
1497    fn from_str(s: &str) -> Result<Self, Self::Err> {
1498        BigInt::new(&s.into())
1499    }
1500}
1501
1502impl fmt::Debug for BigInt {
1503    #[inline]
1504    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1505        fmt::Display::fmt(self, f)
1506    }
1507}
1508
1509impl fmt::Display for BigInt {
1510    #[inline]
1511    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1512        let (abs, is_neg) = self.abs();
1513        f.pad_integral(!is_neg, "", &abs.to_string_unchecked(10))
1514    }
1515}
1516
1517impl fmt::Binary for BigInt {
1518    #[inline]
1519    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1520        let (abs, is_neg) = self.abs();
1521        f.pad_integral(!is_neg, "0b", &abs.to_string_unchecked(2))
1522    }
1523}
1524
1525impl fmt::Octal for BigInt {
1526    #[inline]
1527    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1528        let (abs, is_neg) = self.abs();
1529        f.pad_integral(!is_neg, "0o", &abs.to_string_unchecked(8))
1530    }
1531}
1532
1533impl fmt::LowerHex for BigInt {
1534    #[inline]
1535    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1536        let (abs, is_neg) = self.abs();
1537        f.pad_integral(!is_neg, "0x", &abs.to_string_unchecked(16))
1538    }
1539}
1540
1541impl fmt::UpperHex for BigInt {
1542    #[inline]
1543    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1544        let (abs, is_neg) = self.abs();
1545        let mut s: String = abs.to_string_unchecked(16);
1546        s.make_ascii_uppercase();
1547        f.pad_integral(!is_neg, "0x", &s)
1548    }
1549}
1550
1551// Boolean
1552#[wasm_bindgen]
1553extern "C" {
1554    #[wasm_bindgen(extends = Object, is_type_of = |v| v.as_bool().is_some(), typescript_type = "boolean")]
1555    #[derive(Clone, PartialEq, Eq)]
1556    pub type Boolean;
1557
1558    /// The `Boolean()` constructor creates an object wrapper for a boolean value.
1559    ///
1560    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)
1561    #[wasm_bindgen(constructor)]
1562    #[deprecated(note = "recommended to use `Boolean::from` instead")]
1563    #[allow(deprecated)]
1564    pub fn new(value: &JsValue) -> Boolean;
1565
1566    /// The `valueOf()` method returns the primitive value of a `Boolean` object.
1567    ///
1568    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean/valueOf)
1569    #[wasm_bindgen(method, js_name = valueOf)]
1570    pub fn value_of(this: &Boolean) -> bool;
1571}
1572
1573impl From<bool> for Boolean {
1574    #[inline]
1575    fn from(b: bool) -> Boolean {
1576        Boolean::unchecked_from_js(JsValue::from(b))
1577    }
1578}
1579
1580impl From<Boolean> for bool {
1581    #[inline]
1582    fn from(b: Boolean) -> bool {
1583        b.value_of()
1584    }
1585}
1586
1587impl PartialEq<bool> for Boolean {
1588    #[inline]
1589    fn eq(&self, other: &bool) -> bool {
1590        self.value_of() == *other
1591    }
1592}
1593
1594impl fmt::Debug for Boolean {
1595    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1596        fmt::Debug::fmt(&self.value_of(), f)
1597    }
1598}
1599
1600impl fmt::Display for Boolean {
1601    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1602        fmt::Display::fmt(&self.value_of(), f)
1603    }
1604}
1605
1606impl Default for Boolean {
1607    fn default() -> Self {
1608        Self::from(bool::default())
1609    }
1610}
1611
1612impl Not for &Boolean {
1613    type Output = Boolean;
1614
1615    #[inline]
1616    fn not(self) -> Self::Output {
1617        (!JsValue::as_ref(self)).into()
1618    }
1619}
1620
1621forward_deref_unop!(impl Not, not for Boolean);
1622
1623partialord_ord!(Boolean);
1624
1625// DataView
1626#[wasm_bindgen]
1627extern "C" {
1628    #[wasm_bindgen(extends = Object, typescript_type = "DataView")]
1629    #[derive(Clone, Debug, PartialEq, Eq)]
1630    pub type DataView;
1631
1632    /// The `DataView` view provides a low-level interface for reading and
1633    /// writing multiple number types in an `ArrayBuffer` irrespective of the
1634    /// platform's endianness.
1635    ///
1636    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)
1637    #[wasm_bindgen(constructor)]
1638    pub fn new(buffer: &ArrayBuffer, byteOffset: usize, byteLength: usize) -> DataView;
1639
1640    /// The `DataView` view provides a low-level interface for reading and
1641    /// writing multiple number types in an `ArrayBuffer` irrespective of the
1642    /// platform's endianness.
1643    ///
1644    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)
1645    #[wasm_bindgen(constructor)]
1646    pub fn new_with_shared_array_buffer(
1647        buffer: &SharedArrayBuffer,
1648        byteOffset: usize,
1649        byteLength: usize,
1650    ) -> DataView;
1651
1652    /// The ArrayBuffer referenced by this view. Fixed at construction time and thus read only.
1653    ///
1654    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/buffer)
1655    #[wasm_bindgen(method, getter, structural)]
1656    pub fn buffer(this: &DataView) -> ArrayBuffer;
1657
1658    /// The length (in bytes) of this view from the start of its ArrayBuffer.
1659    /// Fixed at construction time and thus read only.
1660    ///
1661    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteLength)
1662    #[wasm_bindgen(method, getter, structural, js_name = byteLength)]
1663    pub fn byte_length(this: &DataView) -> usize;
1664
1665    /// The offset (in bytes) of this view from the start of its ArrayBuffer.
1666    /// Fixed at construction time and thus read only.
1667    ///
1668    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteOffset)
1669    #[wasm_bindgen(method, getter, structural, js_name = byteOffset)]
1670    pub fn byte_offset(this: &DataView) -> usize;
1671
1672    /// The `getInt8()` method gets a signed 8-bit integer (byte) at the
1673    /// specified byte offset from the start of the DataView.
1674    ///
1675    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt8)
1676    #[wasm_bindgen(method, js_name = getInt8)]
1677    pub fn get_int8(this: &DataView, byte_offset: usize) -> i8;
1678
1679    /// The `getUint8()` method gets a unsigned 8-bit integer (byte) at the specified
1680    /// byte offset from the start of the DataView.
1681    ///
1682    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint8)
1683    #[wasm_bindgen(method, js_name = getUint8)]
1684    pub fn get_uint8(this: &DataView, byte_offset: usize) -> u8;
1685
1686    /// The `getInt16()` method gets a signed 16-bit integer (short) at the specified
1687    /// byte offset from the start of the DataView.
1688    ///
1689    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16)
1690    #[wasm_bindgen(method, js_name = getInt16)]
1691    pub fn get_int16(this: &DataView, byte_offset: usize) -> i16;
1692
1693    /// The `getInt16()` method gets a signed 16-bit integer (short) at the specified
1694    /// byte offset from the start of the DataView.
1695    ///
1696    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16)
1697    #[wasm_bindgen(method, js_name = getInt16)]
1698    pub fn get_int16_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> i16;
1699
1700    /// The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified
1701    /// byte offset from the start of the view.
1702    ///
1703    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16)
1704    #[wasm_bindgen(method, js_name = getUint16)]
1705    pub fn get_uint16(this: &DataView, byte_offset: usize) -> u16;
1706
1707    /// The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified
1708    /// byte offset from the start of the view.
1709    ///
1710    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16)
1711    #[wasm_bindgen(method, js_name = getUint16)]
1712    pub fn get_uint16_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> u16;
1713
1714    /// The `getInt32()` method gets a signed 32-bit integer (long) at the specified
1715    /// byte offset from the start of the DataView.
1716    ///
1717    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32)
1718    #[wasm_bindgen(method, js_name = getInt32)]
1719    pub fn get_int32(this: &DataView, byte_offset: usize) -> i32;
1720
1721    /// The `getInt32()` method gets a signed 32-bit integer (long) at the specified
1722    /// byte offset from the start of the DataView.
1723    ///
1724    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32)
1725    #[wasm_bindgen(method, js_name = getInt32)]
1726    pub fn get_int32_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> i32;
1727
1728    /// The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified
1729    /// byte offset from the start of the view.
1730    ///
1731    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint32)
1732    #[wasm_bindgen(method, js_name = getUint32)]
1733    pub fn get_uint32(this: &DataView, byte_offset: usize) -> u32;
1734
1735    /// The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified
1736    /// byte offset from the start of the view.
1737    ///
1738    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint32)
1739    #[wasm_bindgen(method, js_name = getUint32)]
1740    pub fn get_uint32_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> u32;
1741
1742    /// The `getFloat32()` method gets a signed 32-bit float (float) at the specified
1743    /// byte offset from the start of the DataView.
1744    ///
1745    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat32)
1746    #[wasm_bindgen(method, js_name = getFloat32)]
1747    pub fn get_float32(this: &DataView, byte_offset: usize) -> f32;
1748
1749    /// The `getFloat32()` method gets a signed 32-bit float (float) at the specified
1750    /// byte offset from the start of the DataView.
1751    ///
1752    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat32)
1753    #[wasm_bindgen(method, js_name = getFloat32)]
1754    pub fn get_float32_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> f32;
1755
1756    /// The `getFloat64()` method gets a signed 64-bit float (double) at the specified
1757    /// byte offset from the start of the DataView.
1758    ///
1759    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat64)
1760    #[wasm_bindgen(method, js_name = getFloat64)]
1761    pub fn get_float64(this: &DataView, byte_offset: usize) -> f64;
1762
1763    /// The `getFloat64()` method gets a signed 64-bit float (double) at the specified
1764    /// byte offset from the start of the DataView.
1765    ///
1766    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat64)
1767    #[wasm_bindgen(method, js_name = getFloat64)]
1768    pub fn get_float64_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> f64;
1769
1770    /// The `setInt8()` method stores a signed 8-bit integer (byte) value at the
1771    /// specified byte offset from the start of the DataView.
1772    ///
1773    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8)
1774    #[wasm_bindgen(method, js_name = setInt8)]
1775    pub fn set_int8(this: &DataView, byte_offset: usize, value: i8);
1776
1777    /// The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the
1778    /// specified byte offset from the start of the DataView.
1779    ///
1780    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint8)
1781    #[wasm_bindgen(method, js_name = setUint8)]
1782    pub fn set_uint8(this: &DataView, byte_offset: usize, value: u8);
1783
1784    /// The `setInt16()` method stores a signed 16-bit integer (short) value at the
1785    /// specified byte offset from the start of the DataView.
1786    ///
1787    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt16)
1788    #[wasm_bindgen(method, js_name = setInt16)]
1789    pub fn set_int16(this: &DataView, byte_offset: usize, value: i16);
1790
1791    /// The `setInt16()` method stores a signed 16-bit integer (short) value at the
1792    /// specified byte offset from the start of the DataView.
1793    ///
1794    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt16)
1795    #[wasm_bindgen(method, js_name = setInt16)]
1796    pub fn set_int16_endian(this: &DataView, byte_offset: usize, value: i16, little_endian: bool);
1797
1798    /// The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the
1799    /// specified byte offset from the start of the DataView.
1800    ///
1801    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint16)
1802    #[wasm_bindgen(method, js_name = setUint16)]
1803    pub fn set_uint16(this: &DataView, byte_offset: usize, value: u16);
1804
1805    /// The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the
1806    /// specified byte offset from the start of the DataView.
1807    ///
1808    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint16)
1809    #[wasm_bindgen(method, js_name = setUint16)]
1810    pub fn set_uint16_endian(this: &DataView, byte_offset: usize, value: u16, little_endian: bool);
1811
1812    /// The `setInt32()` method stores a signed 32-bit integer (long) value at the
1813    /// specified byte offset from the start of the DataView.
1814    ///
1815    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt32)
1816    #[wasm_bindgen(method, js_name = setInt32)]
1817    pub fn set_int32(this: &DataView, byte_offset: usize, value: i32);
1818
1819    /// The `setInt32()` method stores a signed 32-bit integer (long) value at the
1820    /// specified byte offset from the start of the DataView.
1821    ///
1822    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt32)
1823    #[wasm_bindgen(method, js_name = setInt32)]
1824    pub fn set_int32_endian(this: &DataView, byte_offset: usize, value: i32, little_endian: bool);
1825
1826    /// The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the
1827    /// specified byte offset from the start of the DataView.
1828    ///
1829    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint32)
1830    #[wasm_bindgen(method, js_name = setUint32)]
1831    pub fn set_uint32(this: &DataView, byte_offset: usize, value: u32);
1832
1833    /// The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the
1834    /// specified byte offset from the start of the DataView.
1835    ///
1836    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint32)
1837    #[wasm_bindgen(method, js_name = setUint32)]
1838    pub fn set_uint32_endian(this: &DataView, byte_offset: usize, value: u32, little_endian: bool);
1839
1840    /// The `setFloat32()` method stores a signed 32-bit float (float) value at the
1841    /// specified byte offset from the start of the DataView.
1842    ///
1843    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat32)
1844    #[wasm_bindgen(method, js_name = setFloat32)]
1845    pub fn set_float32(this: &DataView, byte_offset: usize, value: f32);
1846
1847    /// The `setFloat32()` method stores a signed 32-bit float (float) value at the
1848    /// specified byte offset from the start of the DataView.
1849    ///
1850    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat32)
1851    #[wasm_bindgen(method, js_name = setFloat32)]
1852    pub fn set_float32_endian(this: &DataView, byte_offset: usize, value: f32, little_endian: bool);
1853
1854    /// The `setFloat64()` method stores a signed 64-bit float (double) value at the
1855    /// specified byte offset from the start of the DataView.
1856    ///
1857    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat64)
1858    #[wasm_bindgen(method, js_name = setFloat64)]
1859    pub fn set_float64(this: &DataView, byte_offset: usize, value: f64);
1860
1861    /// The `setFloat64()` method stores a signed 64-bit float (double) value at the
1862    /// specified byte offset from the start of the DataView.
1863    ///
1864    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat64)
1865    #[wasm_bindgen(method, js_name = setFloat64)]
1866    pub fn set_float64_endian(this: &DataView, byte_offset: usize, value: f64, little_endian: bool);
1867}
1868
1869// Error
1870#[wasm_bindgen]
1871extern "C" {
1872    #[wasm_bindgen(extends = Object, typescript_type = "Error")]
1873    #[derive(Clone, Debug, PartialEq, Eq)]
1874    pub type Error;
1875
1876    /// The Error constructor creates an error object.
1877    /// Instances of Error objects are thrown when runtime errors occur.
1878    /// The Error object can also be used as a base object for user-defined exceptions.
1879    /// See below for standard built-in error types.
1880    ///
1881    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
1882    #[wasm_bindgen(constructor)]
1883    pub fn new(message: &str) -> Error;
1884    #[wasm_bindgen(constructor)]
1885    pub fn new_with_options(message: &str, options: &Object) -> Error;
1886
1887    /// The cause property is the underlying cause of the error.
1888    /// Usually this is used to add context to re-thrown errors.
1889    ///
1890    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#differentiate_between_similar_errors)
1891    #[wasm_bindgen(method, getter, structural)]
1892    pub fn cause(this: &Error) -> JsValue;
1893    #[wasm_bindgen(method, setter, structural)]
1894    pub fn set_cause(this: &Error, cause: &JsValue);
1895
1896    /// The message property is a human-readable description of the error.
1897    ///
1898    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/message)
1899    #[wasm_bindgen(method, getter, structural)]
1900    pub fn message(this: &Error) -> JsString;
1901    #[wasm_bindgen(method, setter, structural)]
1902    pub fn set_message(this: &Error, message: &str);
1903
1904    /// The name property represents a name for the type of error. The initial value is "Error".
1905    ///
1906    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/name)
1907    #[wasm_bindgen(method, getter, structural)]
1908    pub fn name(this: &Error) -> JsString;
1909    #[wasm_bindgen(method, setter, structural)]
1910    pub fn set_name(this: &Error, name: &str);
1911
1912    /// The `toString()` method returns a string representing the specified Error object
1913    ///
1914    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/toString)
1915    #[wasm_bindgen(method, js_name = toString)]
1916    pub fn to_string(this: &Error) -> JsString;
1917}
1918
1919partialord_ord!(JsString);
1920
1921// EvalError
1922#[wasm_bindgen]
1923extern "C" {
1924    #[wasm_bindgen(extends = Object, extends = Error, typescript_type = "EvalError")]
1925    #[derive(Clone, Debug, PartialEq, Eq)]
1926    pub type EvalError;
1927
1928    /// The EvalError object indicates an error regarding the global eval() function. This
1929    /// exception is not thrown by JavaScript anymore, however the EvalError object remains for
1930    /// compatibility.
1931    ///
1932    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError)
1933    #[wasm_bindgen(constructor)]
1934    pub fn new(message: &str) -> EvalError;
1935}
1936
1937// Function
1938#[wasm_bindgen]
1939extern "C" {
1940    #[wasm_bindgen(extends = Object, is_type_of = JsValue::is_function, typescript_type = "Function")]
1941    #[derive(Clone, Debug, PartialEq, Eq)]
1942    pub type Function;
1943
1944    /// The `Function` constructor creates a new `Function` object. Calling the
1945    /// constructor directly can create functions dynamically, but suffers from
1946    /// security and similar (but far less significant) performance issues
1947    /// similar to `eval`. However, unlike `eval`, the `Function` constructor
1948    /// allows executing code in the global scope, prompting better programming
1949    /// habits and allowing for more efficient code minification.
1950    ///
1951    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
1952    #[wasm_bindgen(constructor)]
1953    pub fn new_with_args(args: &str, body: &str) -> Function;
1954
1955    /// The `Function` constructor creates a new `Function` object. Calling the
1956    /// constructor directly can create functions dynamically, but suffers from
1957    /// security and similar (but far less significant) performance issues
1958    /// similar to `eval`. However, unlike `eval`, the `Function` constructor
1959    /// allows executing code in the global scope, prompting better programming
1960    /// habits and allowing for more efficient code minification.
1961    ///
1962    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
1963    #[wasm_bindgen(constructor)]
1964    pub fn new_no_args(body: &str) -> Function;
1965
1966    /// The `apply()` method calls a function with a given this value, and arguments provided as an array
1967    /// (or an array-like object).
1968    ///
1969    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)
1970    #[wasm_bindgen(method, catch)]
1971    pub fn apply(this: &Function, context: &JsValue, args: &Array) -> Result<JsValue, JsValue>;
1972
1973    /// The `call()` method calls a function with a given this value and
1974    /// arguments provided individually.
1975    ///
1976    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
1977    #[wasm_bindgen(method, catch, js_name = call)]
1978    pub fn call0(this: &Function, context: &JsValue) -> Result<JsValue, JsValue>;
1979
1980    /// The `call()` method calls a function with a given this value and
1981    /// arguments provided individually.
1982    ///
1983    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
1984    #[wasm_bindgen(method, catch, js_name = call)]
1985    pub fn call1(this: &Function, context: &JsValue, arg1: &JsValue) -> Result<JsValue, JsValue>;
1986
1987    /// The `call()` method calls a function with a given this value and
1988    /// arguments provided individually.
1989    ///
1990    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
1991    #[wasm_bindgen(method, catch, js_name = call)]
1992    pub fn call2(
1993        this: &Function,
1994        context: &JsValue,
1995        arg1: &JsValue,
1996        arg2: &JsValue,
1997    ) -> Result<JsValue, JsValue>;
1998
1999    /// The `call()` method calls a function with a given this value and
2000    /// arguments provided individually.
2001    ///
2002    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
2003    #[wasm_bindgen(method, catch, js_name = call)]
2004    pub fn call3(
2005        this: &Function,
2006        context: &JsValue,
2007        arg1: &JsValue,
2008        arg2: &JsValue,
2009        arg3: &JsValue,
2010    ) -> Result<JsValue, JsValue>;
2011
2012    /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
2013    /// with a given sequence of arguments preceding any provided when the new function is called.
2014    ///
2015    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
2016    #[wasm_bindgen(method, js_name = bind)]
2017    pub fn bind(this: &Function, context: &JsValue) -> Function;
2018
2019    /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
2020    /// with a given sequence of arguments preceding any provided when the new function is called.
2021    ///
2022    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
2023    #[wasm_bindgen(method, js_name = bind)]
2024    pub fn bind0(this: &Function, context: &JsValue) -> Function;
2025
2026    /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
2027    /// with a given sequence of arguments preceding any provided when the new function is called.
2028    ///
2029    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
2030    #[wasm_bindgen(method, js_name = bind)]
2031    pub fn bind1(this: &Function, context: &JsValue, arg1: &JsValue) -> Function;
2032
2033    /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
2034    /// with a given sequence of arguments preceding any provided when the new function is called.
2035    ///
2036    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
2037    #[wasm_bindgen(method, js_name = bind)]
2038    pub fn bind2(this: &Function, context: &JsValue, arg1: &JsValue, arg2: &JsValue) -> Function;
2039
2040    /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
2041    /// with a given sequence of arguments preceding any provided when the new function is called.
2042    ///
2043    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
2044    #[wasm_bindgen(method, js_name = bind)]
2045    pub fn bind3(
2046        this: &Function,
2047        context: &JsValue,
2048        arg1: &JsValue,
2049        arg2: &JsValue,
2050        arg3: &JsValue,
2051    ) -> Function;
2052
2053    /// The length property indicates the number of arguments expected by the function.
2054    ///
2055    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length)
2056    #[wasm_bindgen(method, getter, structural)]
2057    pub fn length(this: &Function) -> u32;
2058
2059    /// A Function object's read-only name property indicates the function's
2060    /// name as specified when it was created or "anonymous" for functions
2061    /// created anonymously.
2062    ///
2063    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name)
2064    #[wasm_bindgen(method, getter, structural)]
2065    pub fn name(this: &Function) -> JsString;
2066
2067    /// The `toString()` method returns a string representing the source code of the function.
2068    ///
2069    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString)
2070    #[wasm_bindgen(method, js_name = toString)]
2071    pub fn to_string(this: &Function) -> JsString;
2072}
2073
2074impl Function {
2075    /// Returns the `Function` value of this JS value if it's an instance of a
2076    /// function.
2077    ///
2078    /// If this JS value is not an instance of a function then this returns
2079    /// `None`.
2080    #[deprecated(note = "recommended to use dyn_ref instead which is now equivalent")]
2081    pub fn try_from(val: &JsValue) -> Option<&Function> {
2082        val.dyn_ref()
2083    }
2084}
2085
2086impl Default for Function {
2087    fn default() -> Self {
2088        Self::new_no_args("")
2089    }
2090}
2091
2092// Generator
2093#[wasm_bindgen]
2094extern "C" {
2095    #[wasm_bindgen(extends = Object, typescript_type = "Generator<any, any, any>")]
2096    #[derive(Clone, Debug, PartialEq, Eq)]
2097    pub type Generator;
2098
2099    /// The `next()` method returns an object with two properties done and value.
2100    /// You can also provide a parameter to the next method to send a value to the generator.
2101    ///
2102    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next)
2103    #[wasm_bindgen(method, structural, catch)]
2104    pub fn next(this: &Generator, value: &JsValue) -> Result<JsValue, JsValue>;
2105
2106    /// The `return()` method returns the given value and finishes the generator.
2107    ///
2108    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/return)
2109    #[wasm_bindgen(method, structural, js_name = return)]
2110    pub fn return_(this: &Generator, value: &JsValue) -> JsValue;
2111
2112    /// The `throw()` method resumes the execution of a generator by throwing an error into it
2113    /// and returns an object with two properties done and value.
2114    ///
2115    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/throw)
2116    #[wasm_bindgen(method, structural, catch)]
2117    pub fn throw(this: &Generator, error: &Error) -> Result<JsValue, JsValue>;
2118}
2119
2120// Map
2121#[wasm_bindgen]
2122extern "C" {
2123    #[wasm_bindgen(extends = Object, typescript_type = "Map<any, any>")]
2124    #[derive(Clone, Debug, PartialEq, Eq)]
2125    pub type Map;
2126
2127    /// The `clear()` method removes all elements from a Map object.
2128    ///
2129    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear)
2130    #[wasm_bindgen(method)]
2131    pub fn clear(this: &Map);
2132
2133    /// The `delete()` method removes the specified element from a Map object.
2134    ///
2135    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete)
2136    #[wasm_bindgen(method)]
2137    pub fn delete(this: &Map, key: &JsValue) -> bool;
2138
2139    /// The `forEach()` method executes a provided function once per each
2140    /// key/value pair in the Map object, in insertion order.
2141    /// Note that in Javascript land the `Key` and `Value` are reversed compared to normal expectations:
2142    /// # Examples
2143    /// ```
2144    /// let js_map = Map::new();
2145    /// js_map.for_each(&mut |value, key| {
2146    ///     // Do something here...
2147    /// })
2148    /// ```
2149    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach)
2150    #[wasm_bindgen(method, js_name = forEach)]
2151    pub fn for_each(this: &Map, callback: &mut dyn FnMut(JsValue, JsValue));
2152
2153    /// The `get()` method returns a specified element from a Map object.
2154    ///
2155    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get)
2156    #[wasm_bindgen(method)]
2157    pub fn get(this: &Map, key: &JsValue) -> JsValue;
2158
2159    /// The `has()` method returns a boolean indicating whether an element with
2160    /// the specified key exists or not.
2161    ///
2162    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has)
2163    #[wasm_bindgen(method)]
2164    pub fn has(this: &Map, key: &JsValue) -> bool;
2165
2166    /// The Map object holds key-value pairs. Any value (both objects and
2167    /// primitive values) maybe used as either a key or a value.
2168    ///
2169    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)
2170    #[wasm_bindgen(constructor)]
2171    pub fn new() -> Map;
2172
2173    /// The `set()` method adds or updates an element with a specified key
2174    /// and value to a Map object.
2175    ///
2176    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set)
2177    #[wasm_bindgen(method)]
2178    pub fn set(this: &Map, key: &JsValue, value: &JsValue) -> Map;
2179
2180    /// The value of size is an integer representing how many entries
2181    /// the Map object has. A set accessor function for size is undefined;
2182    /// you can not change this property.
2183    ///
2184    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/size)
2185    #[wasm_bindgen(method, getter, structural)]
2186    pub fn size(this: &Map) -> u32;
2187}
2188
2189impl Default for Map {
2190    fn default() -> Self {
2191        Self::new()
2192    }
2193}
2194
2195// Map Iterator
2196#[wasm_bindgen]
2197extern "C" {
2198    /// The `entries()` method returns a new Iterator object that contains
2199    /// the [key, value] pairs for each element in the Map object in
2200    /// insertion order.
2201    ///
2202    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries)
2203    #[wasm_bindgen(method)]
2204    pub fn entries(this: &Map) -> Iterator;
2205
2206    /// The `keys()` method returns a new Iterator object that contains the
2207    /// keys for each element in the Map object in insertion order.
2208    ///
2209    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys)
2210    #[wasm_bindgen(method)]
2211    pub fn keys(this: &Map) -> Iterator;
2212
2213    /// The `values()` method returns a new Iterator object that contains the
2214    /// values for each element in the Map object in insertion order.
2215    ///
2216    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values)
2217    #[wasm_bindgen(method)]
2218    pub fn values(this: &Map) -> Iterator;
2219}
2220
2221// Iterator
2222#[wasm_bindgen]
2223extern "C" {
2224    /// Any object that conforms to the JS iterator protocol. For example,
2225    /// something returned by `myArray[Symbol.iterator]()`.
2226    ///
2227    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
2228    #[derive(Clone, Debug)]
2229    #[wasm_bindgen(is_type_of = Iterator::looks_like_iterator, typescript_type = "Iterator<any>")]
2230    pub type Iterator;
2231
2232    /// The `next()` method always has to return an object with appropriate
2233    /// properties including done and value. If a non-object value gets returned
2234    /// (such as false or undefined), a TypeError ("iterator.next() returned a
2235    /// non-object value") will be thrown.
2236    #[wasm_bindgen(catch, method, structural)]
2237    pub fn next(this: &Iterator) -> Result<IteratorNext, JsValue>;
2238}
2239
2240impl Iterator {
2241    fn looks_like_iterator(it: &JsValue) -> bool {
2242        #[wasm_bindgen]
2243        extern "C" {
2244            type MaybeIterator;
2245
2246            #[wasm_bindgen(method, getter)]
2247            fn next(this: &MaybeIterator) -> JsValue;
2248        }
2249
2250        if !it.is_object() {
2251            return false;
2252        }
2253
2254        let it = it.unchecked_ref::<MaybeIterator>();
2255
2256        it.next().is_function()
2257    }
2258}
2259
2260// Async Iterator
2261#[wasm_bindgen]
2262extern "C" {
2263    /// Any object that conforms to the JS async iterator protocol. For example,
2264    /// something returned by `myObject[Symbol.asyncIterator]()`.
2265    ///
2266    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of)
2267    #[derive(Clone, Debug)]
2268    #[wasm_bindgen(is_type_of = Iterator::looks_like_iterator, typescript_type = "AsyncIterator<any>")]
2269    pub type AsyncIterator;
2270
2271    /// The `next()` method always has to return a Promise which resolves to an object
2272    /// with appropriate properties including done and value. If a non-object value
2273    /// gets returned (such as false or undefined), a TypeError ("iterator.next()
2274    /// returned a non-object value") will be thrown.
2275    #[wasm_bindgen(catch, method, structural)]
2276    pub fn next(this: &AsyncIterator) -> Result<Promise, JsValue>;
2277}
2278
2279/// An iterator over the JS `Symbol.iterator` iteration protocol.
2280///
2281/// Use the `IntoIterator for &js_sys::Iterator` implementation to create this.
2282pub struct Iter<'a> {
2283    js: &'a Iterator,
2284    state: IterState,
2285}
2286
2287/// An iterator over the JS `Symbol.iterator` iteration protocol.
2288///
2289/// Use the `IntoIterator for js_sys::Iterator` implementation to create this.
2290pub struct IntoIter {
2291    js: Iterator,
2292    state: IterState,
2293}
2294
2295struct IterState {
2296    done: bool,
2297}
2298
2299impl<'a> IntoIterator for &'a Iterator {
2300    type Item = Result<JsValue, JsValue>;
2301    type IntoIter = Iter<'a>;
2302
2303    fn into_iter(self) -> Iter<'a> {
2304        Iter {
2305            js: self,
2306            state: IterState::new(),
2307        }
2308    }
2309}
2310
2311impl core::iter::Iterator for Iter<'_> {
2312    type Item = Result<JsValue, JsValue>;
2313
2314    fn next(&mut self) -> Option<Self::Item> {
2315        self.state.next(self.js)
2316    }
2317}
2318
2319impl IntoIterator for Iterator {
2320    type Item = Result<JsValue, JsValue>;
2321    type IntoIter = IntoIter;
2322
2323    fn into_iter(self) -> IntoIter {
2324        IntoIter {
2325            js: self,
2326            state: IterState::new(),
2327        }
2328    }
2329}
2330
2331impl core::iter::Iterator for IntoIter {
2332    type Item = Result<JsValue, JsValue>;
2333
2334    fn next(&mut self) -> Option<Self::Item> {
2335        self.state.next(&self.js)
2336    }
2337}
2338
2339impl IterState {
2340    fn new() -> IterState {
2341        IterState { done: false }
2342    }
2343
2344    fn next(&mut self, js: &Iterator) -> Option<Result<JsValue, JsValue>> {
2345        if self.done {
2346            return None;
2347        }
2348        let next = match js.next() {
2349            Ok(val) => val,
2350            Err(e) => {
2351                self.done = true;
2352                return Some(Err(e));
2353            }
2354        };
2355        if next.done() {
2356            self.done = true;
2357            None
2358        } else {
2359            Some(Ok(next.value()))
2360        }
2361    }
2362}
2363
2364/// Create an iterator over `val` using the JS iteration protocol and
2365/// `Symbol.iterator`.
2366pub fn try_iter(val: &JsValue) -> Result<Option<IntoIter>, JsValue> {
2367    let iter_sym = Symbol::iterator();
2368    let iter_fn = Reflect::get(val, iter_sym.as_ref())?;
2369
2370    let iter_fn: Function = match iter_fn.dyn_into() {
2371        Ok(iter_fn) => iter_fn,
2372        Err(_) => return Ok(None),
2373    };
2374
2375    let it: Iterator = match iter_fn.call0(val)?.dyn_into() {
2376        Ok(it) => it,
2377        Err(_) => return Ok(None),
2378    };
2379
2380    Ok(Some(it.into_iter()))
2381}
2382
2383// IteratorNext
2384#[wasm_bindgen]
2385extern "C" {
2386    /// The result of calling `next()` on a JS iterator.
2387    ///
2388    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
2389    #[wasm_bindgen(extends = Object, typescript_type = "IteratorResult<any>")]
2390    #[derive(Clone, Debug, PartialEq, Eq)]
2391    pub type IteratorNext;
2392
2393    /// Has the value `true` if the iterator is past the end of the iterated
2394    /// sequence. In this case value optionally specifies the return value of
2395    /// the iterator.
2396    ///
2397    /// Has the value `false` if the iterator was able to produce the next value
2398    /// in the sequence. This is equivalent of not specifying the done property
2399    /// altogether.
2400    #[wasm_bindgen(method, getter, structural)]
2401    pub fn done(this: &IteratorNext) -> bool;
2402
2403    /// Any JavaScript value returned by the iterator. Can be omitted when done
2404    /// is true.
2405    #[wasm_bindgen(method, getter, structural)]
2406    pub fn value(this: &IteratorNext) -> JsValue;
2407}
2408
2409#[allow(non_snake_case)]
2410pub mod Math {
2411    use super::*;
2412
2413    // Math
2414    #[wasm_bindgen]
2415    extern "C" {
2416        /// The `Math.abs()` function returns the absolute value of a number, that is
2417        /// Math.abs(x) = |x|
2418        ///
2419        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs)
2420        #[wasm_bindgen(js_namespace = Math)]
2421        pub fn abs(x: f64) -> f64;
2422
2423        /// The `Math.acos()` function returns the arccosine (in radians) of a
2424        /// number, that is ∀x∊[-1;1]
2425        /// Math.acos(x) = arccos(x) = the unique y∊[0;π] such that cos(y)=x
2426        ///
2427        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acos)
2428        #[wasm_bindgen(js_namespace = Math)]
2429        pub fn acos(x: f64) -> f64;
2430
2431        /// The `Math.acosh()` function returns the hyperbolic arc-cosine of a
2432        /// number, that is ∀x ≥ 1
2433        /// Math.acosh(x) = arcosh(x) = the unique y ≥ 0 such that cosh(y) = x
2434        ///
2435        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh)
2436        #[wasm_bindgen(js_namespace = Math)]
2437        pub fn acosh(x: f64) -> f64;
2438
2439        /// The `Math.asin()` function returns the arcsine (in radians) of a
2440        /// number, that is ∀x ∊ [-1;1]
2441        /// Math.asin(x) = arcsin(x) = the unique y∊[-π2;π2] such that sin(y) = x
2442        ///
2443        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asin)
2444        #[wasm_bindgen(js_namespace = Math)]
2445        pub fn asin(x: f64) -> f64;
2446
2447        /// The `Math.asinh()` function returns the hyperbolic arcsine of a
2448        /// number, that is Math.asinh(x) = arsinh(x) = the unique y such that sinh(y) = x
2449        ///
2450        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh)
2451        #[wasm_bindgen(js_namespace = Math)]
2452        pub fn asinh(x: f64) -> f64;
2453
2454        /// The `Math.atan()` function returns the arctangent (in radians) of a
2455        /// number, that is Math.atan(x) = arctan(x) = the unique y ∊ [-π2;π2]such that
2456        /// tan(y) = x
2457        #[wasm_bindgen(js_namespace = Math)]
2458        pub fn atan(x: f64) -> f64;
2459
2460        /// The `Math.atan2()` function returns the arctangent of the quotient of
2461        /// its arguments.
2462        ///
2463        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2)
2464        #[wasm_bindgen(js_namespace = Math)]
2465        pub fn atan2(y: f64, x: f64) -> f64;
2466
2467        /// The `Math.atanh()` function returns the hyperbolic arctangent of a number,
2468        /// that is ∀x ∊ (-1,1), Math.atanh(x) = arctanh(x) = the unique y such that
2469        /// tanh(y) = x
2470        ///
2471        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh)
2472        #[wasm_bindgen(js_namespace = Math)]
2473        pub fn atanh(x: f64) -> f64;
2474
2475        /// The `Math.cbrt() `function returns the cube root of a number, that is
2476        /// Math.cbrt(x) = ∛x = the unique y such that y^3 = x
2477        ///
2478        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cbrt)
2479        #[wasm_bindgen(js_namespace = Math)]
2480        pub fn cbrt(x: f64) -> f64;
2481
2482        /// The `Math.ceil()` function returns the smallest integer greater than
2483        /// or equal to a given number.
2484        ///
2485        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil)
2486        #[wasm_bindgen(js_namespace = Math)]
2487        pub fn ceil(x: f64) -> f64;
2488
2489        /// The `Math.clz32()` function returns the number of leading zero bits in
2490        /// the 32-bit binary representation of a number.
2491        ///
2492        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32)
2493        #[wasm_bindgen(js_namespace = Math)]
2494        pub fn clz32(x: i32) -> u32;
2495
2496        /// The `Math.cos()` static function returns the cosine of the specified angle,
2497        /// which must be specified in radians. This value is length(adjacent)/length(hypotenuse).
2498        ///
2499        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos)
2500        #[wasm_bindgen(js_namespace = Math)]
2501        pub fn cos(x: f64) -> f64;
2502
2503        /// The `Math.cosh()` function returns the hyperbolic cosine of a number,
2504        /// that can be expressed using the constant e.
2505        ///
2506        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh)
2507        #[wasm_bindgen(js_namespace = Math)]
2508        pub fn cosh(x: f64) -> f64;
2509
2510        /// The `Math.exp()` function returns e^x, where x is the argument, and e is Euler's number
2511        /// (also known as Napier's constant), the base of the natural logarithms.
2512        ///
2513        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/exp)
2514        #[wasm_bindgen(js_namespace = Math)]
2515        pub fn exp(x: f64) -> f64;
2516
2517        /// The `Math.expm1()` function returns e^x - 1, where x is the argument, and e the base of the
2518        /// natural logarithms.
2519        ///
2520        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/expm1)
2521        #[wasm_bindgen(js_namespace = Math)]
2522        pub fn expm1(x: f64) -> f64;
2523
2524        /// The `Math.floor()` function returns the largest integer less than or
2525        /// equal to a given number.
2526        ///
2527        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor)
2528        #[wasm_bindgen(js_namespace = Math)]
2529        pub fn floor(x: f64) -> f64;
2530
2531        /// The `Math.fround()` function returns the nearest 32-bit single precision float representation
2532        /// of a Number.
2533        ///
2534        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround)
2535        #[wasm_bindgen(js_namespace = Math)]
2536        pub fn fround(x: f64) -> f32;
2537
2538        /// The `Math.hypot()` function returns the square root of the sum of squares of its arguments.
2539        ///
2540        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot)
2541        #[wasm_bindgen(js_namespace = Math)]
2542        pub fn hypot(x: f64, y: f64) -> f64;
2543
2544        /// The `Math.imul()` function returns the result of the C-like 32-bit multiplication of the
2545        /// two parameters.
2546        ///
2547        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul)
2548        #[wasm_bindgen(js_namespace = Math)]
2549        pub fn imul(x: i32, y: i32) -> i32;
2550
2551        /// The `Math.log()` function returns the natural logarithm (base e) of a number.
2552        /// The JavaScript `Math.log()` function is equivalent to ln(x) in mathematics.
2553        ///
2554        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log)
2555        #[wasm_bindgen(js_namespace = Math)]
2556        pub fn log(x: f64) -> f64;
2557
2558        /// The `Math.log10()` function returns the base 10 logarithm of a number.
2559        ///
2560        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10)
2561        #[wasm_bindgen(js_namespace = Math)]
2562        pub fn log10(x: f64) -> f64;
2563
2564        /// The `Math.log1p()` function returns the natural logarithm (base e) of 1 + a number.
2565        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log1p)
2566        #[wasm_bindgen(js_namespace = Math)]
2567        pub fn log1p(x: f64) -> f64;
2568
2569        /// The `Math.log2()` function returns the base 2 logarithm of a number.
2570        ///
2571        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log2)
2572        #[wasm_bindgen(js_namespace = Math)]
2573        pub fn log2(x: f64) -> f64;
2574
2575        /// The `Math.max()` function returns the largest of two numbers.
2576        ///
2577        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max)
2578        #[wasm_bindgen(js_namespace = Math)]
2579        pub fn max(x: f64, y: f64) -> f64;
2580
2581        /// The static function `Math.min()` returns the lowest-valued number passed into it.
2582        ///
2583        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min)
2584        #[wasm_bindgen(js_namespace = Math)]
2585        pub fn min(x: f64, y: f64) -> f64;
2586
2587        /// The `Math.pow()` function returns the base to the exponent power, that is, base^exponent.
2588        ///
2589        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow)
2590        #[wasm_bindgen(js_namespace = Math)]
2591        pub fn pow(base: f64, exponent: f64) -> f64;
2592
2593        /// The `Math.random()` function returns a floating-point, pseudo-random number
2594        /// in the range 0–1 (inclusive of 0, but not 1) with approximately uniform distribution
2595        /// over that range — which you can then scale to your desired range.
2596        /// The implementation selects the initial seed to the random number generation algorithm;
2597        /// it cannot be chosen or reset by the user.
2598        ///
2599        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)
2600        #[wasm_bindgen(js_namespace = Math)]
2601        pub fn random() -> f64;
2602
2603        /// The `Math.round()` function returns the value of a number rounded to the nearest integer.
2604        ///
2605        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round)
2606        #[wasm_bindgen(js_namespace = Math)]
2607        pub fn round(x: f64) -> f64;
2608
2609        /// The `Math.sign()` function returns the sign of a number, indicating whether the number is
2610        /// positive, negative or zero.
2611        ///
2612        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign)
2613        #[wasm_bindgen(js_namespace = Math)]
2614        pub fn sign(x: f64) -> f64;
2615
2616        /// The `Math.sin()` function returns the sine of a number.
2617        ///
2618        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin)
2619        #[wasm_bindgen(js_namespace = Math)]
2620        pub fn sin(x: f64) -> f64;
2621
2622        /// The `Math.sinh()` function returns the hyperbolic sine of a number, that can be expressed
2623        /// using the constant e: Math.sinh(x) = (e^x - e^-x)/2
2624        ///
2625        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh)
2626        #[wasm_bindgen(js_namespace = Math)]
2627        pub fn sinh(x: f64) -> f64;
2628
2629        /// The `Math.sqrt()` function returns the square root of a number, that is
2630        /// ∀x ≥ 0, Math.sqrt(x) = √x = the unique y ≥ 0 such that y^2 = x
2631        ///
2632        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt)
2633        #[wasm_bindgen(js_namespace = Math)]
2634        pub fn sqrt(x: f64) -> f64;
2635
2636        /// The `Math.tan()` function returns the tangent of a number.
2637        ///
2638        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan)
2639        #[wasm_bindgen(js_namespace = Math)]
2640        pub fn tan(x: f64) -> f64;
2641
2642        /// The `Math.tanh()` function returns the hyperbolic tangent of a number, that is
2643        /// tanh x = sinh x / cosh x = (e^x - e^-x)/(e^x + e^-x) = (e^2x - 1)/(e^2x + 1)
2644        ///
2645        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh)
2646        #[wasm_bindgen(js_namespace = Math)]
2647        pub fn tanh(x: f64) -> f64;
2648
2649        /// The `Math.trunc()` function returns the integer part of a number by removing any fractional
2650        /// digits.
2651        ///
2652        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc)
2653        #[wasm_bindgen(js_namespace = Math)]
2654        pub fn trunc(x: f64) -> f64;
2655    }
2656}
2657
2658// Number.
2659#[wasm_bindgen]
2660extern "C" {
2661    #[wasm_bindgen(extends = Object, is_type_of = |v| v.as_f64().is_some(), typescript_type = "number")]
2662    #[derive(Clone, PartialEq)]
2663    pub type Number;
2664
2665    /// The `Number.isFinite()` method determines whether the passed value is a finite number.
2666    ///
2667    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite)
2668    #[wasm_bindgen(static_method_of = Number, js_name = isFinite)]
2669    pub fn is_finite(value: &JsValue) -> bool;
2670
2671    /// The `Number.isInteger()` method determines whether the passed value is an integer.
2672    ///
2673    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger)
2674    #[wasm_bindgen(static_method_of = Number, js_name = isInteger)]
2675    pub fn is_integer(value: &JsValue) -> bool;
2676
2677    /// The `Number.isNaN()` method determines whether the passed value is `NaN` and its type is Number.
2678    /// It is a more robust version of the original, global isNaN().
2679    ///
2680    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN)
2681    #[wasm_bindgen(static_method_of = Number, js_name = isNaN)]
2682    pub fn is_nan(value: &JsValue) -> bool;
2683
2684    /// The `Number.isSafeInteger()` method determines whether the provided value is a number
2685    /// that is a safe integer.
2686    ///
2687    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger)
2688    #[wasm_bindgen(static_method_of = Number, js_name = isSafeInteger)]
2689    pub fn is_safe_integer(value: &JsValue) -> bool;
2690
2691    /// The `Number` JavaScript object is a wrapper object allowing
2692    /// you to work with numerical values. A `Number` object is
2693    /// created using the `Number()` constructor.
2694    ///
2695    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)
2696    #[wasm_bindgen(constructor)]
2697    #[deprecated(note = "recommended to use `Number::from` instead")]
2698    #[allow(deprecated)]
2699    pub fn new(value: &JsValue) -> Number;
2700
2701    #[wasm_bindgen(constructor)]
2702    fn new_from_str(value: &str) -> Number;
2703
2704    /// The `Number.parseInt()` method parses a string argument and returns an
2705    /// integer of the specified radix or base.
2706    ///
2707    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt)
2708    #[wasm_bindgen(static_method_of = Number, js_name = parseInt)]
2709    pub fn parse_int(text: &str, radix: u8) -> f64;
2710
2711    /// The `Number.parseFloat()` method parses a string argument and returns a
2712    /// floating point number.
2713    ///
2714    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat)
2715    #[wasm_bindgen(static_method_of = Number, js_name = parseFloat)]
2716    pub fn parse_float(text: &str) -> f64;
2717
2718    /// The `toLocaleString()` method returns a string with a language sensitive
2719    /// representation of this number.
2720    ///
2721    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)
2722    #[wasm_bindgen(method, js_name = toLocaleString)]
2723    pub fn to_locale_string(this: &Number, locale: &str) -> JsString;
2724
2725    /// The `toPrecision()` method returns a string representing the Number
2726    /// object to the specified precision.
2727    ///
2728    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision)
2729    #[wasm_bindgen(catch, method, js_name = toPrecision)]
2730    pub fn to_precision(this: &Number, precision: u8) -> Result<JsString, JsValue>;
2731
2732    /// The `toFixed()` method returns a string representing the Number
2733    /// object using fixed-point notation.
2734    ///
2735    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed)
2736    #[wasm_bindgen(catch, method, js_name = toFixed)]
2737    pub fn to_fixed(this: &Number, digits: u8) -> Result<JsString, JsValue>;
2738
2739    /// The `toExponential()` method returns a string representing the Number
2740    /// object in exponential notation.
2741    ///
2742    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toExponential)
2743    #[wasm_bindgen(catch, method, js_name = toExponential)]
2744    pub fn to_exponential(this: &Number, fraction_digits: u8) -> Result<JsString, JsValue>;
2745
2746    /// The `toString()` method returns a string representing the
2747    /// specified Number object.
2748    ///
2749    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)
2750    #[wasm_bindgen(catch, method, js_name = toString)]
2751    pub fn to_string(this: &Number, radix: u8) -> Result<JsString, JsValue>;
2752
2753    /// The `valueOf()` method returns the wrapped primitive value of
2754    /// a Number object.
2755    ///
2756    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/valueOf)
2757    #[wasm_bindgen(method, js_name = valueOf)]
2758    pub fn value_of(this: &Number) -> f64;
2759}
2760
2761impl Number {
2762    /// The smallest interval between two representable numbers.
2763    ///
2764    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON)
2765    pub const EPSILON: f64 = f64::EPSILON;
2766    /// The maximum safe integer in JavaScript (2^53 - 1).
2767    ///
2768    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)
2769    pub const MAX_SAFE_INTEGER: f64 = 9007199254740991.0;
2770    /// The largest positive representable number.
2771    ///
2772    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE)
2773    pub const MAX_VALUE: f64 = f64::MAX;
2774    /// The minimum safe integer in JavaScript (-(2^53 - 1)).
2775    ///
2776    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER)
2777    pub const MIN_SAFE_INTEGER: f64 = -9007199254740991.0;
2778    /// The smallest positive representable number—that is, the positive number closest to zero
2779    /// (without actually being zero).
2780    ///
2781    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE)
2782    // Cannot use f64::MIN_POSITIVE since that is the smallest **normal** positive number.
2783    pub const MIN_VALUE: f64 = 5E-324;
2784    /// Special "Not a Number" value.
2785    ///
2786    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/NaN)
2787    pub const NAN: f64 = f64::NAN;
2788    /// Special value representing negative infinity. Returned on overflow.
2789    ///
2790    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY)
2791    pub const NEGATIVE_INFINITY: f64 = f64::NEG_INFINITY;
2792    /// Special value representing infinity. Returned on overflow.
2793    ///
2794    /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY)
2795    pub const POSITIVE_INFINITY: f64 = f64::INFINITY;
2796
2797    /// Applies the binary `**` JS operator on the two `Number`s.
2798    ///
2799    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation)
2800    #[inline]
2801    pub fn pow(&self, rhs: &Self) -> Self {
2802        JsValue::as_ref(self)
2803            .pow(JsValue::as_ref(rhs))
2804            .unchecked_into()
2805    }
2806
2807    /// Applies the binary `>>>` JS operator on the two `Number`s.
2808    ///
2809    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift)
2810    #[inline]
2811    pub fn unsigned_shr(&self, rhs: &Self) -> Self {
2812        Number::from(JsValue::as_ref(self).unsigned_shr(JsValue::as_ref(rhs)))
2813    }
2814}
2815
2816macro_rules! number_from {
2817    ($($x:ident)*) => ($(
2818        impl From<$x> for Number {
2819            #[inline]
2820            fn from(x: $x) -> Number {
2821                Number::unchecked_from_js(JsValue::from(x))
2822            }
2823        }
2824
2825        impl PartialEq<$x> for Number {
2826            #[inline]
2827            fn eq(&self, other: &$x) -> bool {
2828                self.value_of() == f64::from(*other)
2829            }
2830        }
2831    )*)
2832}
2833number_from!(i8 u8 i16 u16 i32 u32 f32 f64);
2834
2835/// The error type returned when a checked integral type conversion fails.
2836#[derive(Debug, Copy, Clone, PartialEq, Eq)]
2837pub struct TryFromIntError(());
2838
2839impl fmt::Display for TryFromIntError {
2840    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2841        fmt.write_str("out of range integral type conversion attempted")
2842    }
2843}
2844
2845#[cfg(feature = "std")]
2846impl std::error::Error for TryFromIntError {}
2847
2848macro_rules! number_try_from {
2849    ($($x:ident)*) => ($(
2850        impl TryFrom<$x> for Number {
2851            type Error = TryFromIntError;
2852
2853            #[inline]
2854            fn try_from(x: $x) -> Result<Number, Self::Error> {
2855                let x_f64 = x as f64;
2856                if (Number::MIN_SAFE_INTEGER..=Number::MAX_SAFE_INTEGER).contains(&x_f64) {
2857                    Ok(Number::from(x_f64))
2858                } else {
2859                    Err(TryFromIntError(()))
2860                }
2861            }
2862        }
2863    )*)
2864}
2865number_try_from!(i64 u64 i128 u128);
2866
2867// TODO: add this on the next major version, when blanket impl is removed
2868/*
2869impl convert::TryFrom<JsValue> for Number {
2870    type Error = Error;
2871
2872    fn try_from(value: JsValue) -> Result<Self, Self::Error> {
2873        return match f64::try_from(value) {
2874            Ok(num) => Ok(Number::from(num)),
2875            Err(jsval) => Err(jsval.unchecked_into())
2876        }
2877    }
2878}
2879*/
2880
2881impl From<&Number> for f64 {
2882    #[inline]
2883    fn from(n: &Number) -> f64 {
2884        n.value_of()
2885    }
2886}
2887
2888impl From<Number> for f64 {
2889    #[inline]
2890    fn from(n: Number) -> f64 {
2891        <f64 as From<&'_ Number>>::from(&n)
2892    }
2893}
2894
2895impl fmt::Debug for Number {
2896    #[inline]
2897    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2898        fmt::Debug::fmt(&self.value_of(), f)
2899    }
2900}
2901
2902impl fmt::Display for Number {
2903    #[inline]
2904    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2905        fmt::Display::fmt(&self.value_of(), f)
2906    }
2907}
2908
2909impl Default for Number {
2910    fn default() -> Self {
2911        Self::from(f64::default())
2912    }
2913}
2914
2915impl PartialEq<BigInt> for Number {
2916    #[inline]
2917    fn eq(&self, other: &BigInt) -> bool {
2918        JsValue::as_ref(self).loose_eq(JsValue::as_ref(other))
2919    }
2920}
2921
2922impl Not for &Number {
2923    type Output = BigInt;
2924
2925    #[inline]
2926    fn not(self) -> Self::Output {
2927        JsValue::as_ref(self).bit_not().unchecked_into()
2928    }
2929}
2930
2931forward_deref_unop!(impl Not, not for Number);
2932forward_js_unop!(impl Neg, neg for Number);
2933forward_js_binop!(impl BitAnd, bitand for Number);
2934forward_js_binop!(impl BitOr, bitor for Number);
2935forward_js_binop!(impl BitXor, bitxor for Number);
2936forward_js_binop!(impl Shl, shl for Number);
2937forward_js_binop!(impl Shr, shr for Number);
2938forward_js_binop!(impl Add, add for Number);
2939forward_js_binop!(impl Sub, sub for Number);
2940forward_js_binop!(impl Div, div for Number);
2941forward_js_binop!(impl Mul, mul for Number);
2942forward_js_binop!(impl Rem, rem for Number);
2943
2944sum_product!(Number);
2945
2946impl PartialOrd for Number {
2947    #[inline]
2948    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
2949        if Number::is_nan(self) || Number::is_nan(other) {
2950            None
2951        } else if self == other {
2952            Some(Ordering::Equal)
2953        } else if self.lt(other) {
2954            Some(Ordering::Less)
2955        } else {
2956            Some(Ordering::Greater)
2957        }
2958    }
2959
2960    #[inline]
2961    fn lt(&self, other: &Self) -> bool {
2962        JsValue::as_ref(self).lt(JsValue::as_ref(other))
2963    }
2964
2965    #[inline]
2966    fn le(&self, other: &Self) -> bool {
2967        JsValue::as_ref(self).le(JsValue::as_ref(other))
2968    }
2969
2970    #[inline]
2971    fn ge(&self, other: &Self) -> bool {
2972        JsValue::as_ref(self).ge(JsValue::as_ref(other))
2973    }
2974
2975    #[inline]
2976    fn gt(&self, other: &Self) -> bool {
2977        JsValue::as_ref(self).gt(JsValue::as_ref(other))
2978    }
2979}
2980
2981impl FromStr for Number {
2982    type Err = Infallible;
2983
2984    #[allow(deprecated)]
2985    #[inline]
2986    fn from_str(s: &str) -> Result<Self, Self::Err> {
2987        Ok(Number::new_from_str(s))
2988    }
2989}
2990
2991// Date.
2992#[wasm_bindgen]
2993extern "C" {
2994    #[wasm_bindgen(extends = Object, typescript_type = "Date")]
2995    #[derive(Clone, Debug, PartialEq, Eq)]
2996    pub type Date;
2997
2998    /// The `getDate()` method returns the day of the month for the
2999    /// specified date according to local time.
3000    ///
3001    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDate)
3002    #[wasm_bindgen(method, js_name = getDate)]
3003    pub fn get_date(this: &Date) -> u32;
3004
3005    /// The `getDay()` method returns the day of the week for the specified date according to local time,
3006    /// where 0 represents Sunday. For the day of the month see getDate().
3007    ///
3008    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay)
3009    #[wasm_bindgen(method, js_name = getDay)]
3010    pub fn get_day(this: &Date) -> u32;
3011
3012    /// The `getFullYear()` method returns the year of the specified date according to local time.
3013    ///
3014    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear)
3015    #[wasm_bindgen(method, js_name = getFullYear)]
3016    pub fn get_full_year(this: &Date) -> u32;
3017
3018    /// The `getHours()` method returns the hour for the specified date, according to local time.
3019    ///
3020    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours)
3021    #[wasm_bindgen(method, js_name = getHours)]
3022    pub fn get_hours(this: &Date) -> u32;
3023
3024    /// The `getMilliseconds()` method returns the milliseconds in the specified date according to local time.
3025    ///
3026    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds)
3027    #[wasm_bindgen(method, js_name = getMilliseconds)]
3028    pub fn get_milliseconds(this: &Date) -> u32;
3029
3030    /// The `getMinutes()` method returns the minutes in the specified date according to local time.
3031    ///
3032    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMinutes)
3033    #[wasm_bindgen(method, js_name = getMinutes)]
3034    pub fn get_minutes(this: &Date) -> u32;
3035
3036    /// The `getMonth()` method returns the month in the specified date according to local time,
3037    /// as a zero-based value (where zero indicates the first month of the year).
3038    ///
3039    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth)
3040    #[wasm_bindgen(method, js_name = getMonth)]
3041    pub fn get_month(this: &Date) -> u32;
3042
3043    /// The `getSeconds()` method returns the seconds in the specified date according to local time.
3044    ///
3045    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getSeconds)
3046    #[wasm_bindgen(method, js_name = getSeconds)]
3047    pub fn get_seconds(this: &Date) -> u32;
3048
3049    /// The `getTime()` method returns the numeric value corresponding to the time for the specified date
3050    /// according to universal time.
3051    ///
3052    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime)
3053    #[wasm_bindgen(method, js_name = getTime)]
3054    pub fn get_time(this: &Date) -> f64;
3055
3056    /// The `getTimezoneOffset()` method returns the time zone difference, in minutes,
3057    /// from current locale (host system settings) to UTC.
3058    ///
3059    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)
3060    #[wasm_bindgen(method, js_name = getTimezoneOffset)]
3061    pub fn get_timezone_offset(this: &Date) -> f64;
3062
3063    /// The `getUTCDate()` method returns the day (date) of the month in the specified date
3064    /// according to universal time.
3065    ///
3066    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate)
3067    #[wasm_bindgen(method, js_name = getUTCDate)]
3068    pub fn get_utc_date(this: &Date) -> u32;
3069
3070    /// The `getUTCDay()` method returns the day of the week in the specified date according to universal time,
3071    /// where 0 represents Sunday.
3072    ///
3073    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDay)
3074    #[wasm_bindgen(method, js_name = getUTCDay)]
3075    pub fn get_utc_day(this: &Date) -> u32;
3076
3077    /// The `getUTCFullYear()` method returns the year in the specified date according to universal time.
3078    ///
3079    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCFullYear)
3080    #[wasm_bindgen(method, js_name = getUTCFullYear)]
3081    pub fn get_utc_full_year(this: &Date) -> u32;
3082
3083    /// The `getUTCHours()` method returns the hours in the specified date according to universal time.
3084    ///
3085    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours)
3086    #[wasm_bindgen(method, js_name = getUTCHours)]
3087    pub fn get_utc_hours(this: &Date) -> u32;
3088
3089    /// The `getUTCMilliseconds()` method returns the milliseconds in the specified date
3090    /// according to universal time.
3091    ///
3092    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds)
3093    #[wasm_bindgen(method, js_name = getUTCMilliseconds)]
3094    pub fn get_utc_milliseconds(this: &Date) -> u32;
3095
3096    /// The `getUTCMinutes()` method returns the minutes in the specified date according to universal time.
3097    ///
3098    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMinutes)
3099    #[wasm_bindgen(method, js_name = getUTCMinutes)]
3100    pub fn get_utc_minutes(this: &Date) -> u32;
3101
3102    /// The `getUTCMonth()` returns the month of the specified date according to universal time,
3103    /// as a zero-based value (where zero indicates the first month of the year).
3104    ///
3105    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMonth)
3106    #[wasm_bindgen(method, js_name = getUTCMonth)]
3107    pub fn get_utc_month(this: &Date) -> u32;
3108
3109    /// The `getUTCSeconds()` method returns the seconds in the specified date according to universal time.
3110    ///
3111    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCSeconds)
3112    #[wasm_bindgen(method, js_name = getUTCSeconds)]
3113    pub fn get_utc_seconds(this: &Date) -> u32;
3114
3115    /// Creates a JavaScript `Date` instance that represents
3116    /// a single moment in time. `Date` objects are based on a time value that is
3117    /// the number of milliseconds since 1 January 1970 UTC.
3118    ///
3119    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3120    #[wasm_bindgen(constructor)]
3121    pub fn new(init: &JsValue) -> Date;
3122
3123    /// Creates a JavaScript `Date` instance that represents the current moment in
3124    /// time.
3125    ///
3126    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3127    #[wasm_bindgen(constructor)]
3128    pub fn new_0() -> Date;
3129
3130    /// Creates a JavaScript `Date` instance that represents
3131    /// a single moment in time. `Date` objects are based on a time value that is
3132    /// the number of milliseconds since 1 January 1970 UTC.
3133    ///
3134    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3135    #[wasm_bindgen(constructor)]
3136    pub fn new_with_year_month(year: u32, month: i32) -> Date;
3137
3138    /// Creates a JavaScript `Date` instance that represents
3139    /// a single moment in time. `Date` objects are based on a time value that is
3140    /// the number of milliseconds since 1 January 1970 UTC.
3141    ///
3142    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3143    #[wasm_bindgen(constructor)]
3144    pub fn new_with_year_month_day(year: u32, month: i32, day: i32) -> Date;
3145
3146    /// Creates a JavaScript `Date` instance that represents
3147    /// a single moment in time. `Date` objects are based on a time value that is
3148    /// the number of milliseconds since 1 January 1970 UTC.
3149    ///
3150    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3151    #[wasm_bindgen(constructor)]
3152    pub fn new_with_year_month_day_hr(year: u32, month: i32, day: i32, hr: i32) -> Date;
3153
3154    /// Creates a JavaScript `Date` instance that represents
3155    /// a single moment in time. `Date` objects are based on a time value that is
3156    /// the number of milliseconds since 1 January 1970 UTC.
3157    ///
3158    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3159    #[wasm_bindgen(constructor)]
3160    pub fn new_with_year_month_day_hr_min(
3161        year: u32,
3162        month: i32,
3163        day: i32,
3164        hr: i32,
3165        min: i32,
3166    ) -> Date;
3167
3168    /// Creates a JavaScript `Date` instance that represents
3169    /// a single moment in time. `Date` objects are based on a time value that is
3170    /// the number of milliseconds since 1 January 1970 UTC.
3171    ///
3172    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3173    #[wasm_bindgen(constructor)]
3174    pub fn new_with_year_month_day_hr_min_sec(
3175        year: u32,
3176        month: i32,
3177        day: i32,
3178        hr: i32,
3179        min: i32,
3180        sec: i32,
3181    ) -> Date;
3182
3183    /// Creates a JavaScript `Date` instance that represents
3184    /// a single moment in time. `Date` objects are based on a time value that is
3185    /// the number of milliseconds since 1 January 1970 UTC.
3186    ///
3187    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
3188    #[wasm_bindgen(constructor)]
3189    pub fn new_with_year_month_day_hr_min_sec_milli(
3190        year: u32,
3191        month: i32,
3192        day: i32,
3193        hr: i32,
3194        min: i32,
3195        sec: i32,
3196        milli: i32,
3197    ) -> Date;
3198
3199    /// The `Date.now()` method returns the number of milliseconds
3200    /// elapsed since January 1, 1970 00:00:00 UTC.
3201    ///
3202    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now)
3203    #[wasm_bindgen(static_method_of = Date)]
3204    pub fn now() -> f64;
3205
3206    /// The `Date.parse()` method parses a string representation of a date, and returns the number of milliseconds
3207    /// since January 1, 1970, 00:00:00 UTC or `NaN` if the string is unrecognized or, in some cases,
3208    /// contains illegal date values (e.g. 2015-02-31).
3209    ///
3210    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
3211    #[wasm_bindgen(static_method_of = Date)]
3212    pub fn parse(date: &str) -> f64;
3213
3214    /// The `setDate()` method sets the day of the Date object relative to the beginning of the currently set month.
3215    ///
3216    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate)
3217    #[wasm_bindgen(method, js_name = setDate)]
3218    pub fn set_date(this: &Date, day: u32) -> f64;
3219
3220    /// The `setFullYear()` method sets the full year for a specified date according to local time.
3221    /// Returns new timestamp.
3222    ///
3223    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
3224    #[wasm_bindgen(method, js_name = setFullYear)]
3225    pub fn set_full_year(this: &Date, year: u32) -> f64;
3226
3227    /// The `setFullYear()` method sets the full year for a specified date according to local time.
3228    /// Returns new timestamp.
3229    ///
3230    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
3231    #[wasm_bindgen(method, js_name = setFullYear)]
3232    pub fn set_full_year_with_month(this: &Date, year: u32, month: i32) -> f64;
3233
3234    /// The `setFullYear()` method sets the full year for a specified date according to local time.
3235    /// Returns new timestamp.
3236    ///
3237    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
3238    #[wasm_bindgen(method, js_name = setFullYear)]
3239    pub fn set_full_year_with_month_date(this: &Date, year: u32, month: i32, date: i32) -> f64;
3240
3241    /// The `setHours()` method sets the hours for a specified date according to local time,
3242    /// and returns the number of milliseconds since January 1, 1970 00:00:00 UTC until the time represented
3243    /// by the updated Date instance.
3244    ///
3245    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours)
3246    #[wasm_bindgen(method, js_name = setHours)]
3247    pub fn set_hours(this: &Date, hours: u32) -> f64;
3248
3249    /// The `setMilliseconds()` method sets the milliseconds for a specified date according to local time.
3250    ///
3251    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMilliseconds)
3252    #[wasm_bindgen(method, js_name = setMilliseconds)]
3253    pub fn set_milliseconds(this: &Date, milliseconds: u32) -> f64;
3254
3255    /// The `setMinutes()` method sets the minutes for a specified date according to local time.
3256    ///
3257    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMinutes)
3258    #[wasm_bindgen(method, js_name = setMinutes)]
3259    pub fn set_minutes(this: &Date, minutes: u32) -> f64;
3260
3261    /// The `setMonth()` method sets the month for a specified date according to the currently set year.
3262    ///
3263    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth)
3264    #[wasm_bindgen(method, js_name = setMonth)]
3265    pub fn set_month(this: &Date, month: u32) -> f64;
3266
3267    /// The `setSeconds()` method sets the seconds for a specified date according to local time.
3268    ///
3269    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setSeconds)
3270    #[wasm_bindgen(method, js_name = setSeconds)]
3271    pub fn set_seconds(this: &Date, seconds: u32) -> f64;
3272
3273    /// The `setTime()` method sets the Date object to the time represented by a number of milliseconds
3274    /// since January 1, 1970, 00:00:00 UTC.
3275    ///
3276    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setTime)
3277    #[wasm_bindgen(method, js_name = setTime)]
3278    pub fn set_time(this: &Date, time: f64) -> f64;
3279
3280    /// The `setUTCDate()` method sets the day of the month for a specified date
3281    /// according to universal time.
3282    ///
3283    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCDate)
3284    #[wasm_bindgen(method, js_name = setUTCDate)]
3285    pub fn set_utc_date(this: &Date, day: u32) -> f64;
3286
3287    /// The `setUTCFullYear()` method sets the full year for a specified date according to universal time.
3288    ///
3289    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
3290    #[wasm_bindgen(method, js_name = setUTCFullYear)]
3291    pub fn set_utc_full_year(this: &Date, year: u32) -> f64;
3292
3293    /// The `setUTCFullYear()` method sets the full year for a specified date according to universal time.
3294    ///
3295    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
3296    #[wasm_bindgen(method, js_name = setUTCFullYear)]
3297    pub fn set_utc_full_year_with_month(this: &Date, year: u32, month: i32) -> f64;
3298
3299    /// The `setUTCFullYear()` method sets the full year for a specified date according to universal time.
3300    ///
3301    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
3302    #[wasm_bindgen(method, js_name = setUTCFullYear)]
3303    pub fn set_utc_full_year_with_month_date(this: &Date, year: u32, month: i32, date: i32) -> f64;
3304
3305    /// The `setUTCHours()` method sets the hour for a specified date according to universal time,
3306    /// and returns the number of milliseconds since  January 1, 1970 00:00:00 UTC until the time
3307    /// represented by the updated Date instance.
3308    ///
3309    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours)
3310    #[wasm_bindgen(method, js_name = setUTCHours)]
3311    pub fn set_utc_hours(this: &Date, hours: u32) -> f64;
3312
3313    /// The `setUTCMilliseconds()` method sets the milliseconds for a specified date
3314    /// according to universal time.
3315    ///
3316    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds)
3317    #[wasm_bindgen(method, js_name = setUTCMilliseconds)]
3318    pub fn set_utc_milliseconds(this: &Date, milliseconds: u32) -> f64;
3319
3320    /// The `setUTCMinutes()` method sets the minutes for a specified date according to universal time.
3321    ///
3322    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMinutes)
3323    #[wasm_bindgen(method, js_name = setUTCMinutes)]
3324    pub fn set_utc_minutes(this: &Date, minutes: u32) -> f64;
3325
3326    /// The `setUTCMonth()` method sets the month for a specified date according to universal time.
3327    ///
3328    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth)
3329    #[wasm_bindgen(method, js_name = setUTCMonth)]
3330    pub fn set_utc_month(this: &Date, month: u32) -> f64;
3331
3332    /// The `setUTCSeconds()` method sets the seconds for a specified date according to universal time.
3333    ///
3334    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds)
3335    #[wasm_bindgen(method, js_name = setUTCSeconds)]
3336    pub fn set_utc_seconds(this: &Date, seconds: u32) -> f64;
3337
3338    /// The `toDateString()` method returns the date portion of a Date object
3339    /// in human readable form in American English.
3340    ///
3341    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toDateString)
3342    #[wasm_bindgen(method, js_name = toDateString)]
3343    pub fn to_date_string(this: &Date) -> JsString;
3344
3345    /// The `toISOString()` method returns a string in simplified extended ISO format (ISO
3346    /// 8601), which is always 24 or 27 characters long (YYYY-MM-DDTHH:mm:ss.sssZ or
3347    /// ±YYYYYY-MM-DDTHH:mm:ss.sssZ, respectively). The timezone is always zero UTC offset,
3348    /// as denoted by the suffix "Z"
3349    ///
3350    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
3351    #[wasm_bindgen(method, js_name = toISOString)]
3352    pub fn to_iso_string(this: &Date) -> JsString;
3353
3354    /// The `toJSON()` method returns a string representation of the Date object.
3355    ///
3356    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON)
3357    #[wasm_bindgen(method, js_name = toJSON)]
3358    pub fn to_json(this: &Date) -> JsString;
3359
3360    /// The `toLocaleDateString()` method returns a string with a language sensitive
3361    /// representation of the date portion of this date. The new locales and options
3362    /// arguments let applications specify the language whose formatting conventions
3363    /// should be used and allow to customize the behavior of the function.
3364    /// In older implementations, which ignore the locales and options arguments,
3365    /// the locale used and the form of the string
3366    /// returned are entirely implementation dependent.
3367    ///
3368    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString)
3369    #[wasm_bindgen(method, js_name = toLocaleDateString)]
3370    pub fn to_locale_date_string(this: &Date, locale: &str, options: &JsValue) -> JsString;
3371
3372    /// The `toLocaleString()` method returns a string with a language sensitive
3373    /// representation of this date. The new locales and options arguments
3374    /// let applications specify the language whose formatting conventions
3375    /// should be used and customize the behavior of the function.
3376    /// In older implementations, which ignore the locales
3377    /// and options arguments, the locale used and the form of the string
3378    /// returned are entirely implementation dependent.
3379    ///
3380    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString)
3381    #[wasm_bindgen(method, js_name = toLocaleString)]
3382    pub fn to_locale_string(this: &Date, locale: &str, options: &JsValue) -> JsString;
3383
3384    /// The `toLocaleTimeString()` method returns a string with a language sensitive
3385    /// representation of the time portion of this date. The new locales and options
3386    /// arguments let applications specify the language whose formatting conventions should be
3387    /// used and customize the behavior of the function. In older implementations, which ignore
3388    /// the locales and options arguments, the locale used and the form of the string
3389    /// returned are entirely implementation dependent.
3390    ///
3391    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString)
3392    #[wasm_bindgen(method, js_name = toLocaleTimeString)]
3393    pub fn to_locale_time_string(this: &Date, locale: &str) -> JsString;
3394
3395    #[wasm_bindgen(method, js_name = toLocaleTimeString)]
3396    pub fn to_locale_time_string_with_options(
3397        this: &Date,
3398        locale: &str,
3399        options: &JsValue,
3400    ) -> JsString;
3401
3402    /// The `toString()` method returns a string representing
3403    /// the specified Date object.
3404    ///
3405    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toString)
3406    #[wasm_bindgen(method, js_name = toString)]
3407    pub fn to_string(this: &Date) -> JsString;
3408
3409    /// The `toTimeString()` method returns the time portion of a Date object in human
3410    /// readable form in American English.
3411    ///
3412    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toTimeString)
3413    #[wasm_bindgen(method, js_name = toTimeString)]
3414    pub fn to_time_string(this: &Date) -> JsString;
3415
3416    /// The `toUTCString()` method converts a date to a string,
3417    /// using the UTC time zone.
3418    ///
3419    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString)
3420    #[wasm_bindgen(method, js_name = toUTCString)]
3421    pub fn to_utc_string(this: &Date) -> JsString;
3422
3423    /// The `Date.UTC()` method accepts the same parameters as the
3424    /// longest form of the constructor, and returns the number of
3425    /// milliseconds in a `Date` object since January 1, 1970,
3426    /// 00:00:00, universal time.
3427    ///
3428    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC)
3429    #[wasm_bindgen(static_method_of = Date, js_name = UTC)]
3430    pub fn utc(year: f64, month: f64) -> f64;
3431
3432    /// The `valueOf()` method  returns the primitive value of
3433    /// a Date object.
3434    ///
3435    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf)
3436    #[wasm_bindgen(method, js_name = valueOf)]
3437    pub fn value_of(this: &Date) -> f64;
3438}
3439
3440// Object.
3441#[wasm_bindgen]
3442extern "C" {
3443    #[wasm_bindgen(typescript_type = "object")]
3444    #[derive(Clone, Debug)]
3445    pub type Object;
3446
3447    /// The `Object.assign()` method is used to copy the values of all enumerable
3448    /// own properties from one or more source objects to a target object. It
3449    /// will return the target object.
3450    ///
3451    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
3452    #[wasm_bindgen(static_method_of = Object)]
3453    pub fn assign(target: &Object, source: &Object) -> Object;
3454
3455    /// The `Object.assign()` method is used to copy the values of all enumerable
3456    /// own properties from one or more source objects to a target object. It
3457    /// will return the target object.
3458    ///
3459    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
3460    #[wasm_bindgen(static_method_of = Object, js_name = assign)]
3461    pub fn assign2(target: &Object, source1: &Object, source2: &Object) -> Object;
3462
3463    /// The `Object.assign()` method is used to copy the values of all enumerable
3464    /// own properties from one or more source objects to a target object. It
3465    /// will return the target object.
3466    ///
3467    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
3468    #[wasm_bindgen(static_method_of = Object, js_name = assign)]
3469    pub fn assign3(target: &Object, source1: &Object, source2: &Object, source3: &Object)
3470        -> Object;
3471
3472    /// The constructor property returns a reference to the `Object` constructor
3473    /// function that created the instance object.
3474    ///
3475    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)
3476    #[wasm_bindgen(method, getter)]
3477    pub fn constructor(this: &Object) -> Function;
3478
3479    /// The `Object.create()` method creates a new object, using an existing
3480    /// object to provide the newly created object's prototype.
3481    ///
3482    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
3483    #[wasm_bindgen(static_method_of = Object)]
3484    pub fn create(prototype: &Object) -> Object;
3485
3486    /// The static method `Object.defineProperty()` defines a new
3487    /// property directly on an object, or modifies an existing
3488    /// property on an object, and returns the object.
3489    ///
3490    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
3491    #[wasm_bindgen(static_method_of = Object, js_name = defineProperty)]
3492    pub fn define_property(obj: &Object, prop: &JsValue, descriptor: &Object) -> Object;
3493
3494    /// The `Object.defineProperties()` method defines new or modifies
3495    /// existing properties directly on an object, returning the
3496    /// object.
3497    ///
3498    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)
3499    #[wasm_bindgen(static_method_of = Object, js_name = defineProperties)]
3500    pub fn define_properties(obj: &Object, props: &Object) -> Object;
3501
3502    /// The `Object.entries()` method returns an array of a given
3503    /// object's own enumerable property [key, value] pairs, in the
3504    /// same order as that provided by a for...in loop (the difference
3505    /// being that a for-in loop enumerates properties in the
3506    /// prototype chain as well).
3507    ///
3508    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
3509    #[wasm_bindgen(static_method_of = Object)]
3510    pub fn entries(object: &Object) -> Array;
3511
3512    /// The `Object.freeze()` method freezes an object: that is, prevents new
3513    /// properties from being added to it; prevents existing properties from
3514    /// being removed; and prevents existing properties, or their enumerability,
3515    /// configurability, or writability, from being changed, it also prevents
3516    /// the prototype from being changed. The method returns the passed object.
3517    ///
3518    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)
3519    #[wasm_bindgen(static_method_of = Object)]
3520    pub fn freeze(value: &Object) -> Object;
3521
3522    /// The `Object.fromEntries()` method transforms a list of key-value pairs
3523    /// into an object.
3524    ///
3525    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries)
3526    #[wasm_bindgen(static_method_of = Object, catch, js_name = fromEntries)]
3527    pub fn from_entries(iterable: &JsValue) -> Result<Object, JsValue>;
3528
3529    /// The `Object.getOwnPropertyDescriptor()` method returns a
3530    /// property descriptor for an own property (that is, one directly
3531    /// present on an object and not in the object's prototype chain)
3532    /// of a given object.
3533    ///
3534    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor)
3535    #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertyDescriptor)]
3536    pub fn get_own_property_descriptor(obj: &Object, prop: &JsValue) -> JsValue;
3537
3538    /// The `Object.getOwnPropertyDescriptors()` method returns all own
3539    /// property descriptors of a given object.
3540    ///
3541    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors)
3542    #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertyDescriptors)]
3543    pub fn get_own_property_descriptors(obj: &Object) -> JsValue;
3544
3545    /// The `Object.getOwnPropertyNames()` method returns an array of
3546    /// all properties (including non-enumerable properties except for
3547    /// those which use Symbol) found directly upon a given object.
3548    ///
3549    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames)
3550    #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertyNames)]
3551    pub fn get_own_property_names(obj: &Object) -> Array;
3552
3553    /// The `Object.getOwnPropertySymbols()` method returns an array of
3554    /// all symbol properties found directly upon a given object.
3555    ///
3556    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols)
3557    #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertySymbols)]
3558    pub fn get_own_property_symbols(obj: &Object) -> Array;
3559
3560    /// The `Object.getPrototypeOf()` method returns the prototype
3561    /// (i.e. the value of the internal [[Prototype]] property) of the
3562    /// specified object.
3563    ///
3564    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf)
3565    #[wasm_bindgen(static_method_of = Object, js_name = getPrototypeOf)]
3566    pub fn get_prototype_of(obj: &JsValue) -> Object;
3567
3568    /// The `hasOwnProperty()` method returns a boolean indicating whether the
3569    /// object has the specified property as its own property (as opposed to
3570    /// inheriting it).
3571    ///
3572    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)
3573    #[wasm_bindgen(method, js_name = hasOwnProperty)]
3574    pub fn has_own_property(this: &Object, property: &JsValue) -> bool;
3575
3576    /// The `Object.hasOwn()` method returns a boolean indicating whether the
3577    /// object passed in has the specified property as its own property (as
3578    /// opposed to inheriting it).
3579    ///
3580    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn)
3581    #[wasm_bindgen(static_method_of = Object, js_name = hasOwn)]
3582    pub fn has_own(instance: &Object, property: &JsValue) -> bool;
3583
3584    /// The `Object.is()` method determines whether two values are the same value.
3585    ///
3586    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)
3587    #[wasm_bindgen(static_method_of = Object)]
3588    pub fn is(value_1: &JsValue, value_2: &JsValue) -> bool;
3589
3590    /// The `Object.isExtensible()` method determines if an object is extensible
3591    /// (whether it can have new properties added to it).
3592    ///
3593    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible)
3594    #[wasm_bindgen(static_method_of = Object, js_name = isExtensible)]
3595    pub fn is_extensible(object: &Object) -> bool;
3596
3597    /// The `Object.isFrozen()` determines if an object is frozen.
3598    ///
3599    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen)
3600    #[wasm_bindgen(static_method_of = Object, js_name = isFrozen)]
3601    pub fn is_frozen(object: &Object) -> bool;
3602
3603    /// The `Object.isSealed()` method determines if an object is sealed.
3604    ///
3605    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed)
3606    #[wasm_bindgen(static_method_of = Object, js_name = isSealed)]
3607    pub fn is_sealed(object: &Object) -> bool;
3608
3609    /// The `isPrototypeOf()` method checks if an object exists in another
3610    /// object's prototype chain.
3611    ///
3612    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf)
3613    #[wasm_bindgen(method, js_name = isPrototypeOf)]
3614    pub fn is_prototype_of(this: &Object, value: &JsValue) -> bool;
3615
3616    /// The `Object.keys()` method returns an array of a given object's property
3617    /// names, in the same order as we get with a normal loop.
3618    ///
3619    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)
3620    #[wasm_bindgen(static_method_of = Object)]
3621    pub fn keys(object: &Object) -> Array;
3622
3623    /// The [`Object`] constructor creates an object wrapper.
3624    ///
3625    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)
3626    #[wasm_bindgen(constructor)]
3627    pub fn new() -> Object;
3628
3629    /// The `Object.preventExtensions()` method prevents new properties from
3630    /// ever being added to an object (i.e. prevents future extensions to the
3631    /// object).
3632    ///
3633    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions)
3634    #[wasm_bindgen(static_method_of = Object, js_name = preventExtensions)]
3635    pub fn prevent_extensions(object: &Object);
3636
3637    /// The `propertyIsEnumerable()` method returns a Boolean indicating
3638    /// whether the specified property is enumerable.
3639    ///
3640    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable)
3641    #[wasm_bindgen(method, js_name = propertyIsEnumerable)]
3642    pub fn property_is_enumerable(this: &Object, property: &JsValue) -> bool;
3643
3644    /// The `Object.seal()` method seals an object, preventing new properties
3645    /// from being added to it and marking all existing properties as
3646    /// non-configurable.  Values of present properties can still be changed as
3647    /// long as they are writable.
3648    ///
3649    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal)
3650    #[wasm_bindgen(static_method_of = Object)]
3651    pub fn seal(value: &Object) -> Object;
3652
3653    /// The `Object.setPrototypeOf()` method sets the prototype (i.e., the
3654    /// internal `[[Prototype]]` property) of a specified object to another
3655    /// object or `null`.
3656    ///
3657    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)
3658    #[wasm_bindgen(static_method_of = Object, js_name = setPrototypeOf)]
3659    pub fn set_prototype_of(object: &Object, prototype: &Object) -> Object;
3660
3661    /// The `toLocaleString()` method returns a string representing the object.
3662    /// This method is meant to be overridden by derived objects for
3663    /// locale-specific purposes.
3664    ///
3665    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toLocaleString)
3666    #[wasm_bindgen(method, js_name = toLocaleString)]
3667    pub fn to_locale_string(this: &Object) -> JsString;
3668
3669    /// The `toString()` method returns a string representing the object.
3670    ///
3671    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString)
3672    #[wasm_bindgen(method, js_name = toString)]
3673    pub fn to_string(this: &Object) -> JsString;
3674
3675    /// The `valueOf()` method returns the primitive value of the
3676    /// specified object.
3677    ///
3678    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf)
3679    #[wasm_bindgen(method, js_name = valueOf)]
3680    pub fn value_of(this: &Object) -> Object;
3681
3682    /// The `Object.values()` method returns an array of a given object's own
3683    /// enumerable property values, in the same order as that provided by a
3684    /// `for...in` loop (the difference being that a for-in loop enumerates
3685    /// properties in the prototype chain as well).
3686    ///
3687    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values)
3688    #[wasm_bindgen(static_method_of = Object)]
3689    pub fn values(object: &Object) -> Array;
3690}
3691
3692impl Object {
3693    /// Returns the `Object` value of this JS value if it's an instance of an
3694    /// object.
3695    ///
3696    /// If this JS value is not an instance of an object then this returns
3697    /// `None`.
3698    pub fn try_from(val: &JsValue) -> Option<&Object> {
3699        if val.is_object() {
3700            Some(val.unchecked_ref())
3701        } else {
3702            None
3703        }
3704    }
3705}
3706
3707impl PartialEq for Object {
3708    #[inline]
3709    fn eq(&self, other: &Object) -> bool {
3710        Object::is(self.as_ref(), other.as_ref())
3711    }
3712}
3713
3714impl Eq for Object {}
3715
3716impl Default for Object {
3717    fn default() -> Self {
3718        Self::new()
3719    }
3720}
3721
3722// Proxy
3723#[wasm_bindgen]
3724extern "C" {
3725    #[wasm_bindgen(typescript_type = "ProxyConstructor")]
3726    #[derive(Clone, Debug)]
3727    pub type Proxy;
3728
3729    /// The [`Proxy`] object is used to define custom behavior for fundamental
3730    /// operations (e.g. property lookup, assignment, enumeration, function
3731    /// invocation, etc).
3732    ///
3733    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
3734    #[wasm_bindgen(constructor)]
3735    pub fn new(target: &JsValue, handler: &Object) -> Proxy;
3736
3737    /// The `Proxy.revocable()` method is used to create a revocable [`Proxy`]
3738    /// object.
3739    ///
3740    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/revocable)
3741    #[wasm_bindgen(static_method_of = Proxy)]
3742    pub fn revocable(target: &JsValue, handler: &Object) -> Object;
3743}
3744
3745// RangeError
3746#[wasm_bindgen]
3747extern "C" {
3748    /// The `RangeError` object indicates an error when a value is not in the set
3749    /// or range of allowed values.
3750    ///
3751    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError)
3752    #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "RangeError")]
3753    #[derive(Clone, Debug, PartialEq, Eq)]
3754    pub type RangeError;
3755
3756    /// The `RangeError` object indicates an error when a value is not in the set
3757    /// or range of allowed values.
3758    ///
3759    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError)
3760    #[wasm_bindgen(constructor)]
3761    pub fn new(message: &str) -> RangeError;
3762}
3763
3764// ReferenceError
3765#[wasm_bindgen]
3766extern "C" {
3767    /// The `ReferenceError` object represents an error when a non-existent
3768    /// variable is referenced.
3769    ///
3770    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError)
3771    #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "ReferenceError")]
3772    #[derive(Clone, Debug, PartialEq, Eq)]
3773    pub type ReferenceError;
3774
3775    /// The `ReferenceError` object represents an error when a non-existent
3776    /// variable is referenced.
3777    ///
3778    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError)
3779    #[wasm_bindgen(constructor)]
3780    pub fn new(message: &str) -> ReferenceError;
3781}
3782
3783#[allow(non_snake_case)]
3784pub mod Reflect {
3785    use super::*;
3786
3787    // Reflect
3788    #[wasm_bindgen]
3789    extern "C" {
3790        /// The static `Reflect.apply()` method calls a target function with
3791        /// arguments as specified.
3792        ///
3793        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply)
3794        #[wasm_bindgen(js_namespace = Reflect, catch)]
3795        pub fn apply(
3796            target: &Function,
3797            this_argument: &JsValue,
3798            arguments_list: &Array,
3799        ) -> Result<JsValue, JsValue>;
3800
3801        /// The static `Reflect.construct()` method acts like the new operator, but
3802        /// as a function.  It is equivalent to calling `new target(...args)`. It
3803        /// gives also the added option to specify a different prototype.
3804        ///
3805        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct)
3806        #[wasm_bindgen(js_namespace = Reflect, catch)]
3807        pub fn construct(target: &Function, arguments_list: &Array) -> Result<JsValue, JsValue>;
3808
3809        /// The static `Reflect.construct()` method acts like the new operator, but
3810        /// as a function.  It is equivalent to calling `new target(...args)`. It
3811        /// gives also the added option to specify a different prototype.
3812        ///
3813        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct)
3814        #[wasm_bindgen(js_namespace = Reflect, js_name = construct, catch)]
3815        pub fn construct_with_new_target(
3816            target: &Function,
3817            arguments_list: &Array,
3818            new_target: &Function,
3819        ) -> Result<JsValue, JsValue>;
3820
3821        /// The static `Reflect.defineProperty()` method is like
3822        /// `Object.defineProperty()` but returns a `Boolean`.
3823        ///
3824        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty)
3825        #[wasm_bindgen(js_namespace = Reflect, js_name = defineProperty, catch)]
3826        pub fn define_property(
3827            target: &Object,
3828            property_key: &JsValue,
3829            attributes: &Object,
3830        ) -> Result<bool, JsValue>;
3831
3832        /// The static `Reflect.deleteProperty()` method allows to delete
3833        /// properties.  It is like the `delete` operator as a function.
3834        ///
3835        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/deleteProperty)
3836        #[wasm_bindgen(js_namespace = Reflect, js_name = deleteProperty, catch)]
3837        pub fn delete_property(target: &Object, key: &JsValue) -> Result<bool, JsValue>;
3838
3839        /// The static `Reflect.get()` method works like getting a property from
3840        /// an object (`target[propertyKey]`) as a function.
3841        ///
3842        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get)
3843        #[wasm_bindgen(js_namespace = Reflect, catch)]
3844        pub fn get(target: &JsValue, key: &JsValue) -> Result<JsValue, JsValue>;
3845
3846        /// The same as [`get`](fn.get.html)
3847        /// except the key is an `f64`, which is slightly faster.
3848        #[wasm_bindgen(js_namespace = Reflect, js_name = "get", catch)]
3849        pub fn get_f64(target: &JsValue, key: f64) -> Result<JsValue, JsValue>;
3850
3851        /// The same as [`get`](fn.get.html)
3852        /// except the key is a `u32`, which is slightly faster.
3853        #[wasm_bindgen(js_namespace = Reflect, js_name = "get", catch)]
3854        pub fn get_u32(target: &JsValue, key: u32) -> Result<JsValue, JsValue>;
3855
3856        /// The static `Reflect.getOwnPropertyDescriptor()` method is similar to
3857        /// `Object.getOwnPropertyDescriptor()`. It returns a property descriptor
3858        /// of the given property if it exists on the object, `undefined` otherwise.
3859        ///
3860        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor)
3861        #[wasm_bindgen(js_namespace = Reflect, js_name = getOwnPropertyDescriptor, catch)]
3862        pub fn get_own_property_descriptor(
3863            target: &Object,
3864            property_key: &JsValue,
3865        ) -> Result<JsValue, JsValue>;
3866
3867        /// The static `Reflect.getPrototypeOf()` method is almost the same
3868        /// method as `Object.getPrototypeOf()`. It returns the prototype
3869        /// (i.e. the value of the internal `[[Prototype]]` property) of
3870        /// the specified object.
3871        ///
3872        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getPrototypeOf)
3873        #[wasm_bindgen(js_namespace = Reflect, js_name = getPrototypeOf, catch)]
3874        pub fn get_prototype_of(target: &JsValue) -> Result<Object, JsValue>;
3875
3876        /// The static `Reflect.has()` method works like the in operator as a
3877        /// function.
3878        ///
3879        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has)
3880        #[wasm_bindgen(js_namespace = Reflect, catch)]
3881        pub fn has(target: &JsValue, property_key: &JsValue) -> Result<bool, JsValue>;
3882
3883        /// The static `Reflect.isExtensible()` method determines if an object is
3884        /// extensible (whether it can have new properties added to it). It is
3885        /// similar to `Object.isExtensible()`, but with some differences.
3886        ///
3887        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/isExtensible)
3888        #[wasm_bindgen(js_namespace = Reflect, js_name = isExtensible, catch)]
3889        pub fn is_extensible(target: &Object) -> Result<bool, JsValue>;
3890
3891        /// The static `Reflect.ownKeys()` method returns an array of the
3892        /// target object's own property keys.
3893        ///
3894        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys)
3895        #[wasm_bindgen(js_namespace = Reflect, js_name = ownKeys, catch)]
3896        pub fn own_keys(target: &JsValue) -> Result<Array, JsValue>;
3897
3898        /// The static `Reflect.preventExtensions()` method prevents new
3899        /// properties from ever being added to an object (i.e. prevents
3900        /// future extensions to the object). It is similar to
3901        /// `Object.preventExtensions()`, but with some differences.
3902        ///
3903        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions)
3904        #[wasm_bindgen(js_namespace = Reflect, js_name = preventExtensions, catch)]
3905        pub fn prevent_extensions(target: &Object) -> Result<bool, JsValue>;
3906
3907        /// The static `Reflect.set()` method works like setting a
3908        /// property on an object.
3909        ///
3910        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set)
3911        #[wasm_bindgen(js_namespace = Reflect, catch)]
3912        pub fn set(
3913            target: &JsValue,
3914            property_key: &JsValue,
3915            value: &JsValue,
3916        ) -> Result<bool, JsValue>;
3917
3918        /// The same as [`set`](fn.set.html)
3919        /// except the key is an `f64`, which is slightly faster.
3920        #[wasm_bindgen(js_namespace = Reflect, js_name = "set", catch)]
3921        pub fn set_f64(
3922            target: &JsValue,
3923            property_key: f64,
3924            value: &JsValue,
3925        ) -> Result<bool, JsValue>;
3926
3927        /// The same as [`set`](fn.set.html)
3928        /// except the key is a `u32`, which is slightly faster.
3929        #[wasm_bindgen(js_namespace = Reflect, js_name = "set", catch)]
3930        pub fn set_u32(
3931            target: &JsValue,
3932            property_key: u32,
3933            value: &JsValue,
3934        ) -> Result<bool, JsValue>;
3935
3936        /// The static `Reflect.set()` method works like setting a
3937        /// property on an object.
3938        ///
3939        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set)
3940        #[wasm_bindgen(js_namespace = Reflect, js_name = set, catch)]
3941        pub fn set_with_receiver(
3942            target: &JsValue,
3943            property_key: &JsValue,
3944            value: &JsValue,
3945            receiver: &JsValue,
3946        ) -> Result<bool, JsValue>;
3947
3948        /// The static `Reflect.setPrototypeOf()` method is the same
3949        /// method as `Object.setPrototypeOf()`. It sets the prototype
3950        /// (i.e., the internal `[[Prototype]]` property) of a specified
3951        /// object to another object or to null.
3952        ///
3953        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/setPrototypeOf)
3954        #[wasm_bindgen(js_namespace = Reflect, js_name = setPrototypeOf, catch)]
3955        pub fn set_prototype_of(target: &Object, prototype: &JsValue) -> Result<bool, JsValue>;
3956    }
3957}
3958
3959// RegExp
3960#[wasm_bindgen]
3961extern "C" {
3962    #[wasm_bindgen(extends = Object, typescript_type = "RegExp")]
3963    #[derive(Clone, Debug, PartialEq, Eq)]
3964    pub type RegExp;
3965
3966    /// The `exec()` method executes a search for a match in a specified
3967    /// string. Returns a result array, or null.
3968    ///
3969    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
3970    #[wasm_bindgen(method)]
3971    pub fn exec(this: &RegExp, text: &str) -> Option<Array>;
3972
3973    /// The flags property returns a string consisting of the flags of
3974    /// the current regular expression object.
3975    ///
3976    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags)
3977    #[wasm_bindgen(method, getter)]
3978    pub fn flags(this: &RegExp) -> JsString;
3979
3980    /// The global property indicates whether or not the "g" flag is
3981    /// used with the regular expression. global is a read-only
3982    /// property of an individual regular expression instance.
3983    ///
3984    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global)
3985    #[wasm_bindgen(method, getter)]
3986    pub fn global(this: &RegExp) -> bool;
3987
3988    /// The ignoreCase property indicates whether or not the "i" flag
3989    /// is used with the regular expression. ignoreCase is a read-only
3990    /// property of an individual regular expression instance.
3991    ///
3992    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/ignoreCase)
3993    #[wasm_bindgen(method, getter, js_name = ignoreCase)]
3994    pub fn ignore_case(this: &RegExp) -> bool;
3995
3996    /// The non-standard input property is a static property of
3997    /// regular expressions that contains the string against which a
3998    /// regular expression is matched. RegExp.$_ is an alias for this
3999    /// property.
4000    ///
4001    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/input)
4002    #[wasm_bindgen(static_method_of = RegExp, getter)]
4003    pub fn input() -> JsString;
4004
4005    /// The lastIndex is a read/write integer property of regular expression
4006    /// instances that specifies the index at which to start the next match.
4007    ///
4008    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex)
4009    #[wasm_bindgen(structural, getter = lastIndex, method)]
4010    pub fn last_index(this: &RegExp) -> u32;
4011
4012    /// The lastIndex is a read/write integer property of regular expression
4013    /// instances that specifies the index at which to start the next match.
4014    ///
4015    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex)
4016    #[wasm_bindgen(structural, setter = lastIndex, method)]
4017    pub fn set_last_index(this: &RegExp, index: u32);
4018
4019    /// The non-standard lastMatch property is a static and read-only
4020    /// property of regular expressions that contains the last matched
4021    /// characters. `RegExp.$&` is an alias for this property.
4022    ///
4023    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch)
4024    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = lastMatch)]
4025    pub fn last_match() -> JsString;
4026
4027    /// The non-standard lastParen property is a static and read-only
4028    /// property of regular expressions that contains the last
4029    /// parenthesized substring match, if any. `RegExp.$+` is an alias
4030    /// for this property.
4031    ///
4032    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastParen)
4033    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = lastParen)]
4034    pub fn last_paren() -> JsString;
4035
4036    /// The non-standard leftContext property is a static and
4037    /// read-only property of regular expressions that contains the
4038    /// substring preceding the most recent match. `RegExp.$`` is an
4039    /// alias for this property.
4040    ///
4041    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/leftContext)
4042    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = leftContext)]
4043    pub fn left_context() -> JsString;
4044
4045    /// The multiline property indicates whether or not the "m" flag
4046    /// is used with the regular expression. multiline is a read-only
4047    /// property of an individual regular expression instance.
4048    ///
4049    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline)
4050    #[wasm_bindgen(method, getter)]
4051    pub fn multiline(this: &RegExp) -> bool;
4052
4053    /// The non-standard $1, $2, $3, $4, $5, $6, $7, $8, $9 properties
4054    /// are static and read-only properties of regular expressions
4055    /// that contain parenthesized substring matches.
4056    ///
4057    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n)
4058    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$1")]
4059    pub fn n1() -> JsString;
4060    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$2")]
4061    pub fn n2() -> JsString;
4062    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$3")]
4063    pub fn n3() -> JsString;
4064    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$4")]
4065    pub fn n4() -> JsString;
4066    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$5")]
4067    pub fn n5() -> JsString;
4068    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$6")]
4069    pub fn n6() -> JsString;
4070    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$7")]
4071    pub fn n7() -> JsString;
4072    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$8")]
4073    pub fn n8() -> JsString;
4074    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$9")]
4075    pub fn n9() -> JsString;
4076
4077    /// The `RegExp` constructor creates a regular expression object for matching text with a pattern.
4078    ///
4079    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp)
4080    #[wasm_bindgen(constructor)]
4081    pub fn new(pattern: &str, flags: &str) -> RegExp;
4082    #[wasm_bindgen(constructor)]
4083    pub fn new_regexp(pattern: &RegExp, flags: &str) -> RegExp;
4084
4085    /// The non-standard rightContext property is a static and
4086    /// read-only property of regular expressions that contains the
4087    /// substring following the most recent match. `RegExp.$'` is an
4088    /// alias for this property.
4089    ///
4090    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/rightContext)
4091    #[wasm_bindgen(static_method_of = RegExp, getter, js_name = rightContext)]
4092    pub fn right_context() -> JsString;
4093
4094    /// The source property returns a String containing the source
4095    /// text of the regexp object, and it doesn't contain the two
4096    /// forward slashes on both sides and any flags.
4097    ///
4098    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source)
4099    #[wasm_bindgen(method, getter)]
4100    pub fn source(this: &RegExp) -> JsString;
4101
4102    /// The sticky property reflects whether or not the search is
4103    /// sticky (searches in strings only from the index indicated by
4104    /// the lastIndex property of this regular expression). sticky is
4105    /// a read-only property of an individual regular expression
4106    /// object.
4107    ///
4108    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky)
4109    #[wasm_bindgen(method, getter)]
4110    pub fn sticky(this: &RegExp) -> bool;
4111
4112    /// The `test()` method executes a search for a match between a
4113    /// regular expression and a specified string. Returns true or
4114    /// false.
4115    ///
4116    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)
4117    #[wasm_bindgen(method)]
4118    pub fn test(this: &RegExp, text: &str) -> bool;
4119
4120    /// The `toString()` method returns a string representing the
4121    /// regular expression.
4122    ///
4123    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/toString)
4124    #[wasm_bindgen(method, js_name = toString)]
4125    pub fn to_string(this: &RegExp) -> JsString;
4126
4127    /// The unicode property indicates whether or not the "u" flag is
4128    /// used with a regular expression. unicode is a read-only
4129    /// property of an individual regular expression instance.
4130    ///
4131    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode)
4132    #[wasm_bindgen(method, getter)]
4133    pub fn unicode(this: &RegExp) -> bool;
4134}
4135
4136// Set
4137#[wasm_bindgen]
4138extern "C" {
4139    #[wasm_bindgen(extends = Object, typescript_type = "Set<any>")]
4140    #[derive(Clone, Debug, PartialEq, Eq)]
4141    pub type Set;
4142
4143    /// The `add()` method appends a new element with a specified value to the
4144    /// end of a [`Set`] object.
4145    ///
4146    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/add)
4147    #[wasm_bindgen(method)]
4148    pub fn add(this: &Set, value: &JsValue) -> Set;
4149
4150    /// The `clear()` method removes all elements from a [`Set`] object.
4151    ///
4152    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/clear)
4153    #[wasm_bindgen(method)]
4154    pub fn clear(this: &Set);
4155
4156    /// The `delete()` method removes the specified element from a [`Set`]
4157    /// object.
4158    ///
4159    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/delete)
4160    #[wasm_bindgen(method)]
4161    pub fn delete(this: &Set, value: &JsValue) -> bool;
4162
4163    /// The `forEach()` method executes a provided function once for each value
4164    /// in the Set object, in insertion order.
4165    ///
4166    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/forEach)
4167    #[wasm_bindgen(method, js_name = forEach)]
4168    pub fn for_each(this: &Set, callback: &mut dyn FnMut(JsValue, JsValue, Set));
4169
4170    /// The `has()` method returns a boolean indicating whether an element with
4171    /// the specified value exists in a [`Set`] object or not.
4172    ///
4173    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/has)
4174    #[wasm_bindgen(method)]
4175    pub fn has(this: &Set, value: &JsValue) -> bool;
4176
4177    /// The [`Set`] object lets you store unique values of any type, whether
4178    /// primitive values or object references.
4179    ///
4180    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)
4181    #[wasm_bindgen(constructor)]
4182    pub fn new(init: &JsValue) -> Set;
4183
4184    /// The size accessor property returns the number of elements in a [`Set`]
4185    /// object.
4186    ///
4187    /// [MDN documentation](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Set/size)
4188    #[wasm_bindgen(method, getter, structural)]
4189    pub fn size(this: &Set) -> u32;
4190}
4191
4192impl Default for Set {
4193    fn default() -> Self {
4194        Self::new(&JsValue::UNDEFINED)
4195    }
4196}
4197
4198// SetIterator
4199#[wasm_bindgen]
4200extern "C" {
4201    /// The `entries()` method returns a new Iterator object that contains an
4202    /// array of [value, value] for each element in the Set object, in insertion
4203    /// order. For Set objects there is no key like in Map objects. However, to
4204    /// keep the API similar to the Map object, each entry has the same value
4205    /// for its key and value here, so that an array [value, value] is returned.
4206    ///
4207    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/entries)
4208    #[wasm_bindgen(method)]
4209    pub fn entries(set: &Set) -> Iterator;
4210
4211    /// The `keys()` method is an alias for this method (for similarity with
4212    /// Map objects); it behaves exactly the same and returns values
4213    /// of Set elements.
4214    ///
4215    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values)
4216    #[wasm_bindgen(method)]
4217    pub fn keys(set: &Set) -> Iterator;
4218
4219    /// The `values()` method returns a new Iterator object that contains the
4220    /// values for each element in the Set object in insertion order.
4221    ///
4222    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values)
4223    #[wasm_bindgen(method)]
4224    pub fn values(set: &Set) -> Iterator;
4225}
4226
4227// SyntaxError
4228#[wasm_bindgen]
4229extern "C" {
4230    /// A `SyntaxError` is thrown when the JavaScript engine encounters tokens or
4231    /// token order that does not conform to the syntax of the language when
4232    /// parsing code.
4233    ///
4234    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError)
4235    #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "SyntaxError")]
4236    #[derive(Clone, Debug, PartialEq, Eq)]
4237    pub type SyntaxError;
4238
4239    /// A `SyntaxError` is thrown when the JavaScript engine encounters tokens or
4240    /// token order that does not conform to the syntax of the language when
4241    /// parsing code.
4242    ///
4243    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError)
4244    #[wasm_bindgen(constructor)]
4245    pub fn new(message: &str) -> SyntaxError;
4246}
4247
4248// TypeError
4249#[wasm_bindgen]
4250extern "C" {
4251    /// The `TypeError` object represents an error when a value is not of the
4252    /// expected type.
4253    ///
4254    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError)
4255    #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "TypeError")]
4256    #[derive(Clone, Debug, PartialEq, Eq)]
4257    pub type TypeError;
4258
4259    /// The `TypeError` object represents an error when a value is not of the
4260    /// expected type.
4261    ///
4262    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError)
4263    #[wasm_bindgen(constructor)]
4264    pub fn new(message: &str) -> TypeError;
4265}
4266
4267// URIError
4268#[wasm_bindgen]
4269extern "C" {
4270    /// The `URIError` object represents an error when a global URI handling
4271    /// function was used in a wrong way.
4272    ///
4273    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError)
4274    #[wasm_bindgen(extends = Error, extends = Object, js_name = URIError, typescript_type = "URIError")]
4275    #[derive(Clone, Debug, PartialEq, Eq)]
4276    pub type UriError;
4277
4278    /// The `URIError` object represents an error when a global URI handling
4279    /// function was used in a wrong way.
4280    ///
4281    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError)
4282    #[wasm_bindgen(constructor, js_class = "URIError")]
4283    pub fn new(message: &str) -> UriError;
4284}
4285
4286// WeakMap
4287#[wasm_bindgen]
4288extern "C" {
4289    #[wasm_bindgen(extends = Object, typescript_type = "WeakMap<object, any>")]
4290    #[derive(Clone, Debug, PartialEq, Eq)]
4291    pub type WeakMap;
4292
4293    /// The [`WeakMap`] object is a collection of key/value pairs in which the
4294    /// keys are weakly referenced.  The keys must be objects and the values can
4295    /// be arbitrary values.
4296    ///
4297    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
4298    #[wasm_bindgen(constructor)]
4299    pub fn new() -> WeakMap;
4300
4301    /// The `set()` method sets the value for the key in the [`WeakMap`] object.
4302    /// Returns the [`WeakMap`] object.
4303    ///
4304    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/set)
4305    #[wasm_bindgen(method, js_class = "WeakMap")]
4306    pub fn set(this: &WeakMap, key: &Object, value: &JsValue) -> WeakMap;
4307
4308    /// The `get()` method returns a specified by key element
4309    /// from a [`WeakMap`] object.
4310    ///
4311    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/get)
4312    #[wasm_bindgen(method)]
4313    pub fn get(this: &WeakMap, key: &Object) -> JsValue;
4314
4315    /// The `has()` method returns a boolean indicating whether an element with
4316    /// the specified key exists in the [`WeakMap`] object or not.
4317    ///
4318    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/has)
4319    #[wasm_bindgen(method)]
4320    pub fn has(this: &WeakMap, key: &Object) -> bool;
4321
4322    /// The `delete()` method removes the specified element from a [`WeakMap`]
4323    /// object.
4324    ///
4325    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/delete)
4326    #[wasm_bindgen(method)]
4327    pub fn delete(this: &WeakMap, key: &Object) -> bool;
4328}
4329
4330impl Default for WeakMap {
4331    fn default() -> Self {
4332        Self::new()
4333    }
4334}
4335
4336// WeakSet
4337#[wasm_bindgen]
4338extern "C" {
4339    #[wasm_bindgen(extends = Object, typescript_type = "WeakSet<object>")]
4340    #[derive(Clone, Debug, PartialEq, Eq)]
4341    pub type WeakSet;
4342
4343    /// The `WeakSet` object lets you store weakly held objects in a collection.
4344    ///
4345    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet)
4346    #[wasm_bindgen(constructor)]
4347    pub fn new() -> WeakSet;
4348
4349    /// The `has()` method returns a boolean indicating whether an object exists
4350    /// in a WeakSet or not.
4351    ///
4352    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/has)
4353    #[wasm_bindgen(method)]
4354    pub fn has(this: &WeakSet, value: &Object) -> bool;
4355
4356    /// The `add()` method appends a new object to the end of a WeakSet object.
4357    ///
4358    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/add)
4359    #[wasm_bindgen(method)]
4360    pub fn add(this: &WeakSet, value: &Object) -> WeakSet;
4361
4362    /// The `delete()` method removes the specified element from a WeakSet
4363    /// object.
4364    ///
4365    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/delete)
4366    #[wasm_bindgen(method)]
4367    pub fn delete(this: &WeakSet, value: &Object) -> bool;
4368}
4369
4370impl Default for WeakSet {
4371    fn default() -> Self {
4372        Self::new()
4373    }
4374}
4375
4376#[cfg(js_sys_unstable_apis)]
4377#[allow(non_snake_case)]
4378pub mod Temporal;
4379
4380#[allow(non_snake_case)]
4381pub mod WebAssembly {
4382    use super::*;
4383
4384    // WebAssembly
4385    #[wasm_bindgen]
4386    extern "C" {
4387        /// The `WebAssembly.compile()` function compiles a `WebAssembly.Module`
4388        /// from WebAssembly binary code.  This function is useful if it is
4389        /// necessary to a compile a module before it can be instantiated
4390        /// (otherwise, the `WebAssembly.instantiate()` function should be used).
4391        ///
4392        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/compile)
4393        #[wasm_bindgen(js_namespace = WebAssembly)]
4394        pub fn compile(buffer_source: &JsValue) -> Promise;
4395
4396        /// The `WebAssembly.compileStreaming()` function compiles a
4397        /// `WebAssembly.Module` module directly from a streamed underlying
4398        /// source. This function is useful if it is necessary to a compile a
4399        /// module before it can be instantiated (otherwise, the
4400        /// `WebAssembly.instantiateStreaming()` function should be used).
4401        ///
4402        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/compileStreaming)
4403        #[wasm_bindgen(js_namespace = WebAssembly, js_name = compileStreaming)]
4404        pub fn compile_streaming(response: &Promise) -> Promise;
4405
4406        /// The `WebAssembly.instantiate()` function allows you to compile and
4407        /// instantiate WebAssembly code.
4408        ///
4409        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate)
4410        #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiate)]
4411        pub fn instantiate_buffer(buffer: &[u8], imports: &Object) -> Promise;
4412
4413        /// The `WebAssembly.instantiate()` function allows you to compile and
4414        /// instantiate WebAssembly code.
4415        ///
4416        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate)
4417        #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiate)]
4418        pub fn instantiate_module(module: &Module, imports: &Object) -> Promise;
4419
4420        /// The `WebAssembly.instantiateStreaming()` function compiles and
4421        /// instantiates a WebAssembly module directly from a streamed
4422        /// underlying source. This is the most efficient, optimized way to load
4423        /// Wasm code.
4424        ///
4425        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming)
4426        #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiateStreaming)]
4427        pub fn instantiate_streaming(response: &Promise, imports: &Object) -> Promise;
4428
4429        /// The `WebAssembly.validate()` function validates a given typed
4430        /// array of WebAssembly binary code, returning whether the bytes
4431        /// form a valid Wasm module (`true`) or not (`false`).
4432        ///
4433        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/validate)
4434        #[wasm_bindgen(js_namespace = WebAssembly, catch)]
4435        pub fn validate(buffer_source: &JsValue) -> Result<bool, JsValue>;
4436    }
4437
4438    // WebAssembly.CompileError
4439    #[wasm_bindgen]
4440    extern "C" {
4441        /// The `WebAssembly.CompileError()` constructor creates a new
4442        /// WebAssembly `CompileError` object, which indicates an error during
4443        /// WebAssembly decoding or validation.
4444        ///
4445        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/CompileError)
4446        #[wasm_bindgen(extends = Error, js_namespace = WebAssembly, typescript_type = "WebAssembly.CompileError")]
4447        #[derive(Clone, Debug, PartialEq, Eq)]
4448        pub type CompileError;
4449
4450        /// The `WebAssembly.CompileError()` constructor creates a new
4451        /// WebAssembly `CompileError` object, which indicates an error during
4452        /// WebAssembly decoding or validation.
4453        ///
4454        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/CompileError)
4455        #[wasm_bindgen(constructor, js_namespace = WebAssembly)]
4456        pub fn new(message: &str) -> CompileError;
4457    }
4458
4459    // WebAssembly.Instance
4460    #[wasm_bindgen]
4461    extern "C" {
4462        /// A `WebAssembly.Instance` object is a stateful, executable instance
4463        /// of a `WebAssembly.Module`. Instance objects contain all the exported
4464        /// WebAssembly functions that allow calling into WebAssembly code from
4465        /// JavaScript.
4466        ///
4467        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance)
4468        #[wasm_bindgen(extends = Object, js_namespace = WebAssembly, typescript_type = "WebAssembly.Instance")]
4469        #[derive(Clone, Debug, PartialEq, Eq)]
4470        pub type Instance;
4471
4472        /// The `WebAssembly.Instance()` constructor function can be called to
4473        /// synchronously instantiate a given `WebAssembly.Module`
4474        /// object. However, the primary way to get an `Instance` is through the
4475        /// asynchronous `WebAssembly.instantiateStreaming()` function.
4476        ///
4477        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance)
4478        #[wasm_bindgen(catch, constructor, js_namespace = WebAssembly)]
4479        pub fn new(module: &Module, imports: &Object) -> Result<Instance, JsValue>;
4480
4481        /// The `exports` readonly property of the `WebAssembly.Instance` object
4482        /// prototype returns an object containing as its members all the
4483        /// functions exported from the WebAssembly module instance, to allow
4484        /// them to be accessed and used by JavaScript.
4485        ///
4486        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance/exports)
4487        #[wasm_bindgen(getter, method, js_namespace = WebAssembly)]
4488        pub fn exports(this: &Instance) -> Object;
4489    }
4490
4491    // WebAssembly.LinkError
4492    #[wasm_bindgen]
4493    extern "C" {
4494        /// The `WebAssembly.LinkError()` constructor creates a new WebAssembly
4495        /// LinkError object, which indicates an error during module
4496        /// instantiation (besides traps from the start function).
4497        ///
4498        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/LinkError)
4499        #[wasm_bindgen(extends = Error, js_namespace = WebAssembly, typescript_type = "WebAssembly.LinkError")]
4500        #[derive(Clone, Debug, PartialEq, Eq)]
4501        pub type LinkError;
4502
4503        /// The `WebAssembly.LinkError()` constructor creates a new WebAssembly
4504        /// LinkError object, which indicates an error during module
4505        /// instantiation (besides traps from the start function).
4506        ///
4507        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/LinkError)
4508        #[wasm_bindgen(constructor, js_namespace = WebAssembly)]
4509        pub fn new(message: &str) -> LinkError;
4510    }
4511
4512    // WebAssembly.RuntimeError
4513    #[wasm_bindgen]
4514    extern "C" {
4515        /// The `WebAssembly.RuntimeError()` constructor creates a new WebAssembly
4516        /// `RuntimeError` object — the type that is thrown whenever WebAssembly
4517        /// specifies a trap.
4518        ///
4519        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/RuntimeError)
4520        #[wasm_bindgen(extends = Error, js_namespace = WebAssembly, typescript_type = "WebAssembly.RuntimeError")]
4521        #[derive(Clone, Debug, PartialEq, Eq)]
4522        pub type RuntimeError;
4523
4524        /// The `WebAssembly.RuntimeError()` constructor creates a new WebAssembly
4525        /// `RuntimeError` object — the type that is thrown whenever WebAssembly
4526        /// specifies a trap.
4527        ///
4528        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/RuntimeError)
4529        #[wasm_bindgen(constructor, js_namespace = WebAssembly)]
4530        pub fn new(message: &str) -> RuntimeError;
4531    }
4532
4533    // WebAssembly.Module
4534    #[wasm_bindgen]
4535    extern "C" {
4536        /// A `WebAssembly.Module` object contains stateless WebAssembly code
4537        /// that has already been compiled by the browser and can be
4538        /// efficiently shared with Workers, and instantiated multiple times.
4539        ///
4540        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module)
4541        #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Module")]
4542        #[derive(Clone, Debug, PartialEq, Eq)]
4543        pub type Module;
4544
4545        /// A `WebAssembly.Module` object contains stateless WebAssembly code
4546        /// that has already been compiled by the browser and can be
4547        /// efficiently shared with Workers, and instantiated multiple times.
4548        ///
4549        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module)
4550        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4551        pub fn new(buffer_source: &JsValue) -> Result<Module, JsValue>;
4552
4553        /// The `WebAssembly.customSections()` function returns a copy of the
4554        /// contents of all custom sections in the given module with the given
4555        /// string name.
4556        ///
4557        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/customSections)
4558        #[wasm_bindgen(static_method_of = Module, js_namespace = WebAssembly, js_name = customSections)]
4559        pub fn custom_sections(module: &Module, sectionName: &str) -> Array;
4560
4561        /// The `WebAssembly.exports()` function returns an array containing
4562        /// descriptions of all the declared exports of the given `Module`.
4563        ///
4564        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/exports)
4565        #[wasm_bindgen(static_method_of = Module, js_namespace = WebAssembly)]
4566        pub fn exports(module: &Module) -> Array;
4567
4568        /// The `WebAssembly.imports()` function returns an array containing
4569        /// descriptions of all the declared imports of the given `Module`.
4570        ///
4571        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/imports)
4572        #[wasm_bindgen(static_method_of = Module, js_namespace = WebAssembly)]
4573        pub fn imports(module: &Module) -> Array;
4574    }
4575
4576    // WebAssembly.Table
4577    #[wasm_bindgen]
4578    extern "C" {
4579        /// The `WebAssembly.Table()` constructor creates a new `Table` object
4580        /// of the given size and element type.
4581        ///
4582        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table)
4583        #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Table")]
4584        #[derive(Clone, Debug, PartialEq, Eq)]
4585        pub type Table;
4586
4587        /// The `WebAssembly.Table()` constructor creates a new `Table` object
4588        /// of the given size and element type.
4589        ///
4590        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table)
4591        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4592        pub fn new(table_descriptor: &Object) -> Result<Table, JsValue>;
4593
4594        /// The length prototype property of the `WebAssembly.Table` object
4595        /// returns the length of the table, i.e. the number of elements in the
4596        /// table.
4597        ///
4598        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/length)
4599        #[wasm_bindgen(method, getter, js_namespace = WebAssembly)]
4600        pub fn length(this: &Table) -> u32;
4601
4602        /// The `get()` prototype method of the `WebAssembly.Table()` object
4603        /// retrieves a function reference stored at a given index.
4604        ///
4605        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/get)
4606        #[wasm_bindgen(method, catch, js_namespace = WebAssembly)]
4607        pub fn get(this: &Table, index: u32) -> Result<Function, JsValue>;
4608
4609        /// The `grow()` prototype method of the `WebAssembly.Table` object
4610        /// increases the size of the `Table` instance by a specified number of
4611        /// elements.
4612        ///
4613        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/grow)
4614        #[wasm_bindgen(method, catch, js_namespace = WebAssembly)]
4615        pub fn grow(this: &Table, additional_capacity: u32) -> Result<u32, JsValue>;
4616
4617        /// The `set()` prototype method of the `WebAssembly.Table` object mutates a
4618        /// reference stored at a given index to a different value.
4619        ///
4620        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/set)
4621        #[wasm_bindgen(method, catch, js_namespace = WebAssembly)]
4622        pub fn set(this: &Table, index: u32, function: &Function) -> Result<(), JsValue>;
4623    }
4624
4625    // WebAssembly.Tag
4626    #[wasm_bindgen]
4627    extern "C" {
4628        /// The `WebAssembly.Tag()` constructor creates a new `Tag` object
4629        ///
4630        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Tag)
4631        #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Tag")]
4632        #[derive(Clone, Debug, PartialEq, Eq)]
4633        pub type Tag;
4634
4635        /// The `WebAssembly.Tag()` constructor creates a new `Tag` object
4636        ///
4637        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Tag)
4638        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4639        pub fn new(tag_descriptor: &Object) -> Result<Tag, JsValue>;
4640    }
4641
4642    // WebAssembly.Exception
4643    #[wasm_bindgen]
4644    extern "C" {
4645        /// The `WebAssembly.Exception()` constructor creates a new `Exception` object
4646        ///
4647        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Exception)
4648        #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Exception")]
4649        #[derive(Clone, Debug, PartialEq, Eq)]
4650        pub type Exception;
4651
4652        /// The `WebAssembly.Exception()` constructor creates a new `Exception` object
4653        ///
4654        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Exception)
4655        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4656        pub fn new(tag: &Tag, payload: &Array) -> Result<Exception, JsValue>;
4657
4658        /// The `WebAssembly.Exception()` constructor creates a new `Exception` object
4659        ///
4660        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Exception)
4661        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4662        pub fn new_with_options(
4663            tag: &Tag,
4664            payload: &Array,
4665            options: &Object,
4666        ) -> Result<Exception, JsValue>;
4667
4668        /// The `is()` prototype method of the `WebAssembly.Exception` can be used to
4669        /// test if the Exception matches a given tag.
4670        ///
4671        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Exception/is)
4672        #[wasm_bindgen(method, js_namespace = WebAssembly)]
4673        pub fn is(this: &Exception, tag: &Tag) -> bool;
4674
4675        /// The `getArg()` prototype method of the `WebAssembly.Exception` can be used
4676        /// to get the value of a specified item in the exception's data arguments
4677        ///
4678        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Exception/getArg)
4679        #[wasm_bindgen(method, js_namespace = WebAssembly, js_name = getArg, catch)]
4680        pub fn get_arg(this: &Exception, tag: &Tag, index: u32) -> Result<JsValue, JsValue>;
4681    }
4682
4683    // WebAssembly.Global
4684    #[wasm_bindgen]
4685    extern "C" {
4686        /// The `WebAssembly.Global()` constructor creates a new `Global` object
4687        /// of the given type and value.
4688        ///
4689        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global)
4690        #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Global")]
4691        #[derive(Clone, Debug, PartialEq, Eq)]
4692        pub type Global;
4693
4694        /// The `WebAssembly.Global()` constructor creates a new `Global` object
4695        /// of the given type and value.
4696        ///
4697        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global)
4698        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4699        pub fn new(global_descriptor: &Object, value: &JsValue) -> Result<Global, JsValue>;
4700
4701        /// The value prototype property of the `WebAssembly.Global` object
4702        /// returns the value of the global.
4703        ///
4704        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global)
4705        #[wasm_bindgen(method, getter, structural, js_namespace = WebAssembly)]
4706        pub fn value(this: &Global) -> JsValue;
4707        #[wasm_bindgen(method, setter = value, structural, js_namespace = WebAssembly)]
4708        pub fn set_value(this: &Global, value: &JsValue);
4709    }
4710
4711    // WebAssembly.Memory
4712    #[wasm_bindgen]
4713    extern "C" {
4714        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory)
4715        #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Memory")]
4716        #[derive(Clone, Debug, PartialEq, Eq)]
4717        pub type Memory;
4718
4719        /// The `WebAssembly.Memory()` constructor creates a new `Memory` object
4720        /// which is a resizable `ArrayBuffer` that holds the raw bytes of
4721        /// memory accessed by a WebAssembly `Instance`.
4722        ///
4723        /// A memory created by JavaScript or in WebAssembly code will be
4724        /// accessible and mutable from both JavaScript and WebAssembly.
4725        ///
4726        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory)
4727        #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
4728        pub fn new(descriptor: &Object) -> Result<Memory, JsValue>;
4729
4730        /// An accessor property that returns the buffer contained in the
4731        /// memory.
4732        ///
4733        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/buffer)
4734        #[wasm_bindgen(method, getter, js_namespace = WebAssembly)]
4735        pub fn buffer(this: &Memory) -> JsValue;
4736
4737        /// The `grow()` prototype method of the `Memory` object increases the
4738        /// size of the memory instance by a specified number of WebAssembly
4739        /// pages.
4740        ///
4741        /// Takes the number of pages to grow (64KiB in size) and returns the
4742        /// previous size of memory, in pages.
4743        ///
4744        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/grow)
4745        #[wasm_bindgen(method, js_namespace = WebAssembly)]
4746        pub fn grow(this: &Memory, pages: u32) -> u32;
4747    }
4748}
4749
4750/// The `JSON` object contains methods for parsing [JavaScript Object
4751/// Notation (JSON)](https://json.org/) and converting values to JSON. It
4752/// can't be called or constructed, and aside from its two method
4753/// properties, it has no interesting functionality of its own.
4754#[allow(non_snake_case)]
4755pub mod JSON {
4756    use super::*;
4757
4758    // JSON
4759    #[wasm_bindgen]
4760    extern "C" {
4761        /// The `JSON.parse()` method parses a JSON string, constructing the
4762        /// JavaScript value or object described by the string.
4763        ///
4764        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)
4765        #[wasm_bindgen(catch, js_namespace = JSON)]
4766        pub fn parse(text: &str) -> Result<JsValue, JsValue>;
4767
4768        /// The `JSON.stringify()` method converts a JavaScript value to a JSON string.
4769        ///
4770        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
4771        #[wasm_bindgen(catch, js_namespace = JSON)]
4772        pub fn stringify(obj: &JsValue) -> Result<JsString, JsValue>;
4773
4774        /// The `JSON.stringify()` method converts a JavaScript value to a JSON string.
4775        ///
4776        /// The `replacer` argument is a function that alters the behavior of the stringification
4777        /// process, or an array of String and Number objects that serve as a whitelist
4778        /// for selecting/filtering the properties of the value object to be included
4779        /// in the JSON string. If this value is null or not provided, all properties
4780        /// of the object are included in the resulting JSON string.
4781        ///
4782        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
4783        #[wasm_bindgen(catch, js_namespace = JSON, js_name = stringify)]
4784        pub fn stringify_with_replacer(
4785            obj: &JsValue,
4786            replacer: &JsValue,
4787        ) -> Result<JsString, JsValue>;
4788
4789        /// The `JSON.stringify()` method converts a JavaScript value to a JSON string.
4790        ///
4791        /// The `replacer` argument is a function that alters the behavior of the stringification
4792        /// process, or an array of String and Number objects that serve as a whitelist
4793        /// for selecting/filtering the properties of the value object to be included
4794        /// in the JSON string. If this value is null or not provided, all properties
4795        /// of the object are included in the resulting JSON string.
4796        ///
4797        /// The `space` argument is a String or Number object that's used to insert white space into
4798        /// the output JSON string for readability purposes. If this is a Number, it
4799        /// indicates the number of space characters to use as white space; this number
4800        /// is capped at 10 (if it is greater, the value is just 10). Values less than
4801        /// 1 indicate that no space should be used. If this is a String, the string
4802        /// (or the first 10 characters of the string, if it's longer than that) is
4803        /// used as white space. If this parameter is not provided (or is null), no
4804        /// white space is used.
4805        ///
4806        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
4807        #[wasm_bindgen(catch, js_namespace = JSON, js_name = stringify)]
4808        pub fn stringify_with_replacer_and_space(
4809            obj: &JsValue,
4810            replacer: &JsValue,
4811            space: &JsValue,
4812        ) -> Result<JsString, JsValue>;
4813
4814    }
4815}
4816
4817// JsString
4818#[wasm_bindgen]
4819extern "C" {
4820    #[wasm_bindgen(js_name = String, extends = Object, is_type_of = JsValue::is_string, typescript_type = "string")]
4821    #[derive(Clone, PartialEq, Eq)]
4822    pub type JsString;
4823
4824    /// The length property of a String object indicates the length of a string,
4825    /// in UTF-16 code units.
4826    ///
4827    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length)
4828    #[wasm_bindgen(method, getter, structural)]
4829    pub fn length(this: &JsString) -> u32;
4830
4831    /// The 'at()' method returns a new string consisting of the single UTF-16
4832    /// code unit located at the specified offset into the string, counting from
4833    /// the end if it's negative.
4834    ///
4835    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/at)
4836    #[wasm_bindgen(method, js_class = "String")]
4837    pub fn at(this: &JsString, index: i32) -> Option<JsString>;
4838
4839    /// The String object's `charAt()` method returns a new string consisting of
4840    /// the single UTF-16 code unit located at the specified offset into the
4841    /// string.
4842    ///
4843    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt)
4844    #[wasm_bindgen(method, js_class = "String", js_name = charAt)]
4845    pub fn char_at(this: &JsString, index: u32) -> JsString;
4846
4847    /// The `charCodeAt()` method returns an integer between 0 and 65535
4848    /// representing the UTF-16 code unit at the given index (the UTF-16 code
4849    /// unit matches the Unicode code point for code points representable in a
4850    /// single UTF-16 code unit, but might also be the first code unit of a
4851    /// surrogate pair for code points not representable in a single UTF-16 code
4852    /// unit, e.g. Unicode code points > 0x10000).  If you want the entire code
4853    /// point value, use `codePointAt()`.
4854    ///
4855    /// Returns `NaN` if index is out of range.
4856    ///
4857    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)
4858    #[wasm_bindgen(method, js_class = "String", js_name = charCodeAt)]
4859    pub fn char_code_at(this: &JsString, index: u32) -> f64;
4860
4861    /// The `codePointAt()` method returns a non-negative integer that is the
4862    /// Unicode code point value.
4863    ///
4864    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt)
4865    #[wasm_bindgen(method, js_class = "String", js_name = codePointAt)]
4866    pub fn code_point_at(this: &JsString, pos: u32) -> JsValue;
4867
4868    /// The `concat()` method concatenates the string arguments to the calling
4869    /// string and returns a new string.
4870    ///
4871    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat)
4872    #[wasm_bindgen(method, js_class = "String")]
4873    pub fn concat(this: &JsString, string_2: &JsValue) -> JsString;
4874
4875    /// The `endsWith()` method determines whether a string ends with the characters of a
4876    /// specified string, returning true or false as appropriate.
4877    ///
4878    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith)
4879    #[wasm_bindgen(method, js_class = "String", js_name = endsWith)]
4880    pub fn ends_with(this: &JsString, search_string: &str, length: i32) -> bool;
4881
4882    /// The static `String.fromCharCode()` method returns a string created from
4883    /// the specified sequence of UTF-16 code units.
4884    ///
4885    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
4886    ///
4887    /// # Notes
4888    ///
4889    /// There are a few bindings to `from_char_code` in `js-sys`: `from_char_code1`, `from_char_code2`, etc...
4890    /// with different arities.
4891    ///
4892    /// Additionally, this function accepts `u16` for character codes, but
4893    /// fixing others requires a breaking change release
4894    /// (see https://github.com/rustwasm/wasm-bindgen/issues/1460 for details).
4895    #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode, variadic)]
4896    pub fn from_char_code(char_codes: &[u16]) -> JsString;
4897
4898    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
4899    #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
4900    pub fn from_char_code1(a: u32) -> JsString;
4901
4902    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
4903    #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
4904    pub fn from_char_code2(a: u32, b: u32) -> JsString;
4905
4906    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
4907    #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
4908    pub fn from_char_code3(a: u32, b: u32, c: u32) -> JsString;
4909
4910    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
4911    #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
4912    pub fn from_char_code4(a: u32, b: u32, c: u32, d: u32) -> JsString;
4913
4914    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
4915    #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
4916    pub fn from_char_code5(a: u32, b: u32, c: u32, d: u32, e: u32) -> JsString;
4917
4918    /// The static `String.fromCodePoint()` method returns a string created by
4919    /// using the specified sequence of code points.
4920    ///
4921    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
4922    ///
4923    /// # Exceptions
4924    ///
4925    /// A RangeError is thrown if an invalid Unicode code point is given
4926    ///
4927    /// # Notes
4928    ///
4929    /// There are a few bindings to `from_code_point` in `js-sys`: `from_code_point1`, `from_code_point2`, etc...
4930    /// with different arities.
4931    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint, variadic)]
4932    pub fn from_code_point(code_points: &[u32]) -> Result<JsString, JsValue>;
4933
4934    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
4935    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
4936    pub fn from_code_point1(a: u32) -> Result<JsString, JsValue>;
4937
4938    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
4939    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
4940    pub fn from_code_point2(a: u32, b: u32) -> Result<JsString, JsValue>;
4941
4942    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
4943    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
4944    pub fn from_code_point3(a: u32, b: u32, c: u32) -> Result<JsString, JsValue>;
4945
4946    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
4947    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
4948    pub fn from_code_point4(a: u32, b: u32, c: u32, d: u32) -> Result<JsString, JsValue>;
4949
4950    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
4951    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
4952    pub fn from_code_point5(a: u32, b: u32, c: u32, d: u32, e: u32) -> Result<JsString, JsValue>;
4953
4954    /// The `includes()` method determines whether one string may be found
4955    /// within another string, returning true or false as appropriate.
4956    ///
4957    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes)
4958    #[wasm_bindgen(method, js_class = "String")]
4959    pub fn includes(this: &JsString, search_string: &str, position: i32) -> bool;
4960
4961    /// The `indexOf()` method returns the index within the calling String
4962    /// object of the first occurrence of the specified value, starting the
4963    /// search at fromIndex.  Returns -1 if the value is not found.
4964    ///
4965    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)
4966    #[wasm_bindgen(method, js_class = "String", js_name = indexOf)]
4967    pub fn index_of(this: &JsString, search_value: &str, from_index: i32) -> i32;
4968
4969    /// The `lastIndexOf()` method returns the index within the calling String
4970    /// object of the last occurrence of the specified value, searching
4971    /// backwards from fromIndex.  Returns -1 if the value is not found.
4972    ///
4973    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf)
4974    #[wasm_bindgen(method, js_class = "String", js_name = lastIndexOf)]
4975    pub fn last_index_of(this: &JsString, search_value: &str, from_index: i32) -> i32;
4976
4977    /// The `localeCompare()` method returns a number indicating whether
4978    /// a reference string comes before or after or is the same as
4979    /// the given string in sort order.
4980    ///
4981    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
4982    #[wasm_bindgen(method, js_class = "String", js_name = localeCompare)]
4983    pub fn locale_compare(
4984        this: &JsString,
4985        compare_string: &str,
4986        locales: &Array,
4987        options: &Object,
4988    ) -> i32;
4989
4990    /// The `match()` method retrieves the matches when matching a string against a regular expression.
4991    ///
4992    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
4993    #[wasm_bindgen(method, js_class = "String", js_name = match)]
4994    pub fn match_(this: &JsString, pattern: &RegExp) -> Option<Object>;
4995
4996    /// The `match_all()` method is similar to `match()`, but gives an iterator of `exec()` arrays, which preserve capture groups.
4997    ///
4998    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll)
4999    #[wasm_bindgen(method, js_class = "String", js_name = matchAll)]
5000    pub fn match_all(this: &JsString, pattern: &RegExp) -> Iterator;
5001
5002    /// The `normalize()` method returns the Unicode Normalization Form
5003    /// of a given string (if the value isn't a string, it will be converted to one first).
5004    ///
5005    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)
5006    #[wasm_bindgen(method, js_class = "String")]
5007    pub fn normalize(this: &JsString, form: &str) -> JsString;
5008
5009    /// The `padEnd()` method pads the current string with a given string
5010    /// (repeated, if needed) so that the resulting string reaches a given
5011    /// length. The padding is applied from the end (right) of the current
5012    /// string.
5013    ///
5014    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd)
5015    #[wasm_bindgen(method, js_class = "String", js_name = padEnd)]
5016    pub fn pad_end(this: &JsString, target_length: u32, pad_string: &str) -> JsString;
5017
5018    /// The `padStart()` method pads the current string with another string
5019    /// (repeated, if needed) so that the resulting string reaches the given
5020    /// length. The padding is applied from the start (left) of the current
5021    /// string.
5022    ///
5023    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)
5024    #[wasm_bindgen(method, js_class = "String", js_name = padStart)]
5025    pub fn pad_start(this: &JsString, target_length: u32, pad_string: &str) -> JsString;
5026
5027    /// The `repeat()` method constructs and returns a new string which contains the specified
5028    /// number of copies of the string on which it was called, concatenated together.
5029    ///
5030    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)
5031    #[wasm_bindgen(method, js_class = "String")]
5032    pub fn repeat(this: &JsString, count: i32) -> JsString;
5033
5034    /// The `replace()` method returns a new string with some or all matches of a pattern
5035    /// replaced by a replacement. The pattern can be a string or a RegExp, and
5036    /// the replacement can be a string or a function to be called for each match.
5037    ///
5038    /// Note: The original string will remain unchanged.
5039    ///
5040    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
5041    #[wasm_bindgen(method, js_class = "String")]
5042    pub fn replace(this: &JsString, pattern: &str, replacement: &str) -> JsString;
5043
5044    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
5045    #[wasm_bindgen(method, js_class = "String", js_name = replace)]
5046    pub fn replace_with_function(
5047        this: &JsString,
5048        pattern: &str,
5049        replacement: &Function,
5050    ) -> JsString;
5051
5052    #[wasm_bindgen(method, js_class = "String", js_name = replace)]
5053    pub fn replace_by_pattern(this: &JsString, pattern: &RegExp, replacement: &str) -> JsString;
5054
5055    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
5056    #[wasm_bindgen(method, js_class = "String", js_name = replace)]
5057    pub fn replace_by_pattern_with_function(
5058        this: &JsString,
5059        pattern: &RegExp,
5060        replacement: &Function,
5061    ) -> JsString;
5062
5063    /// The `replace_all()` method returns a new string with all matches of a pattern
5064    /// replaced by a replacement. The pattern can be a string or a global RegExp, and
5065    /// the replacement can be a string or a function to be called for each match.
5066    ///
5067    /// Note: The original string will remain unchanged.
5068    ///
5069    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
5070    #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
5071    pub fn replace_all(this: &JsString, pattern: &str, replacement: &str) -> JsString;
5072
5073    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
5074    #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
5075    pub fn replace_all_with_function(
5076        this: &JsString,
5077        pattern: &str,
5078        replacement: &Function,
5079    ) -> JsString;
5080
5081    #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
5082    pub fn replace_all_by_pattern(this: &JsString, pattern: &RegExp, replacement: &str)
5083        -> JsString;
5084
5085    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
5086    #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
5087    pub fn replace_all_by_pattern_with_function(
5088        this: &JsString,
5089        pattern: &RegExp,
5090        replacement: &Function,
5091    ) -> JsString;
5092
5093    /// The `search()` method executes a search for a match between
5094    /// a regular expression and this String object.
5095    ///
5096    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search)
5097    #[wasm_bindgen(method, js_class = "String")]
5098    pub fn search(this: &JsString, pattern: &RegExp) -> i32;
5099
5100    /// The `slice()` method extracts a section of a string and returns it as a
5101    /// new string, without modifying the original string.
5102    ///
5103    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)
5104    #[wasm_bindgen(method, js_class = "String")]
5105    pub fn slice(this: &JsString, start: u32, end: u32) -> JsString;
5106
5107    /// The `split()` method splits a String object into an array of strings by separating the string
5108    /// into substrings, using a specified separator string to determine where to make each split.
5109    ///
5110    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
5111    #[wasm_bindgen(method, js_class = "String")]
5112    pub fn split(this: &JsString, separator: &str) -> Array;
5113
5114    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
5115    #[wasm_bindgen(method, js_class = "String", js_name = split)]
5116    pub fn split_limit(this: &JsString, separator: &str, limit: u32) -> Array;
5117
5118    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
5119    #[wasm_bindgen(method, js_class = "String", js_name = split)]
5120    pub fn split_by_pattern(this: &JsString, pattern: &RegExp) -> Array;
5121
5122    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
5123    #[wasm_bindgen(method, js_class = "String", js_name = split)]
5124    pub fn split_by_pattern_limit(this: &JsString, pattern: &RegExp, limit: u32) -> Array;
5125
5126    /// The `startsWith()` method determines whether a string begins with the
5127    /// characters of a specified string, returning true or false as
5128    /// appropriate.
5129    ///
5130    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)
5131    #[wasm_bindgen(method, js_class = "String", js_name = startsWith)]
5132    pub fn starts_with(this: &JsString, search_string: &str, position: u32) -> bool;
5133
5134    /// The `substring()` method returns the part of the string between the
5135    /// start and end indexes, or to the end of the string.
5136    ///
5137    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring)
5138    #[wasm_bindgen(method, js_class = "String")]
5139    pub fn substring(this: &JsString, index_start: u32, index_end: u32) -> JsString;
5140
5141    /// The `substr()` method returns the part of a string between
5142    /// the start index and a number of characters after it.
5143    ///
5144    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr)
5145    #[wasm_bindgen(method, js_class = "String")]
5146    pub fn substr(this: &JsString, start: i32, length: i32) -> JsString;
5147
5148    /// The `toLocaleLowerCase()` method returns the calling string value converted to lower case,
5149    /// according to any locale-specific case mappings.
5150    ///
5151    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase)
5152    #[wasm_bindgen(method, js_class = "String", js_name = toLocaleLowerCase)]
5153    pub fn to_locale_lower_case(this: &JsString, locale: Option<&str>) -> JsString;
5154
5155    /// The `toLocaleUpperCase()` method returns the calling string value converted to upper case,
5156    /// according to any locale-specific case mappings.
5157    ///
5158    /// [MDN documentation](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)
5159    #[wasm_bindgen(method, js_class = "String", js_name = toLocaleUpperCase)]
5160    pub fn to_locale_upper_case(this: &JsString, locale: Option<&str>) -> JsString;
5161
5162    /// The `toLowerCase()` method returns the calling string value
5163    /// converted to lower case.
5164    ///
5165    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)
5166    #[wasm_bindgen(method, js_class = "String", js_name = toLowerCase)]
5167    pub fn to_lower_case(this: &JsString) -> JsString;
5168
5169    /// The `toString()` method returns a string representing the specified
5170    /// object.
5171    ///
5172    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toString)
5173    #[wasm_bindgen(method, js_class = "String", js_name = toString)]
5174    pub fn to_string(this: &JsString) -> JsString;
5175
5176    /// The `toUpperCase()` method returns the calling string value converted to
5177    /// uppercase (the value will be converted to a string if it isn't one).
5178    ///
5179    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)
5180    #[wasm_bindgen(method, js_class = "String", js_name = toUpperCase)]
5181    pub fn to_upper_case(this: &JsString) -> JsString;
5182
5183    /// The `trim()` method removes whitespace from both ends of a string.
5184    /// Whitespace in this context is all the whitespace characters (space, tab,
5185    /// no-break space, etc.) and all the line terminator characters (LF, CR,
5186    /// etc.).
5187    ///
5188    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim)
5189    #[wasm_bindgen(method, js_class = "String")]
5190    pub fn trim(this: &JsString) -> JsString;
5191
5192    /// The `trimEnd()` method removes whitespace from the end of a string.
5193    /// `trimRight()` is an alias of this method.
5194    ///
5195    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimEnd)
5196    #[wasm_bindgen(method, js_class = "String", js_name = trimEnd)]
5197    pub fn trim_end(this: &JsString) -> JsString;
5198
5199    /// The `trimEnd()` method removes whitespace from the end of a string.
5200    /// `trimRight()` is an alias of this method.
5201    ///
5202    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimEnd)
5203    #[wasm_bindgen(method, js_class = "String", js_name = trimRight)]
5204    pub fn trim_right(this: &JsString) -> JsString;
5205
5206    /// The `trimStart()` method removes whitespace from the beginning of a
5207    /// string. `trimLeft()` is an alias of this method.
5208    ///
5209    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimStart)
5210    #[wasm_bindgen(method, js_class = "String", js_name = trimStart)]
5211    pub fn trim_start(this: &JsString) -> JsString;
5212
5213    /// The `trimStart()` method removes whitespace from the beginning of a
5214    /// string. `trimLeft()` is an alias of this method.
5215    ///
5216    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimStart)
5217    #[wasm_bindgen(method, js_class = "String", js_name = trimLeft)]
5218    pub fn trim_left(this: &JsString) -> JsString;
5219
5220    /// The `valueOf()` method returns the primitive value of a `String` object.
5221    ///
5222    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/valueOf)
5223    #[wasm_bindgen(method, js_class = "String", js_name = valueOf)]
5224    pub fn value_of(this: &JsString) -> JsString;
5225
5226    /// The static `raw()` method is a tag function of template literals,
5227    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5228    ///
5229    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5230    #[wasm_bindgen(catch, variadic, static_method_of = JsString, js_class = "String")]
5231    pub fn raw(call_site: &Object, substitutions: &Array) -> Result<JsString, JsValue>;
5232
5233    /// The static `raw()` method is a tag function of template literals,
5234    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5235    ///
5236    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5237    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5238    pub fn raw_0(call_site: &Object) -> Result<JsString, JsValue>;
5239
5240    /// The static `raw()` method is a tag function of template literals,
5241    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5242    ///
5243    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5244    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5245    pub fn raw_1(call_site: &Object, substitutions_1: &str) -> Result<JsString, JsValue>;
5246
5247    /// The static `raw()` method is a tag function of template literals,
5248    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5249    ///
5250    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5251    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5252    pub fn raw_2(
5253        call_site: &Object,
5254        substitutions_1: &str,
5255        substitutions_2: &str,
5256    ) -> Result<JsString, JsValue>;
5257
5258    /// The static `raw()` method is a tag function of template literals,
5259    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5260    ///
5261    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5262    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5263    pub fn raw_3(
5264        call_site: &Object,
5265        substitutions_1: &str,
5266        substitutions_2: &str,
5267        substitutions_3: &str,
5268    ) -> Result<JsString, JsValue>;
5269
5270    /// The static `raw()` method is a tag function of template literals,
5271    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5272    ///
5273    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5274    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5275    pub fn raw_4(
5276        call_site: &Object,
5277        substitutions_1: &str,
5278        substitutions_2: &str,
5279        substitutions_3: &str,
5280        substitutions_4: &str,
5281    ) -> Result<JsString, JsValue>;
5282
5283    /// The static `raw()` method is a tag function of template literals,
5284    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5285    ///
5286    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5287    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5288    pub fn raw_5(
5289        call_site: &Object,
5290        substitutions_1: &str,
5291        substitutions_2: &str,
5292        substitutions_3: &str,
5293        substitutions_4: &str,
5294        substitutions_5: &str,
5295    ) -> Result<JsString, JsValue>;
5296
5297    /// The static `raw()` method is a tag function of template literals,
5298    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5299    ///
5300    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5301    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5302    pub fn raw_6(
5303        call_site: &Object,
5304        substitutions_1: &str,
5305        substitutions_2: &str,
5306        substitutions_3: &str,
5307        substitutions_4: &str,
5308        substitutions_5: &str,
5309        substitutions_6: &str,
5310    ) -> Result<JsString, JsValue>;
5311
5312    /// The static `raw()` method is a tag function of template literals,
5313    /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
5314    ///
5315    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
5316    #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
5317    pub fn raw_7(
5318        call_site: &Object,
5319        substitutions_1: &str,
5320        substitutions_2: &str,
5321        substitutions_3: &str,
5322        substitutions_4: &str,
5323        substitutions_5: &str,
5324        substitutions_6: &str,
5325        substitutions_7: &str,
5326    ) -> Result<JsString, JsValue>;
5327}
5328
5329impl JsString {
5330    /// Returns the `JsString` value of this JS value if it's an instance of a
5331    /// string.
5332    ///
5333    /// If this JS value is not an instance of a string then this returns
5334    /// `None`.
5335    #[deprecated(note = "recommended to use dyn_ref instead which is now equivalent")]
5336    pub fn try_from(val: &JsValue) -> Option<&JsString> {
5337        val.dyn_ref()
5338    }
5339
5340    /// Returns whether this string is a valid UTF-16 string.
5341    ///
5342    /// This is useful for learning whether `String::from(..)` will return a
5343    /// lossless representation of the JS string. If this string contains
5344    /// unpaired surrogates then `String::from` will succeed but it will be a
5345    /// lossy representation of the JS string because unpaired surrogates will
5346    /// become replacement characters.
5347    ///
5348    /// If this function returns `false` then to get a lossless representation
5349    /// of the string you'll need to manually use the `iter` method (or the
5350    /// `char_code_at` accessor) to view the raw character codes.
5351    ///
5352    /// For more information, see the documentation on [JS strings vs Rust
5353    /// strings][docs]
5354    ///
5355    /// [docs]: https://rustwasm.github.io/docs/wasm-bindgen/reference/types/str.html
5356    pub fn is_valid_utf16(&self) -> bool {
5357        core::char::decode_utf16(self.iter()).all(|i| i.is_ok())
5358    }
5359
5360    /// Returns an iterator over the `u16` character codes that make up this JS
5361    /// string.
5362    ///
5363    /// This method will call `char_code_at` for each code in this JS string,
5364    /// returning an iterator of the codes in sequence.
5365    pub fn iter(
5366        &self,
5367    ) -> impl ExactSizeIterator<Item = u16> + DoubleEndedIterator<Item = u16> + '_ {
5368        (0..self.length()).map(move |i| self.char_code_at(i) as u16)
5369    }
5370
5371    /// If this string consists of a single Unicode code point, then this method
5372    /// converts it into a Rust `char` without doing any allocations.
5373    ///
5374    /// If this JS value is not a valid UTF-8 or consists of more than a single
5375    /// codepoint, then this returns `None`.
5376    ///
5377    /// Note that a single Unicode code point might be represented as more than
5378    /// one code unit on the JavaScript side. For example, a JavaScript string
5379    /// `"\uD801\uDC37"` is actually a single Unicode code point U+10437 which
5380    /// corresponds to a character '𐐷'.
5381    pub fn as_char(&self) -> Option<char> {
5382        let len = self.length();
5383
5384        if len == 0 || len > 2 {
5385            return None;
5386        }
5387
5388        // This will be simplified when definitions are fixed:
5389        // https://github.com/rustwasm/wasm-bindgen/issues/1362
5390        let cp = self.code_point_at(0).as_f64().unwrap_throw() as u32;
5391
5392        let c = core::char::from_u32(cp)?;
5393
5394        if c.len_utf16() as u32 == len {
5395            Some(c)
5396        } else {
5397            None
5398        }
5399    }
5400}
5401
5402impl PartialEq<str> for JsString {
5403    #[allow(clippy::cmp_owned)] // prevent infinite recursion
5404    fn eq(&self, other: &str) -> bool {
5405        String::from(self) == other
5406    }
5407}
5408
5409impl<'a> PartialEq<&'a str> for JsString {
5410    fn eq(&self, other: &&'a str) -> bool {
5411        <JsString as PartialEq<str>>::eq(self, other)
5412    }
5413}
5414
5415impl PartialEq<String> for JsString {
5416    fn eq(&self, other: &String) -> bool {
5417        <JsString as PartialEq<str>>::eq(self, other)
5418    }
5419}
5420
5421impl<'a> PartialEq<&'a String> for JsString {
5422    fn eq(&self, other: &&'a String) -> bool {
5423        <JsString as PartialEq<str>>::eq(self, other)
5424    }
5425}
5426
5427impl<'a> From<&'a str> for JsString {
5428    fn from(s: &'a str) -> Self {
5429        JsString::unchecked_from_js(JsValue::from_str(s))
5430    }
5431}
5432
5433impl From<String> for JsString {
5434    fn from(s: String) -> Self {
5435        From::from(&*s)
5436    }
5437}
5438
5439impl From<char> for JsString {
5440    #[inline]
5441    fn from(c: char) -> Self {
5442        JsString::from_code_point1(c as u32).unwrap_throw()
5443    }
5444}
5445
5446impl<'a> From<&'a JsString> for String {
5447    fn from(s: &'a JsString) -> Self {
5448        s.obj.as_string().unwrap_throw()
5449    }
5450}
5451
5452impl From<JsString> for String {
5453    fn from(s: JsString) -> Self {
5454        From::from(&s)
5455    }
5456}
5457
5458impl fmt::Debug for JsString {
5459    #[inline]
5460    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
5461        fmt::Debug::fmt(&String::from(self), f)
5462    }
5463}
5464
5465impl fmt::Display for JsString {
5466    #[inline]
5467    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
5468        fmt::Display::fmt(&String::from(self), f)
5469    }
5470}
5471
5472impl str::FromStr for JsString {
5473    type Err = convert::Infallible;
5474    fn from_str(s: &str) -> Result<Self, Self::Err> {
5475        Ok(JsString::from(s))
5476    }
5477}
5478
5479// Symbol
5480#[wasm_bindgen]
5481extern "C" {
5482    #[wasm_bindgen(is_type_of = JsValue::is_symbol, typescript_type = "Symbol")]
5483    #[derive(Clone, Debug)]
5484    pub type Symbol;
5485
5486    /// The `Symbol.hasInstance` well-known symbol is used to determine
5487    /// if a constructor object recognizes an object as its instance.
5488    /// The `instanceof` operator's behavior can be customized by this symbol.
5489    ///
5490    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance)
5491    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = hasInstance)]
5492    pub fn has_instance() -> Symbol;
5493
5494    /// The `Symbol.isConcatSpreadable` well-known symbol is used to configure
5495    /// if an object should be flattened to its array elements when using the
5496    /// `Array.prototype.concat()` method.
5497    ///
5498    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable)
5499    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = isConcatSpreadable)]
5500    pub fn is_concat_spreadable() -> Symbol;
5501
5502    /// The `Symbol.asyncIterator` well-known symbol specifies the default AsyncIterator for an object.
5503    /// If this property is set on an object, it is an async iterable and can be used in a `for await...of` loop.
5504    ///
5505    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator)
5506    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = asyncIterator)]
5507    pub fn async_iterator() -> Symbol;
5508
5509    /// The `Symbol.iterator` well-known symbol specifies the default iterator
5510    /// for an object.  Used by `for...of`.
5511    ///
5512    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator)
5513    #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
5514    pub fn iterator() -> Symbol;
5515
5516    /// The `Symbol.match` well-known symbol specifies the matching of a regular
5517    /// expression against a string. This function is called by the
5518    /// `String.prototype.match()` method.
5519    ///
5520    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/match)
5521    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = match)]
5522    pub fn match_() -> Symbol;
5523
5524    /// The `Symbol.replace` well-known symbol specifies the method that
5525    /// replaces matched substrings of a string.  This function is called by the
5526    /// `String.prototype.replace()` method.
5527    ///
5528    /// For more information, see `RegExp.prototype[@@replace]()` and
5529    /// `String.prototype.replace()`.
5530    ///
5531    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace)
5532    #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
5533    pub fn replace() -> Symbol;
5534
5535    /// The `Symbol.search` well-known symbol specifies the method that returns
5536    /// the index within a string that matches the regular expression.  This
5537    /// function is called by the `String.prototype.search()` method.
5538    ///
5539    /// For more information, see `RegExp.prototype[@@search]()` and
5540    /// `String.prototype.search()`.
5541    ///
5542    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/search)
5543    #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
5544    pub fn search() -> Symbol;
5545
5546    /// The well-known symbol `Symbol.species` specifies a function-valued
5547    /// property that the constructor function uses to create derived objects.
5548    ///
5549    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species)
5550    #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
5551    pub fn species() -> Symbol;
5552
5553    /// The `Symbol.split` well-known symbol specifies the method that splits a
5554    /// string at the indices that match a regular expression.  This function is
5555    /// called by the `String.prototype.split()` method.
5556    ///
5557    /// For more information, see `RegExp.prototype[@@split]()` and
5558    /// `String.prototype.split()`.
5559    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/split)
5560    #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
5561    pub fn split() -> Symbol;
5562
5563    /// The `Symbol.toPrimitive` is a symbol that specifies a function valued
5564    /// property that is called to convert an object to a corresponding
5565    /// primitive value.
5566    ///
5567    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive)
5568    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = toPrimitive)]
5569    pub fn to_primitive() -> Symbol;
5570
5571    /// The `Symbol.toStringTag` well-known symbol is a string valued property
5572    /// that is used in the creation of the default string description of an
5573    /// object.  It is accessed internally by the `Object.prototype.toString()`
5574    /// method.
5575    ///
5576    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toString)
5577    #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = toStringTag)]
5578    pub fn to_string_tag() -> Symbol;
5579
5580    /// The `Symbol.for(key)` method searches for existing symbols in a runtime-wide symbol registry with
5581    /// the given key and returns it if found.
5582    /// Otherwise a new symbol gets created in the global symbol registry with this key.
5583    ///
5584    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for)
5585    #[wasm_bindgen(static_method_of = Symbol, js_name = for)]
5586    pub fn for_(key: &str) -> Symbol;
5587
5588    /// The `Symbol.keyFor(sym)` method retrieves a shared symbol key from the global symbol registry for the given symbol.
5589    ///
5590    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/keyFor)
5591    #[wasm_bindgen(static_method_of = Symbol, js_name = keyFor)]
5592    pub fn key_for(sym: &Symbol) -> JsValue;
5593
5594    /// The `toString()` method returns a string representing the specified Symbol object.
5595    ///
5596    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toString)
5597    #[wasm_bindgen(method, js_name = toString)]
5598    pub fn to_string(this: &Symbol) -> JsString;
5599
5600    /// The `Symbol.unscopables` well-known symbol is used to specify an object
5601    /// value of whose own and inherited property names are excluded from the
5602    /// with environment bindings of the associated object.
5603    ///
5604    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/unscopables)
5605    #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
5606    pub fn unscopables() -> Symbol;
5607
5608    /// The `valueOf()` method returns the primitive value of a Symbol object.
5609    ///
5610    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/valueOf)
5611    #[wasm_bindgen(method, js_name = valueOf)]
5612    pub fn value_of(this: &Symbol) -> Symbol;
5613}
5614
5615#[allow(non_snake_case)]
5616pub mod Intl {
5617    use super::*;
5618
5619    // Intl
5620    #[wasm_bindgen]
5621    extern "C" {
5622        /// The `Intl.getCanonicalLocales()` method returns an array containing
5623        /// the canonical locale names. Duplicates will be omitted and elements
5624        /// will be validated as structurally valid language tags.
5625        ///
5626        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/getCanonicalLocales)
5627        #[wasm_bindgen(js_name = getCanonicalLocales, js_namespace = Intl)]
5628        pub fn get_canonical_locales(s: &JsValue) -> Array;
5629    }
5630
5631    // Intl.Collator
5632    #[wasm_bindgen]
5633    extern "C" {
5634        /// The `Intl.Collator` object is a constructor for collators, objects
5635        /// that enable language sensitive string comparison.
5636        ///
5637        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator)
5638        #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.Collator")]
5639        #[derive(Clone, Debug)]
5640        pub type Collator;
5641
5642        /// The `Intl.Collator` object is a constructor for collators, objects
5643        /// that enable language sensitive string comparison.
5644        ///
5645        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator)
5646        #[wasm_bindgen(constructor, js_namespace = Intl)]
5647        pub fn new(locales: &Array, options: &Object) -> Collator;
5648
5649        /// The Intl.Collator.prototype.compare property returns a function that
5650        /// compares two strings according to the sort order of this Collator
5651        /// object.
5652        ///
5653        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/compare)
5654        #[wasm_bindgen(method, getter, js_class = "Intl.Collator")]
5655        pub fn compare(this: &Collator) -> Function;
5656
5657        /// The `Intl.Collator.prototype.resolvedOptions()` method returns a new
5658        /// object with properties reflecting the locale and collation options
5659        /// computed during initialization of this Collator object.
5660        ///
5661        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/resolvedOptions)
5662        #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
5663        pub fn resolved_options(this: &Collator) -> Object;
5664
5665        /// The `Intl.Collator.supportedLocalesOf()` method returns an array
5666        /// containing those of the provided locales that are supported in
5667        /// collation without having to fall back to the runtime's default
5668        /// locale.
5669        ///
5670        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/supportedLocalesOf)
5671        #[wasm_bindgen(static_method_of = Collator, js_namespace = Intl, js_name = supportedLocalesOf)]
5672        pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
5673    }
5674
5675    impl Default for Collator {
5676        fn default() -> Self {
5677            Self::new(
5678                &JsValue::UNDEFINED.unchecked_into(),
5679                &JsValue::UNDEFINED.unchecked_into(),
5680            )
5681        }
5682    }
5683
5684    // Intl.DateTimeFormat
5685    #[wasm_bindgen]
5686    extern "C" {
5687        /// The `Intl.DateTimeFormat` object is a constructor for objects
5688        /// that enable language-sensitive date and time formatting.
5689        ///
5690        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat)
5691        #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.DateTimeFormat")]
5692        #[derive(Clone, Debug)]
5693        pub type DateTimeFormat;
5694
5695        /// The `Intl.DateTimeFormat` object is a constructor for objects
5696        /// that enable language-sensitive date and time formatting.
5697        ///
5698        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat)
5699        #[wasm_bindgen(constructor, js_namespace = Intl)]
5700        pub fn new(locales: &Array, options: &Object) -> DateTimeFormat;
5701
5702        /// The Intl.DateTimeFormat.prototype.format property returns a getter function that
5703        /// formats a date according to the locale and formatting options of this
5704        /// Intl.DateTimeFormat object.
5705        ///
5706        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/format)
5707        #[wasm_bindgen(method, getter, js_class = "Intl.DateTimeFormat")]
5708        pub fn format(this: &DateTimeFormat) -> Function;
5709
5710        /// The `Intl.DateTimeFormat.prototype.formatToParts()` method allows locale-aware
5711        /// formatting of strings produced by DateTimeFormat formatters.
5712        ///
5713        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts)
5714        #[wasm_bindgen(method, js_class = "Intl.DateTimeFormat", js_name = formatToParts)]
5715        pub fn format_to_parts(this: &DateTimeFormat, date: &Date) -> Array;
5716
5717        /// The `Intl.DateTimeFormat.prototype.resolvedOptions()` method returns a new
5718        /// object with properties reflecting the locale and date and time formatting
5719        /// options computed during initialization of this DateTimeFormat object.
5720        ///
5721        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions)
5722        #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
5723        pub fn resolved_options(this: &DateTimeFormat) -> Object;
5724
5725        /// The `Intl.DateTimeFormat.supportedLocalesOf()` method returns an array
5726        /// containing those of the provided locales that are supported in date
5727        /// and time formatting without having to fall back to the runtime's default
5728        /// locale.
5729        ///
5730        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/supportedLocalesOf)
5731        #[wasm_bindgen(static_method_of = DateTimeFormat, js_namespace = Intl, js_name = supportedLocalesOf)]
5732        pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
5733    }
5734
5735    impl Default for DateTimeFormat {
5736        fn default() -> Self {
5737            Self::new(
5738                &JsValue::UNDEFINED.unchecked_into(),
5739                &JsValue::UNDEFINED.unchecked_into(),
5740            )
5741        }
5742    }
5743
5744    // Intl.NumberFormat
5745    #[wasm_bindgen]
5746    extern "C" {
5747        /// The `Intl.NumberFormat` object is a constructor for objects
5748        /// that enable language sensitive number formatting.
5749        ///
5750        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat)
5751        #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.NumberFormat")]
5752        #[derive(Clone, Debug)]
5753        pub type NumberFormat;
5754
5755        /// The `Intl.NumberFormat` object is a constructor for objects
5756        /// that enable language sensitive number formatting.
5757        ///
5758        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat)
5759        #[wasm_bindgen(constructor, js_namespace = Intl)]
5760        pub fn new(locales: &Array, options: &Object) -> NumberFormat;
5761
5762        /// The Intl.NumberFormat.prototype.format property returns a getter function that
5763        /// formats a number according to the locale and formatting options of this
5764        /// NumberFormat object.
5765        ///
5766        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/format)
5767        #[wasm_bindgen(method, getter, js_class = "Intl.NumberFormat")]
5768        pub fn format(this: &NumberFormat) -> Function;
5769
5770        /// The `Intl.Numberformat.prototype.formatToParts()` method allows locale-aware
5771        /// formatting of strings produced by NumberTimeFormat formatters.
5772        ///
5773        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/formatToParts)
5774        #[wasm_bindgen(method, js_class = "Intl.NumberFormat", js_name = formatToParts)]
5775        pub fn format_to_parts(this: &NumberFormat, number: f64) -> Array;
5776
5777        /// The `Intl.NumberFormat.prototype.resolvedOptions()` method returns a new
5778        /// object with properties reflecting the locale and number formatting
5779        /// options computed during initialization of this NumberFormat object.
5780        ///
5781        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/resolvedOptions)
5782        #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
5783        pub fn resolved_options(this: &NumberFormat) -> Object;
5784
5785        /// The `Intl.NumberFormat.supportedLocalesOf()` method returns an array
5786        /// containing those of the provided locales that are supported in number
5787        /// formatting without having to fall back to the runtime's default locale.
5788        ///
5789        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/supportedLocalesOf)
5790        #[wasm_bindgen(static_method_of = NumberFormat, js_namespace = Intl, js_name = supportedLocalesOf)]
5791        pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
5792    }
5793
5794    impl Default for NumberFormat {
5795        fn default() -> Self {
5796            Self::new(
5797                &JsValue::UNDEFINED.unchecked_into(),
5798                &JsValue::UNDEFINED.unchecked_into(),
5799            )
5800        }
5801    }
5802
5803    // Intl.PluralRules
5804    #[wasm_bindgen]
5805    extern "C" {
5806        /// The `Intl.PluralRules` object is a constructor for objects
5807        /// that enable plural sensitive formatting and plural language rules.
5808        ///
5809        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules)
5810        #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.PluralRules")]
5811        #[derive(Clone, Debug)]
5812        pub type PluralRules;
5813
5814        /// The `Intl.PluralRules` object is a constructor for objects
5815        /// that enable plural sensitive formatting and plural language rules.
5816        ///
5817        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules)
5818        #[wasm_bindgen(constructor, js_namespace = Intl)]
5819        pub fn new(locales: &Array, options: &Object) -> PluralRules;
5820
5821        /// The `Intl.PluralRules.prototype.resolvedOptions()` method returns a new
5822        /// object with properties reflecting the locale and plural formatting
5823        /// options computed during initialization of this PluralRules object.
5824        ///
5825        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/resolvedOptions)
5826        #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
5827        pub fn resolved_options(this: &PluralRules) -> Object;
5828
5829        /// The `Intl.PluralRules.prototype.select()` method returns a String indicating
5830        /// which plural rule to use for locale-aware formatting.
5831        ///
5832        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/select)
5833        #[wasm_bindgen(method, js_namespace = Intl)]
5834        pub fn select(this: &PluralRules, number: f64) -> JsString;
5835
5836        /// The `Intl.PluralRules.supportedLocalesOf()` method returns an array
5837        /// containing those of the provided locales that are supported in plural
5838        /// formatting without having to fall back to the runtime's default locale.
5839        ///
5840        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/supportedLocalesOf)
5841        #[wasm_bindgen(static_method_of = PluralRules, js_namespace = Intl, js_name = supportedLocalesOf)]
5842        pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
5843    }
5844
5845    impl Default for PluralRules {
5846        fn default() -> Self {
5847            Self::new(
5848                &JsValue::UNDEFINED.unchecked_into(),
5849                &JsValue::UNDEFINED.unchecked_into(),
5850            )
5851        }
5852    }
5853
5854    // Intl.RelativeTimeFormat
5855    #[wasm_bindgen]
5856    extern "C" {
5857        /// The `Intl.RelativeTimeFormat` object is a constructor for objects
5858        /// that enable language-sensitive relative time formatting.
5859        ///
5860        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat)
5861        #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.RelativeTimeFormat")]
5862        #[derive(Clone, Debug)]
5863        pub type RelativeTimeFormat;
5864
5865        /// The `Intl.RelativeTimeFormat` object is a constructor for objects
5866        /// that enable language-sensitive relative time formatting.
5867        ///
5868        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat)
5869        #[wasm_bindgen(constructor, js_namespace = Intl)]
5870        pub fn new(locales: &Array, options: &Object) -> RelativeTimeFormat;
5871
5872        /// The `Intl.RelativeTimeFormat.prototype.format` method formats a `value` and `unit`
5873        /// according to the locale and formatting options of this Intl.RelativeTimeFormat object.
5874        ///
5875        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/format)
5876        #[wasm_bindgen(method, js_class = "Intl.RelativeTimeFormat")]
5877        pub fn format(this: &RelativeTimeFormat, value: f64, unit: &str) -> JsString;
5878
5879        /// The `Intl.RelativeTimeFormat.prototype.formatToParts()` method returns an array of
5880        /// objects representing the relative time format in parts that can be used for custom locale-aware formatting.
5881        ///
5882        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/formatToParts)
5883        #[wasm_bindgen(method, js_class = "Intl.RelativeTimeFormat", js_name = formatToParts)]
5884        pub fn format_to_parts(this: &RelativeTimeFormat, value: f64, unit: &str) -> Array;
5885
5886        /// The `Intl.RelativeTimeFormat.prototype.resolvedOptions()` method returns a new
5887        /// object with properties reflecting the locale and relative time formatting
5888        /// options computed during initialization of this RelativeTimeFormat object.
5889        ///
5890        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/resolvedOptions)
5891        #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
5892        pub fn resolved_options(this: &RelativeTimeFormat) -> Object;
5893
5894        /// The `Intl.RelativeTimeFormat.supportedLocalesOf()` method returns an array
5895        /// containing those of the provided locales that are supported in date and time
5896        /// formatting without having to fall back to the runtime's default locale.
5897        ///
5898        /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat/supportedLocalesOf)
5899        #[wasm_bindgen(static_method_of = RelativeTimeFormat, js_namespace = Intl, js_name = supportedLocalesOf)]
5900        pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
5901    }
5902
5903    impl Default for RelativeTimeFormat {
5904        fn default() -> Self {
5905            Self::new(
5906                &JsValue::UNDEFINED.unchecked_into(),
5907                &JsValue::UNDEFINED.unchecked_into(),
5908            )
5909        }
5910    }
5911}
5912
5913// Promise
5914#[wasm_bindgen]
5915extern "C" {
5916    /// The `Promise` object represents the eventual completion (or failure) of
5917    /// an asynchronous operation, and its resulting value.
5918    ///
5919    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
5920    #[must_use]
5921    #[wasm_bindgen(extends = Object, typescript_type = "Promise<any>")]
5922    #[derive(Clone, Debug)]
5923    pub type Promise;
5924
5925    /// Creates a new `Promise` with the provided executor `cb`
5926    ///
5927    /// The `cb` is a function that is passed with the arguments `resolve` and
5928    /// `reject`. The `cb` function is executed immediately by the `Promise`
5929    /// implementation, passing `resolve` and `reject` functions (the executor
5930    /// is called before the `Promise` constructor even returns the created
5931    /// object). The `resolve` and `reject` functions, when called, resolve or
5932    /// reject the promise, respectively. The executor normally initiates
5933    /// some asynchronous work, and then, once that completes, either calls
5934    /// the `resolve` function to resolve the promise or else rejects it if an
5935    /// error occurred.
5936    ///
5937    /// If an error is thrown in the executor function, the promise is rejected.
5938    /// The return value of the executor is ignored.
5939    ///
5940    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
5941    #[wasm_bindgen(constructor)]
5942    pub fn new(cb: &mut dyn FnMut(Function, Function)) -> Promise;
5943
5944    /// The `Promise.all(iterable)` method returns a single `Promise` that
5945    /// resolves when all of the promises in the iterable argument have resolved
5946    /// or when the iterable argument contains no promises. It rejects with the
5947    /// reason of the first promise that rejects.
5948    ///
5949    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)
5950    #[wasm_bindgen(static_method_of = Promise)]
5951    pub fn all(obj: &JsValue) -> Promise;
5952
5953    /// The `Promise.allSettled(iterable)` method returns a single `Promise` that
5954    /// resolves when all of the promises in the iterable argument have either
5955    /// fulfilled or rejected or when the iterable argument contains no promises.
5956    ///
5957    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled)
5958    #[wasm_bindgen(static_method_of = Promise, js_name = allSettled)]
5959    pub fn all_settled(obj: &JsValue) -> Promise;
5960
5961    /// The `Promise.any(iterable)` method returns a single `Promise` that
5962    /// resolves when any of the promises in the iterable argument have resolved
5963    /// or when the iterable argument contains no promises. It rejects with an
5964    /// `AggregateError` if all promises in the iterable rejected.
5965    ///
5966    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any)
5967    #[wasm_bindgen(static_method_of = Promise)]
5968    pub fn any(obj: &JsValue) -> Promise;
5969
5970    /// The `Promise.race(iterable)` method returns a promise that resolves or
5971    /// rejects as soon as one of the promises in the iterable resolves or
5972    /// rejects, with the value or reason from that promise.
5973    ///
5974    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race)
5975    #[wasm_bindgen(static_method_of = Promise)]
5976    pub fn race(obj: &JsValue) -> Promise;
5977
5978    /// The `Promise.reject(reason)` method returns a `Promise` object that is
5979    /// rejected with the given reason.
5980    ///
5981    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject)
5982    #[wasm_bindgen(static_method_of = Promise)]
5983    pub fn reject(obj: &JsValue) -> Promise;
5984
5985    /// The `Promise.resolve(value)` method returns a `Promise` object that is
5986    /// resolved with the given value. If the value is a promise, that promise
5987    /// is returned; if the value is a thenable (i.e. has a "then" method), the
5988    /// returned promise will "follow" that thenable, adopting its eventual
5989    /// state; otherwise the returned promise will be fulfilled with the value.
5990    ///
5991    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve)
5992    #[wasm_bindgen(static_method_of = Promise)]
5993    pub fn resolve(obj: &JsValue) -> Promise;
5994
5995    /// The `catch()` method returns a `Promise` and deals with rejected cases
5996    /// only.  It behaves the same as calling `Promise.prototype.then(undefined,
5997    /// onRejected)` (in fact, calling `obj.catch(onRejected)` internally calls
5998    /// `obj.then(undefined, onRejected)`).
5999    ///
6000    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)
6001    #[wasm_bindgen(method)]
6002    pub fn catch(this: &Promise, cb: &Closure<dyn FnMut(JsValue)>) -> Promise;
6003
6004    /// The `then()` method returns a `Promise`. It takes up to two arguments:
6005    /// callback functions for the success and failure cases of the `Promise`.
6006    ///
6007    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then)
6008    #[wasm_bindgen(method)]
6009    pub fn then(this: &Promise, cb: &Closure<dyn FnMut(JsValue)>) -> Promise;
6010
6011    /// Same as `then`, only with both arguments provided.
6012    #[wasm_bindgen(method, js_name = then)]
6013    pub fn then2(
6014        this: &Promise,
6015        resolve: &Closure<dyn FnMut(JsValue)>,
6016        reject: &Closure<dyn FnMut(JsValue)>,
6017    ) -> Promise;
6018
6019    /// The `finally()` method returns a `Promise`. When the promise is settled,
6020    /// whether fulfilled or rejected, the specified callback function is
6021    /// executed. This provides a way for code that must be executed once the
6022    /// `Promise` has been dealt with to be run whether the promise was
6023    /// fulfilled successfully or rejected.
6024    ///
6025    /// This lets you avoid duplicating code in both the promise's `then()` and
6026    /// `catch()` handlers.
6027    ///
6028    /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally)
6029    #[wasm_bindgen(method)]
6030    pub fn finally(this: &Promise, cb: &Closure<dyn FnMut()>) -> Promise;
6031}
6032
6033/// Returns a handle to the global scope object.
6034///
6035/// This allows access to the global properties and global names by accessing
6036/// the `Object` returned.
6037pub fn global() -> Object {
6038    use once_cell::unsync::Lazy;
6039
6040    struct Wrapper<T>(Lazy<T>);
6041
6042    #[cfg(not(target_feature = "atomics"))]
6043    unsafe impl<T> Sync for Wrapper<T> {}
6044
6045    #[cfg(not(target_feature = "atomics"))]
6046    unsafe impl<T> Send for Wrapper<T> {}
6047
6048    #[cfg_attr(target_feature = "atomics", thread_local)]
6049    static GLOBAL: Wrapper<Object> = Wrapper(Lazy::new(get_global_object));
6050
6051    return GLOBAL.0.clone();
6052
6053    fn get_global_object() -> Object {
6054        // Accessing the global object is not an easy thing to do, and what we
6055        // basically want is `globalThis` but we can't rely on that existing
6056        // everywhere. In the meantime we've got the fallbacks mentioned in:
6057        //
6058        // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis
6059        //
6060        // Note that this is pretty heavy code-size wise but it at least gets
6061        // the job largely done for now and avoids the `Function` constructor at
6062        // the end which triggers CSP errors.
6063        #[wasm_bindgen]
6064        extern "C" {
6065            type Global;
6066
6067            #[wasm_bindgen(thread_local_v2, js_name = globalThis)]
6068            static GLOBAL_THIS: Option<Object>;
6069
6070            #[wasm_bindgen(thread_local_v2, js_name = self)]
6071            static SELF: Option<Object>;
6072
6073            #[wasm_bindgen(thread_local_v2, js_name = window)]
6074            static WINDOW: Option<Object>;
6075
6076            #[wasm_bindgen(thread_local_v2, js_name = global)]
6077            static GLOBAL: Option<Object>;
6078        }
6079
6080        // The order is important: in Firefox Extension Content Scripts `globalThis`
6081        // is a Sandbox (not Window), so `globalThis` must be checked after `window`.
6082        let static_object = SELF
6083            .with(Option::clone)
6084            .or_else(|| WINDOW.with(Option::clone))
6085            .or_else(|| GLOBAL_THIS.with(Option::clone))
6086            .or_else(|| GLOBAL.with(Option::clone));
6087        if let Some(obj) = static_object {
6088            if !obj.is_undefined() {
6089                return obj;
6090            }
6091        }
6092
6093        // According to StackOverflow you can access the global object via:
6094        //
6095        //      const global = Function('return this')();
6096        //
6097        // I think that's because the manufactured function isn't in "strict" mode.
6098        // It also turns out that non-strict functions will ignore `undefined`
6099        // values for `this` when using the `apply` function.
6100        //
6101        // As a result we use the equivalent of this snippet to get a handle to the
6102        // global object in a sort of roundabout way that should hopefully work in
6103        // all contexts like ESM, node, browsers, etc.
6104        let this = Function::new_no_args("return this")
6105            .call0(&JsValue::undefined())
6106            .ok();
6107
6108        // Note that we avoid `unwrap()` on `call0` to avoid code size bloat, we
6109        // just handle the `Err` case as returning a different object.
6110        debug_assert!(this.is_some());
6111        match this {
6112            Some(this) => this.unchecked_into(),
6113            None => JsValue::undefined().unchecked_into(),
6114        }
6115    }
6116}
6117
6118macro_rules! arrays {
6119    ($(#[doc = $ctor:literal] #[doc = $mdn:literal] $name:ident: $ty:ident,)*) => ($(
6120        #[wasm_bindgen]
6121        extern "C" {
6122            #[wasm_bindgen(extends = Object, typescript_type = $name)]
6123            #[derive(Clone, Debug)]
6124            pub type $name;
6125
6126            /// The
6127            #[doc = $ctor]
6128            /// constructor creates a new array.
6129            ///
6130            /// [MDN documentation](
6131            #[doc = $mdn]
6132            /// )
6133            #[wasm_bindgen(constructor)]
6134            pub fn new(constructor_arg: &JsValue) -> $name;
6135
6136            /// An
6137            #[doc = $ctor]
6138            /// which creates an array with an internal buffer large
6139            /// enough for `length` elements.
6140            ///
6141            /// [MDN documentation](
6142            #[doc = $mdn]
6143            /// )
6144            #[wasm_bindgen(constructor)]
6145            pub fn new_with_length(length: u32) -> $name;
6146
6147            /// An
6148            #[doc = $ctor]
6149            /// which creates an array with the given buffer but is a
6150            /// view starting at `byte_offset`.
6151            ///
6152            /// [MDN documentation](
6153            #[doc = $mdn]
6154            /// )
6155            #[wasm_bindgen(constructor)]
6156            pub fn new_with_byte_offset(buffer: &JsValue, byte_offset: u32) -> $name;
6157
6158            /// An
6159            #[doc = $ctor]
6160            /// which creates an array with the given buffer but is a
6161            /// view starting at `byte_offset` for `length` elements.
6162            ///
6163            /// [MDN documentation](
6164            #[doc = $mdn]
6165            /// )
6166            #[wasm_bindgen(constructor)]
6167            pub fn new_with_byte_offset_and_length(
6168                buffer: &JsValue,
6169                byte_offset: u32,
6170                length: u32,
6171            ) -> $name;
6172
6173            /// The `fill()` method fills all the elements of an array from a start index
6174            /// to an end index with a static value. The end index is not included.
6175            ///
6176            /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/fill)
6177            #[wasm_bindgen(method)]
6178            pub fn fill(this: &$name, value: $ty, start: u32, end: u32) -> $name;
6179
6180            /// The buffer accessor property represents the `ArrayBuffer` referenced
6181            /// by a `TypedArray` at construction time.
6182            #[wasm_bindgen(getter, method)]
6183            pub fn buffer(this: &$name) -> ArrayBuffer;
6184
6185            /// The `subarray()` method returns a new `TypedArray` on the same
6186            /// `ArrayBuffer` store and with the same element types as for this
6187            /// `TypedArray` object.
6188            #[wasm_bindgen(method)]
6189            pub fn subarray(this: &$name, begin: u32, end: u32) -> $name;
6190
6191            /// The `slice()` method returns a shallow copy of a portion of a typed
6192            /// array into a new typed array object. This method has the same algorithm
6193            /// as `Array.prototype.slice()`.
6194            #[wasm_bindgen(method)]
6195            pub fn slice(this: &$name, begin: u32, end: u32) -> $name;
6196
6197            /// The `forEach()` method executes a provided function once per array
6198            /// element. This method has the same algorithm as
6199            /// `Array.prototype.forEach()`. `TypedArray` is one of the typed array
6200            /// types here.
6201            #[wasm_bindgen(method, js_name = forEach)]
6202            pub fn for_each(this: &$name, callback: &mut dyn FnMut($ty, u32, $name));
6203
6204            /// The length accessor property represents the length (in elements) of a
6205            /// typed array.
6206            #[wasm_bindgen(method, getter)]
6207            pub fn length(this: &$name) -> u32;
6208
6209            /// The byteLength accessor property represents the length (in bytes) of a
6210            /// typed array.
6211            #[wasm_bindgen(method, getter, js_name = byteLength)]
6212            pub fn byte_length(this: &$name) -> u32;
6213
6214            /// The byteOffset accessor property represents the offset (in bytes) of a
6215            /// typed array from the start of its `ArrayBuffer`.
6216            #[wasm_bindgen(method, getter, js_name = byteOffset)]
6217            pub fn byte_offset(this: &$name) -> u32;
6218
6219            /// The `set()` method stores multiple values in the typed array, reading
6220            /// input values from a specified array.
6221            #[wasm_bindgen(method)]
6222            pub fn set(this: &$name, src: &JsValue, offset: u32);
6223
6224            /// Gets the value at `idx`, counting from the end if negative.
6225            #[wasm_bindgen(method)]
6226            pub fn at(this: &$name, idx: i32) -> Option<$ty>;
6227
6228            /// The `copyWithin()` method shallow copies part of a typed array to another
6229            /// location in the same typed array and returns it, without modifying its size.
6230            ///
6231            /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/copyWithin)
6232            #[wasm_bindgen(method, js_name = copyWithin)]
6233            pub fn copy_within(this: &$name, target: i32, start: i32, end: i32) -> $name;
6234
6235            /// Gets the value at `idx`, equivalent to the javascript `my_var = arr[idx]`.
6236            #[wasm_bindgen(method, structural, indexing_getter)]
6237            pub fn get_index(this: &$name, idx: u32) -> $ty;
6238
6239            /// Sets the value at `idx`, equivalent to the javascript `arr[idx] = value`.
6240            #[wasm_bindgen(method, structural, indexing_setter)]
6241            pub fn set_index(this: &$name, idx: u32, value: $ty);
6242        }
6243
6244        impl $name {
6245            /// Creates a JS typed array which is a view into wasm's linear
6246            /// memory at the slice specified.
6247            ///
6248            /// This function returns a new typed array which is a view into
6249            /// wasm's memory. This view does not copy the underlying data.
6250            ///
6251            /// # Safety
6252            ///
6253            /// Views into WebAssembly memory are only valid so long as the
6254            /// backing buffer isn't resized in JS. Once this function is called
6255            /// any future calls to `Box::new` (or malloc of any form) may cause
6256            /// the returned value here to be invalidated. Use with caution!
6257            ///
6258            /// Additionally the returned object can be safely mutated but the
6259            /// input slice isn't guaranteed to be mutable.
6260            ///
6261            /// Finally, the returned object is disconnected from the input
6262            /// slice's lifetime, so there's no guarantee that the data is read
6263            /// at the right time.
6264            pub unsafe fn view(rust: &[$ty]) -> $name {
6265                let buf = wasm_bindgen::memory();
6266                let mem = buf.unchecked_ref::<WebAssembly::Memory>();
6267                $name::new_with_byte_offset_and_length(
6268                    &mem.buffer(),
6269                    rust.as_ptr() as u32,
6270                    rust.len() as u32,
6271                )
6272            }
6273
6274            /// Creates a JS typed array which is a view into wasm's linear
6275            /// memory at the specified pointer with specified length.
6276            ///
6277            /// This function returns a new typed array which is a view into
6278            /// wasm's memory. This view does not copy the underlying data.
6279            ///
6280            /// # Safety
6281            ///
6282            /// Views into WebAssembly memory are only valid so long as the
6283            /// backing buffer isn't resized in JS. Once this function is called
6284            /// any future calls to `Box::new` (or malloc of any form) may cause
6285            /// the returned value here to be invalidated. Use with caution!
6286            ///
6287            /// Additionally the returned object can be safely mutated,
6288            /// the changes are guaranteed to be reflected in the input array.
6289            pub unsafe fn view_mut_raw(ptr: *mut $ty, length: usize) -> $name {
6290                let buf = wasm_bindgen::memory();
6291                let mem = buf.unchecked_ref::<WebAssembly::Memory>();
6292                $name::new_with_byte_offset_and_length(
6293                    &mem.buffer(),
6294                    ptr as u32,
6295                    length as u32
6296                )
6297            }
6298
6299
6300            /// Copy the contents of this JS typed array into the destination
6301            /// Rust pointer.
6302            ///
6303            /// This function will efficiently copy the memory from a typed
6304            /// array into this Wasm module's own linear memory, initializing
6305            /// the memory destination provided.
6306            ///
6307            /// # Safety
6308            ///
6309            /// This function requires `dst` to point to a buffer
6310            /// large enough to fit this array's contents.
6311            pub unsafe fn raw_copy_to_ptr(&self, dst: *mut $ty) {
6312                let buf = wasm_bindgen::memory();
6313                let mem = buf.unchecked_ref::<WebAssembly::Memory>();
6314                let all_wasm_memory = $name::new(&mem.buffer());
6315                let offset = dst as usize / mem::size_of::<$ty>();
6316                all_wasm_memory.set(self, offset as u32);
6317            }
6318
6319            /// Copy the contents of this JS typed array into the destination
6320            /// Rust slice.
6321            ///
6322            /// This function will efficiently copy the memory from a typed
6323            /// array into this Wasm module's own linear memory, initializing
6324            /// the memory destination provided.
6325            ///
6326            /// # Panics
6327            ///
6328            /// This function will panic if this typed array's length is
6329            /// different than the length of the provided `dst` array.
6330            pub fn copy_to(&self, dst: &mut [$ty]) {
6331                core::assert_eq!(self.length() as usize, dst.len());
6332                unsafe { self.raw_copy_to_ptr(dst.as_mut_ptr()); }
6333            }
6334
6335            /// Copy the contents of this JS typed array into the destination
6336            /// Rust slice.
6337            ///
6338            /// This function will efficiently copy the memory from a typed
6339            /// array into this Wasm module's own linear memory, initializing
6340            /// the memory destination provided.
6341            ///
6342            /// # Panics
6343            ///
6344            /// This function will panic if this typed array's length is
6345            /// different than the length of the provided `dst` array.
6346            pub fn copy_to_uninit<'dst>(&self, dst: &'dst mut [MaybeUninit<$ty>]) -> &'dst mut [$ty] {
6347                core::assert_eq!(self.length() as usize, dst.len());
6348                unsafe { self.raw_copy_to_ptr(dst.as_mut_ptr().cast()); }
6349                unsafe { &mut *(dst as *mut [MaybeUninit<$ty>] as *mut [$ty]) }
6350            }
6351
6352            /// Copy the contents of the source Rust slice into this
6353            /// JS typed array.
6354            ///
6355            /// This function will efficiently copy the memory from within
6356            /// the Wasm module's own linear memory to this typed array.
6357            ///
6358            /// # Panics
6359            ///
6360            /// This function will panic if this typed array's length is
6361            /// different than the length of the provided `src` array.
6362            pub fn copy_from(&self, src: &[$ty]) {
6363                core::assert_eq!(self.length() as usize, src.len());
6364                // This is safe because the `set` function copies from its TypedArray argument
6365                unsafe { self.set(&$name::view(src), 0) }
6366            }
6367
6368            /// Efficiently copies the contents of this JS typed array into a new Vec.
6369            pub fn to_vec(&self) -> Vec<$ty> {
6370                let mut output = Vec::with_capacity(self.length() as usize);
6371                unsafe {
6372                    self.raw_copy_to_ptr(output.as_mut_ptr());
6373                    output.set_len(self.length() as usize);
6374                }
6375                output
6376            }
6377        }
6378
6379        impl<'a> From<&'a [$ty]> for $name {
6380            #[inline]
6381            fn from(slice: &'a [$ty]) -> $name {
6382                // This is safe because the `new` function makes a copy if its argument is a TypedArray
6383                unsafe { $name::new(&$name::view(slice)) }
6384            }
6385        }
6386
6387        impl Default for $name {
6388            fn default() -> Self {
6389                Self::new(&JsValue::UNDEFINED.unchecked_into())
6390            }
6391        }
6392    )*);
6393}
6394
6395arrays! {
6396    /// `Int8Array()`
6397    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array
6398    Int8Array: i8,
6399
6400    /// `Int16Array()`
6401    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array
6402    Int16Array: i16,
6403
6404    /// `Int32Array()`
6405    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array
6406    Int32Array: i32,
6407
6408    /// `Uint8Array()`
6409    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
6410    Uint8Array: u8,
6411
6412    /// `Uint8ClampedArray()`
6413    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray
6414    Uint8ClampedArray: u8,
6415
6416    /// `Uint16Array()`
6417    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array
6418    Uint16Array: u16,
6419
6420    /// `Uint32Array()`
6421    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array
6422    Uint32Array: u32,
6423
6424    /// `Float32Array()`
6425    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array
6426    Float32Array: f32,
6427
6428    /// `Float64Array()`
6429    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array
6430    Float64Array: f64,
6431
6432    /// `BigInt64Array()`
6433    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt64Array
6434    BigInt64Array: i64,
6435
6436    /// `BigUint64Array()`
6437    /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigUint64Array
6438    BigUint64Array: u64,
6439}