summaryrefslogtreecommitdiffstats
path: root/vendor/js-sys
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:41 +0000
commit10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87 (patch)
treebdffd5d80c26cf4a7a518281a204be1ace85b4c1 /vendor/js-sys
parentReleasing progress-linux version 1.70.0+dfsg1-9~progress7.99u1. (diff)
downloadrustc-10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87.tar.xz
rustc-10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87.zip
Merging upstream version 1.70.0+dfsg2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/js-sys')
-rw-r--r--vendor/js-sys/.cargo-checksum.json1
-rw-r--r--vendor/js-sys/CHANGELOG.md72
-rw-r--r--vendor/js-sys/Cargo.toml47
-rw-r--r--vendor/js-sys/LICENSE-APACHE201
-rw-r--r--vendor/js-sys/LICENSE-MIT25
-rw-r--r--vendor/js-sys/README.md7
-rw-r--r--vendor/js-sys/src/Temporal.rs1057
-rw-r--r--vendor/js-sys/src/lib.rs5871
-rw-r--r--vendor/js-sys/tests/headless.js3
-rw-r--r--vendor/js-sys/tests/headless.rs47
-rw-r--r--vendor/js-sys/tests/wasm/Array.js7
-rw-r--r--vendor/js-sys/tests/wasm/Array.rs647
-rw-r--r--vendor/js-sys/tests/wasm/ArrayBuffer.rs45
-rw-r--r--vendor/js-sys/tests/wasm/ArrayIterator.rs39
-rw-r--r--vendor/js-sys/tests/wasm/BigInt.rs43
-rw-r--r--vendor/js-sys/tests/wasm/Boolean.rs25
-rw-r--r--vendor/js-sys/tests/wasm/DataView.rs84
-rw-r--r--vendor/js-sys/tests/wasm/Date.rs530
-rw-r--r--vendor/js-sys/tests/wasm/Error.rs75
-rw-r--r--vendor/js-sys/tests/wasm/EvalError.rs62
-rw-r--r--vendor/js-sys/tests/wasm/Function.js19
-rw-r--r--vendor/js-sys/tests/wasm/Function.rs134
-rw-r--r--vendor/js-sys/tests/wasm/Generator.js23
-rw-r--r--vendor/js-sys/tests/wasm/Generator.rs66
-rw-r--r--vendor/js-sys/tests/wasm/Intl.rs124
-rw-r--r--vendor/js-sys/tests/wasm/Iterator.js19
-rw-r--r--vendor/js-sys/tests/wasm/Iterator.rs42
-rw-r--r--vendor/js-sys/tests/wasm/JSON.rs198
-rw-r--r--vendor/js-sys/tests/wasm/JsString.js7
-rw-r--r--vendor/js-sys/tests/wasm/JsString.rs612
-rw-r--r--vendor/js-sys/tests/wasm/Map.rs97
-rw-r--r--vendor/js-sys/tests/wasm/MapIterator.rs52
-rw-r--r--vendor/js-sys/tests/wasm/Math.rs271
-rw-r--r--vendor/js-sys/tests/wasm/Number.js22
-rw-r--r--vendor/js-sys/tests/wasm/Number.rs158
-rw-r--r--vendor/js-sys/tests/wasm/Object.js11
-rw-r--r--vendor/js-sys/tests/wasm/Object.rs304
-rw-r--r--vendor/js-sys/tests/wasm/Promise.rs11
-rw-r--r--vendor/js-sys/tests/wasm/Proxy.js11
-rw-r--r--vendor/js-sys/tests/wasm/Proxy.rs45
-rw-r--r--vendor/js-sys/tests/wasm/RangeError.rs17
-rw-r--r--vendor/js-sys/tests/wasm/ReferenceError.rs17
-rw-r--r--vendor/js-sys/tests/wasm/Reflect.js41
-rw-r--r--vendor/js-sys/tests/wasm/Reflect.rs263
-rw-r--r--vendor/js-sys/tests/wasm/RegExp.rs160
-rw-r--r--vendor/js-sys/tests/wasm/Set.rs127
-rw-r--r--vendor/js-sys/tests/wasm/SetIterator.rs41
-rw-r--r--vendor/js-sys/tests/wasm/SharedArrayBuffer.js3
-rw-r--r--vendor/js-sys/tests/wasm/SharedArrayBuffer.rs59
-rw-r--r--vendor/js-sys/tests/wasm/Symbol.js162
-rw-r--r--vendor/js-sys/tests/wasm/Symbol.rs130
-rw-r--r--vendor/js-sys/tests/wasm/SyntaxError.rs17
-rw-r--r--vendor/js-sys/tests/wasm/Temporal.js3
-rw-r--r--vendor/js-sys/tests/wasm/Temporal.rs81
-rw-r--r--vendor/js-sys/tests/wasm/TypeError.rs17
-rw-r--r--vendor/js-sys/tests/wasm/TypedArray.rs175
-rw-r--r--vendor/js-sys/tests/wasm/UriError.rs17
-rw-r--r--vendor/js-sys/tests/wasm/WeakMap.rs61
-rw-r--r--vendor/js-sys/tests/wasm/WeakSet.rs51
-rw-r--r--vendor/js-sys/tests/wasm/WebAssembly.js45
-rw-r--r--vendor/js-sys/tests/wasm/WebAssembly.rs205
-rw-r--r--vendor/js-sys/tests/wasm/global_fns.rs90
-rw-r--r--vendor/js-sys/tests/wasm/main.rs43
63 files changed, 12939 insertions, 0 deletions
diff --git a/vendor/js-sys/.cargo-checksum.json b/vendor/js-sys/.cargo-checksum.json
new file mode 100644
index 000000000..e60e652d4
--- /dev/null
+++ b/vendor/js-sys/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"CHANGELOG.md":"3441ebc3918099baefa15652602bb1b2a06e1fc1de9d95e23079ef7b22832fdc","Cargo.toml":"f5194a77dfcfcc82e4a7b94fa60b08c0c7948ef215d358576849f5a9819f7d76","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"de73c6d7a9d9eac0674770fde362175700676be0dfaee0b22d4c75fdc28b068e","src/Temporal.rs":"6c3745bf5cbfbbaee3fabecd870c50669f7a4f1ee65fc96e2baa8f3e440cfe86","src/lib.rs":"209ee49d97af84ae42d9f6b55a5175b5db82ff052dc2e66662fe7f86f2167cfb","tests/headless.js":"dc0fdafb377cd6aa1415897083bbbf3d53c0ca39fc1691cc1f1fa7c528190491","tests/headless.rs":"f9eb68e88cc40fc81b7afad881fbdf2243d574f4417705226aa2102a71187e60","tests/wasm/Array.js":"c21d3d69f388ed4574fa7670c4a41240d0cfa2a374ed29f32f93069983138c72","tests/wasm/Array.rs":"c8916a57751c27fab2f73cda700794412ccf4863cbceaa50ea824d13ee76a631","tests/wasm/ArrayBuffer.rs":"a465e7cf7114e7466eb843f6612e22f00eb070dda15759bf8c62a1a3147a8c8d","tests/wasm/ArrayIterator.rs":"d849e50fbb8ebf6979e962c89210cf278176b15198c37f59cb15337e9c30ffa0","tests/wasm/BigInt.rs":"55a8070545f477acea07aebccad1bfd36bac88202923c357f894d6721046f53e","tests/wasm/Boolean.rs":"6091385e24f292a7e65809fa9cf3d328d8e65ad01fb976aef5daa2b5143224c3","tests/wasm/DataView.rs":"b1bea4a6235c406ca1df0e12daec95158c5fb663f3733a8cf986038770ae23a7","tests/wasm/Date.rs":"4de15246207a5f4c961f448dd18c743aa4ae45950571c9e4ec948272677bf584","tests/wasm/Error.rs":"3d593bdce1dee56fa2c35c290d499d687cc7f08971f89f7aa5f9b52d73af1546","tests/wasm/EvalError.rs":"638641bdd06bb43cffee89d37cd39ee615fe98d44d4c8278756a798a6593111f","tests/wasm/Function.js":"6c5876f74cf2838823470c4c007089baa17e2b28e4f602b65a4b2bc67073b9d7","tests/wasm/Function.rs":"2ccfd94e301b569d70face86d31843d095380973673a811302fb67d8d58378fe","tests/wasm/Generator.js":"7be85b1acbc2de5c3d9d8d64a396baf8c5a5b111905759315b3b395a22ea49e2","tests/wasm/Generator.rs":"860e51ccd01a06076b713445a2eff27244f5b349211a322aa9e3e8df2e76c8ce","tests/wasm/Intl.rs":"7da28d28423f925e9de5270d5c0e7bc4382a587c3c72864d142e15c2e6c7dc30","tests/wasm/Iterator.js":"525d29257a508e0cfcf4aa01dddd522d1dda6f8f968f271802ebd703e6f347d6","tests/wasm/Iterator.rs":"b2ac023d150179c0c3cd54f27f9b2775f62ad519111dc233e9ebbad5e9983193","tests/wasm/JSON.rs":"bc78a06047550271e38fa412fcb1220e49208933af6e136d7f99294240807da4","tests/wasm/JsString.js":"931aedd837c316bd7e1e2d52142a92d663e36b79995e2dde6d91c9d762095c13","tests/wasm/JsString.rs":"d5f5eff01b6ffb95e4512a1cae171537bb3ee36bbe9d17ca936714bd291b6683","tests/wasm/Map.rs":"022b4c26387190e36726b493615f9852ce40ed0c86a97db85bcf06e9086925f2","tests/wasm/MapIterator.rs":"ed0405dbc9a74885fc3c3614d08d5b7c9da2ad14e4b8d3c5f392ad03e12c61cc","tests/wasm/Math.rs":"0604f28481ac122ee88a5198c2b4f234e3f25e266f73c8e455973d486bcf4768","tests/wasm/Number.js":"a0b161084686deee75588a01834dea2bc12fde317d96bd3a0b73c825db71180f","tests/wasm/Number.rs":"ec02a3c8a39b7148b685b9b7d8bb8dd99cc33640c7e105b133c9de53eee71e10","tests/wasm/Object.js":"a8ab74505388012de784b2f62f00a57058632e02a3e4bf70f33fa0e5332ff384","tests/wasm/Object.rs":"851a89c9ec20a21ee88f05a3971a2c09baecd84bd4fb1847a8d30dad685ff2ae","tests/wasm/Promise.rs":"8c62a5c08cb43c60391f94e2d697d8925ba47069e19318a30fa64062ef372c8b","tests/wasm/Proxy.js":"63baac7050190339ed772fed09e4bd1845f34bcc36d7aa40ab2ecf93e9db786a","tests/wasm/Proxy.rs":"02d5ec8e5b781e12cdd96b38e643a4d0f6b725c0c904cc614bc83d829d501035","tests/wasm/RangeError.rs":"00a75d29880f53704c1ede81fb0f5c80efa8528a7c9f75b9f64d25234f74c3a4","tests/wasm/ReferenceError.rs":"47b60df993231f4631de2b9317bc1ac0a968976747f05d9b655dc61bcf2a58b4","tests/wasm/Reflect.js":"e5c43d410802ed45f38bffe60d0313dfcb978ac29a748258e889fbb3efa6d64a","tests/wasm/Reflect.rs":"f8bd8876b6bc1740652d51b6bad948eac7eb49541a08e2fe32a85043f9e0aa65","tests/wasm/RegExp.rs":"f91a9c838921832299185582900df6132dd5263fdcce4cc5342b6a1575d727b7","tests/wasm/Set.rs":"c22ca4651d472eedaadcfb03cfbb5c7d37f449cc073586db8ea97299f5d40b63","tests/wasm/SetIterator.rs":"0ad63f4852adcd91a40ffc1d95bb269e23bc338666acdc85a9516c492d5e1561","tests/wasm/SharedArrayBuffer.js":"6d30cec14dfc5890c8303cd1b81da235bce8a37d730232fc8b0d050f0e1db1b2","tests/wasm/SharedArrayBuffer.rs":"1cbf97431f693297d86de8477b3eb5c2f6e36111c0723d3de51ba9c677c5e289","tests/wasm/Symbol.js":"76c6c15f9fd34ffb7efddc90e898e12be074e9c98e066076a2b46f0554754de2","tests/wasm/Symbol.rs":"ae91d396b867bdfd9fd0c66b8863fb8e5c569886eeec98ae6cbd0ffad1a952a8","tests/wasm/SyntaxError.rs":"526ae9168f4979594e9d44f456e6b2816e38860ebf5937c2c905577aae5be7c0","tests/wasm/Temporal.js":"83312c76bdaa0893b7a6d638ccedb5a3d35f9beeb36977e608a739a81a2f4460","tests/wasm/Temporal.rs":"c7daa8e9e3f1e134ea08bb1a29879d8b515c6db3f7e53d1bc3af12ac4bae4ed8","tests/wasm/TypeError.rs":"618530b6556daad348106bd1c48c6dd808f54fe4efb344b15238db4ec3254d9f","tests/wasm/TypedArray.rs":"e6e1a350e10f7244eb669858d0a6d1e4a1007d57bd34508d685d2b6d43b38896","tests/wasm/UriError.rs":"2e695b4823e8875aa72c41aa6679e4d3f924adf47b763cb4462cf96ecdacfda6","tests/wasm/WeakMap.rs":"300bf589a0cfb0b0d3c3534222c949406bb3b9b408bc44cd54a72e3642987782","tests/wasm/WeakSet.rs":"321e780b427e4e4779c69839e6731840b1869d18ece0d71994ae1ef1fd804a8f","tests/wasm/WebAssembly.js":"5870c3811c8c17bab0b0e14c5ed62af987b8fa52382572a27cf704cded30f061","tests/wasm/WebAssembly.rs":"ddc4d36238a1b36ff9c949d4e9c73b7eb055c0c04b28cf262d2ccb55ffd7bc54","tests/wasm/global_fns.rs":"34e12bfd548b8710297087920599d97e31971d142a8b0c4acb5712f71f1213d3","tests/wasm/main.rs":"e07b9a62897df33dba3d0962f403b19574d5cd99cd2e08e316be364c7a73d7e7"},"package":"49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"} \ No newline at end of file
diff --git a/vendor/js-sys/CHANGELOG.md b/vendor/js-sys/CHANGELOG.md
new file mode 100644
index 000000000..f822008aa
--- /dev/null
+++ b/vendor/js-sys/CHANGELOG.md
@@ -0,0 +1,72 @@
+# `js-sys` Change Log
+
+--------------------------------------------------------------------------------
+
+## Unreleased
+
+Released YYYY-MM-DD.
+
+### Added
+
+* TODO (or remove section if none)
+
+### Changed
+
+* TODO (or remove section if none)
+
+### Deprecated
+
+* TODO (or remove section if none)
+
+### Removed
+
+* TODO (or remove section if none)
+
+### Fixed
+
+* TODO (or remove section if none)
+
+### Security
+
+* TODO (or remove section if none)
+
+--------------------------------------------------------------------------------
+
+## 0.2.1
+
+Released 2018-08-13.
+
+### Added
+
+* Added bindings to `Array.prototype.splice`.
+* Added bindings to `RegExp`.
+* Added bindings to `ArrayBuffer.prototype.byteLength`.
+* Started adding the `#[wasm_bindgen(extends = ...)]` attribute to various JS
+ types.
+* Added bindings to `EvalError`.
+* Added bindings to `Promise`. See the new `wasm-bindgen-futures` crate for
+ integrating JS `Promise`s into Rust `Future`s.
+* Added bindings to `JSON.{parse,stringify}`.
+* Added bindings to `Array.of`.
+* Added bindings to `Intl.Collator`.
+* Added bindings to `Object.assign`.
+* Added bindings to `Object.create`.
+* Added bindings to `RangeError`.
+* Added bindings to `ReferenceError`.
+* Added bindings to `Symbol.unscopables`.
+* Added bindings to `URIError`.
+* Added bindings to `SyntaxError`.
+* Added bindings to `TypeError`.
+
+### Changed
+
+* The `Intl` namespace was previously a bound object with static methods hanging
+ off of it. It is now a module with free functions, and nested types.
+
+--------------------------------------------------------------------------------
+
+## 0.2.0
+
+Released 2018-07-26.
+
+Initial release!
diff --git a/vendor/js-sys/Cargo.toml b/vendor/js-sys/Cargo.toml
new file mode 100644
index 000000000..a5643083a
--- /dev/null
+++ b/vendor/js-sys/Cargo.toml
@@ -0,0 +1,47 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2018"
+name = "js-sys"
+version = "0.3.60"
+authors = ["The wasm-bindgen Developers"]
+description = """
+Bindings for all JS global objects and functions in all JS environments like
+Node.js and browsers, built on `#[wasm_bindgen]` using the `wasm-bindgen` crate.
+"""
+homepage = "https://rustwasm.github.io/wasm-bindgen/"
+documentation = "https://docs.rs/js-sys"
+readme = "./README.md"
+categories = ["wasm"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys"
+
+[lib]
+test = false
+doctest = false
+
+[dependencies.wasm-bindgen]
+version = "0.2.83"
+
+[target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-futures]
+version = "0.4.33"
+
+[target."cfg(target_arch = \"wasm32\")".dev-dependencies.wasm-bindgen-test]
+version = "=0.3.33"
+
+[target."cfg(target_arch = \"wasm32\")".dev-dependencies.web-sys]
+version = "0.3.60"
+features = [
+ "Headers",
+ "Response",
+ "ResponseInit",
+]
diff --git a/vendor/js-sys/LICENSE-APACHE b/vendor/js-sys/LICENSE-APACHE
new file mode 100644
index 000000000..16fe87b06
--- /dev/null
+++ b/vendor/js-sys/LICENSE-APACHE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/vendor/js-sys/LICENSE-MIT b/vendor/js-sys/LICENSE-MIT
new file mode 100644
index 000000000..39e0ed660
--- /dev/null
+++ b/vendor/js-sys/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2014 Alex Crichton
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/vendor/js-sys/README.md b/vendor/js-sys/README.md
new file mode 100644
index 000000000..a5b0f2d97
--- /dev/null
+++ b/vendor/js-sys/README.md
@@ -0,0 +1,7 @@
+# `js-sys`
+
+[API documentation](https://rustwasm.github.io/wasm-bindgen/api/js_sys/)
+
+Raw bindings to JS global APIs for projects using `wasm-bindgen`. This crate is
+handwritten and intended to work in *all* JS environments like browsers and
+Node.js.
diff --git a/vendor/js-sys/src/Temporal.rs b/vendor/js-sys/src/Temporal.rs
new file mode 100644
index 000000000..ee6d97d17
--- /dev/null
+++ b/vendor/js-sys/src/Temporal.rs
@@ -0,0 +1,1057 @@
+use super::*;
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type Instant;
+
+ #[wasm_bindgen(static_method_of = Instant, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> Instant;
+
+ #[wasm_bindgen(static_method_of = Instant, js_namespace = Temporal)]
+ pub fn compare(one: &Instant, two: &Instant) -> i32;
+
+ #[wasm_bindgen(method, getter, structural, js_name = epochSeconds)]
+ pub fn epoch_seconds(this: &Instant) -> u64;
+ #[wasm_bindgen(method, getter, structural, js_name = epochMilliseconds)]
+ pub fn epoch_milliseconds(this: &Instant) -> u64;
+ #[wasm_bindgen(method, getter, structural, js_name = epochMicroseconds)]
+ pub fn epoch_microseconds(this: &Instant) -> BigInt;
+ #[wasm_bindgen(method, getter, structural, js_name = epochNanoseconds)]
+ pub fn epoch_nanoseconds(this: &Instant) -> BigInt;
+
+ /// This method adds duration to Instant.
+ ///
+ /// The years, months, weeks, and days fields of duration must be zero.
+ #[wasm_bindgen(method)]
+ pub fn add(this: &Instant, duration: &Duration, options: &JsValue) -> Instant;
+
+ /// This method subtracts duration to Instant.
+ ///
+ /// The years, months, weeks, and days fields of duration must be zero.
+ #[wasm_bindgen(method)]
+ pub fn subtract(this: &Instant, duration: &Duration, options: &JsValue) -> Instant;
+
+ /// This method computes the difference between the two times represented by zonedDateTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is earlier
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn until(this: &Instant, other: &Instant, options: &JsValue) -> Duration;
+
+ /// This method computes the difference between the two times represented by zonedDateTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is later
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn since(this: &Instant, other: &Instant, options: &JsValue) -> Duration;
+
+ /// Returns a new Temporal.Instant object which is zonedDateTime rounded to `roundTo` (if
+ /// a string parameter is used) or `roundingIncrement` of `smallestUnit` (if an object parameter
+ /// is used).
+ #[wasm_bindgen(method)]
+ pub fn round(this: &Instant, round_to: &JsValue) -> Instant;
+
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &Instant, other: &Instant) -> bool;
+
+ /// This method overrides the Object.prototype.toString() method and provides a convenient, unambiguous
+ /// string representation of date. The string can be passed to Temporal.PlainDate.from() to
+ /// create a new Temporal.PlainDate object.
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Instant) -> JsString;
+
+ /// This method overrides `Object.prototype.toLocaleString()` to provide a human-readable,
+ /// language-sensitive representation of duration.
+ ///
+ /// The locales and options arguments are the same as in the constructor to Intl.DateTimeFormat.
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &Instant, locales: &JsValue, options: &JsValue) -> JsString;
+
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type PlainDateTime;
+
+ #[wasm_bindgen(static_method_of = PlainDateTime, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> PlainDateTime;
+
+ #[wasm_bindgen(static_method_of = PlainDateTime, js_namespace = Temporal)]
+ pub fn compare(one: &PlainDateTime, two: &PlainDateTime) -> i32;
+
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn year(this: &PlainDateTime) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn month(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn week(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn day(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn hour(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn minute(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn second(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn millisecond(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn microsecond(this: &PlainDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn nanosecond(this: &PlainDateTime) -> u32;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural, js_name = eraYear)]
+ pub fn era_year(this: &PlainDateTime) -> JsValue;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn era(this: &PlainDateTime) -> JsValue;
+
+ /// The dayOfWeek read-only property gives the weekday number that the date falls
+ /// on. For the ISO 8601 calendar, the weekday number is defined as in the ISO 8601
+ /// standard: a value between 1 and 7, inclusive, with Monday being 1, and Sunday 7.
+ #[wasm_bindgen(method, getter, structural, js_name = dayOfWeek)]
+ pub fn day_of_week(this: &PlainDateTime) -> u32;
+
+ /// The dayOfYear read-only property gives the ordinal day of the year that the date
+ /// falls on. For the ISO 8601 calendar, this is a value between 1 and 365, or 366 in
+ /// a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = dayOfYear)]
+ pub fn day_of_year(this: &PlainDateTime) -> u32;
+
+ /// The weekOfYear read-only property gives the ISO week number of the date. For the
+ /// ISO 8601 calendar, this is normally a value between 1 and 52, but in a few cases it
+ /// can be 53 as well. ISO week 1 is the week containing the first Thursday of the year.
+ #[wasm_bindgen(method, getter, structural, js_name = weekOfYear)]
+ pub fn week_of_year(this: &PlainDateTime) -> u32;
+
+ /// The daysInWeek read-only property gives the number of days in the week that the
+ /// date falls in. For the ISO 8601 calendar, this is always 7, but in other calendar
+ /// systems it may differ from week to week.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInWeek)]
+ pub fn days_in_week(this: &PlainDateTime) -> u32;
+
+ /// The daysInMonth read-only property gives the number of days in the month that the
+ /// date falls in. For the ISO 8601 calendar, this is 28, 29, 30, or 31, depending
+ /// on the month and whether the year is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInMonth)]
+ pub fn days_in_month(this: &PlainDateTime) -> u32;
+
+ /// The daysInYear read-only property gives the number of days in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is 365 or 366, depending on whether the year
+ /// is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInYear)]
+ pub fn days_in_year(this: &PlainDateTime) -> u32;
+
+ /// The monthsInYear read-only property gives the number of months in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is always 12, but in other calendar systems
+ /// it may differ from year to year.
+ #[wasm_bindgen(method, getter, structural, js_name = monthsInWeek)]
+ pub fn months_in_year(this: &PlainDateTime) -> u32;
+
+ /// The inLeapYear read-only property tells whether the year that the date falls in is a
+ /// leap year or not. Its value is true if the year is a leap year, and false if not.
+ #[wasm_bindgen(method, getter, structural, js_name = inLeapYear)]
+ pub fn in_leap_year(this: &PlainDateTime) -> bool;
+
+ /// This method creates a new Temporal.PlainDateTime which is a copy of zonedDateTime, but any
+ /// properties present on parameter override the ones already present on zonedDateTime.
+ #[wasm_bindgen(method, js_name = withPlainDate)]
+ pub fn with(this: &PlainDateTime, parameter: &JsValue, options: &JsValue) -> PlainDateTime;
+
+ /// Returns a new `Temporal.PlainDateTime` object which replaces the calendar date of zonedDateTime
+ /// with the calendar date represented by plainDate.
+ #[wasm_bindgen(method, js_name = withPlainDate)]
+ pub fn with_plain_date(this: &PlainDateTime, date: &PlainDate) -> PlainDateTime;
+
+ /// Returns a new `Temporal.PlainDateTime` object which is the date indicated by date, projected
+ /// into calendar.
+ #[wasm_bindgen(method, js_name = withCalendar)]
+ pub fn with_calendar(this: &PlainDateTime, calendar: &str) -> PlainDateTime;
+
+ /// This method adds duration to zonedDateTime.
+ #[wasm_bindgen(method)]
+ pub fn add(this: &PlainDateTime, duration: &Duration, options: &JsValue) -> PlainDateTime;
+
+ /// This method subtracts duration to zonedDateTime.
+ #[wasm_bindgen(method)]
+ pub fn subtract(this: &PlainDateTime, duration: &Duration, options: &JsValue) -> PlainDateTime;
+
+ /// This method computes the difference between the two times represented by zonedDateTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is earlier
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn until(this: &PlainDateTime, other: &PlainDateTime, options: &JsValue) -> Duration;
+
+ /// This method computes the difference between the two times represented by zonedDateTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is later
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn since(this: &PlainDateTime, other: &PlainDateTime, options: &JsValue) -> Duration;
+
+ /// Returns a new Temporal.PlainDateTime object which is zonedDateTime rounded to `roundTo` (if
+ /// a string parameter is used) or `roundingIncrement` of `smallestUnit` (if an object parameter
+ /// is used).
+ #[wasm_bindgen(method)]
+ pub fn round(this: &PlainDateTime, round_to: &JsValue) -> PlainDateTime;
+
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &PlainDateTime, other: &PlainDateTime) -> bool;
+
+ /// Returns: a plain object with properties expressing zonedDateTime in the ISO 8601 calendar, including
+ /// all date/time fields as well as the calendar, timeZone, and offset properties.
+ ///
+ /// This is an advanced method that's mainly useful if you are implementing a custom calendar. Most
+ /// developers will not need to use it.
+ #[wasm_bindgen(method, js_name = getISOFields)]
+ pub fn get_iso_fields(this: &PlainDateTime) -> JsValue;
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type ZonedDateTime;
+
+ #[wasm_bindgen(static_method_of = ZonedDateTime, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> ZonedDateTime;
+
+ #[wasm_bindgen(static_method_of = ZonedDateTime, js_namespace = Temporal)]
+ pub fn compare(one: &ZonedDateTime, two: &ZonedDateTime) -> i32;
+
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn year(this: &ZonedDateTime) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn month(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn week(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn day(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn hour(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn minute(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn second(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn millisecond(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn microsecond(this: &ZonedDateTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn nanosecond(this: &ZonedDateTime) -> u32;
+
+ #[wasm_bindgen(method, getter, structural, js_name = epochSeconds)]
+ pub fn epoch_seconds(this: &ZonedDateTime) -> u64;
+ #[wasm_bindgen(method, getter, structural, js_name = epochMilliseconds)]
+ pub fn epoch_milliseconds(this: &ZonedDateTime) -> u64;
+ #[wasm_bindgen(method, getter, structural, js_name = epochMicroseconds)]
+ pub fn epoch_microseconds(this: &ZonedDateTime) -> BigInt;
+ #[wasm_bindgen(method, getter, structural, js_name = epochNanoseconds)]
+ pub fn epoch_nanoseconds(this: &ZonedDateTime) -> BigInt;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural, js_name = eraYear)]
+ pub fn era_year(this: &ZonedDateTime) -> JsValue;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn era(this: &ZonedDateTime) -> JsValue;
+
+ /// The dayOfWeek read-only property gives the weekday number that the date falls
+ /// on. For the ISO 8601 calendar, the weekday number is defined as in the ISO 8601
+ /// standard: a value between 1 and 7, inclusive, with Monday being 1, and Sunday 7.
+ #[wasm_bindgen(method, getter, structural, js_name = dayOfWeek)]
+ pub fn day_of_week(this: &ZonedDateTime) -> u32;
+
+ /// The dayOfYear read-only property gives the ordinal day of the year that the date
+ /// falls on. For the ISO 8601 calendar, this is a value between 1 and 365, or 366 in
+ /// a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = dayOfYear)]
+ pub fn day_of_year(this: &ZonedDateTime) -> u32;
+
+ /// The weekOfYear read-only property gives the ISO week number of the date. For the
+ /// ISO 8601 calendar, this is normally a value between 1 and 52, but in a few cases it
+ /// can be 53 as well. ISO week 1 is the week containing the first Thursday of the year.
+ #[wasm_bindgen(method, getter, structural, js_name = weekOfYear)]
+ pub fn week_of_year(this: &ZonedDateTime) -> u32;
+
+ /// The daysInWeek read-only property gives the number of days in the week that the
+ /// date falls in. For the ISO 8601 calendar, this is always 7, but in other calendar
+ /// systems it may differ from week to week.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInWeek)]
+ pub fn days_in_week(this: &ZonedDateTime) -> u32;
+
+ /// The daysInMonth read-only property gives the number of days in the month that the
+ /// date falls in. For the ISO 8601 calendar, this is 28, 29, 30, or 31, depending
+ /// on the month and whether the year is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInMonth)]
+ pub fn days_in_month(this: &ZonedDateTime) -> u32;
+
+ /// The daysInYear read-only property gives the number of days in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is 365 or 366, depending on whether the year
+ /// is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInYear)]
+ pub fn days_in_year(this: &ZonedDateTime) -> u32;
+
+ /// The monthsInYear read-only property gives the number of months in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is always 12, but in other calendar systems
+ /// it may differ from year to year.
+ #[wasm_bindgen(method, getter, structural, js_name = monthsInWeek)]
+ pub fn months_in_year(this: &ZonedDateTime) -> u32;
+
+ /// The inLeapYear read-only property tells whether the year that the date falls in is a
+ /// leap year or not. Its value is true if the year is a leap year, and false if not.
+ #[wasm_bindgen(method, getter, structural, js_name = inLeapYear)]
+ pub fn in_leap_year(this: &ZonedDateTime) -> bool;
+
+ /// The `hoursInDay` read-only property returns the number of real-world hours
+ /// between the start of the current day (usually midnight) in zonedDateTime.timeZone to
+ /// the start of the next calendar day in the same time zone. Normally days will be 24 hours
+ /// long, but on days where there are DST changes or other time zone transitions, this
+ /// property may return 23 or 25. In rare cases, other integers or even non-integer
+ /// values may be returned, e.g. when time zone definitions change by less than one hour.
+ #[wasm_bindgen(method, getter, structural, js_name = inLeapYear)]
+ pub fn hours_in_day(this: &ZonedDateTime) -> u32;
+
+ #[wasm_bindgen(method, getter, structural, js_name = startOfDay)]
+ pub fn start_of_day(this: &ZonedDateTime) -> ZonedDateTime;
+
+ /// The offset read-only property is the offset (formatted as a string) relative
+ /// to UTC of the current time zone and exact instant. Examples: '-08:00' or '+05:30'
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn offset(this: &ZonedDateTime) -> JsString;
+
+ /// This method creates a new Temporal.ZonedDateTime which is a copy of zonedDateTime, but any
+ /// properties present on parameter override the ones already present on zonedDateTime.
+ #[wasm_bindgen(method, js_name = withPlainDate)]
+ pub fn with(this: &ZonedDateTime, parameter: &JsValue, options: &JsValue) -> ZonedDateTime;
+
+ /// Returns a new `Temporal.ZonedDateTime` object which replaces the calendar date of zonedDateTime
+ /// with the calendar date represented by plainDate.
+ #[wasm_bindgen(method, js_name = withPlainDate)]
+ pub fn with_plain_date(this: &ZonedDateTime, date: &PlainDate) -> ZonedDateTime;
+
+ /// Returns a new `Temporal.ZonedDateTime` object which is the date indicated by date, projected
+ /// into calendar.
+ #[wasm_bindgen(method, js_name = withCalendar)]
+ pub fn with_calendar(this: &ZonedDateTime, calendar: &str) -> ZonedDateTime;
+
+ /// This method adds duration to zonedDateTime.
+ #[wasm_bindgen(method)]
+ pub fn add(this: &ZonedDateTime, duration: &Duration, options: &JsValue) -> ZonedDateTime;
+
+ /// This method subtracts duration to zonedDateTime.
+ #[wasm_bindgen(method)]
+ pub fn subtract(this: &ZonedDateTime, duration: &Duration, options: &JsValue) -> ZonedDateTime;
+
+ /// This method computes the difference between the two times represented by zonedDateTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is earlier
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn until(this: &ZonedDateTime, other: &ZonedDateTime, options: &JsValue) -> Duration;
+
+ /// This method computes the difference between the two times represented by zonedDateTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is later
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn since(this: &ZonedDateTime, other: &ZonedDateTime, options: &JsValue) -> Duration;
+
+ /// Returns a new Temporal.ZonedDateTime object which is zonedDateTime rounded to `roundTo` (if
+ /// a string parameter is used) or `roundingIncrement` of `smallestUnit` (if an object parameter
+ /// is used).
+ #[wasm_bindgen(method)]
+ pub fn round(this: &ZonedDateTime, round_to: &JsValue) -> ZonedDateTime;
+
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &ZonedDateTime, other: &ZonedDateTime) -> bool;
+
+ /// Returns: a plain object with properties expressing zonedDateTime in the ISO 8601 calendar, including
+ /// all date/time fields as well as the calendar, timeZone, and offset properties.
+ ///
+ /// This is an advanced method that's mainly useful if you are implementing a custom calendar. Most
+ /// developers will not need to use it.
+ #[wasm_bindgen(method, js_name = getISOFields)]
+ pub fn get_iso_fields(this: &ZonedDateTime) -> JsValue;
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type Duration;
+
+ #[wasm_bindgen(static_method_of = Duration, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> Duration;
+
+ #[wasm_bindgen(static_method_of = Duration, js_namespace = Temporal)]
+ pub fn compare(one: &Duration, two: &Duration) -> i32;
+
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn years(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn months(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn weeks(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn days(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn hours(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn minutes(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn seconds(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn milliseconds(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn microseconds(this: &Duration) -> i32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn nanoseconds(this: &Duration) -> i32;
+
+ /// The read-only `sign` property has the value –1, 0, or 1, depending on whether
+ /// the duration is negative, zero, or positive.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn sign(this: &Duration) -> i32;
+
+ /// The read-only `blank` property is a convenience property that tells whether duration
+ /// represents a zero length of time. In other words, `duration.blank === (duration.sign === 0)`.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn blank(this: &Duration) -> bool;
+
+ /// In order to be valid, the resulting duration must not have fields with mixed signs, and
+ /// so the result is balanced. For usage examples and a more complete explanation of how
+ /// balancing works and why it is necessary, see [Duration balancing].
+ ///
+ /// [Duration balancing]: https://tc39.es/proposal-temporal/docs/balancing.html
+ #[wasm_bindgen(method)]
+ pub fn add(this: &Duration, other: &Duration, options: &JsValue) -> Duration;
+
+ /// In order to be valid, the resulting duration must not have fields with mixed signs, and
+ /// so the result is balanced. For usage examples and a more complete explanation of how
+ /// balancing works and why it is necessary, see [Duration balancing].
+ ///
+ /// [Duration balancing]: https://tc39.es/proposal-temporal/docs/balancing.html
+ #[wasm_bindgen(method)]
+ pub fn subtract(this: &Duration, other: &Duration, options: &JsValue) -> Duration;
+
+ /// This method gives the absolute value of duration. It returns a newly constructed
+ /// `Temporal.Duration` with all the fields having the same magnitude as those of
+ /// duration, but positive. If duration is already positive or zero, then the returned
+ /// object is a copy of duration.
+ #[wasm_bindgen(method)]
+ pub fn abs(this: &Duration) -> Duration;
+
+ /// Rounds and/or balances duration to the given largest and smallest units and rounding
+ /// increment, and returns the result as a new `Temporal.Duration` object.
+ #[wasm_bindgen(method)]
+ pub fn round(this: &Duration, round_to: &JsValue) -> Duration;
+
+ /// Calculates the number of units of time that can fit in a particular `Temporal.Duration`.
+ /// If the duration IS NOT evenly divisible by the desired unit, then a fractional remainder
+ /// will be present in the result. If the duration IS evenly divisible by the desired
+ /// unit, then the integer result will be identical
+ /// to `duration.round({ smallestUnit: unit, largestUnit: unit, relativeTo })[unit]`
+ #[wasm_bindgen(method)]
+ pub fn total(this: &Duration, total_of: &JsValue) -> f64;
+
+ /// This method overrides `Object.prototype.toString()` and provides the ISO 8601
+ /// description of the duration.
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Duration, options: &JsValue) -> JsString;
+
+ /// This method is the same as duration.toString(). It is usually not called directly, but
+ /// it can be called automatically by JSON.stringify().
+ #[wasm_bindgen(method, js_name = toJson)]
+ pub fn to_json(this: &Duration) -> JsString;
+
+ /// This method overrides `Object.prototype.toLocaleString()` to provide a human-readable,
+ /// language-sensitive representation of duration.
+ ///
+ /// The locales and options arguments are the same as in the constructor to Intl.DurationFormat.
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &Duration, locales: &JsValue, options: &JsValue) -> JsString;
+
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type PlainTime;
+
+ #[wasm_bindgen(static_method_of = PlainTime, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> PlainTime;
+
+ #[wasm_bindgen(static_method_of = PlainTime, js_namespace = Temporal)]
+ pub fn compare(one: &PlainTime, two: &PlainTime) -> i32;
+
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn hour(this: &PlainTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn minute(this: &PlainTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn second(this: &PlainTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn millisecond(this: &PlainTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn microsecond(this: &PlainTime) -> u32;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn nanosecond(this: &PlainTime) -> u32;
+
+ /// This method adds duration to PlainTime.
+ #[wasm_bindgen(method)]
+ pub fn add(this: &PlainTime, duration: &Duration, options: &JsValue) -> PlainTime;
+
+ /// This method subtracts duration to PlainTime.
+ #[wasm_bindgen(method)]
+ pub fn subtract(this: &PlainTime, duration: &Duration, options: &JsValue) -> PlainTime;
+
+ /// This method computes the difference between the two times represented by PlainTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is earlier
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn until(this: &PlainTime, other: &PlainTime, options: &JsValue) -> Duration;
+
+ /// This method computes the difference between the two times represented by PlainTime and
+ /// other, optionally rounds it, and returns it as a Temporal.Duration object. If other is later
+ /// than zonedDateTime then the resulting duration will be negative. The returned Temporal.Duration, when
+ /// added to zonedDateTime with the same options, will yield other.
+ #[wasm_bindgen(method)]
+ pub fn since(this: &PlainTime, other: &PlainTime, options: &JsValue) -> Duration;
+
+ /// Returns a new Temporal.ZonedDateTime object which is PlainTime rounded to `roundTo` (if
+ /// a string parameter is used) or `roundingIncrement` of `smallestUnit` (if an object parameter
+ /// is used).
+ #[wasm_bindgen(method)]
+ pub fn round(this: &PlainTime, round_to: &JsValue) -> PlainTime;
+
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &PlainTime, other: &PlainTime) -> bool;
+
+ /// This method overrides `Object.prototype.toLocaleString()` to provide a human-readable,
+ /// language-sensitive representation of duration.
+ ///
+ /// The locales and options arguments are the same as in the constructor to Intl.DateTimeFormat.
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &PlainTime, locales: &JsValue, options: &JsValue) -> JsString;
+
+ /// Returns: a plain object with properties expressing PlainTime in the ISO 8601 calendar, including
+ /// all date/time fields as well as the calendar, timeZone, and offset properties.
+ ///
+ /// This is an advanced method that's mainly useful if you are implementing a custom calendar. Most
+ /// developers will not need to use it.
+ #[wasm_bindgen(method, js_name = getISOFields)]
+ pub fn get_iso_fields(this: &PlainTime) -> JsValue;
+
+}
+
+#[wasm_bindgen]
+extern "C" {
+ /// A Temporal.PlainYearMonth represents a particular month on the calendar. For example, it
+ /// could be used to represent a particular instance of a monthly recurring event, like "the
+ /// June 2019 meeting".
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type PlainYearMonth;
+
+ #[wasm_bindgen(static_method_of = PlainYearMonth, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> PlainYearMonth;
+
+ #[wasm_bindgen(static_method_of = PlainYearMonth, js_namespace = Temporal)]
+ pub fn compare(one: &PlainYearMonth, two: &PlainYearMonth) -> i32;
+
+ /// `year` is a signed integer representing the number of years relative to a
+ /// calendar-specific epoch. For calendars that use eras, the anchor is usually
+ /// aligned with the latest era so that eraYear === year for all dates in that
+ /// era. However, some calendars like Japanese may use a different anchor.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn year(this: &PlainYearMonth) -> i32;
+
+ /// `month` is a positive integer representing the ordinal index of the month in
+ /// the current year. For calendars like Hebrew or Chinese that use leap
+ /// months, the same-named month may have a different month value depending on
+ /// the year. The first month in every year has month equal to 1. The last month
+ /// of every year has month equal to the monthsInYear property. month values
+ /// start at 1, which is different from legacy Date where months are represented
+ /// by zero-based indices (0 to 11).
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn month(this: &PlainYearMonth) -> u32;
+
+ /// `monthCode` is a calendar-specific string that identifies the month in
+ /// a year-independent way. For common (non-leap) months, monthCode should
+ /// be `M${month}`, where month is zero padded up to two digits. For uncommon
+ /// (leap) months in lunisolar calendars like Hebrew or Chinese, the month code
+ /// is the previous month's code with with an "L" suffix appended.
+ /// Examples:
+ /// * 'M02' => February;
+ /// * 'M08L' => repeated 8th month in the Chinese calendar;
+ /// * 'M05L' => Adar I in the Hebrew calendar.
+ #[wasm_bindgen(method, getter, structural, js_name = monthCode)]
+ pub fn month_code(this: &PlainYearMonth) -> JsString;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural, js_name = eraYear)]
+ pub fn era_year(this: &PlainYearMonth) -> JsValue;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn era(this: &PlainYearMonth) -> JsValue;
+
+ /// The daysInMonth read-only property gives the number of days in the month that the
+ /// date falls in. For the ISO 8601 calendar, this is 28, 29, 30, or 31, depending
+ /// on the month and whether the year is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInMonth)]
+ pub fn days_in_month(this: &PlainYearMonth) -> u32;
+
+ /// The daysInYear read-only property gives the number of days in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is 365 or 366, depending on whether the year
+ /// is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInYear)]
+ pub fn days_in_year(this: &PlainYearMonth) -> u32;
+
+ /// The monthsInYear read-only property gives the number of months in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is always 12, but in other calendar systems
+ /// it may differ from year to year.
+ #[wasm_bindgen(method, getter, structural, js_name = monthsInWeek)]
+ pub fn months_in_year(this: &PlainYearMonth) -> u32;
+
+ /// The inLeapYear read-only property tells whether the year that the date falls in is a
+ /// leap year or not. Its value is true if the year is a leap year, and false if not.
+ #[wasm_bindgen(method, getter, structural, js_name = inLeapYear)]
+ pub fn in_leap_year(this: &PlainYearMonth) -> bool;
+
+ /// **Parameters:**
+ ///
+ ///- `duration` (`Temporal.Duration` or value convertible to one): The duration to add.
+ ///- `options` (optional object): An object with properties representing options for the addition.
+ ///The following options are recognized:
+ ///- `overflow` (optional string): How to deal with additions that result in out-of-range values.
+ /// Allowed values are `constrain` and `reject`.
+ /// The default is `constrain`.
+ ///
+ ///**Returns:** a new `Temporal.PlainYearMonth` object which is the date indicated by `date` plus `duration`.
+ ///
+ ///This method adds `duration` to `date`, returning a date that is in the future relative to `date`.
+ ///
+ ///The `duration` argument is an object with properties denoting a duration, such as `{ days: 5 }`, or a string such as `P5D`, or a `Temporal.Duration` object.
+ ///If `duration` is not a `Temporal.Duration` object, then it will be converted to one as if it were passed to `Temporal.Duration.from()`.
+ ///
+ ///Some additions may be ambiguous, because months have different lengths.
+ ///For example, adding one month to August 31 would result in September 31, which doesn't exist.
+ ///For these cases, the `overflow` option tells what to do:
+ ///
+ ///- In `constrain` mode (the default), out-of-range values are clamped to the nearest in-range value.
+ ///- In `reject` mode, an addition that would result in an out-of-range value fails, and a `RangeError` is thrown.
+ ///
+ ///Additionally, if the result is earlier or later than the range of dates that `Temporal.PlainYearMonth` can represent (approximately half a million years centered on the [Unix epoch](https://en.wikipedia.org/wiki/Unix_time)), then this method will throw a `RangeError` regardless of `overflow`.
+ ///
+ ///Adding a negative duration is equivalent to subtracting the absolute value of that duration.
+ #[wasm_bindgen(method)]
+ pub fn add(this: &PlainYearMonth, duration: &Duration, options: &JsValue) -> PlainYearMonth;
+
+ /// **Parameters:**
+ ///- `duration` (`Temporal.Duration` or value convertible to one): The duration to subtract.
+ ///- `options` (optional object): An object with properties representing options for the subtraction.
+ ///The following options are recognized:
+ ///- `overflow` (string): How to deal with subtractions that result in out-of-range values.
+ /// Allowed values are `constrain` and `reject`.
+ /// The default is `constrain`.
+ ///
+ ///**Returns:** a new `Temporal.PlainYearMonth` object which is the date indicated by `date` minus `duration`.
+ ///
+ ///This method subtracts `duration` from `date`, returning a date that is in the past relative to `date`.
+ ///
+ ///The `duration` argument is an object with properties denoting a duration, such as `{ days: 5 }`, or a string such as `P5D`, or a `Temporal.Duration` object.
+ ///If `duration` is not a `Temporal.Duration` object, then it will be converted to one as if it were passed to `Temporal.Duration.from()`.
+ ///
+ ///Some subtractions may be ambiguous, because months have different lengths.
+ ///For example, subtracting one month from July 31 would result in June 31, which doesn't exist.
+ ///For these cases, the `overflow` option tells what to do:
+ ///
+ ///- In `constrain` mode (the default), out-of-range values are clamped to the nearest in-range value.
+ ///- In `reject` mode, an addition that would result in an out-of-range value fails, and a `RangeError` is thrown.
+ ///
+ ///Additionally, if the result is earlier or later than the range of dates that `Temporal.PlainDate` can represent (approximately half a million years centered on the [Unix epoch](https://en.wikipedia.org/wiki/Unix_time)), then this method will throw a `RangeError` regardless of `overflow`.
+ ///
+ ///Subtracting a negative duration is equivalent to adding the absolute value of that duration.
+ ///
+ #[wasm_bindgen(method)]
+ pub fn subtract(
+ this: &PlainYearMonth,
+ duration: &Duration,
+ options: &JsValue,
+ ) -> PlainYearMonth;
+
+ /// This function exists because it's not possible to compare using date == other
+ /// or date === other, due to ambiguity in the primitive representation and between
+ /// Temporal types.
+ ///
+ /// If you don't need to know the order in which the two dates occur, then this function
+ /// may be less typing and more efficient than Temporal.PlainDate.compare.
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &PlainYearMonth, other: &PlainYearMonth) -> bool;
+
+ /// This method overrides the Object.prototype.toString() method and provides a convenient, unambiguous
+ /// string representation of date. The string can be passed to Temporal.PlainYearMonth.from() to
+ /// create a new Temporal.PlainDate object.
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &PlainYearMonth) -> JsString;
+
+ /// This method overrides `Object.prototype.toLocaleString()` to provide a human-readable,
+ /// language-sensitive representation of duration.
+ ///
+ /// The locales and options arguments are the same as in the constructor to Intl.DateTimeFormat.
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(
+ this: &PlainYearMonth,
+ locales: &JsValue,
+ options: &JsValue,
+ ) -> JsString;
+
+ /// Returns: a plain object with properties expressing date in the ISO 8601
+ /// calendar, as well as the value of date.calendar.
+ ///
+ /// This method is mainly useful if you are implementing a custom calendar. Most
+ /// code will not need to use it.
+ #[wasm_bindgen(method, js_name = getISOFields)]
+ pub fn get_iso_fields(this: &PlainYearMonth) -> JsValue;
+
+}
+
+#[wasm_bindgen]
+extern "C" {
+ /// A date without a year component. This is useful to express
+ /// things like "Bastille Day is on the 14th of July".
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type PlainMonthDay;
+
+ #[wasm_bindgen(static_method_of = PlainMonthDay, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> PlainMonthDay;
+
+ #[wasm_bindgen(static_method_of = PlainMonthDay, js_namespace = Temporal)]
+ pub fn compare(one: &PlainMonthDay, two: &PlainMonthDay) -> i32;
+
+ /// `monthCode` is a calendar-specific string that identifies the month in
+ /// a year-independent way. For common (non-leap) months, monthCode should
+ /// be `M${month}`, where month is zero padded up to two digits. For uncommon
+ /// (leap) months in lunisolar calendars like Hebrew or Chinese, the month code
+ /// is the previous month's code with with an "L" suffix appended.
+ /// Examples:
+ /// * 'M02' => February;
+ /// * 'M08L' => repeated 8th month in the Chinese calendar;
+ /// * 'M05L' => Adar I in the Hebrew calendar.
+ ///
+ /// Note that this type has no month property, because month is ambiguous for some
+ /// calendars without knowing the year. Instead, the monthCode property is used which
+ /// is year-independent in all calendars.
+ #[wasm_bindgen(method, getter, structural, js_name = monthCode)]
+ pub fn month_code(this: &PlainMonthDay) -> JsString;
+
+ /// day is a positive integer representing the day of the month.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn day(this: &PlainMonthDay) -> u32;
+
+ /// This function exists because it's not possible to compare using date == other
+ /// or date === other, due to ambiguity in the primitive representation and between
+ /// Temporal types.
+ ///
+ /// If you don't need to know the order in which the two dates occur, then this function
+ /// may be less typing and more efficient than Temporal.PlainMonthDay.compare.
+ ///
+ /// Note that this function will return false if the two objects have different calendar
+ /// properties, even if the actual dates are equal.
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &PlainMonthDay, other: &PlainMonthDay) -> bool;
+
+ /// This method overrides the Object.prototype.toString() method and provides a convenient, unambiguous
+ /// string representation of date. The string can be passed to Temporal.PlainMonthDay.from() to
+ /// create a new Temporal.PlainMonthDay object.
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &PlainMonthDay) -> JsString;
+
+ /// This method overrides `Object.prototype.toLocaleString()` to provide a human-readable,
+ /// language-sensitive representation of duration.
+ ///
+ /// The locales and options arguments are the same as in the constructor to Intl.DateTimeFormat.
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &PlainMonthDay, locales: &JsValue, options: &JsValue)
+ -> JsString;
+
+ /// Returns: a plain object with properties expressing date in the ISO 8601
+ /// calendar, as well as the value of date.calendar.
+ ///
+ /// This method is mainly useful if you are implementing a custom calendar. Most
+ /// code will not need to use it.
+ #[wasm_bindgen(method, js_name = getISOFields)]
+ pub fn get_iso_fields(this: &PlainMonthDay) -> JsValue;
+
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_namespace = Temporal, extends = Object)]
+ #[derive(Clone, Debug)]
+ pub type PlainDate;
+
+ #[wasm_bindgen(js_namespace = Temporal, constructor)]
+ pub fn new(year: i32, month: u32, day: u32) -> PlainDate;
+
+ #[wasm_bindgen(static_method_of = PlainDate, js_namespace = Temporal)]
+ pub fn from(val: &JsValue) -> PlainDate;
+
+ #[wasm_bindgen(static_method_of = PlainDate, js_namespace = Temporal)]
+ pub fn compare(one: &PlainDate, two: &PlainDate) -> i32;
+
+ /// `year` is a signed integer representing the number of years relative to a
+ /// calendar-specific epoch. For calendars that use eras, the anchor is usually
+ /// aligned with the latest era so that eraYear === year for all dates in that
+ /// era. However, some calendars like Japanese may use a different anchor.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn year(this: &PlainDate) -> i32;
+
+ /// `month` is a positive integer representing the ordinal index of the month in
+ /// the current year. For calendars like Hebrew or Chinese that use leap
+ /// months, the same-named month may have a different month value depending on
+ /// the year. The first month in every year has month equal to 1. The last month
+ /// of every year has month equal to the monthsInYear property. month values
+ /// start at 1, which is different from legacy Date where months are represented
+ /// by zero-based indices (0 to 11).
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn month(this: &PlainDate) -> u32;
+
+ /// `monthCode` is a calendar-specific string that identifies the month in
+ /// a year-independent way. For common (non-leap) months, monthCode should
+ /// be `M${month}`, where month is zero padded up to two digits. For uncommon
+ /// (leap) months in lunisolar calendars like Hebrew or Chinese, the month code
+ /// is the previous month's code with with an "L" suffix appended.
+ /// Examples:
+ /// * 'M02' => February;
+ /// * 'M08L' => repeated 8th month in the Chinese calendar;
+ /// * 'M05L' => Adar I in the Hebrew calendar.
+ #[wasm_bindgen(method, getter, structural, js_name = monthCode)]
+ pub fn month_code(this: &PlainDate) -> JsString;
+
+ /// day is a positive integer representing the day of the month.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn day(this: &PlainDate) -> u32;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural, js_name = eraYear)]
+ pub fn era_year(this: &PlainDate) -> JsValue;
+
+ /// In calendars that use eras, the era and eraYear read-only properties can be used
+ /// together to resolve an era-relative year. Both properties are undefined when using
+ /// the ISO 8601 calendar. As inputs to from or with, era and eraYear can be used instead
+ /// of year. Unlike year, eraYear may decrease as time proceeds because some
+ /// eras (like the BCE era in the Gregorian calendar) count years backwards.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn era(this: &PlainDate) -> JsValue;
+
+ /// The dayOfWeek read-only property gives the weekday number that the date falls
+ /// on. For the ISO 8601 calendar, the weekday number is defined as in the ISO 8601
+ /// standard: a value between 1 and 7, inclusive, with Monday being 1, and Sunday 7.
+ #[wasm_bindgen(method, getter, structural, js_name = dayOfWeek)]
+ pub fn day_of_week(this: &PlainDate) -> u32;
+
+ /// The dayOfYear read-only property gives the ordinal day of the year that the date
+ /// falls on. For the ISO 8601 calendar, this is a value between 1 and 365, or 366 in
+ /// a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = dayOfYear)]
+ pub fn day_of_year(this: &PlainDate) -> u32;
+
+ /// The weekOfYear read-only property gives the ISO week number of the date. For the
+ /// ISO 8601 calendar, this is normally a value between 1 and 52, but in a few cases it
+ /// can be 53 as well. ISO week 1 is the week containing the first Thursday of the year.
+ #[wasm_bindgen(method, getter, structural, js_name = weekOfYear)]
+ pub fn week_of_year(this: &PlainDate) -> u32;
+
+ /// The daysInWeek read-only property gives the number of days in the week that the
+ /// date falls in. For the ISO 8601 calendar, this is always 7, but in other calendar
+ /// systems it may differ from week to week.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInWeek)]
+ pub fn days_in_week(this: &PlainDate) -> u32;
+
+ /// The daysInMonth read-only property gives the number of days in the month that the
+ /// date falls in. For the ISO 8601 calendar, this is 28, 29, 30, or 31, depending
+ /// on the month and whether the year is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInMonth)]
+ pub fn days_in_month(this: &PlainDate) -> u32;
+
+ /// The daysInYear read-only property gives the number of days in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is 365 or 366, depending on whether the year
+ /// is a leap year.
+ #[wasm_bindgen(method, getter, structural, js_name = daysInYear)]
+ pub fn days_in_year(this: &PlainDate) -> u32;
+
+ /// The monthsInYear read-only property gives the number of months in the year that the date
+ /// falls in. For the ISO 8601 calendar, this is always 12, but in other calendar systems
+ /// it may differ from year to year.
+ #[wasm_bindgen(method, getter, structural, js_name = monthsInWeek)]
+ pub fn months_in_year(this: &PlainDate) -> u32;
+
+ /// The inLeapYear read-only property tells whether the year that the date falls in is a
+ /// leap year or not. Its value is true if the year is a leap year, and false if not.
+ #[wasm_bindgen(method, getter, structural, js_name = inLeapYear)]
+ pub fn in_leap_year(this: &PlainDate) -> bool;
+
+ /// Returns a new `Temporal.PlainDate` object which is the date indicated by date, projected
+ /// into calendar.
+ #[wasm_bindgen(method, js_name = withCalendar)]
+ pub fn with_calendar(this: &PlainDate, calendar: &str) -> PlainDate;
+
+ /// **Parameters:**
+ ///
+ ///- `duration` (`Temporal.Duration` or value convertible to one): The duration to add.
+ ///- `options` (optional object): An object with properties representing options for the addition.
+ ///The following options are recognized:
+ ///- `overflow` (optional string): How to deal with additions that result in out-of-range values.
+ /// Allowed values are `constrain` and `reject`.
+ /// The default is `constrain`.
+ ///
+ ///**Returns:** a new `Temporal.PlainDate` object which is the date indicated by `date` plus `duration`.
+ ///
+ ///This method adds `duration` to `date`, returning a date that is in the future relative to `date`.
+ ///
+ ///The `duration` argument is an object with properties denoting a duration, such as `{ days: 5 }`, or a string such as `P5D`, or a `Temporal.Duration` object.
+ ///If `duration` is not a `Temporal.Duration` object, then it will be converted to one as if it were passed to `Temporal.Duration.from()`.
+ ///
+ ///Some additions may be ambiguous, because months have different lengths.
+ ///For example, adding one month to August 31 would result in September 31, which doesn't exist.
+ ///For these cases, the `overflow` option tells what to do:
+ ///
+ ///- In `constrain` mode (the default), out-of-range values are clamped to the nearest in-range value.
+ ///- In `reject` mode, an addition that would result in an out-of-range value fails, and a `RangeError` is thrown.
+ ///
+ ///Additionally, if the result is earlier or later than the range of dates that `Temporal.PlainDate` can represent (approximately half a million years centered on the [Unix epoch](https://en.wikipedia.org/wiki/Unix_time)), then this method will throw a `RangeError` regardless of `overflow`.
+ ///
+ ///Adding a negative duration is equivalent to subtracting the absolute value of that duration.
+ #[wasm_bindgen(method)]
+ pub fn add(this: &PlainDate, duration: &Duration, options: &JsValue) -> PlainDate;
+
+ /// **Parameters:**
+ ///- `duration` (`Temporal.Duration` or value convertible to one): The duration to subtract.
+ ///- `options` (optional object): An object with properties representing options for the subtraction.
+ ///The following options are recognized:
+ ///- `overflow` (string): How to deal with subtractions that result in out-of-range values.
+ /// Allowed values are `constrain` and `reject`.
+ /// The default is `constrain`.
+ ///
+ ///**Returns:** a new `Temporal.PlainDate` object which is the date indicated by `date` minus `duration`.
+ ///
+ ///This method subtracts `duration` from `date`, returning a date that is in the past relative to `date`.
+ ///
+ ///The `duration` argument is an object with properties denoting a duration, such as `{ days: 5 }`, or a string such as `P5D`, or a `Temporal.Duration` object.
+ ///If `duration` is not a `Temporal.Duration` object, then it will be converted to one as if it were passed to `Temporal.Duration.from()`.
+ ///
+ ///Some subtractions may be ambiguous, because months have different lengths.
+ ///For example, subtracting one month from July 31 would result in June 31, which doesn't exist.
+ ///For these cases, the `overflow` option tells what to do:
+ ///
+ ///- In `constrain` mode (the default), out-of-range values are clamped to the nearest in-range value.
+ ///- In `reject` mode, an addition that would result in an out-of-range value fails, and a `RangeError` is thrown.
+ ///
+ ///Additionally, if the result is earlier or later than the range of dates that `Temporal.PlainDate` can represent (approximately half a million years centered on the [Unix epoch](https://en.wikipedia.org/wiki/Unix_time)), then this method will throw a `RangeError` regardless of `overflow`.
+ ///
+ ///Subtracting a negative duration is equivalent to adding the absolute value of that duration.
+ ///
+ #[wasm_bindgen(method)]
+ pub fn subtract(this: &PlainDate, duration: &Duration, options: &JsValue) -> PlainDate;
+
+ /// This function exists because it's not possible to compare using date == other
+ /// or date === other, due to ambiguity in the primitive representation and between
+ /// Temporal types.
+ ///
+ /// If you don't need to know the order in which the two dates occur, then this function
+ /// may be less typing and more efficient than Temporal.PlainDate.compare.
+ ///
+ /// Note that this function will return false if the two objects have different calendar
+ /// properties, even if the actual dates are equal.
+ #[wasm_bindgen(method)]
+ pub fn equals(this: &PlainDate, other: &PlainDate) -> bool;
+
+ /// This method overrides the Object.prototype.toString() method and provides a convenient, unambiguous
+ /// string representation of date. The string can be passed to Temporal.PlainDate.from() to
+ /// create a new Temporal.PlainDate object.
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &PlainDate) -> JsString;
+
+ /// This method overrides `Object.prototype.toLocaleString()` to provide a human-readable,
+ /// language-sensitive representation of duration.
+ ///
+ /// The locales and options arguments are the same as in the constructor to Intl.DateTimeFormat.
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &PlainDate, locales: &JsValue, options: &JsValue) -> JsString;
+
+ /// Returns: a plain object with properties expressing date in the ISO 8601
+ /// calendar, as well as the value of date.calendar.
+ ///
+ /// This method is mainly useful if you are implementing a custom calendar. Most
+ /// code will not need to use it.
+ #[wasm_bindgen(method, js_name = getISOFields)]
+ pub fn get_iso_fields(this: &PlainDate) -> JsValue;
+
+}
+
+pub mod Now {
+ use super::*;
+
+ #[wasm_bindgen]
+ extern "C" {
+ #[wasm_bindgen(js_namespace = ["Temporal", "Now"])]
+ pub fn instant() -> Instant;
+
+ #[wasm_bindgen(js_namespace = ["Temporal", "Now"], js_name = zonedDateTime)]
+ pub fn zoned_date_time(calendar: &str) -> ZonedDateTime;
+
+ #[wasm_bindgen(js_namespace = ["Temporal", "Now"], js_name = zonedDateTimeISO)]
+ pub fn zoned_date_time_iso() -> ZonedDateTime;
+
+ #[wasm_bindgen(js_namespace = ["Temporal", "Now"], js_name = plainDate)]
+ pub fn plain_date(calendar: &str) -> PlainDate;
+
+ #[wasm_bindgen(js_namespace = ["Temporal", "Now"], js_name = plainDateISO)]
+ pub fn plain_date_iso() -> PlainDate;
+
+ #[wasm_bindgen(js_namespace = ["Temporal", "Now"], js_name = plainTimeISO)]
+ pub fn plain_time_iso() -> PlainTime;
+
+ }
+}
diff --git a/vendor/js-sys/src/lib.rs b/vendor/js-sys/src/lib.rs
new file mode 100644
index 000000000..12fef1cb7
--- /dev/null
+++ b/vendor/js-sys/src/lib.rs
@@ -0,0 +1,5871 @@
+//! Bindings to JavaScript's standard, built-in objects, including their methods
+//! and properties.
+//!
+//! This does *not* include any Web, Node, or any other JS environment
+//! APIs. Only the things that are guaranteed to exist in the global scope by
+//! the ECMAScript standard.
+//!
+//! <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects>
+//!
+//! ## A Note About `camelCase`, `snake_case`, and Naming Conventions
+//!
+//! JavaScript's global objects use `camelCase` naming conventions for functions
+//! and methods, but Rust style is to use `snake_case`. These bindings expose
+//! the Rust style `snake_case` name. Additionally, acronyms within a method
+//! name are all lower case, where as in JavaScript they are all upper case. For
+//! example, `decodeURI` in JavaScript is exposed as `decode_uri` in these
+//! bindings.
+
+#![doc(html_root_url = "https://docs.rs/js-sys/0.2")]
+
+use core::ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Neg, Not, Rem, Shl, Shr, Sub};
+use std::cmp::Ordering;
+use std::convert::{self, Infallible, TryFrom};
+use std::f64;
+use std::fmt;
+use std::iter::{self, Product, Sum};
+use std::mem;
+use std::str;
+use std::str::FromStr;
+
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+
+// When adding new imports:
+//
+// * Keep imports in alphabetical order.
+//
+// * Rename imports with `js_name = ...` according to the note about `camelCase`
+// and `snake_case` in the module's documentation above.
+//
+// * Include the one sentence summary of the import from the MDN link in the
+// module's documentation above, and the MDN link itself.
+//
+// * If a function or method can throw an exception, make it catchable by adding
+// `#[wasm_bindgen(catch)]`.
+//
+// * Add a new `#[test]` into the appropriate file in the
+// `crates/js-sys/tests/wasm/` directory. If the imported function or method
+// can throw an exception, make sure to also add test coverage for that case.
+//
+// * Arguments that are `JsValue`s or imported JavaScript types should be taken
+// by reference.
+
+macro_rules! forward_deref_unop {
+ (impl $imp:ident, $method:ident for $t:ty) => {
+ impl $imp for $t {
+ type Output = <&'static $t as $imp>::Output;
+
+ #[inline]
+ fn $method(self) -> Self::Output {
+ $imp::$method(&self)
+ }
+ }
+ };
+}
+
+macro_rules! forward_deref_binop {
+ (impl $imp:ident, $method:ident for $t:ty) => {
+ impl<'a> $imp<$t> for &'a $t {
+ type Output = <&'static $t as $imp<&'static $t>>::Output;
+
+ #[inline]
+ fn $method(self, other: $t) -> Self::Output {
+ $imp::$method(self, &other)
+ }
+ }
+
+ impl $imp<&$t> for $t {
+ type Output = <&'static $t as $imp<&'static $t>>::Output;
+
+ #[inline]
+ fn $method(self, other: &$t) -> Self::Output {
+ $imp::$method(&self, other)
+ }
+ }
+
+ impl $imp<$t> for $t {
+ type Output = <&'static $t as $imp<&'static $t>>::Output;
+
+ #[inline]
+ fn $method(self, other: $t) -> Self::Output {
+ $imp::$method(&self, &other)
+ }
+ }
+ };
+}
+
+macro_rules! forward_js_unop {
+ (impl $imp:ident, $method:ident for $t:ty) => {
+ impl $imp for &$t {
+ type Output = $t;
+
+ #[inline]
+ fn $method(self) -> Self::Output {
+ $imp::$method(JsValue::as_ref(self)).unchecked_into()
+ }
+ }
+
+ forward_deref_unop!(impl $imp, $method for $t);
+ };
+}
+
+macro_rules! forward_js_binop {
+ (impl $imp:ident, $method:ident for $t:ty) => {
+ impl $imp<&$t> for &$t {
+ type Output = $t;
+
+ #[inline]
+ fn $method(self, other: &$t) -> Self::Output {
+ $imp::$method(JsValue::as_ref(self), JsValue::as_ref(other)).unchecked_into()
+ }
+ }
+
+ forward_deref_binop!(impl $imp, $method for $t);
+ };
+}
+
+macro_rules! sum_product {
+ ($($a:ident)*) => ($(
+ impl Sum for $a {
+ #[inline]
+ fn sum<I: iter::Iterator<Item=Self>>(iter: I) -> Self {
+ iter.fold(
+ $a::from(0),
+ |a, b| a + b,
+ )
+ }
+ }
+
+ impl Product for $a {
+ #[inline]
+ fn product<I: iter::Iterator<Item=Self>>(iter: I) -> Self {
+ iter.fold(
+ $a::from(1),
+ |a, b| a * b,
+ )
+ }
+ }
+
+ impl<'a> Sum<&'a $a> for $a {
+ fn sum<I: iter::Iterator<Item=&'a Self>>(iter: I) -> Self {
+ iter.fold(
+ $a::from(0),
+ |a, b| a + b,
+ )
+ }
+ }
+
+ impl<'a> Product<&'a $a> for $a {
+ #[inline]
+ fn product<I: iter::Iterator<Item=&'a Self>>(iter: I) -> Self {
+ iter.fold(
+ $a::from(1),
+ |a, b| a * b,
+ )
+ }
+ }
+ )*)
+}
+
+macro_rules! partialord_ord {
+ ($t:ident) => {
+ impl PartialOrd for $t {
+ #[inline]
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ Some(self.cmp(other))
+ }
+
+ #[inline]
+ fn lt(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).lt(JsValue::as_ref(other))
+ }
+
+ #[inline]
+ fn le(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).le(JsValue::as_ref(other))
+ }
+
+ #[inline]
+ fn ge(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).ge(JsValue::as_ref(other))
+ }
+
+ #[inline]
+ fn gt(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).gt(JsValue::as_ref(other))
+ }
+ }
+
+ impl Ord for $t {
+ #[inline]
+ fn cmp(&self, other: &Self) -> Ordering {
+ if self == other {
+ Ordering::Equal
+ } else if self.lt(other) {
+ Ordering::Less
+ } else {
+ Ordering::Greater
+ }
+ }
+ }
+ };
+}
+
+#[wasm_bindgen]
+extern "C" {
+ /// The `decodeURI()` function decodes a Uniform Resource Identifier (URI)
+ /// previously created by `encodeURI` or by a similar routine.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURI)
+ #[wasm_bindgen(catch, js_name = decodeURI)]
+ pub fn decode_uri(encoded: &str) -> Result<JsString, JsValue>;
+
+ /// The `decodeURIComponent()` function decodes a Uniform Resource Identifier (URI) component
+ /// previously created by `encodeURIComponent` or by a similar routine.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent)
+ #[wasm_bindgen(catch, js_name = decodeURIComponent)]
+ pub fn decode_uri_component(encoded: &str) -> Result<JsString, JsValue>;
+
+ /// The `encodeURI()` function encodes a Uniform Resource Identifier (URI)
+ /// by replacing each instance of certain characters by one, two, three, or
+ /// four escape sequences representing the UTF-8 encoding of the character
+ /// (will only be four escape sequences for characters composed of two
+ /// "surrogate" characters).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI)
+ #[wasm_bindgen(js_name = encodeURI)]
+ pub fn encode_uri(decoded: &str) -> JsString;
+
+ /// The `encodeURIComponent()` function encodes a Uniform Resource Identifier (URI) component
+ /// by replacing each instance of certain characters by one, two, three, or four escape sequences
+ /// representing the UTF-8 encoding of the character
+ /// (will only be four escape sequences for characters composed of two "surrogate" characters).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)
+ #[wasm_bindgen(js_name = encodeURIComponent)]
+ pub fn encode_uri_component(decoded: &str) -> JsString;
+
+ /// The `eval()` function evaluates JavaScript code represented as a string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval)
+ #[wasm_bindgen(catch)]
+ pub fn eval(js_source_text: &str) -> Result<JsValue, JsValue>;
+
+ /// The global `isFinite()` function determines whether the passed value is a finite number.
+ /// If needed, the parameter is first converted to a number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)
+ #[wasm_bindgen(js_name = isFinite)]
+ pub fn is_finite(value: &JsValue) -> bool;
+
+ /// The `parseInt()` function parses a string argument and returns an integer
+ /// of the specified radix (the base in mathematical numeral systems), or NaN on error.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
+ #[wasm_bindgen(js_name = parseInt)]
+ pub fn parse_int(text: &str, radix: u8) -> f64;
+
+ /// The `parseFloat()` function parses an argument and returns a floating point number,
+ /// or NaN on error.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)
+ #[wasm_bindgen(js_name = parseFloat)]
+ pub fn parse_float(text: &str) -> f64;
+
+ /// The `escape()` function computes a new string in which certain characters have been
+ /// replaced by a hexadecimal escape sequence.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape)
+ #[wasm_bindgen]
+ pub fn escape(string: &str) -> JsString;
+
+ /// The `unescape()` function computes a new string in which hexadecimal escape
+ /// sequences are replaced with the character that it represents. The escape sequences might
+ /// be introduced by a function like `escape`. Usually, `decodeURI` or `decodeURIComponent`
+ /// are preferred over `unescape`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/unescape)
+ #[wasm_bindgen]
+ pub fn unescape(string: &str) -> JsString;
+}
+
+// Array
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, is_type_of = Array::is_array, typescript_type = "Array<any>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Array;
+
+ /// Creates a new empty array.
+ #[wasm_bindgen(constructor)]
+ pub fn new() -> Array;
+
+ /// Creates a new array with the specified length (elements are initialized to `undefined`).
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_length(len: u32) -> Array;
+
+ /// Retrieves the element at the index, counting from the end if negative
+ /// (returns `undefined` if the index is out of range).
+ #[wasm_bindgen(method)]
+ pub fn at(this: &Array, index: i32) -> JsValue;
+
+ /// Retrieves the element at the index (returns `undefined` if the index is out of range).
+ #[wasm_bindgen(method, structural, indexing_getter)]
+ pub fn get(this: &Array, index: u32) -> JsValue;
+
+ /// Sets the element at the index (auto-enlarges the array if the index is out of range).
+ #[wasm_bindgen(method, structural, indexing_setter)]
+ pub fn set(this: &Array, index: u32, value: JsValue);
+
+ /// Deletes the element at the index (does nothing if the index is out of range).
+ ///
+ /// The element at the index is set to `undefined`.
+ ///
+ /// This does not resize the array, the array will still be the same length.
+ #[wasm_bindgen(method, structural, indexing_deleter)]
+ pub fn delete(this: &Array, index: u32);
+
+ /// The `Array.from()` method creates a new, shallow-copied `Array` instance
+ /// from an array-like or iterable object.
+ #[wasm_bindgen(static_method_of = Array)]
+ pub fn from(val: &JsValue) -> Array;
+
+ /// The `copyWithin()` method shallow copies part of an array to another
+ /// location in the same array and returns it, without modifying its size.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/copyWithin)
+ #[wasm_bindgen(method, js_name = copyWithin)]
+ pub fn copy_within(this: &Array, target: i32, start: i32, end: i32) -> Array;
+
+ /// The `concat()` method is used to merge two or more arrays. This method
+ /// does not change the existing arrays, but instead returns a new array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)
+ #[wasm_bindgen(method)]
+ pub fn concat(this: &Array, array: &Array) -> Array;
+
+ /// The `every()` method tests whether all elements in the array pass the test
+ /// implemented by the provided function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)
+ #[wasm_bindgen(method)]
+ pub fn every(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> bool;
+
+ /// The `fill()` method fills all the elements of an array from a start index
+ /// to an end index with a static value. The end index is not included.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill)
+ #[wasm_bindgen(method)]
+ pub fn fill(this: &Array, value: &JsValue, start: u32, end: u32) -> Array;
+
+ /// The `filter()` method creates a new array with all elements that pass the
+ /// test implemented by the provided function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
+ #[wasm_bindgen(method)]
+ pub fn filter(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> Array;
+
+ /// The `find()` method returns the value of the first element in the array that satisfies
+ /// the provided testing function. Otherwise `undefined` is returned.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
+ #[wasm_bindgen(method)]
+ pub fn find(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> JsValue;
+
+ /// The `findIndex()` method returns the index of the first element in the array that
+ /// satisfies the provided testing function. Otherwise -1 is returned.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex)
+ #[wasm_bindgen(method, js_name = findIndex)]
+ pub fn find_index(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> bool) -> i32;
+
+ /// The `flat()` method creates a new array with all sub-array elements concatenated into it
+ /// recursively up to the specified depth.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)
+ #[wasm_bindgen(method)]
+ pub fn flat(this: &Array, depth: i32) -> Array;
+
+ /// The `flatMap()` method first maps each element using a mapping function, then flattens
+ /// the result into a new array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap)
+ #[wasm_bindgen(method, js_name = flatMap)]
+ pub fn flat_map(
+ this: &Array,
+ callback: &mut dyn FnMut(JsValue, u32, Array) -> Vec<JsValue>,
+ ) -> Array;
+
+ /// The `forEach()` method executes a provided function once for each array element.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
+ #[wasm_bindgen(method, js_name = forEach)]
+ pub fn for_each(this: &Array, callback: &mut dyn FnMut(JsValue, u32, Array));
+
+ /// The `includes()` method determines whether an array includes a certain
+ /// element, returning true or false as appropriate.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)
+ #[wasm_bindgen(method)]
+ pub fn includes(this: &Array, value: &JsValue, from_index: i32) -> bool;
+
+ /// The `indexOf()` method returns the first index at which a given element
+ /// can be found in the array, or -1 if it is not present.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
+ #[wasm_bindgen(method, js_name = indexOf)]
+ pub fn index_of(this: &Array, value: &JsValue, from_index: i32) -> i32;
+
+ /// The `Array.isArray()` method determines whether the passed value is an Array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
+ #[wasm_bindgen(static_method_of = Array, js_name = isArray)]
+ pub fn is_array(value: &JsValue) -> bool;
+
+ /// The `join()` method joins all elements of an array (or an array-like object)
+ /// into a string and returns this string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join)
+ #[wasm_bindgen(method)]
+ pub fn join(this: &Array, delimiter: &str) -> JsString;
+
+ /// The `lastIndexOf()` method returns the last index at which a given element
+ /// can be found in the array, or -1 if it is not present. The array is
+ /// searched backwards, starting at fromIndex.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf)
+ #[wasm_bindgen(method, js_name = lastIndexOf)]
+ pub fn last_index_of(this: &Array, value: &JsValue, from_index: i32) -> i32;
+
+ /// The length property of an object which is an instance of type Array
+ /// sets or returns the number of elements in that array. The value is an
+ /// unsigned, 32-bit integer that is always numerically greater than the
+ /// highest index in the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn length(this: &Array) -> u32;
+
+ /// `map()` calls a provided callback function once for each element in an array,
+ /// in order, and constructs a new array from the results. callback is invoked
+ /// only for indexes of the array which have assigned values, including undefined.
+ /// It is not called for missing elements of the array (that is, indexes that have
+ /// never been set, which have been deleted or which have never been assigned a value).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
+ #[wasm_bindgen(method)]
+ pub fn map(this: &Array, predicate: &mut dyn FnMut(JsValue, u32, Array) -> JsValue) -> Array;
+
+ /// The `Array.of()` method creates a new Array instance with a variable
+ /// number of arguments, regardless of number or type of the arguments.
+ ///
+ /// The difference between `Array.of()` and the `Array` constructor is in the
+ /// handling of integer arguments: `Array.of(7)` creates an array with a single
+ /// element, `7`, whereas `Array(7)` creates an empty array with a `length`
+ /// property of `7` (Note: this implies an array of 7 empty slots, not slots
+ /// with actual undefined values).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
+ ///
+ /// # Notes
+ ///
+ /// There are a few bindings to `of` in `js-sys`: `of1`, `of2`, etc...
+ /// with different arities.
+ #[wasm_bindgen(static_method_of = Array, js_name = of)]
+ pub fn of1(a: &JsValue) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
+ #[wasm_bindgen(static_method_of = Array, js_name = of)]
+ pub fn of2(a: &JsValue, b: &JsValue) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
+ #[wasm_bindgen(static_method_of = Array, js_name = of)]
+ pub fn of3(a: &JsValue, b: &JsValue, c: &JsValue) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
+ #[wasm_bindgen(static_method_of = Array, js_name = of)]
+ pub fn of4(a: &JsValue, b: &JsValue, c: &JsValue, d: &JsValue) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of)
+ #[wasm_bindgen(static_method_of = Array, js_name = of)]
+ pub fn of5(a: &JsValue, b: &JsValue, c: &JsValue, d: &JsValue, e: &JsValue) -> Array;
+
+ /// The `pop()` method removes the last element from an array and returns that
+ /// element. This method changes the length of the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)
+ #[wasm_bindgen(method)]
+ pub fn pop(this: &Array) -> JsValue;
+
+ /// The `push()` method adds one or more elements to the end of an array and
+ /// returns the new length of the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
+ #[wasm_bindgen(method)]
+ pub fn push(this: &Array, value: &JsValue) -> u32;
+
+ /// The `reduce()` method applies a function against an accumulator and each element in
+ /// the array (from left to right) to reduce it to a single value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
+ #[wasm_bindgen(method)]
+ pub fn reduce(
+ this: &Array,
+ predicate: &mut dyn FnMut(JsValue, JsValue, u32, Array) -> JsValue,
+ initial_value: &JsValue,
+ ) -> JsValue;
+
+ /// The `reduceRight()` method applies a function against an accumulator and each value
+ /// of the array (from right-to-left) to reduce it to a single value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight)
+ #[wasm_bindgen(method, js_name = reduceRight)]
+ pub fn reduce_right(
+ this: &Array,
+ predicate: &mut dyn FnMut(JsValue, JsValue, u32, Array) -> JsValue,
+ initial_value: &JsValue,
+ ) -> JsValue;
+
+ /// The `reverse()` method reverses an array in place. The first array
+ /// element becomes the last, and the last array element becomes the first.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)
+ #[wasm_bindgen(method)]
+ pub fn reverse(this: &Array) -> Array;
+
+ /// The `shift()` method removes the first element from an array and returns
+ /// that removed element. This method changes the length of the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
+ #[wasm_bindgen(method)]
+ pub fn shift(this: &Array) -> JsValue;
+
+ /// The `slice()` method returns a shallow copy of a portion of an array into
+ /// a new array object selected from begin to end (end not included).
+ /// The original array will not be modified.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
+ #[wasm_bindgen(method)]
+ pub fn slice(this: &Array, start: u32, end: u32) -> Array;
+
+ /// The `some()` method tests whether at least one element in the array passes the test implemented
+ /// by the provided function.
+ /// Note: This method returns false for any condition put on an empty array.
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
+ #[wasm_bindgen(method)]
+ pub fn some(this: &Array, predicate: &mut dyn FnMut(JsValue) -> bool) -> bool;
+
+ /// The `sort()` method sorts the elements of an array in place and returns
+ /// the array. The sort is not necessarily stable. The default sort
+ /// order is according to string Unicode code points.
+ ///
+ /// The time and space complexity of the sort cannot be guaranteed as it
+ /// is implementation dependent.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)
+ #[wasm_bindgen(method)]
+ pub fn sort(this: &Array) -> Array;
+
+ /// The `splice()` method changes the contents of an array by removing existing elements and/or
+ /// adding new elements.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
+ #[wasm_bindgen(method)]
+ pub fn splice(this: &Array, start: u32, delete_count: u32, item: &JsValue) -> Array;
+
+ /// The `toLocaleString()` method returns a string representing the elements of the array.
+ /// The elements are converted to Strings using their toLocaleString methods and these
+ /// Strings are separated by a locale-specific String (such as a comma “,”).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString)
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &Array, locales: &JsValue, options: &JsValue) -> JsString;
+
+ /// The `toString()` method returns a string representing the specified array
+ /// and its elements.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Array) -> JsString;
+
+ /// The `unshift()` method adds one or more elements to the beginning of an
+ /// array and returns the new length of the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)
+ #[wasm_bindgen(method)]
+ pub fn unshift(this: &Array, value: &JsValue) -> u32;
+}
+
+/// Iterator returned by `Array::iter`
+#[derive(Debug, Clone)]
+pub struct ArrayIter<'a> {
+ range: std::ops::Range<u32>,
+ array: &'a Array,
+}
+
+impl<'a> std::iter::Iterator for ArrayIter<'a> {
+ type Item = JsValue;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ let index = self.range.next()?;
+ Some(self.array.get(index))
+ }
+
+ #[inline]
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.range.size_hint()
+ }
+}
+
+impl<'a> std::iter::DoubleEndedIterator for ArrayIter<'a> {
+ fn next_back(&mut self) -> Option<Self::Item> {
+ let index = self.range.next_back()?;
+ Some(self.array.get(index))
+ }
+}
+
+impl<'a> std::iter::FusedIterator for ArrayIter<'a> {}
+
+impl<'a> std::iter::ExactSizeIterator for ArrayIter<'a> {}
+
+impl Array {
+ /// Returns an iterator over the values of the JS array.
+ pub fn iter(&self) -> ArrayIter<'_> {
+ ArrayIter {
+ range: 0..self.length(),
+ array: self,
+ }
+ }
+
+ /// Converts the JS array into a new Vec.
+ pub fn to_vec(&self) -> Vec<JsValue> {
+ let len = self.length();
+
+ let mut output = Vec::with_capacity(len as usize);
+
+ for i in 0..len {
+ output.push(self.get(i));
+ }
+
+ output
+ }
+}
+
+// TODO pre-initialize the Array with the correct length using TrustedLen
+impl<A> std::iter::FromIterator<A> for Array
+where
+ A: AsRef<JsValue>,
+{
+ fn from_iter<T>(iter: T) -> Array
+ where
+ T: IntoIterator<Item = A>,
+ {
+ let mut out = Array::new();
+ out.extend(iter);
+ out
+ }
+}
+
+impl<A> std::iter::Extend<A> for Array
+where
+ A: AsRef<JsValue>,
+{
+ fn extend<T>(&mut self, iter: T)
+ where
+ T: IntoIterator<Item = A>,
+ {
+ for value in iter {
+ self.push(value.as_ref());
+ }
+ }
+}
+
+impl Default for Array {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+// ArrayBuffer
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "ArrayBuffer")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type ArrayBuffer;
+
+ /// The `ArrayBuffer` object is used to represent a generic,
+ /// fixed-length raw binary data buffer. You cannot directly
+ /// manipulate the contents of an `ArrayBuffer`; instead, you
+ /// create one of the typed array objects or a `DataView` object
+ /// which represents the buffer in a specific format, and use that
+ /// to read and write the contents of the buffer.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
+ #[wasm_bindgen(constructor)]
+ pub fn new(length: u32) -> ArrayBuffer;
+
+ /// The byteLength property of an object which is an instance of type ArrayBuffer
+ /// it's an accessor property whose set accessor function is undefined,
+ /// meaning that you can only read this property.
+ /// The value is established when the array is constructed and cannot be changed.
+ /// This property returns 0 if this ArrayBuffer has been detached.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/byteLength)
+ #[wasm_bindgen(method, getter, js_name = byteLength)]
+ pub fn byte_length(this: &ArrayBuffer) -> u32;
+
+ /// The `isView()` method returns true if arg is one of the `ArrayBuffer`
+ /// views, such as typed array objects or a DataView; false otherwise.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/isView)
+ #[wasm_bindgen(static_method_of = ArrayBuffer, js_name = isView)]
+ pub fn is_view(value: &JsValue) -> bool;
+
+ /// The `slice()` method returns a new `ArrayBuffer` whose contents
+ /// are a copy of this `ArrayBuffer`'s bytes from begin, inclusive,
+ /// up to end, exclusive.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice)
+ #[wasm_bindgen(method)]
+ pub fn slice(this: &ArrayBuffer, begin: u32) -> ArrayBuffer;
+
+ /// Like `slice()` but with the `end` argument.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice)
+ #[wasm_bindgen(method, js_name = slice)]
+ pub fn slice_with_end(this: &ArrayBuffer, begin: u32, end: u32) -> ArrayBuffer;
+}
+
+// SharedArrayBuffer
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "SharedArrayBuffer")]
+ #[derive(Clone, Debug)]
+ pub type SharedArrayBuffer;
+
+ /// The `SharedArrayBuffer` object is used to represent a generic,
+ /// fixed-length raw binary data buffer, similar to the `ArrayBuffer`
+ /// object, but in a way that they can be used to create views
+ /// on shared memory. Unlike an `ArrayBuffer`, a `SharedArrayBuffer`
+ /// cannot become detached.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer)
+ #[wasm_bindgen(constructor)]
+ pub fn new(length: u32) -> SharedArrayBuffer;
+
+ /// The byteLength accessor property represents the length of
+ /// an `SharedArrayBuffer` in bytes. This is established when
+ /// the `SharedArrayBuffer` is constructed and cannot be changed.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/byteLength)
+ #[wasm_bindgen(method, getter, js_name = byteLength)]
+ pub fn byte_length(this: &SharedArrayBuffer) -> u32;
+
+ /// The `slice()` method returns a new `SharedArrayBuffer` whose contents
+ /// are a copy of this `SharedArrayBuffer`'s bytes from begin, inclusive,
+ /// up to end, exclusive.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/slice)
+ #[wasm_bindgen(method)]
+ pub fn slice(this: &SharedArrayBuffer, begin: u32) -> SharedArrayBuffer;
+
+ /// Like `slice()` but with the `end` argument.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/slice)
+ #[wasm_bindgen(method, js_name = slice)]
+ pub fn slice_with_end(this: &SharedArrayBuffer, begin: u32, end: u32) -> SharedArrayBuffer;
+}
+
+// Array Iterator
+#[wasm_bindgen]
+extern "C" {
+ /// The `keys()` method returns a new Array Iterator object that contains the
+ /// keys for each index in the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/keys)
+ #[wasm_bindgen(method)]
+ pub fn keys(this: &Array) -> Iterator;
+
+ /// The `entries()` method returns a new Array Iterator object that contains
+ /// the key/value pairs for each index in the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries)
+ #[wasm_bindgen(method)]
+ pub fn entries(this: &Array) -> Iterator;
+
+ /// The `values()` method returns a new Array Iterator object that
+ /// contains the values for each index in the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values)
+ #[wasm_bindgen(method)]
+ pub fn values(this: &Array) -> Iterator;
+}
+
+/// The `Atomics` object provides atomic operations as static methods.
+/// They are used with `SharedArrayBuffer` objects.
+///
+/// The Atomic operations are installed on an `Atomics` module. Unlike
+/// the other global objects, `Atomics` is not a constructor. You cannot
+/// use it with a new operator or invoke the `Atomics` object as a
+/// function. All properties and methods of `Atomics` are static
+/// (as is the case with the Math object, for example).
+/// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics)
+#[allow(non_snake_case)]
+pub mod Atomics {
+ use super::*;
+
+ #[wasm_bindgen]
+ extern "C" {
+ /// The static `Atomics.add()` method adds a given value at a given
+ /// position in the array and returns the old value at that position.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/add)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn add(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.and()` method computes a bitwise AND with a given
+ /// value at a given position in the array, and returns the old value
+ /// at that position.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/and)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn and(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.compareExchange()` method exchanges a given
+ /// replacement value at a given position in the array, if a given expected
+ /// value equals the old value. It returns the old value at that position
+ /// whether it was equal to the expected value or not.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/compareExchange)
+ #[wasm_bindgen(js_namespace = Atomics, catch, js_name = compareExchange)]
+ pub fn compare_exchange(
+ typed_array: &JsValue,
+ index: u32,
+ expected_value: i32,
+ replacement_value: i32,
+ ) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.exchange()` method stores a given value at a given
+ /// position in the array and returns the old value at that position.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/exchange)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn exchange(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.isLockFree()` method is used to determine
+ /// whether to use locks or atomic operations. It returns true,
+ /// if the given size is one of the `BYTES_PER_ELEMENT` property
+ /// of integer `TypedArray` types.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/isLockFree)
+ #[wasm_bindgen(js_namespace = Atomics, js_name = isLockFree)]
+ pub fn is_lock_free(size: u32) -> bool;
+
+ /// The static `Atomics.load()` method returns a value at a given
+ /// position in the array.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/load)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn load(typed_array: &JsValue, index: u32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.notify()` method notifies up some agents that
+ /// are sleeping in the wait queue.
+ /// Note: This operation works with a shared `Int32Array` only.
+ /// If `count` is not provided, notifies all the agents in the queue.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/notify)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn notify(typed_array: &Int32Array, index: u32) -> Result<u32, JsValue>;
+
+ /// Notifies up to `count` agents in the wait queue.
+ #[wasm_bindgen(js_namespace = Atomics, catch, js_name = notify)]
+ pub fn notify_with_count(
+ typed_array: &Int32Array,
+ index: u32,
+ count: u32,
+ ) -> Result<u32, JsValue>;
+
+ /// The static `Atomics.or()` method computes a bitwise OR with a given value
+ /// at a given position in the array, and returns the old value at that position.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/or)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn or(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.store()` method stores a given value at the given
+ /// position in the array and returns that value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/store)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn store(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.sub()` method substracts a given value at a
+ /// given position in the array and returns the old value at that position.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/sub)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn sub(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+
+ /// The static `Atomics.wait()` method verifies that a given
+ /// position in an `Int32Array` still contains a given value
+ /// and if so sleeps, awaiting a wakeup or a timeout.
+ /// It returns a string which is either "ok", "not-equal", or "timed-out".
+ /// Note: This operation only works with a shared `Int32Array`
+ /// and may not be allowed on the main thread.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn wait(typed_array: &Int32Array, index: u32, value: i32) -> Result<JsString, JsValue>;
+
+ /// Like `wait()`, but with timeout
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/wait)
+ #[wasm_bindgen(js_namespace = Atomics, catch, js_name = wait)]
+ pub fn wait_with_timeout(
+ typed_array: &Int32Array,
+ index: u32,
+ value: i32,
+ timeout: f64,
+ ) -> Result<JsString, JsValue>;
+
+ /// The static `Atomics.xor()` method computes a bitwise XOR
+ /// with a given value at a given position in the array,
+ /// and returns the old value at that position.
+ /// This atomic operation guarantees that no other write happens
+ /// until the modified value is written back.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics/xor)
+ #[wasm_bindgen(js_namespace = Atomics, catch)]
+ pub fn xor(typed_array: &JsValue, index: u32, value: i32) -> Result<i32, JsValue>;
+ }
+}
+
+// BigInt
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, is_type_of = |v| v.is_bigint(), typescript_type = "bigint")]
+ #[derive(Clone, PartialEq, Eq)]
+ pub type BigInt;
+
+ #[wasm_bindgen(catch, js_name = BigInt)]
+ fn new_bigint(value: &JsValue) -> Result<BigInt, Error>;
+
+ #[wasm_bindgen(js_name = BigInt)]
+ fn new_bigint_unchecked(value: &JsValue) -> BigInt;
+
+ /// Clamps a BigInt value to a signed integer value, and returns that value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asIntN)
+ #[wasm_bindgen(static_method_of = BigInt, js_name = asIntN)]
+ pub fn as_int_n(bits: f64, bigint: &BigInt) -> BigInt;
+
+ /// Clamps a BigInt value to an unsigned integer value, and returns that value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/asUintN)
+ #[wasm_bindgen(static_method_of = BigInt, js_name = asUintN)]
+ pub fn as_uint_n(bits: f64, bigint: &BigInt) -> BigInt;
+
+ /// 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.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toLocaleString)
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &BigInt, locales: &JsValue, options: &JsValue) -> JsString;
+
+ /// 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.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/toString)
+ #[wasm_bindgen(catch, method, js_name = toString)]
+ pub fn to_string(this: &BigInt, radix: u8) -> Result<JsString, RangeError>;
+
+ #[wasm_bindgen(method, js_name = toString)]
+ fn to_string_unchecked(this: &BigInt, radix: u8) -> String;
+
+ /// Returns this BigInt value. Overrides the [`Object.prototype.valueOf()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf) method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/valueOf)
+ #[wasm_bindgen(method, js_name = valueOf)]
+ pub fn value_of(this: &BigInt, radix: u8) -> BigInt;
+}
+
+impl BigInt {
+ /// Creates a new BigInt value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt/BigInt)
+ #[inline]
+ pub fn new(value: &JsValue) -> Result<BigInt, Error> {
+ new_bigint(value)
+ }
+
+ /// Applies the binary `/` JS operator on two `BigInt`s, catching and returning any `RangeError` thrown.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Division)
+ pub fn checked_div(&self, rhs: &Self) -> Result<Self, RangeError> {
+ let result = JsValue::as_ref(self).checked_div(JsValue::as_ref(rhs));
+
+ if result.is_instance_of::<RangeError>() {
+ Err(result.unchecked_into())
+ } else {
+ Ok(result.unchecked_into())
+ }
+ }
+
+ /// Applies the binary `**` JS operator on the two `BigInt`s.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation)
+ #[inline]
+ pub fn pow(&self, rhs: &Self) -> Self {
+ JsValue::as_ref(self)
+ .pow(JsValue::as_ref(rhs))
+ .unchecked_into()
+ }
+}
+
+macro_rules! bigint_from {
+ ($($x:ident)*) => ($(
+ impl From<$x> for BigInt {
+ #[inline]
+ fn from(x: $x) -> BigInt {
+ new_bigint_unchecked(&JsValue::from(x))
+ }
+ }
+
+ impl PartialEq<$x> for BigInt {
+ #[inline]
+ fn eq(&self, other: &$x) -> bool {
+ JsValue::from(self) == JsValue::from(BigInt::from(*other))
+ }
+ }
+ )*)
+}
+bigint_from!(i8 u8 i16 u16 i32 u32 isize usize);
+
+macro_rules! bigint_from_big {
+ ($($x:ident)*) => ($(
+ impl From<$x> for BigInt {
+ #[inline]
+ fn from(x: $x) -> BigInt {
+ JsValue::from(x).unchecked_into()
+ }
+ }
+
+ impl PartialEq<$x> for BigInt {
+ #[inline]
+ fn eq(&self, other: &$x) -> bool {
+ self == &BigInt::from(*other)
+ }
+ }
+
+ impl TryFrom<BigInt> for $x {
+ type Error = BigInt;
+
+ #[inline]
+ fn try_from(x: BigInt) -> Result<Self, BigInt> {
+ Self::try_from(JsValue::from(x)).map_err(JsCast::unchecked_into)
+ }
+ }
+ )*)
+}
+bigint_from_big!(i64 u64 i128 u128);
+
+impl PartialEq<Number> for BigInt {
+ #[inline]
+ fn eq(&self, other: &Number) -> bool {
+ JsValue::as_ref(self).loose_eq(JsValue::as_ref(other))
+ }
+}
+
+impl Not for &BigInt {
+ type Output = BigInt;
+
+ #[inline]
+ fn not(self) -> Self::Output {
+ JsValue::as_ref(self).bit_not().unchecked_into()
+ }
+}
+
+forward_deref_unop!(impl Not, not for BigInt);
+forward_js_unop!(impl Neg, neg for BigInt);
+forward_js_binop!(impl BitAnd, bitand for BigInt);
+forward_js_binop!(impl BitOr, bitor for BigInt);
+forward_js_binop!(impl BitXor, bitxor for BigInt);
+forward_js_binop!(impl Shl, shl for BigInt);
+forward_js_binop!(impl Shr, shr for BigInt);
+forward_js_binop!(impl Add, add for BigInt);
+forward_js_binop!(impl Sub, sub for BigInt);
+forward_js_binop!(impl Div, div for BigInt);
+forward_js_binop!(impl Mul, mul for BigInt);
+forward_js_binop!(impl Rem, rem for BigInt);
+sum_product!(BigInt);
+
+partialord_ord!(BigInt);
+
+impl Default for BigInt {
+ fn default() -> Self {
+ BigInt::from(i32::default())
+ }
+}
+
+impl FromStr for BigInt {
+ type Err = Error;
+
+ #[inline]
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ BigInt::new(&s.into())
+ }
+}
+
+impl fmt::Debug for BigInt {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ fmt::Display::fmt(self, f)
+ }
+}
+
+impl fmt::Display for BigInt {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.pad_integral(self >= &BigInt::from(0), "", &self.to_string_unchecked(10))
+ }
+}
+
+impl fmt::Binary for BigInt {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.pad_integral(self >= &BigInt::from(0), "0b", &self.to_string_unchecked(2))
+ }
+}
+
+impl fmt::Octal for BigInt {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.pad_integral(self >= &BigInt::from(0), "0o", &self.to_string_unchecked(8))
+ }
+}
+
+impl fmt::LowerHex for BigInt {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ f.pad_integral(
+ self >= &BigInt::from(0),
+ "0x",
+ &self.to_string_unchecked(16),
+ )
+ }
+}
+
+impl fmt::UpperHex for BigInt {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ let mut s: String = self.to_string_unchecked(16);
+ s.make_ascii_uppercase();
+ f.pad_integral(self >= &BigInt::from(0), "0x", &s)
+ }
+}
+
+// Boolean
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, is_type_of = |v| v.as_bool().is_some(), typescript_type = "boolean")]
+ #[derive(Clone, PartialEq, Eq)]
+ pub type Boolean;
+
+ /// The `Boolean()` constructor creates an object wrapper for a boolean value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)
+ #[wasm_bindgen(constructor)]
+ #[deprecated(note = "recommended to use `Boolean::from` instead")]
+ #[allow(deprecated)]
+ pub fn new(value: &JsValue) -> Boolean;
+
+ /// The `valueOf()` method returns the primitive value of a `Boolean` object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean/valueOf)
+ #[wasm_bindgen(method, js_name = valueOf)]
+ pub fn value_of(this: &Boolean) -> bool;
+}
+
+impl From<bool> for Boolean {
+ #[inline]
+ fn from(b: bool) -> Boolean {
+ Boolean::unchecked_from_js(JsValue::from(b))
+ }
+}
+
+impl From<Boolean> for bool {
+ #[inline]
+ fn from(b: Boolean) -> bool {
+ b.value_of()
+ }
+}
+
+impl PartialEq<bool> for Boolean {
+ #[inline]
+ fn eq(&self, other: &bool) -> bool {
+ self.value_of() == *other
+ }
+}
+
+impl fmt::Debug for Boolean {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fmt::Debug::fmt(&self.value_of(), f)
+ }
+}
+
+impl fmt::Display for Boolean {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fmt::Display::fmt(&self.value_of(), f)
+ }
+}
+
+impl Default for Boolean {
+ fn default() -> Self {
+ Self::from(bool::default())
+ }
+}
+
+impl Not for &Boolean {
+ type Output = Boolean;
+
+ #[inline]
+ fn not(self) -> Self::Output {
+ (!JsValue::as_ref(self)).into()
+ }
+}
+
+forward_deref_unop!(impl Not, not for Boolean);
+
+partialord_ord!(Boolean);
+
+// DataView
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "DataView")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type DataView;
+
+ /// The `DataView` view provides a low-level interface for reading and
+ /// writing multiple number types in an `ArrayBuffer` irrespective of the
+ /// platform's endianness.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView)
+ #[wasm_bindgen(constructor)]
+ pub fn new(buffer: &ArrayBuffer, byteOffset: usize, byteLength: usize) -> DataView;
+
+ /// The ArrayBuffer referenced by this view. Fixed at construction time and thus read only.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/buffer)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn buffer(this: &DataView) -> ArrayBuffer;
+
+ /// The length (in bytes) of this view from the start of its ArrayBuffer.
+ /// Fixed at construction time and thus read only.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteLength)
+ #[wasm_bindgen(method, getter, structural, js_name = byteLength)]
+ pub fn byte_length(this: &DataView) -> usize;
+
+ /// The offset (in bytes) of this view from the start of its ArrayBuffer.
+ /// Fixed at construction time and thus read only.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteOffset)
+ #[wasm_bindgen(method, getter, structural, js_name = byteOffset)]
+ pub fn byte_offset(this: &DataView) -> usize;
+
+ /// The `getInt8()` method gets a signed 8-bit integer (byte) at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt8)
+ #[wasm_bindgen(method, js_name = getInt8)]
+ pub fn get_int8(this: &DataView, byte_offset: usize) -> i8;
+
+ /// The `getUint8()` method gets a unsigned 8-bit integer (byte) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint8)
+ #[wasm_bindgen(method, js_name = getUint8)]
+ pub fn get_uint8(this: &DataView, byte_offset: usize) -> u8;
+
+ /// The `getInt16()` method gets a signed 16-bit integer (short) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16)
+ #[wasm_bindgen(method, js_name = getInt16)]
+ pub fn get_int16(this: &DataView, byte_offset: usize) -> i16;
+
+ /// The `getInt16()` method gets a signed 16-bit integer (short) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16)
+ #[wasm_bindgen(method, js_name = getInt16)]
+ pub fn get_int16_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> i16;
+
+ /// The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified
+ /// byte offset from the start of the view.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16)
+ #[wasm_bindgen(method, js_name = getUint16)]
+ pub fn get_uint16(this: &DataView, byte_offset: usize) -> u16;
+
+ /// The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified
+ /// byte offset from the start of the view.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16)
+ #[wasm_bindgen(method, js_name = getUint16)]
+ pub fn get_uint16_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> u16;
+
+ /// The `getInt32()` method gets a signed 32-bit integer (long) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32)
+ #[wasm_bindgen(method, js_name = getInt32)]
+ pub fn get_int32(this: &DataView, byte_offset: usize) -> i32;
+
+ /// The `getInt32()` method gets a signed 32-bit integer (long) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32)
+ #[wasm_bindgen(method, js_name = getInt32)]
+ pub fn get_int32_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> i32;
+
+ /// The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified
+ /// byte offset from the start of the view.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint32)
+ #[wasm_bindgen(method, js_name = getUint32)]
+ pub fn get_uint32(this: &DataView, byte_offset: usize) -> u32;
+
+ /// The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified
+ /// byte offset from the start of the view.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint32)
+ #[wasm_bindgen(method, js_name = getUint32)]
+ pub fn get_uint32_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> u32;
+
+ /// The `getFloat32()` method gets a signed 32-bit float (float) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat32)
+ #[wasm_bindgen(method, js_name = getFloat32)]
+ pub fn get_float32(this: &DataView, byte_offset: usize) -> f32;
+
+ /// The `getFloat32()` method gets a signed 32-bit float (float) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat32)
+ #[wasm_bindgen(method, js_name = getFloat32)]
+ pub fn get_float32_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> f32;
+
+ /// The `getFloat64()` method gets a signed 64-bit float (double) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat64)
+ #[wasm_bindgen(method, js_name = getFloat64)]
+ pub fn get_float64(this: &DataView, byte_offset: usize) -> f64;
+
+ /// The `getFloat64()` method gets a signed 64-bit float (double) at the specified
+ /// byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat64)
+ #[wasm_bindgen(method, js_name = getFloat64)]
+ pub fn get_float64_endian(this: &DataView, byte_offset: usize, little_endian: bool) -> f64;
+
+ /// The `setInt8()` method stores a signed 8-bit integer (byte) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8)
+ #[wasm_bindgen(method, js_name = setInt8)]
+ pub fn set_int8(this: &DataView, byte_offset: usize, value: i8);
+
+ /// The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint8)
+ #[wasm_bindgen(method, js_name = setUint8)]
+ pub fn set_uint8(this: &DataView, byte_offset: usize, value: u8);
+
+ /// The `setInt16()` method stores a signed 16-bit integer (short) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt16)
+ #[wasm_bindgen(method, js_name = setInt16)]
+ pub fn set_int16(this: &DataView, byte_offset: usize, value: i16);
+
+ /// The `setInt16()` method stores a signed 16-bit integer (short) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt16)
+ #[wasm_bindgen(method, js_name = setInt16)]
+ pub fn set_int16_endian(this: &DataView, byte_offset: usize, value: i16, little_endian: bool);
+
+ /// The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint16)
+ #[wasm_bindgen(method, js_name = setUint16)]
+ pub fn set_uint16(this: &DataView, byte_offset: usize, value: u16);
+
+ /// The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint16)
+ #[wasm_bindgen(method, js_name = setUint16)]
+ pub fn set_uint16_endian(this: &DataView, byte_offset: usize, value: u16, little_endian: bool);
+
+ /// The `setInt32()` method stores a signed 32-bit integer (long) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt32)
+ #[wasm_bindgen(method, js_name = setInt32)]
+ pub fn set_int32(this: &DataView, byte_offset: usize, value: i32);
+
+ /// The `setInt32()` method stores a signed 32-bit integer (long) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt32)
+ #[wasm_bindgen(method, js_name = setInt32)]
+ pub fn set_int32_endian(this: &DataView, byte_offset: usize, value: i32, little_endian: bool);
+
+ /// The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint32)
+ #[wasm_bindgen(method, js_name = setUint32)]
+ pub fn set_uint32(this: &DataView, byte_offset: usize, value: u32);
+
+ /// The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint32)
+ #[wasm_bindgen(method, js_name = setUint32)]
+ pub fn set_uint32_endian(this: &DataView, byte_offset: usize, value: u32, little_endian: bool);
+
+ /// The `setFloat32()` method stores a signed 32-bit float (float) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat32)
+ #[wasm_bindgen(method, js_name = setFloat32)]
+ pub fn set_float32(this: &DataView, byte_offset: usize, value: f32);
+
+ /// The `setFloat32()` method stores a signed 32-bit float (float) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat32)
+ #[wasm_bindgen(method, js_name = setFloat32)]
+ pub fn set_float32_endian(this: &DataView, byte_offset: usize, value: f32, little_endian: bool);
+
+ /// The `setFloat64()` method stores a signed 64-bit float (double) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat64)
+ #[wasm_bindgen(method, js_name = setFloat64)]
+ pub fn set_float64(this: &DataView, byte_offset: usize, value: f64);
+
+ /// The `setFloat64()` method stores a signed 64-bit float (double) value at the
+ /// specified byte offset from the start of the DataView.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat64)
+ #[wasm_bindgen(method, js_name = setFloat64)]
+ pub fn set_float64_endian(this: &DataView, byte_offset: usize, value: f64, little_endian: bool);
+}
+
+// Error
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "Error")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Error;
+
+ /// The Error constructor creates an error object.
+ /// Instances of Error objects are thrown when runtime errors occur.
+ /// The Error object can also be used as a base object for user-defined exceptions.
+ /// See below for standard built-in error types.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
+ #[wasm_bindgen(constructor)]
+ pub fn new(message: &str) -> Error;
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_options(message: &str, options: &Object) -> Error;
+
+ /// The cause property is the underlying cause of the error.
+ /// Usually this is used to add context to re-thrown errors.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#differentiate_between_similar_errors)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn cause(this: &Error) -> JsValue;
+ #[wasm_bindgen(method, setter, structural)]
+ pub fn set_cause(this: &Error, cause: &JsValue);
+
+ /// The message property is a human-readable description of the error.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/message)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn message(this: &Error) -> JsString;
+ #[wasm_bindgen(method, setter, structural)]
+ pub fn set_message(this: &Error, message: &str);
+
+ /// The name property represents a name for the type of error. The initial value is "Error".
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/name)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn name(this: &Error) -> JsString;
+ #[wasm_bindgen(method, setter, structural)]
+ pub fn set_name(this: &Error, name: &str);
+
+ /// The `toString()` method returns a string representing the specified Error object
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Error) -> JsString;
+}
+
+partialord_ord!(JsString);
+
+// EvalError
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, extends = Error, typescript_type = "EvalError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type EvalError;
+
+ /// The EvalError object indicates an error regarding the global eval() function. This
+ /// exception is not thrown by JavaScript anymore, however the EvalError object remains for
+ /// compatibility.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/EvalError)
+ #[wasm_bindgen(constructor)]
+ pub fn new(message: &str) -> EvalError;
+}
+
+// Function
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, is_type_of = JsValue::is_function, typescript_type = "Function")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Function;
+
+ /// The `Function` constructor creates a new `Function` object. Calling the
+ /// constructor directly can create functions dynamically, but suffers from
+ /// security and similar (but far less significant) performance issues
+ /// similar to `eval`. However, unlike `eval`, the `Function` constructor
+ /// allows executing code in the global scope, prompting better programming
+ /// habits and allowing for more efficient code minification.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_args(args: &str, body: &str) -> Function;
+
+ /// The `Function` constructor creates a new `Function` object. Calling the
+ /// constructor directly can create functions dynamically, but suffers from
+ /// security and similar (but far less significant) performance issues
+ /// similar to `eval`. However, unlike `eval`, the `Function` constructor
+ /// allows executing code in the global scope, prompting better programming
+ /// habits and allowing for more efficient code minification.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
+ #[wasm_bindgen(constructor)]
+ pub fn new_no_args(body: &str) -> Function;
+
+ /// The `apply()` method calls a function with a given this value, and arguments provided as an array
+ /// (or an array-like object).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)
+ #[wasm_bindgen(method, catch)]
+ pub fn apply(this: &Function, context: &JsValue, args: &Array) -> Result<JsValue, JsValue>;
+
+ /// The `call()` method calls a function with a given this value and
+ /// arguments provided individually.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
+ #[wasm_bindgen(method, catch, js_name = call)]
+ pub fn call0(this: &Function, context: &JsValue) -> Result<JsValue, JsValue>;
+
+ /// The `call()` method calls a function with a given this value and
+ /// arguments provided individually.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
+ #[wasm_bindgen(method, catch, js_name = call)]
+ pub fn call1(this: &Function, context: &JsValue, arg1: &JsValue) -> Result<JsValue, JsValue>;
+
+ /// The `call()` method calls a function with a given this value and
+ /// arguments provided individually.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
+ #[wasm_bindgen(method, catch, js_name = call)]
+ pub fn call2(
+ this: &Function,
+ context: &JsValue,
+ arg1: &JsValue,
+ arg2: &JsValue,
+ ) -> Result<JsValue, JsValue>;
+
+ /// The `call()` method calls a function with a given this value and
+ /// arguments provided individually.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)
+ #[wasm_bindgen(method, catch, js_name = call)]
+ pub fn call3(
+ this: &Function,
+ context: &JsValue,
+ arg1: &JsValue,
+ arg2: &JsValue,
+ arg3: &JsValue,
+ ) -> Result<JsValue, JsValue>;
+
+ /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
+ /// with a given sequence of arguments preceding any provided when the new function is called.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
+ #[wasm_bindgen(method, js_name = bind)]
+ pub fn bind(this: &Function, context: &JsValue) -> Function;
+
+ /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
+ /// with a given sequence of arguments preceding any provided when the new function is called.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
+ #[wasm_bindgen(method, js_name = bind)]
+ pub fn bind0(this: &Function, context: &JsValue) -> Function;
+
+ /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
+ /// with a given sequence of arguments preceding any provided when the new function is called.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
+ #[wasm_bindgen(method, js_name = bind)]
+ pub fn bind1(this: &Function, context: &JsValue, arg1: &JsValue) -> Function;
+
+ /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
+ /// with a given sequence of arguments preceding any provided when the new function is called.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
+ #[wasm_bindgen(method, js_name = bind)]
+ pub fn bind2(this: &Function, context: &JsValue, arg1: &JsValue, arg2: &JsValue) -> Function;
+
+ /// The `bind()` method creates a new function that, when called, has its this keyword set to the provided value,
+ /// with a given sequence of arguments preceding any provided when the new function is called.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
+ #[wasm_bindgen(method, js_name = bind)]
+ pub fn bind3(
+ this: &Function,
+ context: &JsValue,
+ arg1: &JsValue,
+ arg2: &JsValue,
+ arg3: &JsValue,
+ ) -> Function;
+
+ /// The length property indicates the number of arguments expected by the function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/length)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn length(this: &Function) -> u32;
+
+ /// A Function object's read-only name property indicates the function's
+ /// name as specified when it was created or "anonymous" for functions
+ /// created anonymously.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn name(this: &Function) -> JsString;
+
+ /// The `toString()` method returns a string representing the source code of the function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Function) -> JsString;
+}
+
+impl Function {
+ /// Returns the `Function` value of this JS value if it's an instance of a
+ /// function.
+ ///
+ /// If this JS value is not an instance of a function then this returns
+ /// `None`.
+ #[deprecated(note = "recommended to use dyn_ref instead which is now equivalent")]
+ pub fn try_from(val: &JsValue) -> Option<&Function> {
+ val.dyn_ref()
+ }
+}
+
+impl Default for Function {
+ fn default() -> Self {
+ Self::new_no_args("")
+ }
+}
+
+// Generator
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "Generator<any, any, any>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Generator;
+
+ /// The `next()` method returns an object with two properties done and value.
+ /// You can also provide a parameter to the next method to send a value to the generator.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next)
+ #[wasm_bindgen(method, structural, catch)]
+ pub fn next(this: &Generator, value: &JsValue) -> Result<JsValue, JsValue>;
+
+ /// The `return()` method returns the given value and finishes the generator.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/return)
+ #[wasm_bindgen(method, structural, js_name = return)]
+ pub fn return_(this: &Generator, value: &JsValue) -> JsValue;
+
+ /// The `throw()` method resumes the execution of a generator by throwing an error into it
+ /// and returns an object with two properties done and value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/throw)
+ #[wasm_bindgen(method, structural, catch)]
+ pub fn throw(this: &Generator, error: &Error) -> Result<JsValue, JsValue>;
+}
+
+// Map
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "Map<any, any>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Map;
+
+ /// The `clear()` method removes all elements from a Map object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/clear)
+ #[wasm_bindgen(method)]
+ pub fn clear(this: &Map);
+
+ /// The `delete()` method removes the specified element from a Map object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/delete)
+ #[wasm_bindgen(method)]
+ pub fn delete(this: &Map, key: &JsValue) -> bool;
+
+ /// The `forEach()` method executes a provided function once per each
+ /// key/value pair in the Map object, in insertion order.
+ /// Note that in Javascript land the `Key` and `Value` are reversed compared to normal expectations:
+ /// # Examples
+ /// ```
+ /// let js_map = Map::new();
+ /// js_map.for_each(&mut |value, key| {
+ /// // Do something here...
+ /// })
+ /// ```
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/forEach)
+ #[wasm_bindgen(method, js_name = forEach)]
+ pub fn for_each(this: &Map, callback: &mut dyn FnMut(JsValue, JsValue));
+
+ /// The `get()` method returns a specified element from a Map object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/get)
+ #[wasm_bindgen(method)]
+ pub fn get(this: &Map, key: &JsValue) -> JsValue;
+
+ /// The `has()` method returns a boolean indicating whether an element with
+ /// the specified key exists or not.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/has)
+ #[wasm_bindgen(method)]
+ pub fn has(this: &Map, key: &JsValue) -> bool;
+
+ /// The Map object holds key-value pairs. Any value (both objects and
+ /// primitive values) maybe used as either a key or a value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)
+ #[wasm_bindgen(constructor)]
+ pub fn new() -> Map;
+
+ /// The `set()` method adds or updates an element with a specified key
+ /// and value to a Map object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/set)
+ #[wasm_bindgen(method)]
+ pub fn set(this: &Map, key: &JsValue, value: &JsValue) -> Map;
+
+ /// The value of size is an integer representing how many entries
+ /// the Map object has. A set accessor function for size is undefined;
+ /// you can not change this property.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/size)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn size(this: &Map) -> u32;
+}
+
+impl Default for Map {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+// Map Iterator
+#[wasm_bindgen]
+extern "C" {
+ /// The `entries()` method returns a new Iterator object that contains
+ /// the [key, value] pairs for each element in the Map object in
+ /// insertion order.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries)
+ #[wasm_bindgen(method)]
+ pub fn entries(this: &Map) -> Iterator;
+
+ /// The `keys()` method returns a new Iterator object that contains the
+ /// keys for each element in the Map object in insertion order.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys)
+ #[wasm_bindgen(method)]
+ pub fn keys(this: &Map) -> Iterator;
+
+ /// The `values()` method returns a new Iterator object that contains the
+ /// values for each element in the Map object in insertion order.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values)
+ #[wasm_bindgen(method)]
+ pub fn values(this: &Map) -> Iterator;
+}
+
+// Iterator
+#[wasm_bindgen]
+extern "C" {
+ /// Any object that conforms to the JS iterator protocol. For example,
+ /// something returned by `myArray[Symbol.iterator]()`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
+ #[derive(Clone, Debug)]
+ #[wasm_bindgen(is_type_of = Iterator::looks_like_iterator, typescript_type = "Iterator<any>")]
+ pub type Iterator;
+
+ /// The `next()` method always has to return an object with appropriate
+ /// properties including done and value. If a non-object value gets returned
+ /// (such as false or undefined), a TypeError ("iterator.next() returned a
+ /// non-object value") will be thrown.
+ #[wasm_bindgen(catch, method, structural)]
+ pub fn next(this: &Iterator) -> Result<IteratorNext, JsValue>;
+}
+
+impl Iterator {
+ fn looks_like_iterator(it: &JsValue) -> bool {
+ #[wasm_bindgen]
+ extern "C" {
+ type MaybeIterator;
+
+ #[wasm_bindgen(method, getter)]
+ fn next(this: &MaybeIterator) -> JsValue;
+ }
+
+ if !it.is_object() {
+ return false;
+ }
+
+ let it = it.unchecked_ref::<MaybeIterator>();
+
+ it.next().is_function()
+ }
+}
+
+// Async Iterator
+#[wasm_bindgen]
+extern "C" {
+ /// Any object that conforms to the JS async iterator protocol. For example,
+ /// something returned by `myObject[Symbol.asyncIterator]()`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of)
+ #[derive(Clone, Debug)]
+ #[wasm_bindgen(is_type_of = Iterator::looks_like_iterator, typescript_type = "AsyncIterator<any>")]
+ pub type AsyncIterator;
+
+ /// The `next()` method always has to return a Promise which resolves to an object
+ /// with appropriate properties including done and value. If a non-object value
+ /// gets returned (such as false or undefined), a TypeError ("iterator.next()
+ /// returned a non-object value") will be thrown.
+ #[wasm_bindgen(catch, method, structural)]
+ pub fn next(this: &AsyncIterator) -> Result<Promise, JsValue>;
+}
+
+/// An iterator over the JS `Symbol.iterator` iteration protocol.
+///
+/// Use the `IntoIterator for &js_sys::Iterator` implementation to create this.
+pub struct Iter<'a> {
+ js: &'a Iterator,
+ state: IterState,
+}
+
+/// An iterator over the JS `Symbol.iterator` iteration protocol.
+///
+/// Use the `IntoIterator for js_sys::Iterator` implementation to create this.
+pub struct IntoIter {
+ js: Iterator,
+ state: IterState,
+}
+
+struct IterState {
+ done: bool,
+}
+
+impl<'a> IntoIterator for &'a Iterator {
+ type Item = Result<JsValue, JsValue>;
+ type IntoIter = Iter<'a>;
+
+ fn into_iter(self) -> Iter<'a> {
+ Iter {
+ js: self,
+ state: IterState::new(),
+ }
+ }
+}
+
+impl<'a> std::iter::Iterator for Iter<'a> {
+ type Item = Result<JsValue, JsValue>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.state.next(self.js)
+ }
+}
+
+impl IntoIterator for Iterator {
+ type Item = Result<JsValue, JsValue>;
+ type IntoIter = IntoIter;
+
+ fn into_iter(self) -> IntoIter {
+ IntoIter {
+ js: self,
+ state: IterState::new(),
+ }
+ }
+}
+
+impl std::iter::Iterator for IntoIter {
+ type Item = Result<JsValue, JsValue>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.state.next(&self.js)
+ }
+}
+
+impl IterState {
+ fn new() -> IterState {
+ IterState { done: false }
+ }
+
+ fn next(&mut self, js: &Iterator) -> Option<Result<JsValue, JsValue>> {
+ if self.done {
+ return None;
+ }
+ let next = match js.next() {
+ Ok(val) => val,
+ Err(e) => {
+ self.done = true;
+ return Some(Err(e));
+ }
+ };
+ if next.done() {
+ self.done = true;
+ None
+ } else {
+ Some(Ok(next.value()))
+ }
+ }
+}
+
+/// Create an iterator over `val` using the JS iteration protocol and
+/// `Symbol.iterator`.
+pub fn try_iter(val: &JsValue) -> Result<Option<IntoIter>, JsValue> {
+ let iter_sym = Symbol::iterator();
+ let iter_fn = Reflect::get(val, iter_sym.as_ref())?;
+
+ let iter_fn: Function = match iter_fn.dyn_into() {
+ Ok(iter_fn) => iter_fn,
+ Err(_) => return Ok(None),
+ };
+
+ let it: Iterator = match iter_fn.call0(val)?.dyn_into() {
+ Ok(it) => it,
+ Err(_) => return Ok(None),
+ };
+
+ Ok(Some(it.into_iter()))
+}
+
+// IteratorNext
+#[wasm_bindgen]
+extern "C" {
+ /// The result of calling `next()` on a JS iterator.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)
+ #[wasm_bindgen(extends = Object, typescript_type = "IteratorResult<any>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type IteratorNext;
+
+ /// Has the value `true` if the iterator is past the end of the iterated
+ /// sequence. In this case value optionally specifies the return value of
+ /// the iterator.
+ ///
+ /// Has the value `false` if the iterator was able to produce the next value
+ /// in the sequence. This is equivalent of not specifying the done property
+ /// altogether.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn done(this: &IteratorNext) -> bool;
+
+ /// Any JavaScript value returned by the iterator. Can be omitted when done
+ /// is true.
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn value(this: &IteratorNext) -> JsValue;
+}
+
+#[allow(non_snake_case)]
+pub mod Math {
+ use super::*;
+
+ // Math
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `Math.abs()` function returns the absolute value of a number, that is
+ /// Math.abs(x) = |x|
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/abs)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn abs(x: f64) -> f64;
+
+ /// The `Math.acos()` function returns the arccosine (in radians) of a
+ /// number, that is ∀x∊[-1;1]
+ /// Math.acos(x) = arccos(x) = the unique y∊[0;π] such that cos(y)=x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acos)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn acos(x: f64) -> f64;
+
+ /// The `Math.acosh()` function returns the hyperbolic arc-cosine of a
+ /// number, that is ∀x ≥ 1
+ /// Math.acosh(x) = arcosh(x) = the unique y ≥ 0 such that cosh(y) = x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn acosh(x: f64) -> f64;
+
+ /// The `Math.asin()` function returns the arcsine (in radians) of a
+ /// number, that is ∀x ∊ [-1;1]
+ /// Math.asin(x) = arcsin(x) = the unique y∊[-π2;π2] such that sin(y) = x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asin)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn asin(x: f64) -> f64;
+
+ /// The `Math.asinh()` function returns the hyperbolic arcsine of a
+ /// number, that is Math.asinh(x) = arsinh(x) = the unique y such that sinh(y) = x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn asinh(x: f64) -> f64;
+
+ /// The `Math.atan()` function returns the arctangent (in radians) of a
+ /// number, that is Math.atan(x) = arctan(x) = the unique y ∊ [-π2;π2]such that
+ /// tan(y) = x
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn atan(x: f64) -> f64;
+
+ /// The `Math.atan2()` function returns the arctangent of the quotient of
+ /// its arguments.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn atan2(y: f64, x: f64) -> f64;
+
+ /// The `Math.atanh()` function returns the hyperbolic arctangent of a number,
+ /// that is ∀x ∊ (-1,1), Math.atanh(x) = arctanh(x) = the unique y such that
+ /// tanh(y) = x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn atanh(x: f64) -> f64;
+
+ /// The `Math.cbrt() `function returns the cube root of a number, that is
+ /// Math.cbrt(x) = ∛x = the unique y such that y^3 = x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cbrt)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn cbrt(x: f64) -> f64;
+
+ /// The `Math.ceil()` function returns the smallest integer greater than
+ /// or equal to a given number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/ceil)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn ceil(x: f64) -> f64;
+
+ /// The `Math.clz32()` function returns the number of leading zero bits in
+ /// the 32-bit binary representation of a number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn clz32(x: i32) -> u32;
+
+ /// The `Math.cos()` static function returns the cosine of the specified angle,
+ /// which must be specified in radians. This value is length(adjacent)/length(hypotenuse).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn cos(x: f64) -> f64;
+
+ /// The `Math.cosh()` function returns the hyperbolic cosine of a number,
+ /// that can be expressed using the constant e.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn cosh(x: f64) -> f64;
+
+ /// The `Math.exp()` function returns e^x, where x is the argument, and e is Euler's number
+ /// (also known as Napier's constant), the base of the natural logarithms.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/exp)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn exp(x: f64) -> f64;
+
+ /// The `Math.expm1()` function returns e^x - 1, where x is the argument, and e the base of the
+ /// natural logarithms.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/expm1)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn expm1(x: f64) -> f64;
+
+ /// The `Math.floor()` function returns the largest integer less than or
+ /// equal to a given number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn floor(x: f64) -> f64;
+
+ /// The `Math.fround()` function returns the nearest 32-bit single precision float representation
+ /// of a Number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn fround(x: f64) -> f32;
+
+ /// The `Math.hypot()` function returns the square root of the sum of squares of its arguments.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn hypot(x: f64, y: f64) -> f64;
+
+ /// The `Math.imul()` function returns the result of the C-like 32-bit multiplication of the
+ /// two parameters.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn imul(x: i32, y: i32) -> i32;
+
+ /// The `Math.log()` function returns the natural logarithm (base e) of a number.
+ /// The JavaScript `Math.log()` function is equivalent to ln(x) in mathematics.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn log(x: f64) -> f64;
+
+ /// The `Math.log10()` function returns the base 10 logarithm of a number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn log10(x: f64) -> f64;
+
+ /// The `Math.log1p()` function returns the natural logarithm (base e) of 1 + a number.
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log1p)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn log1p(x: f64) -> f64;
+
+ /// The `Math.log2()` function returns the base 2 logarithm of a number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log2)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn log2(x: f64) -> f64;
+
+ /// The `Math.max()` function returns the largest of two numbers.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn max(x: f64, y: f64) -> f64;
+
+ /// The static function `Math.min()` returns the lowest-valued number passed into it.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn min(x: f64, y: f64) -> f64;
+
+ /// The `Math.pow()` function returns the base to the exponent power, that is, base^exponent.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn pow(base: f64, exponent: f64) -> f64;
+
+ /// The `Math.random()` function returns a floating-point, pseudo-random number
+ /// in the range 0–1 (inclusive of 0, but not 1) with approximately uniform distribution
+ /// over that range — which you can then scale to your desired range.
+ /// The implementation selects the initial seed to the random number generation algorithm;
+ /// it cannot be chosen or reset by the user.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn random() -> f64;
+
+ /// The `Math.round()` function returns the value of a number rounded to the nearest integer.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn round(x: f64) -> f64;
+
+ /// The `Math.sign()` function returns the sign of a number, indicating whether the number is
+ /// positive, negative or zero.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn sign(x: f64) -> f64;
+
+ /// The `Math.sin()` function returns the sine of a number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn sin(x: f64) -> f64;
+
+ /// The `Math.sinh()` function returns the hyperbolic sine of a number, that can be expressed
+ /// using the constant e: Math.sinh(x) = (e^x - e^-x)/2
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn sinh(x: f64) -> f64;
+
+ /// The `Math.sqrt()` function returns the square root of a number, that is
+ /// ∀x ≥ 0, Math.sqrt(x) = √x = the unique y ≥ 0 such that y^2 = x
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn sqrt(x: f64) -> f64;
+
+ /// The `Math.tan()` function returns the tangent of a number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tan)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn tan(x: f64) -> f64;
+
+ /// The `Math.tanh()` function returns the hyperbolic tangent of a number, that is
+ /// tanh x = sinh x / cosh x = (e^x - e^-x)/(e^x + e^-x) = (e^2x - 1)/(e^2x + 1)
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn tanh(x: f64) -> f64;
+
+ /// The `Math.trunc()` function returns the integer part of a number by removing any fractional
+ /// digits.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc)
+ #[wasm_bindgen(js_namespace = Math)]
+ pub fn trunc(x: f64) -> f64;
+ }
+}
+
+// Number.
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, is_type_of = |v| v.as_f64().is_some(), typescript_type = "number")]
+ #[derive(Clone, PartialEq)]
+ pub type Number;
+
+ /// The `Number.isFinite()` method determines whether the passed value is a finite number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite)
+ #[wasm_bindgen(static_method_of = Number, js_name = isFinite)]
+ pub fn is_finite(value: &JsValue) -> bool;
+
+ /// The `Number.isInteger()` method determines whether the passed value is an integer.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger)
+ #[wasm_bindgen(static_method_of = Number, js_name = isInteger)]
+ pub fn is_integer(value: &JsValue) -> bool;
+
+ /// The `Number.isNaN()` method determines whether the passed value is `NaN` and its type is Number.
+ /// It is a more robust version of the original, global isNaN().
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN)
+ #[wasm_bindgen(static_method_of = Number, js_name = isNaN)]
+ pub fn is_nan(value: &JsValue) -> bool;
+
+ /// The `Number.isSafeInteger()` method determines whether the provided value is a number
+ /// that is a safe integer.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger)
+ #[wasm_bindgen(static_method_of = Number, js_name = isSafeInteger)]
+ pub fn is_safe_integer(value: &JsValue) -> bool;
+
+ /// The `Number` JavaScript object is a wrapper object allowing
+ /// you to work with numerical values. A `Number` object is
+ /// created using the `Number()` constructor.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)
+ #[wasm_bindgen(constructor)]
+ #[deprecated(note = "recommended to use `Number::from` instead")]
+ #[allow(deprecated)]
+ pub fn new(value: &JsValue) -> Number;
+
+ #[wasm_bindgen(constructor)]
+ fn new_from_str(value: &str) -> Number;
+
+ /// The `Number.parseInt()` method parses a string argument and returns an
+ /// integer of the specified radix or base.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseInt)
+ #[wasm_bindgen(static_method_of = Number, js_name = parseInt)]
+ pub fn parse_int(text: &str, radix: u8) -> f64;
+
+ /// The `Number.parseFloat()` method parses a string argument and returns a
+ /// floating point number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/parseFloat)
+ #[wasm_bindgen(static_method_of = Number, js_name = parseFloat)]
+ pub fn parse_float(text: &str) -> f64;
+
+ /// The `toLocaleString()` method returns a string with a language sensitive
+ /// representation of this number.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &Number, locale: &str) -> JsString;
+
+ /// The `toPrecision()` method returns a string representing the Number
+ /// object to the specified precision.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision)
+ #[wasm_bindgen(catch, method, js_name = toPrecision)]
+ pub fn to_precision(this: &Number, precision: u8) -> Result<JsString, JsValue>;
+
+ /// The `toFixed()` method returns a string representing the Number
+ /// object using fixed-point notation.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed)
+ #[wasm_bindgen(catch, method, js_name = toFixed)]
+ pub fn to_fixed(this: &Number, digits: u8) -> Result<JsString, JsValue>;
+
+ /// The `toExponential()` method returns a string representing the Number
+ /// object in exponential notation.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toExponential)
+ #[wasm_bindgen(catch, method, js_name = toExponential)]
+ pub fn to_exponential(this: &Number, fraction_digits: u8) -> Result<JsString, JsValue>;
+
+ /// The `toString()` method returns a string representing the
+ /// specified Number object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)
+ #[wasm_bindgen(catch, method, js_name = toString)]
+ pub fn to_string(this: &Number, radix: u8) -> Result<JsString, JsValue>;
+
+ /// The `valueOf()` method returns the wrapped primitive value of
+ /// a Number object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/valueOf)
+ #[wasm_bindgen(method, js_name = valueOf)]
+ pub fn value_of(this: &Number) -> f64;
+}
+
+impl Number {
+ /// The smallest interval between two representable numbers.
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON)
+ pub const EPSILON: f64 = f64::EPSILON;
+ /// The maximum safe integer in JavaScript (2^53 - 1).
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)
+ pub const MAX_SAFE_INTEGER: f64 = 9007199254740991.0;
+ /// The largest positive representable number.
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_VALUE)
+ pub const MAX_VALUE: f64 = f64::MAX;
+ /// The minimum safe integer in JavaScript (-(2^53 - 1)).
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER)
+ pub const MIN_SAFE_INTEGER: f64 = -9007199254740991.0;
+ /// The smallest positive representable number—that is, the positive number closest to zero
+ /// (without actually being zero).
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE)
+ // Cannot use f64::MIN_POSITIVE since that is the smallest **normal** postitive number.
+ pub const MIN_VALUE: f64 = 5E-324;
+ /// Special "Not a Number" value.
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/NaN)
+ pub const NAN: f64 = f64::NAN;
+ /// Special value representing negative infinity. Returned on overflow.
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/NEGATIVE_INFINITY)
+ pub const NEGATIVE_INFINITY: f64 = f64::NEG_INFINITY;
+ /// Special value representing infinity. Returned on overflow.
+ ///
+ /// [MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/POSITIVE_INFINITY)
+ pub const POSITIVE_INFINITY: f64 = f64::INFINITY;
+
+ /// Applies the binary `**` JS operator on the two `Number`s.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation)
+ #[inline]
+ pub fn pow(&self, rhs: &Self) -> Self {
+ JsValue::as_ref(self)
+ .pow(JsValue::as_ref(rhs))
+ .unchecked_into()
+ }
+
+ /// Applies the binary `>>>` JS operator on the two `Number`s.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unsigned_right_shift)
+ #[inline]
+ pub fn unsigned_shr(&self, rhs: &Self) -> Self {
+ Number::from(JsValue::as_ref(self).unsigned_shr(JsValue::as_ref(rhs)))
+ }
+}
+
+macro_rules! number_from {
+ ($($x:ident)*) => ($(
+ impl From<$x> for Number {
+ #[inline]
+ fn from(x: $x) -> Number {
+ Number::unchecked_from_js(JsValue::from(x))
+ }
+ }
+
+ impl PartialEq<$x> for Number {
+ #[inline]
+ fn eq(&self, other: &$x) -> bool {
+ self.value_of() == f64::from(*other)
+ }
+ }
+ )*)
+}
+number_from!(i8 u8 i16 u16 i32 u32 f32 f64);
+
+// TODO: add this on the next major version, when blanket impl is removed
+/*
+impl convert::TryFrom<JsValue> for Number {
+ type Error = Error;
+
+ fn try_from(value: JsValue) -> Result<Self, Self::Error> {
+ return match f64::try_from(value) {
+ Ok(num) => Ok(Number::from(num)),
+ Err(jsval) => Err(jsval.unchecked_into())
+ }
+ }
+}
+*/
+
+impl From<&Number> for f64 {
+ #[inline]
+ fn from(n: &Number) -> f64 {
+ n.value_of()
+ }
+}
+
+impl From<Number> for f64 {
+ #[inline]
+ fn from(n: Number) -> f64 {
+ <f64 as From<&'_ Number>>::from(&n)
+ }
+}
+
+impl fmt::Debug for Number {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fmt::Debug::fmt(&self.value_of(), f)
+ }
+}
+
+impl fmt::Display for Number {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fmt::Display::fmt(&self.value_of(), f)
+ }
+}
+
+impl Default for Number {
+ fn default() -> Self {
+ Self::from(f64::default())
+ }
+}
+
+impl PartialEq<BigInt> for Number {
+ #[inline]
+ fn eq(&self, other: &BigInt) -> bool {
+ JsValue::as_ref(self).loose_eq(JsValue::as_ref(other))
+ }
+}
+
+impl Not for &Number {
+ type Output = BigInt;
+
+ #[inline]
+ fn not(self) -> Self::Output {
+ JsValue::as_ref(self).bit_not().unchecked_into()
+ }
+}
+
+forward_deref_unop!(impl Not, not for Number);
+forward_js_unop!(impl Neg, neg for Number);
+forward_js_binop!(impl BitAnd, bitand for Number);
+forward_js_binop!(impl BitOr, bitor for Number);
+forward_js_binop!(impl BitXor, bitxor for Number);
+forward_js_binop!(impl Shl, shl for Number);
+forward_js_binop!(impl Shr, shr for Number);
+forward_js_binop!(impl Add, add for Number);
+forward_js_binop!(impl Sub, sub for Number);
+forward_js_binop!(impl Div, div for Number);
+forward_js_binop!(impl Mul, mul for Number);
+forward_js_binop!(impl Rem, rem for Number);
+
+sum_product!(Number);
+
+impl PartialOrd for Number {
+ #[inline]
+ fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+ if Number::is_nan(self) || Number::is_nan(other) {
+ None
+ } else if self == other {
+ Some(Ordering::Equal)
+ } else if self.lt(other) {
+ Some(Ordering::Less)
+ } else {
+ Some(Ordering::Greater)
+ }
+ }
+
+ #[inline]
+ fn lt(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).lt(JsValue::as_ref(other))
+ }
+
+ #[inline]
+ fn le(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).le(JsValue::as_ref(other))
+ }
+
+ #[inline]
+ fn ge(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).ge(JsValue::as_ref(other))
+ }
+
+ #[inline]
+ fn gt(&self, other: &Self) -> bool {
+ JsValue::as_ref(self).gt(JsValue::as_ref(other))
+ }
+}
+
+impl FromStr for Number {
+ type Err = Infallible;
+
+ #[allow(deprecated)]
+ #[inline]
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(Number::new_from_str(s))
+ }
+}
+
+// Date.
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "Date")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Date;
+
+ /// The `getDate()` method returns the day of the month for the
+ /// specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDate)
+ #[wasm_bindgen(method, js_name = getDate)]
+ pub fn get_date(this: &Date) -> u32;
+
+ /// The `getDay()` method returns the day of the week for the specified date according to local time,
+ /// where 0 represents Sunday. For the day of the month see getDate().
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay)
+ #[wasm_bindgen(method, js_name = getDay)]
+ pub fn get_day(this: &Date) -> u32;
+
+ /// The `getFullYear()` method returns the year of the specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear)
+ #[wasm_bindgen(method, js_name = getFullYear)]
+ pub fn get_full_year(this: &Date) -> u32;
+
+ /// The `getHours()` method returns the hour for the specified date, according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours)
+ #[wasm_bindgen(method, js_name = getHours)]
+ pub fn get_hours(this: &Date) -> u32;
+
+ /// The `getMilliseconds()` method returns the milliseconds in the specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds)
+ #[wasm_bindgen(method, js_name = getMilliseconds)]
+ pub fn get_milliseconds(this: &Date) -> u32;
+
+ /// The `getMinutes()` method returns the minutes in the specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMinutes)
+ #[wasm_bindgen(method, js_name = getMinutes)]
+ pub fn get_minutes(this: &Date) -> u32;
+
+ /// The `getMonth()` method returns the month in the specified date according to local time,
+ /// as a zero-based value (where zero indicates the first month of the year).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth)
+ #[wasm_bindgen(method, js_name = getMonth)]
+ pub fn get_month(this: &Date) -> u32;
+
+ /// The `getSeconds()` method returns the seconds in the specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getSeconds)
+ #[wasm_bindgen(method, js_name = getSeconds)]
+ pub fn get_seconds(this: &Date) -> u32;
+
+ /// The `getTime()` method returns the numeric value corresponding to the time for the specified date
+ /// according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime)
+ #[wasm_bindgen(method, js_name = getTime)]
+ pub fn get_time(this: &Date) -> f64;
+
+ /// The `getTimezoneOffset()` method returns the time zone difference, in minutes,
+ /// from current locale (host system settings) to UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)
+ #[wasm_bindgen(method, js_name = getTimezoneOffset)]
+ pub fn get_timezone_offset(this: &Date) -> f64;
+
+ /// The `getUTCDate()` method returns the day (date) of the month in the specified date
+ /// according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate)
+ #[wasm_bindgen(method, js_name = getUTCDate)]
+ pub fn get_utc_date(this: &Date) -> u32;
+
+ /// The `getUTCDay()` method returns the day of the week in the specified date according to universal time,
+ /// where 0 represents Sunday.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDay)
+ #[wasm_bindgen(method, js_name = getUTCDay)]
+ pub fn get_utc_day(this: &Date) -> u32;
+
+ /// The `getUTCFullYear()` method returns the year in the specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCFullYear)
+ #[wasm_bindgen(method, js_name = getUTCFullYear)]
+ pub fn get_utc_full_year(this: &Date) -> u32;
+
+ /// The `getUTCHours()` method returns the hours in the specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours)
+ #[wasm_bindgen(method, js_name = getUTCHours)]
+ pub fn get_utc_hours(this: &Date) -> u32;
+
+ /// The `getUTCMilliseconds()` method returns the milliseconds in the specified date
+ /// according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds)
+ #[wasm_bindgen(method, js_name = getUTCMilliseconds)]
+ pub fn get_utc_milliseconds(this: &Date) -> u32;
+
+ /// The `getUTCMinutes()` method returns the minutes in the specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMinutes)
+ #[wasm_bindgen(method, js_name = getUTCMinutes)]
+ pub fn get_utc_minutes(this: &Date) -> u32;
+
+ /// The `getUTCMonth()` returns the month of the specified date according to universal time,
+ /// as a zero-based value (where zero indicates the first month of the year).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMonth)
+ #[wasm_bindgen(method, js_name = getUTCMonth)]
+ pub fn get_utc_month(this: &Date) -> u32;
+
+ /// The `getUTCSeconds()` method returns the seconds in the specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCSeconds)
+ #[wasm_bindgen(method, js_name = getUTCSeconds)]
+ pub fn get_utc_seconds(this: &Date) -> u32;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new(init: &JsValue) -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents the current moment in
+ /// time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_0() -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_year_month(year: u32, month: i32) -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_year_month_day(year: u32, month: i32, day: i32) -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_year_month_day_hr(year: u32, month: i32, day: i32, hr: i32) -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_year_month_day_hr_min(
+ year: u32,
+ month: i32,
+ day: i32,
+ hr: i32,
+ min: i32,
+ ) -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_year_month_day_hr_min_sec(
+ year: u32,
+ month: i32,
+ day: i32,
+ hr: i32,
+ min: i32,
+ sec: i32,
+ ) -> Date;
+
+ /// Creates a JavaScript `Date` instance that represents
+ /// a single moment in time. `Date` objects are based on a time value that is
+ /// the number of milliseconds since 1 January 1970 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_year_month_day_hr_min_sec_milli(
+ year: u32,
+ month: i32,
+ day: i32,
+ hr: i32,
+ min: i32,
+ sec: i32,
+ milli: i32,
+ ) -> Date;
+
+ /// The `Date.now()` method returns the number of milliseconds
+ /// elapsed since January 1, 1970 00:00:00 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now)
+ #[wasm_bindgen(static_method_of = Date)]
+ pub fn now() -> f64;
+
+ /// The `Date.parse()` method parses a string representation of a date, and returns the number of milliseconds
+ /// since January 1, 1970, 00:00:00 UTC or `NaN` if the string is unrecognized or, in some cases,
+ /// contains illegal date values (e.g. 2015-02-31).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse)
+ #[wasm_bindgen(static_method_of = Date)]
+ pub fn parse(date: &str) -> f64;
+
+ /// The `setDate()` method sets the day of the Date object relative to the beginning of the currently set month.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate)
+ #[wasm_bindgen(method, js_name = setDate)]
+ pub fn set_date(this: &Date, day: u32) -> f64;
+
+ /// The `setFullYear()` method sets the full year for a specified date according to local time.
+ /// Returns new timestamp.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
+ #[wasm_bindgen(method, js_name = setFullYear)]
+ pub fn set_full_year(this: &Date, year: u32) -> f64;
+
+ /// The `setFullYear()` method sets the full year for a specified date according to local time.
+ /// Returns new timestamp.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
+ #[wasm_bindgen(method, js_name = setFullYear)]
+ pub fn set_full_year_with_month(this: &Date, year: u32, month: i32) -> f64;
+
+ /// The `setFullYear()` method sets the full year for a specified date according to local time.
+ /// Returns new timestamp.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
+ #[wasm_bindgen(method, js_name = setFullYear)]
+ pub fn set_full_year_with_month_date(this: &Date, year: u32, month: i32, date: i32) -> f64;
+
+ /// The `setHours()` method sets the hours for a specified date according to local time,
+ /// and returns the number of milliseconds since January 1, 1970 00:00:00 UTC until the time represented
+ /// by the updated Date instance.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours)
+ #[wasm_bindgen(method, js_name = setHours)]
+ pub fn set_hours(this: &Date, hours: u32) -> f64;
+
+ /// The `setMilliseconds()` method sets the milliseconds for a specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMilliseconds)
+ #[wasm_bindgen(method, js_name = setMilliseconds)]
+ pub fn set_milliseconds(this: &Date, milliseconds: u32) -> f64;
+
+ /// The `setMinutes()` method sets the minutes for a specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMinutes)
+ #[wasm_bindgen(method, js_name = setMinutes)]
+ pub fn set_minutes(this: &Date, minutes: u32) -> f64;
+
+ /// The `setMonth()` method sets the month for a specified date according to the currently set year.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth)
+ #[wasm_bindgen(method, js_name = setMonth)]
+ pub fn set_month(this: &Date, month: u32) -> f64;
+
+ /// The `setSeconds()` method sets the seconds for a specified date according to local time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setSeconds)
+ #[wasm_bindgen(method, js_name = setSeconds)]
+ pub fn set_seconds(this: &Date, seconds: u32) -> f64;
+
+ /// The `setTime()` method sets the Date object to the time represented by a number of milliseconds
+ /// since January 1, 1970, 00:00:00 UTC.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setTime)
+ #[wasm_bindgen(method, js_name = setTime)]
+ pub fn set_time(this: &Date, time: f64) -> f64;
+
+ /// The `setUTCDate()` method sets the day of the month for a specified date
+ /// according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCDate)
+ #[wasm_bindgen(method, js_name = setUTCDate)]
+ pub fn set_utc_date(this: &Date, day: u32) -> f64;
+
+ /// The `setUTCFullYear()` method sets the full year for a specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
+ #[wasm_bindgen(method, js_name = setUTCFullYear)]
+ pub fn set_utc_full_year(this: &Date, year: u32) -> f64;
+
+ /// The `setUTCFullYear()` method sets the full year for a specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
+ #[wasm_bindgen(method, js_name = setUTCFullYear)]
+ pub fn set_utc_full_year_with_month(this: &Date, year: u32, month: i32) -> f64;
+
+ /// The `setUTCFullYear()` method sets the full year for a specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
+ #[wasm_bindgen(method, js_name = setUTCFullYear)]
+ pub fn set_utc_full_year_with_month_date(this: &Date, year: u32, month: i32, date: i32) -> f64;
+
+ /// The `setUTCHours()` method sets the hour for a specified date according to universal time,
+ /// and returns the number of milliseconds since January 1, 1970 00:00:00 UTC until the time
+ /// represented by the updated Date instance.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours)
+ #[wasm_bindgen(method, js_name = setUTCHours)]
+ pub fn set_utc_hours(this: &Date, hours: u32) -> f64;
+
+ /// The `setUTCMilliseconds()` method sets the milliseconds for a specified date
+ /// according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds)
+ #[wasm_bindgen(method, js_name = setUTCMilliseconds)]
+ pub fn set_utc_milliseconds(this: &Date, milliseconds: u32) -> f64;
+
+ /// The `setUTCMinutes()` method sets the minutes for a specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMinutes)
+ #[wasm_bindgen(method, js_name = setUTCMinutes)]
+ pub fn set_utc_minutes(this: &Date, minutes: u32) -> f64;
+
+ /// The `setUTCMonth()` method sets the month for a specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth)
+ #[wasm_bindgen(method, js_name = setUTCMonth)]
+ pub fn set_utc_month(this: &Date, month: u32) -> f64;
+
+ /// The `setUTCSeconds()` method sets the seconds for a specified date according to universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds)
+ #[wasm_bindgen(method, js_name = setUTCSeconds)]
+ pub fn set_utc_seconds(this: &Date, seconds: u32) -> f64;
+
+ /// The `toDateString()` method returns the date portion of a Date object
+ /// in human readable form in American English.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toDateString)
+ #[wasm_bindgen(method, js_name = toDateString)]
+ pub fn to_date_string(this: &Date) -> JsString;
+
+ /// The `toISOString()` method returns a string in simplified extended ISO format (ISO
+ /// 8601), which is always 24 or 27 characters long (YYYY-MM-DDTHH:mm:ss.sssZ or
+ /// ±YYYYYY-MM-DDTHH:mm:ss.sssZ, respectively). The timezone is always zero UTC offset,
+ /// as denoted by the suffix "Z"
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+ #[wasm_bindgen(method, js_name = toISOString)]
+ pub fn to_iso_string(this: &Date) -> JsString;
+
+ /// The `toJSON()` method returns a string representation of the Date object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON)
+ #[wasm_bindgen(method, js_name = toJSON)]
+ pub fn to_json(this: &Date) -> JsString;
+
+ /// The `toLocaleDateString()` method returns a string with a language sensitive
+ /// representation of the date portion of this date. The new locales and options
+ /// arguments let applications specify the language whose formatting conventions
+ /// should be used and allow to customize the behavior of the function.
+ /// In older implementations, which ignore the locales and options arguments,
+ /// the locale used and the form of the string
+ /// returned are entirely implementation dependent.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString)
+ #[wasm_bindgen(method, js_name = toLocaleDateString)]
+ pub fn to_locale_date_string(this: &Date, locale: &str, options: &JsValue) -> JsString;
+
+ /// The `toLocaleString()` method returns a string with a language sensitive
+ /// representation of this date. The new locales and options arguments
+ /// let applications specify the language whose formatting conventions
+ /// should be used and customize the behavior of the function.
+ /// In older implementations, which ignore the locales
+ /// and options arguments, the locale used and the form of the string
+ /// returned are entirely implementation dependent.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString)
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &Date, locale: &str, options: &JsValue) -> JsString;
+
+ /// The `toLocaleTimeString()` method returns a string with a language sensitive
+ /// representation of the time portion of this date. The new locales and options
+ /// arguments let applications specify the language whose formatting conventions should be
+ /// used and customize the behavior of the function. In older implementations, which ignore
+ /// the locales and options arguments, the locale used and the form of the string
+ /// returned are entirely implementation dependent.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString)
+ #[wasm_bindgen(method, js_name = toLocaleTimeString)]
+ pub fn to_locale_time_string(this: &Date, locale: &str) -> JsString;
+
+ /// The `toString()` method returns a string representing
+ /// the specified Date object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Date) -> JsString;
+
+ /// The `toTimeString()` method returns the time portion of a Date object in human
+ /// readable form in American English.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toTimeString)
+ #[wasm_bindgen(method, js_name = toTimeString)]
+ pub fn to_time_string(this: &Date) -> JsString;
+
+ /// The `toUTCString()` method converts a date to a string,
+ /// using the UTC time zone.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString)
+ #[wasm_bindgen(method, js_name = toUTCString)]
+ pub fn to_utc_string(this: &Date) -> JsString;
+
+ /// The `Date.UTC()` method accepts the same parameters as the
+ /// longest form of the constructor, and returns the number of
+ /// milliseconds in a `Date` object since January 1, 1970,
+ /// 00:00:00, universal time.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC)
+ #[wasm_bindgen(static_method_of = Date, js_name = UTC)]
+ pub fn utc(year: f64, month: f64) -> f64;
+
+ /// The `valueOf()` method returns the primitive value of
+ /// a Date object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf)
+ #[wasm_bindgen(method, js_name = valueOf)]
+ pub fn value_of(this: &Date) -> f64;
+}
+
+// Object.
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(typescript_type = "object")]
+ #[derive(Clone, Debug)]
+ pub type Object;
+
+ /// The `Object.assign()` method is used to copy the values of all enumerable
+ /// own properties from one or more source objects to a target object. It
+ /// will return the target object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn assign(target: &Object, source: &Object) -> Object;
+
+ /// The `Object.assign()` method is used to copy the values of all enumerable
+ /// own properties from one or more source objects to a target object. It
+ /// will return the target object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ #[wasm_bindgen(static_method_of = Object, js_name = assign)]
+ pub fn assign2(target: &Object, source1: &Object, source2: &Object) -> Object;
+
+ /// The `Object.assign()` method is used to copy the values of all enumerable
+ /// own properties from one or more source objects to a target object. It
+ /// will return the target object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ #[wasm_bindgen(static_method_of = Object, js_name = assign)]
+ pub fn assign3(target: &Object, source1: &Object, source2: &Object, source3: &Object)
+ -> Object;
+
+ /// The constructor property returns a reference to the `Object` constructor
+ /// function that created the instance object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)
+ #[wasm_bindgen(method, getter)]
+ pub fn constructor(this: &Object) -> Function;
+
+ /// The `Object.create()` method creates a new object, using an existing
+ /// object to provide the newly created object's prototype.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn create(prototype: &Object) -> Object;
+
+ /// The static method `Object.defineProperty()` defines a new
+ /// property directly on an object, or modifies an existing
+ /// property on an object, and returns the object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
+ #[wasm_bindgen(static_method_of = Object, js_name = defineProperty)]
+ pub fn define_property(obj: &Object, prop: &JsValue, descriptor: &Object) -> Object;
+
+ /// The `Object.defineProperties()` method defines new or modifies
+ /// existing properties directly on an object, returning the
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)
+ #[wasm_bindgen(static_method_of = Object, js_name = defineProperties)]
+ pub fn define_properties(obj: &Object, props: &Object) -> Object;
+
+ /// The `Object.entries()` method returns an array of a given
+ /// object's own enumerable property [key, value] pairs, in the
+ /// same order as that provided by a for...in loop (the difference
+ /// being that a for-in loop enumerates properties in the
+ /// prototype chain as well).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn entries(object: &Object) -> Array;
+
+ /// The `Object.freeze()` method freezes an object: that is, prevents new
+ /// properties from being added to it; prevents existing properties from
+ /// being removed; and prevents existing properties, or their enumerability,
+ /// configurability, or writability, from being changed, it also prevents
+ /// the prototype from being changed. The method returns the passed object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn freeze(value: &Object) -> Object;
+
+ /// The `Object.fromEntries()` method transforms a list of key-value pairs
+ /// into an object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries)
+ #[wasm_bindgen(static_method_of = Object, catch, js_name = fromEntries)]
+ pub fn from_entries(iterable: &JsValue) -> Result<Object, JsValue>;
+
+ /// The `Object.getOwnPropertyDescriptor()` method returns a
+ /// property descriptor for an own property (that is, one directly
+ /// present on an object and not in the object's prototype chain)
+ /// of a given object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor)
+ #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertyDescriptor)]
+ pub fn get_own_property_descriptor(obj: &Object, prop: &JsValue) -> JsValue;
+
+ /// The `Object.getOwnPropertyDescriptors()` method returns all own
+ /// property descriptors of a given object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors)
+ #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertyDescriptors)]
+ pub fn get_own_property_descriptors(obj: &Object) -> JsValue;
+
+ /// The `Object.getOwnPropertyNames()` method returns an array of
+ /// all properties (including non-enumerable properties except for
+ /// those which use Symbol) found directly upon a given object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames)
+ #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertyNames)]
+ pub fn get_own_property_names(obj: &Object) -> Array;
+
+ /// The `Object.getOwnPropertySymbols()` method returns an array of
+ /// all symbol properties found directly upon a given object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols)
+ #[wasm_bindgen(static_method_of = Object, js_name = getOwnPropertySymbols)]
+ pub fn get_own_property_symbols(obj: &Object) -> Array;
+
+ /// The `Object.getPrototypeOf()` method returns the prototype
+ /// (i.e. the value of the internal [[Prototype]] property) of the
+ /// specified object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf)
+ #[wasm_bindgen(static_method_of = Object, js_name = getPrototypeOf)]
+ pub fn get_prototype_of(obj: &JsValue) -> Object;
+
+ /// The `hasOwnProperty()` method returns a boolean indicating whether the
+ /// object has the specified property as its own property (as opposed to
+ /// inheriting it).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)
+ #[wasm_bindgen(method, js_name = hasOwnProperty)]
+ pub fn has_own_property(this: &Object, property: &JsValue) -> bool;
+
+ /// The `Object.hasOwn()` method returns a boolean indicating whether the
+ /// object passed in has the specified property as its own property (as
+ /// opposed to inheriting it).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn)
+ #[wasm_bindgen(static_method_of = Object, js_name = hasOwn)]
+ pub fn has_own(instance: &Object, property: &JsValue) -> bool;
+
+ /// The `Object.is()` method determines whether two values are the same value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn is(value_1: &JsValue, value_2: &JsValue) -> bool;
+
+ /// The `Object.isExtensible()` method determines if an object is extensible
+ /// (whether it can have new properties added to it).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible)
+ #[wasm_bindgen(static_method_of = Object, js_name = isExtensible)]
+ pub fn is_extensible(object: &Object) -> bool;
+
+ /// The `Object.isFrozen()` determines if an object is frozen.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen)
+ #[wasm_bindgen(static_method_of = Object, js_name = isFrozen)]
+ pub fn is_frozen(object: &Object) -> bool;
+
+ /// The `Object.isSealed()` method determines if an object is sealed.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed)
+ #[wasm_bindgen(static_method_of = Object, js_name = isSealed)]
+ pub fn is_sealed(object: &Object) -> bool;
+
+ /// The `isPrototypeOf()` method checks if an object exists in another
+ /// object's prototype chain.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf)
+ #[wasm_bindgen(method, js_name = isPrototypeOf)]
+ pub fn is_prototype_of(this: &Object, value: &JsValue) -> bool;
+
+ /// The `Object.keys()` method returns an array of a given object's property
+ /// names, in the same order as we get with a normal loop.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn keys(object: &Object) -> Array;
+
+ /// The [`Object`] constructor creates an object wrapper.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)
+ #[wasm_bindgen(constructor)]
+ pub fn new() -> Object;
+
+ /// The `Object.preventExtensions()` method prevents new properties from
+ /// ever being added to an object (i.e. prevents future extensions to the
+ /// object).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions)
+ #[wasm_bindgen(static_method_of = Object, js_name = preventExtensions)]
+ pub fn prevent_extensions(object: &Object);
+
+ /// The `propertyIsEnumerable()` method returns a Boolean indicating
+ /// whether the specified property is enumerable.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable)
+ #[wasm_bindgen(method, js_name = propertyIsEnumerable)]
+ pub fn property_is_enumerable(this: &Object, property: &JsValue) -> bool;
+
+ /// The `Object.seal()` method seals an object, preventing new properties
+ /// from being added to it and marking all existing properties as
+ /// non-configurable. Values of present properties can still be changed as
+ /// long as they are writable.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn seal(value: &Object) -> Object;
+
+ /// The `Object.setPrototypeOf()` method sets the prototype (i.e., the
+ /// internal `[[Prototype]]` property) of a specified object to another
+ /// object or `null`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf)
+ #[wasm_bindgen(static_method_of = Object, js_name = setPrototypeOf)]
+ pub fn set_prototype_of(object: &Object, prototype: &Object) -> Object;
+
+ /// The `toLocaleString()` method returns a string representing the object.
+ /// This method is meant to be overridden by derived objects for
+ /// locale-specific purposes.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toLocaleString)
+ #[wasm_bindgen(method, js_name = toLocaleString)]
+ pub fn to_locale_string(this: &Object) -> JsString;
+
+ /// The `toString()` method returns a string representing the object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Object) -> JsString;
+
+ /// The `valueOf()` method returns the primitive value of the
+ /// specified object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf)
+ #[wasm_bindgen(method, js_name = valueOf)]
+ pub fn value_of(this: &Object) -> Object;
+
+ /// The `Object.values()` method returns an array of a given object's own
+ /// enumerable property values, in the same order as that provided by a
+ /// `for...in` loop (the difference being that a for-in loop enumerates
+ /// properties in the prototype chain as well).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values)
+ #[wasm_bindgen(static_method_of = Object)]
+ pub fn values(object: &Object) -> Array;
+}
+
+impl Object {
+ /// Returns the `Object` value of this JS value if it's an instance of an
+ /// object.
+ ///
+ /// If this JS value is not an instance of an object then this returns
+ /// `None`.
+ pub fn try_from(val: &JsValue) -> Option<&Object> {
+ if val.is_object() {
+ Some(val.unchecked_ref())
+ } else {
+ None
+ }
+ }
+}
+
+impl PartialEq for Object {
+ #[inline]
+ fn eq(&self, other: &Object) -> bool {
+ Object::is(self.as_ref(), other.as_ref())
+ }
+}
+
+impl Eq for Object {}
+
+impl Default for Object {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+// Proxy
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(typescript_type = "ProxyConstructor")]
+ #[derive(Clone, Debug)]
+ pub type Proxy;
+
+ /// The [`Proxy`] object is used to define custom behavior for fundamental
+ /// operations (e.g. property lookup, assignment, enumeration, function
+ /// invocation, etc).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)
+ #[wasm_bindgen(constructor)]
+ pub fn new(target: &JsValue, handler: &Object) -> Proxy;
+
+ /// The `Proxy.revocable()` method is used to create a revocable [`Proxy`]
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/revocable)
+ #[wasm_bindgen(static_method_of = Proxy)]
+ pub fn revocable(target: &JsValue, handler: &Object) -> Object;
+}
+
+// RangeError
+#[wasm_bindgen]
+extern "C" {
+ /// The `RangeError` object indicates an error when a value is not in the set
+ /// or range of allowed values.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError)
+ #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "RangeError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type RangeError;
+
+ /// The `RangeError` object indicates an error when a value is not in the set
+ /// or range of allowed values.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RangeError)
+ #[wasm_bindgen(constructor)]
+ pub fn new(message: &str) -> RangeError;
+}
+
+// ReferenceError
+#[wasm_bindgen]
+extern "C" {
+ /// The `ReferenceError` object represents an error when a non-existent
+ /// variable is referenced.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError)
+ #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "ReferenceError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type ReferenceError;
+
+ /// The `ReferenceError` object represents an error when a non-existent
+ /// variable is referenced.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError)
+ #[wasm_bindgen(constructor)]
+ pub fn new(message: &str) -> ReferenceError;
+}
+
+#[allow(non_snake_case)]
+pub mod Reflect {
+ use super::*;
+
+ // Reflect
+ #[wasm_bindgen]
+ extern "C" {
+ /// The static `Reflect.apply()` method calls a target function with
+ /// arguments as specified.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/apply)
+ #[wasm_bindgen(js_namespace = Reflect, catch)]
+ pub fn apply(
+ target: &Function,
+ this_argument: &JsValue,
+ arguments_list: &Array,
+ ) -> Result<JsValue, JsValue>;
+
+ /// The static `Reflect.construct()` method acts like the new operator, but
+ /// as a function. It is equivalent to calling `new target(...args)`. It
+ /// gives also the added option to specify a different prototype.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct)
+ #[wasm_bindgen(js_namespace = Reflect, catch)]
+ pub fn construct(target: &Function, arguments_list: &Array) -> Result<JsValue, JsValue>;
+
+ /// The static `Reflect.construct()` method acts like the new operator, but
+ /// as a function. It is equivalent to calling `new target(...args)`. It
+ /// gives also the added option to specify a different prototype.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/construct)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = construct, catch)]
+ pub fn construct_with_new_target(
+ target: &Function,
+ arguments_list: &Array,
+ new_target: &Function,
+ ) -> Result<JsValue, JsValue>;
+
+ /// The static `Reflect.defineProperty()` method is like
+ /// `Object.defineProperty()` but returns a `Boolean`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = defineProperty, catch)]
+ pub fn define_property(
+ target: &Object,
+ property_key: &JsValue,
+ attributes: &Object,
+ ) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.deleteProperty()` method allows to delete
+ /// properties. It is like the `delete` operator as a function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/deleteProperty)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = deleteProperty, catch)]
+ pub fn delete_property(target: &Object, key: &JsValue) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.get()` method works like getting a property from
+ /// an object (`target[propertyKey]`) as a function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/get)
+ #[wasm_bindgen(js_namespace = Reflect, catch)]
+ pub fn get(target: &JsValue, key: &JsValue) -> Result<JsValue, JsValue>;
+
+ /// The same as [`get`](fn.get.html)
+ /// except the key is an `f64`, which is slightly faster.
+ #[wasm_bindgen(js_namespace = Reflect, js_name = "get", catch)]
+ pub fn get_f64(target: &JsValue, key: f64) -> Result<JsValue, JsValue>;
+
+ /// The same as [`get`](fn.get.html)
+ /// except the key is a `u32`, which is slightly faster.
+ #[wasm_bindgen(js_namespace = Reflect, js_name = "get", catch)]
+ pub fn get_u32(target: &JsValue, key: u32) -> Result<JsValue, JsValue>;
+
+ /// The static `Reflect.getOwnPropertyDescriptor()` method is similar to
+ /// `Object.getOwnPropertyDescriptor()`. It returns a property descriptor
+ /// of the given property if it exists on the object, `undefined` otherwise.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getOwnPropertyDescriptor)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = getOwnPropertyDescriptor, catch)]
+ pub fn get_own_property_descriptor(
+ target: &Object,
+ property_key: &JsValue,
+ ) -> Result<JsValue, JsValue>;
+
+ /// The static `Reflect.getPrototypeOf()` method is almost the same
+ /// method as `Object.getPrototypeOf()`. It returns the prototype
+ /// (i.e. the value of the internal `[[Prototype]]` property) of
+ /// the specified object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/getPrototypeOf)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = getPrototypeOf, catch)]
+ pub fn get_prototype_of(target: &JsValue) -> Result<Object, JsValue>;
+
+ /// The static `Reflect.has()` method works like the in operator as a
+ /// function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/has)
+ #[wasm_bindgen(js_namespace = Reflect, catch)]
+ pub fn has(target: &JsValue, property_key: &JsValue) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.isExtensible()` method determines if an object is
+ /// extensible (whether it can have new properties added to it). It is
+ /// similar to `Object.isExtensible()`, but with some differences.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/isExtensible)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = isExtensible, catch)]
+ pub fn is_extensible(target: &Object) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.ownKeys()` method returns an array of the
+ /// target object's own property keys.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = ownKeys, catch)]
+ pub fn own_keys(target: &JsValue) -> Result<Array, JsValue>;
+
+ /// The static `Reflect.preventExtensions()` method prevents new
+ /// properties from ever being added to an object (i.e. prevents
+ /// future extensions to the object). It is similar to
+ /// `Object.preventExtensions()`, but with some differences.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = preventExtensions, catch)]
+ pub fn prevent_extensions(target: &Object) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.set()` method works like setting a
+ /// property on an object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set)
+ #[wasm_bindgen(js_namespace = Reflect, catch)]
+ pub fn set(
+ target: &JsValue,
+ property_key: &JsValue,
+ value: &JsValue,
+ ) -> Result<bool, JsValue>;
+
+ /// The same as [`set`](fn.set.html)
+ /// except the key is an `f64`, which is slightly faster.
+ #[wasm_bindgen(js_namespace = Reflect, js_name = "set", catch)]
+ pub fn set_f64(
+ target: &JsValue,
+ property_key: f64,
+ value: &JsValue,
+ ) -> Result<bool, JsValue>;
+
+ /// The same as [`set`](fn.set.html)
+ /// except the key is a `u32`, which is slightly faster.
+ #[wasm_bindgen(js_namespace = Reflect, js_name = "set", catch)]
+ pub fn set_u32(
+ target: &JsValue,
+ property_key: u32,
+ value: &JsValue,
+ ) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.set()` method works like setting a
+ /// property on an object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = set, catch)]
+ pub fn set_with_receiver(
+ target: &JsValue,
+ property_key: &JsValue,
+ value: &JsValue,
+ receiver: &JsValue,
+ ) -> Result<bool, JsValue>;
+
+ /// The static `Reflect.setPrototypeOf()` method is the same
+ /// method as `Object.setPrototypeOf()`. It sets the prototype
+ /// (i.e., the internal `[[Prototype]]` property) of a specified
+ /// object to another object or to null.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/setPrototypeOf)
+ #[wasm_bindgen(js_namespace = Reflect, js_name = setPrototypeOf, catch)]
+ pub fn set_prototype_of(target: &Object, prototype: &JsValue) -> Result<bool, JsValue>;
+ }
+}
+
+// RegExp
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "RegExp")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type RegExp;
+
+ /// The `exec()` method executes a search for a match in a specified
+ /// string. Returns a result array, or null.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)
+ #[wasm_bindgen(method)]
+ pub fn exec(this: &RegExp, text: &str) -> Option<Array>;
+
+ /// The flags property returns a string consisting of the flags of
+ /// the current regular expression object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags)
+ #[wasm_bindgen(method, getter)]
+ pub fn flags(this: &RegExp) -> JsString;
+
+ /// The global property indicates whether or not the "g" flag is
+ /// used with the regular expression. global is a read-only
+ /// property of an individual regular expression instance.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global)
+ #[wasm_bindgen(method, getter)]
+ pub fn global(this: &RegExp) -> bool;
+
+ /// The ignoreCase property indicates whether or not the "i" flag
+ /// is used with the regular expression. ignoreCase is a read-only
+ /// property of an individual regular expression instance.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/ignoreCase)
+ #[wasm_bindgen(method, getter, js_name = ignoreCase)]
+ pub fn ignore_case(this: &RegExp) -> bool;
+
+ /// The non-standard input property is a static property of
+ /// regular expressions that contains the string against which a
+ /// regular expression is matched. RegExp.$_ is an alias for this
+ /// property.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/input)
+ #[wasm_bindgen(static_method_of = RegExp, getter)]
+ pub fn input() -> JsString;
+
+ /// The lastIndex is a read/write integer property of regular expression
+ /// instances that specifies the index at which to start the next match.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex)
+ #[wasm_bindgen(structural, getter = lastIndex, method)]
+ pub fn last_index(this: &RegExp) -> u32;
+
+ /// The lastIndex is a read/write integer property of regular expression
+ /// instances that specifies the index at which to start the next match.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex)
+ #[wasm_bindgen(structural, setter = lastIndex, method)]
+ pub fn set_last_index(this: &RegExp, index: u32);
+
+ /// The non-standard lastMatch property is a static and read-only
+ /// property of regular expressions that contains the last matched
+ /// characters. `RegExp.$&` is an alias for this property.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastMatch)
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = lastMatch)]
+ pub fn last_match() -> JsString;
+
+ /// The non-standard lastParen property is a static and read-only
+ /// property of regular expressions that contains the last
+ /// parenthesized substring match, if any. `RegExp.$+` is an alias
+ /// for this property.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/lastParen)
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = lastParen)]
+ pub fn last_paren() -> JsString;
+
+ /// The non-standard leftContext property is a static and
+ /// read-only property of regular expressions that contains the
+ /// substring preceding the most recent match. `RegExp.$`` is an
+ /// alias for this property.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/leftContext)
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = leftContext)]
+ pub fn left_context() -> JsString;
+
+ /// The multiline property indicates whether or not the "m" flag
+ /// is used with the regular expression. multiline is a read-only
+ /// property of an individual regular expression instance.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/multiline)
+ #[wasm_bindgen(method, getter)]
+ pub fn multiline(this: &RegExp) -> bool;
+
+ /// The non-standard $1, $2, $3, $4, $5, $6, $7, $8, $9 properties
+ /// are static and read-only properties of regular expressions
+ /// that contain parenthesized substring matches.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n)
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$1")]
+ pub fn n1() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$2")]
+ pub fn n2() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$3")]
+ pub fn n3() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$4")]
+ pub fn n4() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$5")]
+ pub fn n5() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$6")]
+ pub fn n6() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$7")]
+ pub fn n7() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$8")]
+ pub fn n8() -> JsString;
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = "$9")]
+ pub fn n9() -> JsString;
+
+ /// The `RegExp` constructor creates a regular expression object for matching text with a pattern.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp)
+ #[wasm_bindgen(constructor)]
+ pub fn new(pattern: &str, flags: &str) -> RegExp;
+ #[wasm_bindgen(constructor)]
+ pub fn new_regexp(pattern: &RegExp, flags: &str) -> RegExp;
+
+ /// The non-standard rightContext property is a static and
+ /// read-only property of regular expressions that contains the
+ /// substring following the most recent match. `RegExp.$'` is an
+ /// alias for this property.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/rightContext)
+ #[wasm_bindgen(static_method_of = RegExp, getter, js_name = rightContext)]
+ pub fn right_context() -> JsString;
+
+ /// The source property returns a String containing the source
+ /// text of the regexp object, and it doesn't contain the two
+ /// forward slashes on both sides and any flags.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source)
+ #[wasm_bindgen(method, getter)]
+ pub fn source(this: &RegExp) -> JsString;
+
+ /// The sticky property reflects whether or not the search is
+ /// sticky (searches in strings only from the index indicated by
+ /// the lastIndex property of this regular expression). sticky is
+ /// a read-only property of an individual regular expression
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky)
+ #[wasm_bindgen(method, getter)]
+ pub fn sticky(this: &RegExp) -> bool;
+
+ /// The `test()` method executes a search for a match between a
+ /// regular expression and a specified string. Returns true or
+ /// false.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)
+ #[wasm_bindgen(method)]
+ pub fn test(this: &RegExp, text: &str) -> bool;
+
+ /// The `toString()` method returns a string representing the
+ /// regular expression.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &RegExp) -> JsString;
+
+ /// The unicode property indicates whether or not the "u" flag is
+ /// used with a regular expression. unicode is a read-only
+ /// property of an individual regular expression instance.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/unicode)
+ #[wasm_bindgen(method, getter)]
+ pub fn unicode(this: &RegExp) -> bool;
+}
+
+// Set
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "Set<any>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Set;
+
+ /// The `add()` method appends a new element with a specified value to the
+ /// end of a [`Set`] object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/add)
+ #[wasm_bindgen(method)]
+ pub fn add(this: &Set, value: &JsValue) -> Set;
+
+ /// The `clear()` method removes all elements from a [`Set`] object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/clear)
+ #[wasm_bindgen(method)]
+ pub fn clear(this: &Set);
+
+ /// The `delete()` method removes the specified element from a [`Set`]
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/delete)
+ #[wasm_bindgen(method)]
+ pub fn delete(this: &Set, value: &JsValue) -> bool;
+
+ /// The `forEach()` method executes a provided function once for each value
+ /// in the Set object, in insertion order.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/forEach)
+ #[wasm_bindgen(method, js_name = forEach)]
+ pub fn for_each(this: &Set, callback: &mut dyn FnMut(JsValue, JsValue, Set));
+
+ /// The `has()` method returns a boolean indicating whether an element with
+ /// the specified value exists in a [`Set`] object or not.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/has)
+ #[wasm_bindgen(method)]
+ pub fn has(this: &Set, value: &JsValue) -> bool;
+
+ /// The [`Set`] object lets you store unique values of any type, whether
+ /// primitive values or object references.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)
+ #[wasm_bindgen(constructor)]
+ pub fn new(init: &JsValue) -> Set;
+
+ /// The size accessor property returns the number of elements in a [`Set`]
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Set/size)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn size(this: &Set) -> u32;
+}
+
+impl Default for Set {
+ fn default() -> Self {
+ Self::new(&JsValue::UNDEFINED)
+ }
+}
+
+// SetIterator
+#[wasm_bindgen]
+extern "C" {
+ /// The `entries()` method returns a new Iterator object that contains an
+ /// array of [value, value] for each element in the Set object, in insertion
+ /// order. For Set objects there is no key like in Map objects. However, to
+ /// keep the API similar to the Map object, each entry has the same value
+ /// for its key and value here, so that an array [value, value] is returned.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/entries)
+ #[wasm_bindgen(method)]
+ pub fn entries(set: &Set) -> Iterator;
+
+ /// The `keys()` method is an alias for this method (for similarity with
+ /// Map objects); it behaves exactly the same and returns values
+ /// of Set elements.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values)
+ #[wasm_bindgen(method)]
+ pub fn keys(set: &Set) -> Iterator;
+
+ /// The `values()` method returns a new Iterator object that contains the
+ /// values for each element in the Set object in insertion order.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/values)
+ #[wasm_bindgen(method)]
+ pub fn values(set: &Set) -> Iterator;
+}
+
+// SyntaxError
+#[wasm_bindgen]
+extern "C" {
+ /// A `SyntaxError` is thrown when the JavaScript engine encounters tokens or
+ /// token order that does not conform to the syntax of the language when
+ /// parsing code.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError)
+ #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "SyntaxError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type SyntaxError;
+
+ /// A `SyntaxError` is thrown when the JavaScript engine encounters tokens or
+ /// token order that does not conform to the syntax of the language when
+ /// parsing code.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError)
+ #[wasm_bindgen(constructor)]
+ pub fn new(message: &str) -> SyntaxError;
+}
+
+// TypeError
+#[wasm_bindgen]
+extern "C" {
+ /// The `TypeError` object represents an error when a value is not of the
+ /// expected type.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError)
+ #[wasm_bindgen(extends = Error, extends = Object, typescript_type = "TypeError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type TypeError;
+
+ /// The `TypeError` object represents an error when a value is not of the
+ /// expected type.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError)
+ #[wasm_bindgen(constructor)]
+ pub fn new(message: &str) -> TypeError;
+}
+
+// URIError
+#[wasm_bindgen]
+extern "C" {
+ /// The `URIError` object represents an error when a global URI handling
+ /// function was used in a wrong way.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError)
+ #[wasm_bindgen(extends = Error, extends = Object, js_name = URIError, typescript_type = "URIError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type UriError;
+
+ /// The `URIError` object represents an error when a global URI handling
+ /// function was used in a wrong way.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIError)
+ #[wasm_bindgen(constructor, js_class = "URIError")]
+ pub fn new(message: &str) -> UriError;
+}
+
+// WeakMap
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "WeakMap<object, any>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type WeakMap;
+
+ /// The [`WeakMap`] object is a collection of key/value pairs in which the
+ /// keys are weakly referenced. The keys must be objects and the values can
+ /// be arbitrary values.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
+ #[wasm_bindgen(constructor)]
+ pub fn new() -> WeakMap;
+
+ /// The `set()` method sets the value for the key in the [`WeakMap`] object.
+ /// Returns the [`WeakMap`] object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/set)
+ #[wasm_bindgen(method, js_class = "WeakMap")]
+ pub fn set(this: &WeakMap, key: &Object, value: &JsValue) -> WeakMap;
+
+ /// The `get()` method returns a specified by key element
+ /// from a [`WeakMap`] object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/get)
+ #[wasm_bindgen(method)]
+ pub fn get(this: &WeakMap, key: &Object) -> JsValue;
+
+ /// The `has()` method returns a boolean indicating whether an element with
+ /// the specified key exists in the [`WeakMap`] object or not.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/has)
+ #[wasm_bindgen(method)]
+ pub fn has(this: &WeakMap, key: &Object) -> bool;
+
+ /// The `delete()` method removes the specified element from a [`WeakMap`]
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap/delete)
+ #[wasm_bindgen(method)]
+ pub fn delete(this: &WeakMap, key: &Object) -> bool;
+}
+
+impl Default for WeakMap {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+// WeakSet
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = "WeakSet<object>")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type WeakSet;
+
+ /// The `WeakSet` object lets you store weakly held objects in a collection.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet)
+ #[wasm_bindgen(constructor)]
+ pub fn new() -> WeakSet;
+
+ /// The `has()` method returns a boolean indicating whether an object exists
+ /// in a WeakSet or not.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/has)
+ #[wasm_bindgen(method)]
+ pub fn has(this: &WeakSet, value: &Object) -> bool;
+
+ /// The `add()` method appends a new object to the end of a WeakSet object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/add)
+ #[wasm_bindgen(method)]
+ pub fn add(this: &WeakSet, value: &Object) -> WeakSet;
+
+ /// The `delete()` method removes the specified element from a WeakSet
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet/delete)
+ #[wasm_bindgen(method)]
+ pub fn delete(this: &WeakSet, value: &Object) -> bool;
+}
+
+impl Default for WeakSet {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+#[cfg(js_sys_unstable_apis)]
+#[allow(non_snake_case)]
+pub mod Temporal;
+
+#[allow(non_snake_case)]
+pub mod WebAssembly {
+ use super::*;
+
+ // WebAssembly
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `WebAssembly.compile()` function compiles a `WebAssembly.Module`
+ /// from WebAssembly binary code. This function is useful if it is
+ /// necessary to a compile a module before it can be instantiated
+ /// (otherwise, the `WebAssembly.instantiate()` function should be used).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/compile)
+ #[wasm_bindgen(js_namespace = WebAssembly)]
+ pub fn compile(buffer_source: &JsValue) -> Promise;
+
+ /// The `WebAssembly.compileStreaming()` function compiles a
+ /// `WebAssembly.Module` module directly from a streamed underlying
+ /// source. This function is useful if it is necessary to a compile a
+ /// module before it can be instantiated (otherwise, the
+ /// `WebAssembly.instantiateStreaming()` function should be used).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/compileStreaming)
+ #[wasm_bindgen(js_namespace = WebAssembly, js_name = compileStreaming)]
+ pub fn compile_streaming(response: &Promise) -> Promise;
+
+ /// The `WebAssembly.instantiate()` function allows you to compile and
+ /// instantiate WebAssembly code.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate)
+ #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiate)]
+ pub fn instantiate_buffer(buffer: &[u8], imports: &Object) -> Promise;
+
+ /// The `WebAssembly.instantiate()` function allows you to compile and
+ /// instantiate WebAssembly code.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiate)
+ #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiate)]
+ pub fn instantiate_module(module: &Module, imports: &Object) -> Promise;
+
+ /// The `WebAssembly.instantiateStreaming()` function compiles and
+ /// instantiates a WebAssembly module directly from a streamed
+ /// underlying source. This is the most efficient, optimized way to load
+ /// wasm code.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming)
+ #[wasm_bindgen(js_namespace = WebAssembly, js_name = instantiateStreaming)]
+ pub fn instantiate_streaming(response: &Promise, imports: &Object) -> Promise;
+
+ /// The `WebAssembly.validate()` function validates a given typed
+ /// array of WebAssembly binary code, returning whether the bytes
+ /// form a valid wasm module (`true`) or not (`false`).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/validate)
+ #[wasm_bindgen(js_namespace = WebAssembly, catch)]
+ pub fn validate(buffer_source: &JsValue) -> Result<bool, JsValue>;
+ }
+
+ // WebAssembly.CompileError
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `WebAssembly.CompileError()` constructor creates a new
+ /// WebAssembly `CompileError` object, which indicates an error during
+ /// WebAssembly decoding or validation.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/CompileError)
+ #[wasm_bindgen(extends = Error, js_namespace = WebAssembly, typescript_type = "WebAssembly.CompileError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type CompileError;
+
+ /// The `WebAssembly.CompileError()` constructor creates a new
+ /// WebAssembly `CompileError` object, which indicates an error during
+ /// WebAssembly decoding or validation.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/CompileError)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly)]
+ pub fn new(message: &str) -> CompileError;
+ }
+
+ // WebAssembly.Instance
+ #[wasm_bindgen]
+ extern "C" {
+ /// A `WebAssembly.Instance` object is a stateful, executable instance
+ /// of a `WebAssembly.Module`. Instance objects contain all the exported
+ /// WebAssembly functions that allow calling into WebAssembly code from
+ /// JavaScript.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance)
+ #[wasm_bindgen(extends = Object, js_namespace = WebAssembly, typescript_type = "WebAssembly.Instance")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Instance;
+
+ /// The `WebAssembly.Instance()` constructor function can be called to
+ /// synchronously instantiate a given `WebAssembly.Module`
+ /// object. However, the primary way to get an `Instance` is through the
+ /// asynchronous `WebAssembly.instantiateStreaming()` function.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance)
+ #[wasm_bindgen(catch, constructor, js_namespace = WebAssembly)]
+ pub fn new(module: &Module, imports: &Object) -> Result<Instance, JsValue>;
+
+ /// The `exports` readonly property of the `WebAssembly.Instance` object
+ /// prototype returns an object containing as its members all the
+ /// functions exported from the WebAssembly module instance, to allow
+ /// them to be accessed and used by JavaScript.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Instance/exports)
+ #[wasm_bindgen(getter, method, js_namespace = WebAssembly)]
+ pub fn exports(this: &Instance) -> Object;
+ }
+
+ // WebAssembly.LinkError
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `WebAssembly.LinkError()` constructor creates a new WebAssembly
+ /// LinkError object, which indicates an error during module
+ /// instantiation (besides traps from the start function).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/LinkError)
+ #[wasm_bindgen(extends = Error, js_namespace = WebAssembly, typescript_type = "WebAssembly.LinkError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type LinkError;
+
+ /// The `WebAssembly.LinkError()` constructor creates a new WebAssembly
+ /// LinkError object, which indicates an error during module
+ /// instantiation (besides traps from the start function).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/LinkError)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly)]
+ pub fn new(message: &str) -> LinkError;
+ }
+
+ // WebAssembly.RuntimeError
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `WebAssembly.RuntimeError()` constructor creates a new WebAssembly
+ /// `RuntimeError` object — the type that is thrown whenever WebAssembly
+ /// specifies a trap.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/RuntimeError)
+ #[wasm_bindgen(extends = Error, js_namespace = WebAssembly, typescript_type = "WebAssembly.RuntimeError")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type RuntimeError;
+
+ /// The `WebAssembly.RuntimeError()` constructor creates a new WebAssembly
+ /// `RuntimeError` object — the type that is thrown whenever WebAssembly
+ /// specifies a trap.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/RuntimeError)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly)]
+ pub fn new(message: &str) -> RuntimeError;
+ }
+
+ // WebAssembly.Module
+ #[wasm_bindgen]
+ extern "C" {
+ /// A `WebAssembly.Module` object contains stateless WebAssembly code
+ /// that has already been compiled by the browser and can be
+ /// efficiently shared with Workers, and instantiated multiple times.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module)
+ #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Module")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Module;
+
+ /// A `WebAssembly.Module` object contains stateless WebAssembly code
+ /// that has already been compiled by the browser and can be
+ /// efficiently shared with Workers, and instantiated multiple times.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
+ pub fn new(buffer_source: &JsValue) -> Result<Module, JsValue>;
+
+ /// The `WebAssembly.customSections()` function returns a copy of the
+ /// contents of all custom sections in the given module with the given
+ /// string name.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/customSections)
+ #[wasm_bindgen(static_method_of = Module, js_namespace = WebAssembly, js_name = customSections)]
+ pub fn custom_sections(module: &Module, sectionName: &str) -> Array;
+
+ /// The `WebAssembly.exports()` function returns an array containing
+ /// descriptions of all the declared exports of the given `Module`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/exports)
+ #[wasm_bindgen(static_method_of = Module, js_namespace = WebAssembly)]
+ pub fn exports(module: &Module) -> Array;
+
+ /// The `WebAssembly.imports()` function returns an array containing
+ /// descriptions of all the declared imports of the given `Module`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Module/imports)
+ #[wasm_bindgen(static_method_of = Module, js_namespace = WebAssembly)]
+ pub fn imports(module: &Module) -> Array;
+ }
+
+ // WebAssembly.Table
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `WebAssembly.Table()` constructor creates a new `Table` object
+ /// of the given size and element type.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table)
+ #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Table")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Table;
+
+ /// The `WebAssembly.Table()` constructor creates a new `Table` object
+ /// of the given size and element type.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
+ pub fn new(table_descriptor: &Object) -> Result<Table, JsValue>;
+
+ /// The length prototype property of the `WebAssembly.Table` object
+ /// returns the length of the table, i.e. the number of elements in the
+ /// table.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/length)
+ #[wasm_bindgen(method, getter, js_namespace = WebAssembly)]
+ pub fn length(this: &Table) -> u32;
+
+ /// The `get()` prototype method of the `WebAssembly.Table()` object
+ /// retrieves a function reference stored at a given index.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/get)
+ #[wasm_bindgen(method, catch, js_namespace = WebAssembly)]
+ pub fn get(this: &Table, index: u32) -> Result<Function, JsValue>;
+
+ /// The `grow()` prototype method of the `WebAssembly.Table` object
+ /// increases the size of the `Table` instance by a specified number of
+ /// elements.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/grow)
+ #[wasm_bindgen(method, catch, js_namespace = WebAssembly)]
+ pub fn grow(this: &Table, additional_capacity: u32) -> Result<u32, JsValue>;
+
+ /// The `set()` prototype method of the `WebAssembly.Table` object mutates a
+ /// reference stored at a given index to a different value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Table/set)
+ #[wasm_bindgen(method, catch, js_namespace = WebAssembly)]
+ pub fn set(this: &Table, index: u32, function: &Function) -> Result<(), JsValue>;
+ }
+
+ // WebAssembly.Global
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `WebAssembly.Global()` constructor creates a new `Global` object
+ /// of the given type and value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global)
+ #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Global")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Global;
+
+ /// The `WebAssembly.Global()` constructor creates a new `Global` object
+ /// of the given type and value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
+ pub fn new(global_descriptor: &Object, value: &JsValue) -> Result<Global, JsValue>;
+
+ /// The value prototype property of the `WebAssembly.Global` object
+ /// returns the value of the global.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Global)
+ #[wasm_bindgen(method, getter, structural, js_namespace = WebAssembly)]
+ pub fn value(this: &Global) -> JsValue;
+ #[wasm_bindgen(method, setter = value, structural, js_namespace = WebAssembly)]
+ pub fn set_value(this: &Global, value: &JsValue);
+ }
+
+ // WebAssembly.Memory
+ #[wasm_bindgen]
+ extern "C" {
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory)
+ #[wasm_bindgen(js_namespace = WebAssembly, extends = Object, typescript_type = "WebAssembly.Memory")]
+ #[derive(Clone, Debug, PartialEq, Eq)]
+ pub type Memory;
+
+ /// The `WebAssembly.Memory()` constructor creates a new `Memory` object
+ /// which is a resizable `ArrayBuffer` that holds the raw bytes of
+ /// memory accessed by a WebAssembly `Instance`.
+ ///
+ /// A memory created by JavaScript or in WebAssembly code will be
+ /// accessible and mutable from both JavaScript and WebAssembly.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory)
+ #[wasm_bindgen(constructor, js_namespace = WebAssembly, catch)]
+ pub fn new(descriptor: &Object) -> Result<Memory, JsValue>;
+
+ /// An accessor property that returns the buffer contained in the
+ /// memory.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/buffer)
+ #[wasm_bindgen(method, getter, js_namespace = WebAssembly)]
+ pub fn buffer(this: &Memory) -> JsValue;
+
+ /// The `grow()` protoype method of the `Memory` object increases the
+ /// size of the memory instance by a specified number of WebAssembly
+ /// pages.
+ ///
+ /// Takes the number of pages to grow (64KiB in size) and returns the
+ /// previous size of memory, in pages.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/grow)
+ #[wasm_bindgen(method, js_namespace = WebAssembly)]
+ pub fn grow(this: &Memory, pages: u32) -> u32;
+ }
+}
+
+/// The `JSON` object contains methods for parsing [JavaScript Object
+/// Notation (JSON)](https://json.org/) and converting values to JSON. It
+/// can't be called or constructed, and aside from its two method
+/// properties, it has no interesting functionality of its own.
+#[allow(non_snake_case)]
+pub mod JSON {
+ use super::*;
+
+ // JSON
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `JSON.parse()` method parses a JSON string, constructing the
+ /// JavaScript value or object described by the string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse)
+ #[wasm_bindgen(catch, js_namespace = JSON)]
+ pub fn parse(text: &str) -> Result<JsValue, JsValue>;
+
+ /// The `JSON.stringify()` method converts a JavaScript value to a JSON string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
+ #[wasm_bindgen(catch, js_namespace = JSON)]
+ pub fn stringify(obj: &JsValue) -> Result<JsString, JsValue>;
+
+ /// The `JSON.stringify()` method converts a JavaScript value to a JSON string.
+ ///
+ /// The `replacer` argument is a function that alters the behavior of the stringification
+ /// process, or an array of String and Number objects that serve as a whitelist
+ /// for selecting/filtering the properties of the value object to be included
+ /// in the JSON string. If this value is null or not provided, all properties
+ /// of the object are included in the resulting JSON string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
+ #[wasm_bindgen(catch, js_namespace = JSON, js_name = stringify)]
+ pub fn stringify_with_replacer(
+ obj: &JsValue,
+ replacer: &JsValue,
+ ) -> Result<JsString, JsValue>;
+
+ /// The `JSON.stringify()` method converts a JavaScript value to a JSON string.
+ ///
+ /// The `replacer` argument is a function that alters the behavior of the stringification
+ /// process, or an array of String and Number objects that serve as a whitelist
+ /// for selecting/filtering the properties of the value object to be included
+ /// in the JSON string. If this value is null or not provided, all properties
+ /// of the object are included in the resulting JSON string.
+ ///
+ /// The `space` argument is a String or Number object that's used to insert white space into
+ /// the output JSON string for readability purposes. If this is a Number, it
+ /// indicates the number of space characters to use as white space; this number
+ /// is capped at 10 (if it is greater, the value is just 10). Values less than
+ /// 1 indicate that no space should be used. If this is a String, the string
+ /// (or the first 10 characters of the string, if it's longer than that) is
+ /// used as white space. If this parameter is not provided (or is null), no
+ /// white space is used.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)
+ #[wasm_bindgen(catch, js_namespace = JSON, js_name = stringify)]
+ pub fn stringify_with_replacer_and_space(
+ obj: &JsValue,
+ replacer: &JsValue,
+ space: &JsValue,
+ ) -> Result<JsString, JsValue>;
+
+ }
+}
+
+// JsString
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_name = String, extends = Object, is_type_of = JsValue::is_string, typescript_type = "string")]
+ #[derive(Clone, PartialEq, Eq)]
+ pub type JsString;
+
+ /// The length property of a String object indicates the length of a string,
+ /// in UTF-16 code units.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length)
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn length(this: &JsString) -> u32;
+
+ /// The 'at()' method returns a new string consisting of the single UTF-16
+ /// code unit located at the specified offset into the string, counting from
+ /// the end if it's negative.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/at)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn at(this: &JsString, index: i32) -> Option<JsString>;
+
+ /// The String object's `charAt()` method returns a new string consisting of
+ /// the single UTF-16 code unit located at the specified offset into the
+ /// string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt)
+ #[wasm_bindgen(method, js_class = "String", js_name = charAt)]
+ pub fn char_at(this: &JsString, index: u32) -> JsString;
+
+ /// The `charCodeAt()` method returns an integer between 0 and 65535
+ /// representing the UTF-16 code unit at the given index (the UTF-16 code
+ /// unit matches the Unicode code point for code points representable in a
+ /// single UTF-16 code unit, but might also be the first code unit of a
+ /// surrogate pair for code points not representable in a single UTF-16 code
+ /// unit, e.g. Unicode code points > 0x10000). If you want the entire code
+ /// point value, use `codePointAt()`.
+ ///
+ /// Returns `NaN` if index is out of range.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)
+ #[wasm_bindgen(method, js_class = "String", js_name = charCodeAt)]
+ pub fn char_code_at(this: &JsString, index: u32) -> f64;
+
+ /// The `codePointAt()` method returns a non-negative integer that is the
+ /// Unicode code point value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt)
+ #[wasm_bindgen(method, js_class = "String", js_name = codePointAt)]
+ pub fn code_point_at(this: &JsString, pos: u32) -> JsValue;
+
+ /// The `concat()` method concatenates the string arguments to the calling
+ /// string and returns a new string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn concat(this: &JsString, string_2: &JsValue) -> JsString;
+
+ /// The `endsWith()` method determines whether a string ends with the characters of a
+ /// specified string, returning true or false as appropriate.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith)
+ #[wasm_bindgen(method, js_class = "String", js_name = endsWith)]
+ pub fn ends_with(this: &JsString, search_string: &str, length: i32) -> bool;
+
+ /// The static `String.fromCharCode()` method returns a string created from
+ /// the specified sequence of UTF-16 code units.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+ ///
+ /// # Notes
+ ///
+ /// There are a few bindings to `from_char_code` in `js-sys`: `from_char_code1`, `from_char_code2`, etc...
+ /// with different arities.
+ ///
+ /// Additionally, this function accepts `u16` for character codes, but
+ /// fixing others requires a breaking change release
+ /// (see https://github.com/rustwasm/wasm-bindgen/issues/1460 for details).
+ #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode, variadic)]
+ pub fn from_char_code(char_codes: &[u16]) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+ #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
+ pub fn from_char_code1(a: u32) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+ #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
+ pub fn from_char_code2(a: u32, b: u32) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+ #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
+ pub fn from_char_code3(a: u32, b: u32, c: u32) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+ #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
+ pub fn from_char_code4(a: u32, b: u32, c: u32, d: u32) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+ #[wasm_bindgen(static_method_of = JsString, js_class = "String", js_name = fromCharCode)]
+ pub fn from_char_code5(a: u32, b: u32, c: u32, d: u32, e: u32) -> JsString;
+
+ /// The static `String.fromCodePoint()` method returns a string created by
+ /// using the specified sequence of code points.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
+ ///
+ /// # Exceptions
+ ///
+ /// A RangeError is thrown if an invalid Unicode code point is given
+ ///
+ /// # Notes
+ ///
+ /// There are a few bindings to `from_code_point` in `js-sys`: `from_code_point1`, `from_code_point2`, etc...
+ /// with different arities.
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint, variadic)]
+ pub fn from_code_point(code_points: &[u32]) -> Result<JsString, JsValue>;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
+ pub fn from_code_point1(a: u32) -> Result<JsString, JsValue>;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
+ pub fn from_code_point2(a: u32, b: u32) -> Result<JsString, JsValue>;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
+ pub fn from_code_point3(a: u32, b: u32, c: u32) -> Result<JsString, JsValue>;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
+ pub fn from_code_point4(a: u32, b: u32, c: u32, d: u32) -> Result<JsString, JsValue>;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = fromCodePoint)]
+ pub fn from_code_point5(a: u32, b: u32, c: u32, d: u32, e: u32) -> Result<JsString, JsValue>;
+
+ /// The `includes()` method determines whether one string may be found
+ /// within another string, returning true or false as appropriate.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn includes(this: &JsString, search_string: &str, position: i32) -> bool;
+
+ /// The `indexOf()` method returns the index within the calling String
+ /// object of the first occurrence of the specified value, starting the
+ /// search at fromIndex. Returns -1 if the value is not found.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)
+ #[wasm_bindgen(method, js_class = "String", js_name = indexOf)]
+ pub fn index_of(this: &JsString, search_value: &str, from_index: i32) -> i32;
+
+ /// The `lastIndexOf()` method returns the index within the calling String
+ /// object of the last occurrence of the specified value, searching
+ /// backwards from fromIndex. Returns -1 if the value is not found.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf)
+ #[wasm_bindgen(method, js_class = "String", js_name = lastIndexOf)]
+ pub fn last_index_of(this: &JsString, search_value: &str, from_index: i32) -> i32;
+
+ /// The `localeCompare()` method returns a number indicating whether
+ /// a reference string comes before or after or is the same as
+ /// the given string in sort order.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)
+ #[wasm_bindgen(method, js_class = "String", js_name = localeCompare)]
+ pub fn locale_compare(
+ this: &JsString,
+ compare_string: &str,
+ locales: &Array,
+ options: &Object,
+ ) -> i32;
+
+ /// The `match()` method retrieves the matches when matching a string against a regular expression.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
+ #[wasm_bindgen(method, js_class = "String", js_name = match)]
+ pub fn match_(this: &JsString, pattern: &RegExp) -> Option<Object>;
+
+ /// The `match_all()` method is similar to `match()`, but gives an iterator of `exec()` arrays, which preserve capture groups.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/matchAll)
+ #[wasm_bindgen(method, js_class = "String", js_name = matchAll)]
+ pub fn match_all(this: &JsString, pattern: &RegExp) -> Iterator;
+
+ /// The `normalize()` method returns the Unicode Normalization Form
+ /// of a given string (if the value isn't a string, it will be converted to one first).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn normalize(this: &JsString, form: &str) -> JsString;
+
+ /// The `padEnd()` method pads the current string with a given string
+ /// (repeated, if needed) so that the resulting string reaches a given
+ /// length. The padding is applied from the end (right) of the current
+ /// string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd)
+ #[wasm_bindgen(method, js_class = "String", js_name = padEnd)]
+ pub fn pad_end(this: &JsString, target_length: u32, pad_string: &str) -> JsString;
+
+ /// The `padStart()` method pads the current string with another string
+ /// (repeated, if needed) so that the resulting string reaches the given
+ /// length. The padding is applied from the start (left) of the current
+ /// string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)
+ #[wasm_bindgen(method, js_class = "String", js_name = padStart)]
+ pub fn pad_start(this: &JsString, target_length: u32, pad_string: &str) -> JsString;
+
+ /// The `repeat()` method constructs and returns a new string which contains the specified
+ /// number of copies of the string on which it was called, concatenated together.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn repeat(this: &JsString, count: i32) -> JsString;
+
+ /// The `replace()` method returns a new string with some or all matches of a pattern
+ /// replaced by a replacement. The pattern can be a string or a RegExp, and
+ /// the replacement can be a string or a function to be called for each match.
+ ///
+ /// Note: The original string will remain unchanged.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn replace(this: &JsString, pattern: &str, replacement: &str) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
+ #[wasm_bindgen(method, js_class = "String", js_name = replace)]
+ pub fn replace_with_function(
+ this: &JsString,
+ pattern: &str,
+ replacement: &Function,
+ ) -> JsString;
+
+ #[wasm_bindgen(method, js_class = "String", js_name = replace)]
+ pub fn replace_by_pattern(this: &JsString, pattern: &RegExp, replacement: &str) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)
+ #[wasm_bindgen(method, js_class = "String", js_name = replace)]
+ pub fn replace_by_pattern_with_function(
+ this: &JsString,
+ pattern: &RegExp,
+ replacement: &Function,
+ ) -> JsString;
+
+ /// The `replace_all()` method returns a new string with all matches of a pattern
+ /// replaced by a replacement. The pattern can be a string or a global RegExp, and
+ /// the replacement can be a string or a function to be called for each match.
+ ///
+ /// Note: The original string will remain unchanged.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
+ #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
+ pub fn replace_all(this: &JsString, pattern: &str, replacement: &str) -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
+ #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
+ pub fn replace_all_with_function(
+ this: &JsString,
+ pattern: &str,
+ replacement: &Function,
+ ) -> JsString;
+
+ #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
+ pub fn replace_all_by_pattern(this: &JsString, pattern: &RegExp, replacement: &str)
+ -> JsString;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll)
+ #[wasm_bindgen(method, js_class = "String", js_name = replaceAll)]
+ pub fn replace_all_by_pattern_with_function(
+ this: &JsString,
+ pattern: &RegExp,
+ replacement: &Function,
+ ) -> JsString;
+
+ /// The `search()` method executes a search for a match between
+ /// a regular expression and this String object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/search)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn search(this: &JsString, pattern: &RegExp) -> i32;
+
+ /// The `slice()` method extracts a section of a string and returns it as a
+ /// new string, without modifying the original string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn slice(this: &JsString, start: u32, end: u32) -> JsString;
+
+ /// The `split()` method splits a String object into an array of strings by separating the string
+ /// into substrings, using a specified separator string to determine where to make each split.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn split(this: &JsString, separator: &str) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
+ #[wasm_bindgen(method, js_class = "String", js_name = split)]
+ pub fn split_limit(this: &JsString, separator: &str, limit: u32) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
+ #[wasm_bindgen(method, js_class = "String", js_name = split)]
+ pub fn split_by_pattern(this: &JsString, pattern: &RegExp) -> Array;
+
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split)
+ #[wasm_bindgen(method, js_class = "String", js_name = split)]
+ pub fn split_by_pattern_limit(this: &JsString, pattern: &RegExp, limit: u32) -> Array;
+
+ /// The `startsWith()` method determines whether a string begins with the
+ /// characters of a specified string, returning true or false as
+ /// appropriate.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith)
+ #[wasm_bindgen(method, js_class = "String", js_name = startsWith)]
+ pub fn starts_with(this: &JsString, search_string: &str, position: u32) -> bool;
+
+ /// The `substring()` method returns the part of the string between the
+ /// start and end indexes, or to the end of the string.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn substring(this: &JsString, index_start: u32, index_end: u32) -> JsString;
+
+ /// The `substr()` method returns the part of a string between
+ /// the start index and a number of characters after it.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn substr(this: &JsString, start: i32, length: i32) -> JsString;
+
+ /// The `toLocaleLowerCase()` method returns the calling string value converted to lower case,
+ /// according to any locale-specific case mappings.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase)
+ #[wasm_bindgen(method, js_class = "String", js_name = toLocaleLowerCase)]
+ pub fn to_locale_lower_case(this: &JsString, locale: Option<&str>) -> JsString;
+
+ /// The `toLocaleUpperCase()` method returns the calling string value converted to upper case,
+ /// according to any locale-specific case mappings.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase)
+ #[wasm_bindgen(method, js_class = "String", js_name = toLocaleUpperCase)]
+ pub fn to_locale_upper_case(this: &JsString, locale: Option<&str>) -> JsString;
+
+ /// The `toLowerCase()` method returns the calling string value
+ /// converted to lower case.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase)
+ #[wasm_bindgen(method, js_class = "String", js_name = toLowerCase)]
+ pub fn to_lower_case(this: &JsString) -> JsString;
+
+ /// The `toString()` method returns a string representing the specified
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toString)
+ #[wasm_bindgen(method, js_class = "String", js_name = toString)]
+ pub fn to_string(this: &JsString) -> JsString;
+
+ /// The `toUpperCase()` method returns the calling string value converted to
+ /// uppercase (the value will be converted to a string if it isn't one).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase)
+ #[wasm_bindgen(method, js_class = "String", js_name = toUpperCase)]
+ pub fn to_upper_case(this: &JsString) -> JsString;
+
+ /// The `trim()` method removes whitespace from both ends of a string.
+ /// Whitespace in this context is all the whitespace characters (space, tab,
+ /// no-break space, etc.) and all the line terminator characters (LF, CR,
+ /// etc.).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim)
+ #[wasm_bindgen(method, js_class = "String")]
+ pub fn trim(this: &JsString) -> JsString;
+
+ /// The `trimEnd()` method removes whitespace from the end of a string.
+ /// `trimRight()` is an alias of this method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimEnd)
+ #[wasm_bindgen(method, js_class = "String", js_name = trimEnd)]
+ pub fn trim_end(this: &JsString) -> JsString;
+
+ /// The `trimEnd()` method removes whitespace from the end of a string.
+ /// `trimRight()` is an alias of this method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimEnd)
+ #[wasm_bindgen(method, js_class = "String", js_name = trimRight)]
+ pub fn trim_right(this: &JsString) -> JsString;
+
+ /// The `trimStart()` method removes whitespace from the beginning of a
+ /// string. `trimLeft()` is an alias of this method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimStart)
+ #[wasm_bindgen(method, js_class = "String", js_name = trimStart)]
+ pub fn trim_start(this: &JsString) -> JsString;
+
+ /// The `trimStart()` method removes whitespace from the beginning of a
+ /// string. `trimLeft()` is an alias of this method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trimStart)
+ #[wasm_bindgen(method, js_class = "String", js_name = trimLeft)]
+ pub fn trim_left(this: &JsString) -> JsString;
+
+ /// The `valueOf()` method returns the primitive value of a `String` object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/valueOf)
+ #[wasm_bindgen(method, js_class = "String", js_name = valueOf)]
+ pub fn value_of(this: &JsString) -> JsString;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, variadic, static_method_of = JsString, js_class = "String")]
+ pub fn raw(call_site: &Object, substitutions: &Array) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_0(call_site: &Object) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_1(call_site: &Object, substitutions_1: &str) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_2(
+ call_site: &Object,
+ substitutions_1: &str,
+ substitutions_2: &str,
+ ) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_3(
+ call_site: &Object,
+ substitutions_1: &str,
+ substitutions_2: &str,
+ substitutions_3: &str,
+ ) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_4(
+ call_site: &Object,
+ substitutions_1: &str,
+ substitutions_2: &str,
+ substitutions_3: &str,
+ substitutions_4: &str,
+ ) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_5(
+ call_site: &Object,
+ substitutions_1: &str,
+ substitutions_2: &str,
+ substitutions_3: &str,
+ substitutions_4: &str,
+ substitutions_5: &str,
+ ) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_6(
+ call_site: &Object,
+ substitutions_1: &str,
+ substitutions_2: &str,
+ substitutions_3: &str,
+ substitutions_4: &str,
+ substitutions_5: &str,
+ substitutions_6: &str,
+ ) -> Result<JsString, JsValue>;
+
+ /// The static `raw()` method is a tag function of template literals,
+ /// similar to the `r` prefix in Python or the `@` prefix in C# for string literals.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw)
+ #[wasm_bindgen(catch, static_method_of = JsString, js_class = "String", js_name = raw)]
+ pub fn raw_7(
+ call_site: &Object,
+ substitutions_1: &str,
+ substitutions_2: &str,
+ substitutions_3: &str,
+ substitutions_4: &str,
+ substitutions_5: &str,
+ substitutions_6: &str,
+ substitutions_7: &str,
+ ) -> Result<JsString, JsValue>;
+}
+
+impl JsString {
+ /// Returns the `JsString` value of this JS value if it's an instance of a
+ /// string.
+ ///
+ /// If this JS value is not an instance of a string then this returns
+ /// `None`.
+ #[deprecated(note = "recommended to use dyn_ref instead which is now equivalent")]
+ pub fn try_from(val: &JsValue) -> Option<&JsString> {
+ val.dyn_ref()
+ }
+
+ /// Returns whether this string is a valid UTF-16 string.
+ ///
+ /// This is useful for learning whether `String::from(..)` will return a
+ /// lossless representation of the JS string. If this string contains
+ /// unpaired surrogates then `String::from` will succeed but it will be a
+ /// lossy representation of the JS string because unpaired surrogates will
+ /// become replacement characters.
+ ///
+ /// If this function returns `false` then to get a lossless representation
+ /// of the string you'll need to manually use the `iter` method (or the
+ /// `char_code_at` accessor) to view the raw character codes.
+ ///
+ /// For more information, see the documentation on [JS strings vs Rust
+ /// strings][docs]
+ ///
+ /// [docs]: https://rustwasm.github.io/docs/wasm-bindgen/reference/types/str.html
+ pub fn is_valid_utf16(&self) -> bool {
+ std::char::decode_utf16(self.iter()).all(|i| i.is_ok())
+ }
+
+ /// Returns an iterator over the `u16` character codes that make up this JS
+ /// string.
+ ///
+ /// This method will call `char_code_at` for each code in this JS string,
+ /// returning an iterator of the codes in sequence.
+ pub fn iter<'a>(
+ &'a self,
+ ) -> impl ExactSizeIterator<Item = u16> + DoubleEndedIterator<Item = u16> + 'a {
+ (0..self.length()).map(move |i| self.char_code_at(i) as u16)
+ }
+
+ /// If this string consists of a single Unicode code point, then this method
+ /// converts it into a Rust `char` without doing any allocations.
+ ///
+ /// If this JS value is not a valid UTF-8 or consists of more than a single
+ /// codepoint, then this returns `None`.
+ ///
+ /// Note that a single Unicode code point might be represented as more than
+ /// one code unit on the JavaScript side. For example, a JavaScript string
+ /// `"\uD801\uDC37"` is actually a single Unicode code point U+10437 which
+ /// corresponds to a character '𐐷'.
+ pub fn as_char(&self) -> Option<char> {
+ let len = self.length();
+
+ if len == 0 || len > 2 {
+ return None;
+ }
+
+ // This will be simplified when definitions are fixed:
+ // https://github.com/rustwasm/wasm-bindgen/issues/1362
+ let cp = self.code_point_at(0).as_f64().unwrap_throw() as u32;
+
+ let c = std::char::from_u32(cp)?;
+
+ if c.len_utf16() as u32 == len {
+ Some(c)
+ } else {
+ None
+ }
+ }
+}
+
+impl PartialEq<str> for JsString {
+ fn eq(&self, other: &str) -> bool {
+ String::from(self) == other
+ }
+}
+
+impl<'a> PartialEq<&'a str> for JsString {
+ fn eq(&self, other: &&'a str) -> bool {
+ <JsString as PartialEq<str>>::eq(self, other)
+ }
+}
+
+impl PartialEq<String> for JsString {
+ fn eq(&self, other: &String) -> bool {
+ <JsString as PartialEq<str>>::eq(self, other)
+ }
+}
+
+impl<'a> PartialEq<&'a String> for JsString {
+ fn eq(&self, other: &&'a String) -> bool {
+ <JsString as PartialEq<str>>::eq(self, other)
+ }
+}
+
+impl<'a> From<&'a str> for JsString {
+ fn from(s: &'a str) -> Self {
+ JsString::unchecked_from_js(JsValue::from_str(s))
+ }
+}
+
+impl From<String> for JsString {
+ fn from(s: String) -> Self {
+ From::from(&*s)
+ }
+}
+
+impl From<char> for JsString {
+ #[inline]
+ fn from(c: char) -> Self {
+ JsString::from_code_point1(c as u32).unwrap_throw()
+ }
+}
+
+impl<'a> From<&'a JsString> for String {
+ fn from(s: &'a JsString) -> Self {
+ s.obj.as_string().unwrap_throw()
+ }
+}
+
+impl From<JsString> for String {
+ fn from(s: JsString) -> Self {
+ From::from(&s)
+ }
+}
+
+impl fmt::Debug for JsString {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fmt::Debug::fmt(&String::from(self), f)
+ }
+}
+
+impl fmt::Display for JsString {
+ #[inline]
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ fmt::Display::fmt(&String::from(self), f)
+ }
+}
+
+impl str::FromStr for JsString {
+ type Err = convert::Infallible;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(JsString::from(s))
+ }
+}
+
+// Symbol
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(is_type_of = JsValue::is_symbol, typescript_type = "Symbol")]
+ #[derive(Clone, Debug)]
+ pub type Symbol;
+
+ /// The `Symbol.hasInstance` well-known symbol is used to determine
+ /// if a constructor object recognizes an object as its instance.
+ /// The `instanceof` operator's behavior can be customized by this symbol.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = hasInstance)]
+ pub fn has_instance() -> Symbol;
+
+ /// The `Symbol.isConcatSpreadable` well-known symbol is used to configure
+ /// if an object should be flattened to its array elements when using the
+ /// `Array.prototype.concat()` method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = isConcatSpreadable)]
+ pub fn is_concat_spreadable() -> Symbol;
+
+ /// The `Symbol.asyncIterator` well-known symbol specifies the default AsyncIterator for an object.
+ /// If this property is set on an object, it is an async iterable and can be used in a `for await...of` loop.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = asyncIterator)]
+ pub fn async_iterator() -> Symbol;
+
+ /// The `Symbol.iterator` well-known symbol specifies the default iterator
+ /// for an object. Used by `for...of`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
+ pub fn iterator() -> Symbol;
+
+ /// The `Symbol.match` well-known symbol specifies the matching of a regular
+ /// expression against a string. This function is called by the
+ /// `String.prototype.match()` method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/match)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = match)]
+ pub fn match_() -> Symbol;
+
+ /// The `Symbol.replace` well-known symbol specifies the method that
+ /// replaces matched substrings of a string. This function is called by the
+ /// `String.prototype.replace()` method.
+ ///
+ /// For more information, see `RegExp.prototype[@@replace]()` and
+ /// `String.prototype.replace()`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/replace)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
+ pub fn replace() -> Symbol;
+
+ /// The `Symbol.search` well-known symbol specifies the method that returns
+ /// the index within a string that matches the regular expression. This
+ /// function is called by the `String.prototype.search()` method.
+ ///
+ /// For more information, see `RegExp.prototype[@@search]()` and
+ /// `String.prototype.search()`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/search)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
+ pub fn search() -> Symbol;
+
+ /// The well-known symbol `Symbol.species` specifies a function-valued
+ /// property that the constructor function uses to create derived objects.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
+ pub fn species() -> Symbol;
+
+ /// The `Symbol.split` well-known symbol specifies the method that splits a
+ /// string at the indices that match a regular expression. This function is
+ /// called by the `String.prototype.split()` method.
+ ///
+ /// For more information, see `RegExp.prototype[@@split]()` and
+ /// `String.prototype.split()`.
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/split)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
+ pub fn split() -> Symbol;
+
+ /// The `Symbol.toPrimitive` is a symbol that specifies a function valued
+ /// property that is called to convert an object to a corresponding
+ /// primitive value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = toPrimitive)]
+ pub fn to_primitive() -> Symbol;
+
+ /// The `Symbol.toStringTag` well-known symbol is a string valued property
+ /// that is used in the creation of the default string description of an
+ /// object. It is accessed internally by the `Object.prototype.toString()`
+ /// method.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toString)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural, js_name = toStringTag)]
+ pub fn to_string_tag() -> Symbol;
+
+ /// The `Symbol.for(key)` method searches for existing symbols in a runtime-wide symbol registry with
+ /// the given key and returns it if found.
+ /// Otherwise a new symbol gets created in the global symbol registry with this key.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for)
+ #[wasm_bindgen(static_method_of = Symbol, js_name = for)]
+ pub fn for_(key: &str) -> Symbol;
+
+ /// The `Symbol.keyFor(sym)` method retrieves a shared symbol key from the global symbol registry for the given symbol.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/keyFor)
+ #[wasm_bindgen(static_method_of = Symbol, js_name = keyFor)]
+ pub fn key_for(sym: &Symbol) -> JsValue;
+
+ /// The `toString()` method returns a string representing the specified Symbol object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toString)
+ #[wasm_bindgen(method, js_name = toString)]
+ pub fn to_string(this: &Symbol) -> JsString;
+
+ /// The `Symbol.unscopables` well-known symbol is used to specify an object
+ /// value of whose own and inherited property names are excluded from the
+ /// with environment bindings of the associated object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/unscopables)
+ #[wasm_bindgen(static_method_of = Symbol, getter, structural)]
+ pub fn unscopables() -> Symbol;
+
+ /// The `valueOf()` method returns the primitive value of a Symbol object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/valueOf)
+ #[wasm_bindgen(method, js_name = valueOf)]
+ pub fn value_of(this: &Symbol) -> Symbol;
+}
+
+#[allow(non_snake_case)]
+pub mod Intl {
+ use super::*;
+
+ // Intl
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `Intl.getCanonicalLocales()` method returns an array containing
+ /// the canonical locale names. Duplicates will be omitted and elements
+ /// will be validated as structurally valid language tags.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/getCanonicalLocales)
+ #[wasm_bindgen(js_name = getCanonicalLocales, js_namespace = Intl)]
+ pub fn get_canonical_locales(s: &JsValue) -> Array;
+ }
+
+ // Intl.Collator
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `Intl.Collator` object is a constructor for collators, objects
+ /// that enable language sensitive string comparison.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator)
+ #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.Collator")]
+ #[derive(Clone, Debug)]
+ pub type Collator;
+
+ /// The `Intl.Collator` object is a constructor for collators, objects
+ /// that enable language sensitive string comparison.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator)
+ #[wasm_bindgen(constructor, js_namespace = Intl)]
+ pub fn new(locales: &Array, options: &Object) -> Collator;
+
+ /// The Intl.Collator.prototype.compare property returns a function that
+ /// compares two strings according to the sort order of this Collator
+ /// object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/compare)
+ #[wasm_bindgen(method, getter, js_class = "Intl.Collator")]
+ pub fn compare(this: &Collator) -> Function;
+
+ /// The `Intl.Collator.prototype.resolvedOptions()` method returns a new
+ /// object with properties reflecting the locale and collation options
+ /// computed during initialization of this Collator object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/resolvedOptions)
+ #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
+ pub fn resolved_options(this: &Collator) -> Object;
+
+ /// The `Intl.Collator.supportedLocalesOf()` method returns an array
+ /// containing those of the provided locales that are supported in
+ /// collation without having to fall back to the runtime's default
+ /// locale.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/supportedLocalesOf)
+ #[wasm_bindgen(static_method_of = Collator, js_namespace = Intl, js_name = supportedLocalesOf)]
+ pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
+ }
+
+ impl Default for Collator {
+ fn default() -> Self {
+ Self::new(
+ &JsValue::UNDEFINED.unchecked_into(),
+ &JsValue::UNDEFINED.unchecked_into(),
+ )
+ }
+ }
+
+ // Intl.DateTimeFormat
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `Intl.DateTimeFormat` object is a constructor for objects
+ /// that enable language-sensitive date and time formatting.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat)
+ #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.DateTimeFormat")]
+ #[derive(Clone, Debug)]
+ pub type DateTimeFormat;
+
+ /// The `Intl.DateTimeFormat` object is a constructor for objects
+ /// that enable language-sensitive date and time formatting.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat)
+ #[wasm_bindgen(constructor, js_namespace = Intl)]
+ pub fn new(locales: &Array, options: &Object) -> DateTimeFormat;
+
+ /// The Intl.DateTimeFormat.prototype.format property returns a getter function that
+ /// formats a date according to the locale and formatting options of this
+ /// Intl.DateTimeFormat object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/format)
+ #[wasm_bindgen(method, getter, js_class = "Intl.DateTimeFormat")]
+ pub fn format(this: &DateTimeFormat) -> Function;
+
+ /// The `Intl.DateTimeFormat.prototype.formatToParts()` method allows locale-aware
+ /// formatting of strings produced by DateTimeFormat formatters.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts)
+ #[wasm_bindgen(method, js_class = "Intl.DateTimeFormat", js_name = formatToParts)]
+ pub fn format_to_parts(this: &DateTimeFormat, date: &Date) -> Array;
+
+ /// The `Intl.DateTimeFormat.prototype.resolvedOptions()` method returns a new
+ /// object with properties reflecting the locale and date and time formatting
+ /// options computed during initialization of this DateTimeFormat object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions)
+ #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
+ pub fn resolved_options(this: &DateTimeFormat) -> Object;
+
+ /// The `Intl.DateTimeFormat.supportedLocalesOf()` method returns an array
+ /// containing those of the provided locales that are supported in date
+ /// and time formatting without having to fall back to the runtime's default
+ /// locale.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/supportedLocalesOf)
+ #[wasm_bindgen(static_method_of = DateTimeFormat, js_namespace = Intl, js_name = supportedLocalesOf)]
+ pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
+ }
+
+ impl Default for DateTimeFormat {
+ fn default() -> Self {
+ Self::new(
+ &JsValue::UNDEFINED.unchecked_into(),
+ &JsValue::UNDEFINED.unchecked_into(),
+ )
+ }
+ }
+
+ // Intl.NumberFormat
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `Intl.NumberFormat` object is a constructor for objects
+ /// that enable language sensitive number formatting.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat)
+ #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.NumberFormat")]
+ #[derive(Clone, Debug)]
+ pub type NumberFormat;
+
+ /// The `Intl.NumberFormat` object is a constructor for objects
+ /// that enable language sensitive number formatting.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat)
+ #[wasm_bindgen(constructor, js_namespace = Intl)]
+ pub fn new(locales: &Array, options: &Object) -> NumberFormat;
+
+ /// The Intl.NumberFormat.prototype.format property returns a getter function that
+ /// formats a number according to the locale and formatting options of this
+ /// NumberFormat object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/format)
+ #[wasm_bindgen(method, getter, js_class = "Intl.NumberFormat")]
+ pub fn format(this: &NumberFormat) -> Function;
+
+ /// The `Intl.Numberformat.prototype.formatToParts()` method allows locale-aware
+ /// formatting of strings produced by NumberTimeFormat formatters.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/formatToParts)
+ #[wasm_bindgen(method, js_class = "Intl.NumberFormat", js_name = formatToParts)]
+ pub fn format_to_parts(this: &NumberFormat, number: f64) -> Array;
+
+ /// The `Intl.NumberFormat.prototype.resolvedOptions()` method returns a new
+ /// object with properties reflecting the locale and number formatting
+ /// options computed during initialization of this NumberFormat object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/resolvedOptions)
+ #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
+ pub fn resolved_options(this: &NumberFormat) -> Object;
+
+ /// The `Intl.NumberFormat.supportedLocalesOf()` method returns an array
+ /// containing those of the provided locales that are supported in number
+ /// formatting without having to fall back to the runtime's default locale.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat/supportedLocalesOf)
+ #[wasm_bindgen(static_method_of = NumberFormat, js_namespace = Intl, js_name = supportedLocalesOf)]
+ pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
+ }
+
+ impl Default for NumberFormat {
+ fn default() -> Self {
+ Self::new(
+ &JsValue::UNDEFINED.unchecked_into(),
+ &JsValue::UNDEFINED.unchecked_into(),
+ )
+ }
+ }
+
+ // Intl.PluralRules
+ #[wasm_bindgen]
+ extern "C" {
+ /// The `Intl.PluralRules` object is a constructor for objects
+ /// that enable plural sensitive formatting and plural language rules.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules)
+ #[wasm_bindgen(extends = Object, js_namespace = Intl, typescript_type = "Intl.PluralRules")]
+ #[derive(Clone, Debug)]
+ pub type PluralRules;
+
+ /// The `Intl.PluralRules` object is a constructor for objects
+ /// that enable plural sensitive formatting and plural language rules.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules)
+ #[wasm_bindgen(constructor, js_namespace = Intl)]
+ pub fn new(locales: &Array, options: &Object) -> PluralRules;
+
+ /// The `Intl.PluralRules.prototype.resolvedOptions()` method returns a new
+ /// object with properties reflecting the locale and plural formatting
+ /// options computed during initialization of this PluralRules object.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/resolvedOptions)
+ #[wasm_bindgen(method, js_namespace = Intl, js_name = resolvedOptions)]
+ pub fn resolved_options(this: &PluralRules) -> Object;
+
+ /// The `Intl.PluralRules.prototype.select()` method returns a String indicating
+ /// which plural rule to use for locale-aware formatting.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/select)
+ #[wasm_bindgen(method, js_namespace = Intl)]
+ pub fn select(this: &PluralRules, number: f64) -> JsString;
+
+ /// The `Intl.PluralRules.supportedLocalesOf()` method returns an array
+ /// containing those of the provided locales that are supported in plural
+ /// formatting without having to fall back to the runtime's default locale.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/PluralRules/supportedLocalesOf)
+ #[wasm_bindgen(static_method_of = PluralRules, js_namespace = Intl, js_name = supportedLocalesOf)]
+ pub fn supported_locales_of(locales: &Array, options: &Object) -> Array;
+ }
+
+ impl Default for PluralRules {
+ fn default() -> Self {
+ Self::new(
+ &JsValue::UNDEFINED.unchecked_into(),
+ &JsValue::UNDEFINED.unchecked_into(),
+ )
+ }
+ }
+}
+
+// Promise
+#[wasm_bindgen]
+extern "C" {
+ /// The `Promise` object represents the eventual completion (or failure) of
+ /// an asynchronous operation, and its resulting value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
+ #[must_use]
+ #[wasm_bindgen(extends = Object, typescript_type = "Promise<any>")]
+ #[derive(Clone, Debug)]
+ pub type Promise;
+
+ /// Creates a new `Promise` with the provided executor `cb`
+ ///
+ /// The `cb` is a function that is passed with the arguments `resolve` and
+ /// `reject`. The `cb` function is executed immediately by the `Promise`
+ /// implementation, passing `resolve` and `reject` functions (the executor
+ /// is called before the `Promise` constructor even returns the created
+ /// object). The `resolve` and `reject` functions, when called, resolve or
+ /// reject the promise, respectively. The executor normally initiates
+ /// some asynchronous work, and then, once that completes, either calls
+ /// the `resolve` function to resolve the promise or else rejects it if an
+ /// error occurred.
+ ///
+ /// If an error is thrown in the executor function, the promise is rejected.
+ /// The return value of the executor is ignored.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
+ #[wasm_bindgen(constructor)]
+ pub fn new(cb: &mut dyn FnMut(Function, Function)) -> Promise;
+
+ /// The `Promise.all(iterable)` method returns a single `Promise` that
+ /// resolves when all of the promises in the iterable argument have resolved
+ /// or when the iterable argument contains no promises. It rejects with the
+ /// reason of the first promise that rejects.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)
+ #[wasm_bindgen(static_method_of = Promise)]
+ pub fn all(obj: &JsValue) -> Promise;
+
+ /// The `Promise.allSettled(iterable)` method returns a single `Promise` that
+ /// resolves when all of the promises in the iterable argument have either
+ /// fulfilled or rejected or when the iterable argument contains no promises.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled)
+ #[wasm_bindgen(static_method_of = Promise, js_name = allSettled)]
+ pub fn all_settled(obj: &JsValue) -> Promise;
+
+ /// The `Promise.any(iterable)` method returns a single `Promise` that
+ /// resolves when any of the promises in the iterable argument have resolved
+ /// or when the iterable argument contains no promises. It rejects with an
+ /// `AggregateError` if all promises in the iterable rejected.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any)
+ #[wasm_bindgen(static_method_of = Promise)]
+ pub fn any(obj: &JsValue) -> Promise;
+
+ /// The `Promise.race(iterable)` method returns a promise that resolves or
+ /// rejects as soon as one of the promises in the iterable resolves or
+ /// rejects, with the value or reason from that promise.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race)
+ #[wasm_bindgen(static_method_of = Promise)]
+ pub fn race(obj: &JsValue) -> Promise;
+
+ /// The `Promise.reject(reason)` method returns a `Promise` object that is
+ /// rejected with the given reason.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject)
+ #[wasm_bindgen(static_method_of = Promise)]
+ pub fn reject(obj: &JsValue) -> Promise;
+
+ /// The `Promise.resolve(value)` method returns a `Promise` object that is
+ /// resolved with the given value. If the value is a promise, that promise
+ /// is returned; if the value is a thenable (i.e. has a "then" method), the
+ /// returned promise will "follow" that thenable, adopting its eventual
+ /// state; otherwise the returned promise will be fulfilled with the value.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve)
+ #[wasm_bindgen(static_method_of = Promise)]
+ pub fn resolve(obj: &JsValue) -> Promise;
+
+ /// The `catch()` method returns a `Promise` and deals with rejected cases
+ /// only. It behaves the same as calling `Promise.prototype.then(undefined,
+ /// onRejected)` (in fact, calling `obj.catch(onRejected)` internally calls
+ /// `obj.then(undefined, onRejected)`).
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)
+ #[wasm_bindgen(method)]
+ pub fn catch(this: &Promise, cb: &Closure<dyn FnMut(JsValue)>) -> Promise;
+
+ /// The `then()` method returns a `Promise`. It takes up to two arguments:
+ /// callback functions for the success and failure cases of the `Promise`.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then)
+ #[wasm_bindgen(method)]
+ pub fn then(this: &Promise, cb: &Closure<dyn FnMut(JsValue)>) -> Promise;
+
+ /// Same as `then`, only with both arguments provided.
+ #[wasm_bindgen(method, js_name = then)]
+ pub fn then2(
+ this: &Promise,
+ resolve: &Closure<dyn FnMut(JsValue)>,
+ reject: &Closure<dyn FnMut(JsValue)>,
+ ) -> Promise;
+
+ /// The `finally()` method returns a `Promise`. When the promise is settled,
+ /// whether fulfilled or rejected, the specified callback function is
+ /// executed. This provides a way for code that must be executed once the
+ /// `Promise` has been dealt with to be run whether the promise was
+ /// fulfilled successfully or rejected.
+ ///
+ /// This lets you avoid duplicating code in both the promise's `then()` and
+ /// `catch()` handlers.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally)
+ #[wasm_bindgen(method)]
+ pub fn finally(this: &Promise, cb: &Closure<dyn FnMut()>) -> Promise;
+}
+
+/// Returns a handle to the global scope object.
+///
+/// This allows access to the global properties and global names by accessing
+/// the `Object` returned.
+pub fn global() -> Object {
+ thread_local!(static GLOBAL: Object = get_global_object());
+
+ return GLOBAL.with(|g| g.clone());
+
+ fn get_global_object() -> Object {
+ // This is a bit wonky, but we're basically using `#[wasm_bindgen]`
+ // attributes to synthesize imports so we can access properties of the
+ // form:
+ //
+ // * `globalThis.globalThis`
+ // * `self.self`
+ // * ... (etc)
+ //
+ // Accessing the global object is not an easy thing to do, and what we
+ // basically want is `globalThis` but we can't rely on that existing
+ // everywhere. In the meantime we've got the fallbacks mentioned in:
+ //
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis
+ //
+ // Note that this is pretty heavy code-size wise but it at least gets
+ // the job largely done for now and avoids the `Function` constructor at
+ // the end which triggers CSP errors.
+ #[wasm_bindgen]
+ extern "C" {
+ type Global;
+
+ #[wasm_bindgen(getter, catch, static_method_of = Global, js_class = globalThis, js_name = globalThis)]
+ fn get_global_this() -> Result<Object, JsValue>;
+
+ #[wasm_bindgen(getter, catch, static_method_of = Global, js_class = self, js_name = self)]
+ fn get_self() -> Result<Object, JsValue>;
+
+ #[wasm_bindgen(getter, catch, static_method_of = Global, js_class = window, js_name = window)]
+ fn get_window() -> Result<Object, JsValue>;
+
+ #[wasm_bindgen(getter, catch, static_method_of = Global, js_class = global, js_name = global)]
+ fn get_global() -> Result<Object, JsValue>;
+ }
+
+ // The order is important: in Firefox Extension Content Scripts `globalThis`
+ // is a Sandbox (not Window), so `globalThis` must be checked after `window`.
+ let static_object = Global::get_self()
+ .or_else(|_| Global::get_window())
+ .or_else(|_| Global::get_global_this())
+ .or_else(|_| Global::get_global());
+ if let Ok(obj) = static_object {
+ if !obj.is_undefined() {
+ return obj;
+ }
+ }
+
+ // According to StackOverflow you can access the global object via:
+ //
+ // const global = Function('return this')();
+ //
+ // I think that's because the manufactured function isn't in "strict" mode.
+ // It also turns out that non-strict functions will ignore `undefined`
+ // values for `this` when using the `apply` function.
+ //
+ // As a result we use the equivalent of this snippet to get a handle to the
+ // global object in a sort of roundabout way that should hopefully work in
+ // all contexts like ESM, node, browsers, etc.
+ let this = Function::new_no_args("return this")
+ .call0(&JsValue::undefined())
+ .ok();
+
+ // Note that we avoid `unwrap()` on `call0` to avoid code size bloat, we
+ // just handle the `Err` case as returning a different object.
+ debug_assert!(this.is_some());
+ match this {
+ Some(this) => this.unchecked_into(),
+ None => JsValue::undefined().unchecked_into(),
+ }
+ }
+}
+
+macro_rules! arrays {
+ ($(#[doc = $ctor:literal] #[doc = $mdn:literal] $name:ident: $ty:ident,)*) => ($(
+ #[wasm_bindgen]
+ extern "C" {
+ #[wasm_bindgen(extends = Object, typescript_type = $name)]
+ #[derive(Clone, Debug)]
+ pub type $name;
+
+ /// The
+ #[doc = $ctor]
+ /// constructor creates a new array.
+ ///
+ /// [MDN documentation](
+ #[doc = $mdn]
+ /// )
+ #[wasm_bindgen(constructor)]
+ pub fn new(constructor_arg: &JsValue) -> $name;
+
+ /// An
+ #[doc = $ctor]
+ /// which creates an array with an internal buffer large
+ /// enough for `length` elements.
+ ///
+ /// [MDN documentation](
+ #[doc = $mdn]
+ /// )
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_length(length: u32) -> $name;
+
+ /// An
+ #[doc = $ctor]
+ /// which creates an array with the given buffer but is a
+ /// view starting at `byte_offset`.
+ ///
+ /// [MDN documentation](
+ #[doc = $mdn]
+ /// )
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_byte_offset(buffer: &JsValue, byte_offset: u32) -> $name;
+
+ /// An
+ #[doc = $ctor]
+ /// which creates an array with the given buffer but is a
+ /// view starting at `byte_offset` for `length` elements.
+ ///
+ /// [MDN documentation](
+ #[doc = $mdn]
+ /// )
+ #[wasm_bindgen(constructor)]
+ pub fn new_with_byte_offset_and_length(
+ buffer: &JsValue,
+ byte_offset: u32,
+ length: u32,
+ ) -> $name;
+
+ /// The `fill()` method fills all the elements of an array from a start index
+ /// to an end index with a static value. The end index is not included.
+ ///
+ /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/fill)
+ #[wasm_bindgen(method)]
+ pub fn fill(this: &$name, value: $ty, start: u32, end: u32) -> $name;
+
+ /// The buffer accessor property represents the `ArrayBuffer` referenced
+ /// by a `TypedArray` at construction time.
+ #[wasm_bindgen(getter, method)]
+ pub fn buffer(this: &$name) -> ArrayBuffer;
+
+ /// The `subarray()` method returns a new `TypedArray` on the same
+ /// `ArrayBuffer` store and with the same element types as for this
+ /// `TypedArray` object.
+ #[wasm_bindgen(method)]
+ pub fn subarray(this: &$name, begin: u32, end: u32) -> $name;
+
+ /// The `slice()` method returns a shallow copy of a portion of a typed
+ /// array into a new typed array object. This method has the same algorithm
+ /// as `Array.prototype.slice()`.
+ #[wasm_bindgen(method)]
+ pub fn slice(this: &$name, begin: u32, end: u32) -> $name;
+
+ /// The `forEach()` method executes a provided function once per array
+ /// element. This method has the same algorithm as
+ /// `Array.prototype.forEach()`. `TypedArray` is one of the typed array
+ /// types here.
+ #[wasm_bindgen(method, js_name = forEach)]
+ pub fn for_each(this: &$name, callback: &mut dyn FnMut($ty, u32, $name));
+
+ /// The length accessor property represents the length (in elements) of a
+ /// typed array.
+ #[wasm_bindgen(method, getter)]
+ pub fn length(this: &$name) -> u32;
+
+ /// The byteLength accessor property represents the length (in bytes) of a
+ /// typed array.
+ #[wasm_bindgen(method, getter, js_name = byteLength)]
+ pub fn byte_length(this: &$name) -> u32;
+
+ /// The byteOffset accessor property represents the offset (in bytes) of a
+ /// typed array from the start of its `ArrayBuffer`.
+ #[wasm_bindgen(method, getter, js_name = byteOffset)]
+ pub fn byte_offset(this: &$name) -> u32;
+
+ /// The `set()` method stores multiple values in the typed array, reading
+ /// input values from a specified array.
+ #[wasm_bindgen(method)]
+ pub fn set(this: &$name, src: &JsValue, offset: u32);
+
+ /// Gets the value at `idx`, counting from the end if negative.
+ #[wasm_bindgen(method)]
+ pub fn at(this: &$name, idx: i32) -> Option<$ty>;
+
+ /// Gets the value at `idx`, equivalent to the javascript `my_var = arr[idx]`.
+ #[wasm_bindgen(method, structural, indexing_getter)]
+ pub fn get_index(this: &$name, idx: u32) -> $ty;
+
+ /// Sets the value at `idx`, equivalent to the javascript `arr[idx] = value`.
+ #[wasm_bindgen(method, structural, indexing_setter)]
+ pub fn set_index(this: &$name, idx: u32, value: $ty);
+ }
+
+ impl $name {
+ /// Creates a JS typed array which is a view into wasm's linear
+ /// memory at the slice specified.
+ ///
+ /// This function returns a new typed array which is a view into
+ /// wasm's memory. This view does not copy the underlying data.
+ ///
+ /// # Unsafety
+ ///
+ /// Views into WebAssembly memory are only valid so long as the
+ /// backing buffer isn't resized in JS. Once this function is called
+ /// any future calls to `Box::new` (or malloc of any form) may cause
+ /// the returned value here to be invalidated. Use with caution!
+ ///
+ /// Additionally the returned object can be safely mutated but the
+ /// input slice isn't guaranteed to be mutable.
+ ///
+ /// Finally, the returned object is disconnected from the input
+ /// slice's lifetime, so there's no guarantee that the data is read
+ /// at the right time.
+ pub unsafe fn view(rust: &[$ty]) -> $name {
+ let buf = wasm_bindgen::memory();
+ let mem = buf.unchecked_ref::<WebAssembly::Memory>();
+ $name::new_with_byte_offset_and_length(
+ &mem.buffer(),
+ rust.as_ptr() as u32,
+ rust.len() as u32,
+ )
+ }
+
+ /// Creates a JS typed array which is a view into wasm's linear
+ /// memory at the specified pointer with specified length.
+ ///
+ /// This function returns a new typed array which is a view into
+ /// wasm's memory. This view does not copy the underlying data.
+ ///
+ /// # Unsafety
+ ///
+ /// Views into WebAssembly memory are only valid so long as the
+ /// backing buffer isn't resized in JS. Once this function is called
+ /// any future calls to `Box::new` (or malloc of any form) may cause
+ /// the returned value here to be invalidated. Use with caution!
+ ///
+ /// Additionally the returned object can be safely mutated,
+ /// the changes are guranteed to be reflected in the input array.
+ pub unsafe fn view_mut_raw(ptr: *mut $ty, length: usize) -> $name {
+ let buf = wasm_bindgen::memory();
+ let mem = buf.unchecked_ref::<WebAssembly::Memory>();
+ $name::new_with_byte_offset_and_length(
+ &mem.buffer(),
+ ptr as u32,
+ length as u32
+ )
+ }
+
+
+ /// Copy the contents of this JS typed array into the destination
+ /// Rust pointer.
+ ///
+ /// This function will efficiently copy the memory from a typed
+ /// array into this wasm module's own linear memory, initializing
+ /// the memory destination provided.
+ ///
+ /// # Unsafety
+ ///
+ /// This function requires `dst` to point to a buffer
+ /// large enough to fit this array's contents.
+ pub unsafe fn raw_copy_to_ptr(&self, dst: *mut $ty) {
+ let buf = wasm_bindgen::memory();
+ let mem = buf.unchecked_ref::<WebAssembly::Memory>();
+ let all_wasm_memory = $name::new(&mem.buffer());
+ let offset = dst as usize / mem::size_of::<$ty>();
+ all_wasm_memory.set(self, offset as u32);
+ }
+
+ /// Copy the contents of this JS typed array into the destination
+ /// Rust slice.
+ ///
+ /// This function will efficiently copy the memory from a typed
+ /// array into this wasm module's own linear memory, initializing
+ /// the memory destination provided.
+ ///
+ /// # Panics
+ ///
+ /// This function will panic if this typed array's length is
+ /// different than the length of the provided `dst` array.
+ pub fn copy_to(&self, dst: &mut [$ty]) {
+ assert_eq!(self.length() as usize, dst.len());
+ unsafe { self.raw_copy_to_ptr(dst.as_mut_ptr()); }
+ }
+
+ /// Copy the contents of the source Rust slice into this
+ /// JS typed array.
+ ///
+ /// This function will efficiently copy the memory from within
+ /// the wasm module's own linear memory to this typed array.
+ ///
+ /// # Panics
+ ///
+ /// This function will panic if this typed array's length is
+ /// different than the length of the provided `src` array.
+ pub fn copy_from(&self, src: &[$ty]) {
+ assert_eq!(self.length() as usize, src.len());
+ // This is safe because the `set` function copies from its TypedArray argument
+ unsafe { self.set(&$name::view(src), 0) }
+ }
+
+ /// Efficiently copies the contents of this JS typed array into a new Vec.
+ pub fn to_vec(&self) -> Vec<$ty> {
+ let mut output = Vec::with_capacity(self.length() as usize);
+ unsafe {
+ self.raw_copy_to_ptr(output.as_mut_ptr());
+ output.set_len(self.length() as usize);
+ }
+ output
+ }
+ }
+
+ impl<'a> From<&'a [$ty]> for $name {
+ #[inline]
+ fn from(slice: &'a [$ty]) -> $name {
+ // This is safe because the `new` function makes a copy if its argument is a TypedArray
+ unsafe { $name::new(&$name::view(slice)) }
+ }
+ }
+
+ impl Default for $name {
+ fn default() -> Self {
+ Self::new(&JsValue::UNDEFINED.unchecked_into())
+ }
+ }
+ )*);
+}
+
+arrays! {
+ /// `Int8Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array
+ Int8Array: i8,
+
+ /// `Int16Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array
+ Int16Array: i16,
+
+ /// `Int32Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int32Array
+ Int32Array: i32,
+
+ /// `Uint8Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array
+ Uint8Array: u8,
+
+ /// `Uint8ClampedArray()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8ClampedArray
+ Uint8ClampedArray: u8,
+
+ /// `Uint16Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array
+ Uint16Array: u16,
+
+ /// `Uint32Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array
+ Uint32Array: u32,
+
+ /// `Float32Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array
+ Float32Array: f32,
+
+ /// `Float64Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float64Array
+ Float64Array: f64,
+
+ /// `BigInt64Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt64Array
+ BigInt64Array: i64,
+
+ /// `BigUint64Array()`
+ /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigUint64Array
+ BigUint64Array: u64,
+}
diff --git a/vendor/js-sys/tests/headless.js b/vendor/js-sys/tests/headless.js
new file mode 100644
index 000000000..ba93a0917
--- /dev/null
+++ b/vendor/js-sys/tests/headless.js
@@ -0,0 +1,3 @@
+export function is_array_values_supported() {
+ return typeof Array.prototype.values === 'function';
+}
diff --git a/vendor/js-sys/tests/headless.rs b/vendor/js-sys/tests/headless.rs
new file mode 100644
index 000000000..aafa6b0ae
--- /dev/null
+++ b/vendor/js-sys/tests/headless.rs
@@ -0,0 +1,47 @@
+#![cfg(target_arch = "wasm32")]
+
+extern crate js_sys;
+extern crate wasm_bindgen;
+extern crate wasm_bindgen_test;
+
+use js_sys::Array;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::*;
+
+wasm_bindgen_test_configure!(run_in_browser);
+
+#[wasm_bindgen(module = "/tests/headless.js")]
+extern "C" {
+ fn is_array_values_supported() -> bool;
+}
+
+#[wasm_bindgen]
+extern "C" {
+ type ValuesIterator;
+ #[wasm_bindgen(method, structural)]
+ fn next(this: &ValuesIterator) -> IterNext;
+
+ type IterNext;
+
+ #[wasm_bindgen(method, getter, structural)]
+ fn value(this: &IterNext) -> JsValue;
+ #[wasm_bindgen(method, getter, structural)]
+ fn done(this: &IterNext) -> bool;
+}
+
+#[wasm_bindgen_test]
+fn array_iterator_values() {
+ if !is_array_values_supported() {
+ return;
+ }
+ let array = Array::new();
+ array.push(&8.into());
+ array.push(&3.into());
+ array.push(&2.into());
+ let iter = ValuesIterator::from(JsValue::from(array.values()));
+
+ assert_eq!(iter.next().value(), 8);
+ assert_eq!(iter.next().value(), 3);
+ assert_eq!(iter.next().value(), 2);
+ assert!(iter.next().done());
+}
diff --git a/vendor/js-sys/tests/wasm/Array.js b/vendor/js-sys/tests/wasm/Array.js
new file mode 100644
index 000000000..f4d6ab713
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Array.js
@@ -0,0 +1,7 @@
+// Used for `Array.rs` tests
+exports.populate_array = function(arr, start, len) {
+ var isBigInt = typeof(arr[0]) === "bigint";
+ for (i = 0; i < len; i++) {
+ arr[i] = isBigInt ? BigInt(start + i) : start + i;
+ }
+};
diff --git a/vendor/js-sys/tests/wasm/Array.rs b/vendor/js-sys/tests/wasm/Array.rs
new file mode 100644
index 000000000..e498c2cc0
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Array.rs
@@ -0,0 +1,647 @@
+use js_sys::*;
+use std::iter::FromIterator;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+macro_rules! js_array {
+ ($($e:expr),*) => ({
+ let __x = Array::new();
+ $(__x.push(&JsValue::from($e));)*
+ __x
+ })
+}
+
+macro_rules! array {
+ ($($e:expr),*) => ({
+ let mut __x = Vec::new();
+ $(__x.push(JsValue::from($e));)*
+ __x
+ })
+}
+
+fn to_rust(arr: &Array) -> Vec<JsValue> {
+ let mut result = Vec::with_capacity(arr.length() as usize);
+ arr.for_each(&mut |x, _, _| result.push(x));
+ result
+}
+
+#[wasm_bindgen_test]
+fn from_iter() {
+ assert_eq!(
+ to_rust(
+ &vec![JsValue::from("a"), JsValue::from("b"), JsValue::from("c"),]
+ .into_iter()
+ .collect()
+ ),
+ vec!["a", "b", "c"],
+ );
+
+ assert_eq!(
+ to_rust(
+ &vec![JsValue::from("a"), JsValue::from("b"), JsValue::from("c"),]
+ .iter()
+ .collect()
+ ),
+ vec!["a", "b", "c"],
+ );
+
+ let array = js_array![1u32, 2u32, 3u32];
+
+ assert_eq!(
+ to_rust(&vec![array.clone(),].into_iter().collect()),
+ vec![JsValue::from(array.clone())],
+ );
+
+ assert_eq!(
+ to_rust(&vec![array.clone(),].iter().collect()),
+ vec![JsValue::from(array)],
+ );
+
+ assert_eq!(
+ to_rust(&vec![5, 10, 20,].into_iter().map(JsValue::from).collect()),
+ vec![5, 10, 20],
+ );
+
+ assert_eq!(
+ to_rust(&Array::from_iter(&[
+ JsValue::from("a"),
+ JsValue::from("b"),
+ JsValue::from("c"),
+ ])),
+ vec!["a", "b", "c"],
+ );
+
+ let v = vec!["a", "b", "c"];
+
+ assert_eq!(
+ to_rust(&Array::from_iter(v.into_iter().map(|s| JsValue::from(s)))),
+ vec!["a", "b", "c"],
+ );
+}
+
+#[wasm_bindgen_test]
+fn extend() {
+ let mut array = array!["a", "b"];
+ array.extend(vec![JsValue::from("c"), JsValue::from("d")]);
+ assert_eq!(array, array!["a", "b", "c", "d"]);
+}
+
+#[wasm_bindgen_test]
+fn to_vec() {
+ let array = vec![JsValue::from("a"), JsValue::from("b"), JsValue::from("c")]
+ .into_iter()
+ .collect::<js_sys::Array>();
+
+ assert_eq!(
+ array.to_vec(),
+ vec![JsValue::from("a"), JsValue::from("b"), JsValue::from("c")]
+ );
+}
+
+#[wasm_bindgen_test]
+fn iter() {
+ let array = vec![JsValue::from("a"), JsValue::from("b"), JsValue::from("c")]
+ .into_iter()
+ .collect::<js_sys::Array>();
+
+ assert_eq!(
+ array.iter().collect::<Vec<JsValue>>(),
+ vec![JsValue::from("a"), JsValue::from("b"), JsValue::from("c")]
+ );
+
+ let mut iter = array.iter();
+
+ assert_eq!(iter.size_hint(), (3, Some(3)));
+ assert_eq!(iter.next(), Some(JsValue::from("a")));
+
+ assert_eq!(iter.size_hint(), (2, Some(2)));
+ assert_eq!(iter.next_back(), Some(JsValue::from("c")));
+
+ assert_eq!(iter.size_hint(), (1, Some(1)));
+ assert_eq!(iter.next_back(), Some(JsValue::from("b")));
+
+ assert_eq!(iter.size_hint(), (0, Some(0)));
+ assert_eq!(iter.next(), None);
+
+ assert_eq!(iter.size_hint(), (0, Some(0)));
+ assert_eq!(iter.next_back(), None);
+
+ let mut iter = array.iter();
+
+ assert_eq!(iter.size_hint(), (3, Some(3)));
+ assert_eq!(iter.next(), Some(JsValue::from("a")));
+
+ assert_eq!(iter.size_hint(), (2, Some(2)));
+ assert_eq!(iter.next(), Some(JsValue::from("b")));
+
+ assert_eq!(iter.size_hint(), (1, Some(1)));
+ assert_eq!(iter.next(), Some(JsValue::from("c")));
+
+ assert_eq!(iter.size_hint(), (0, Some(0)));
+ assert_eq!(iter.next(), None);
+
+ let mut iter = array.iter();
+
+ assert_eq!(iter.size_hint(), (3, Some(3)));
+ assert_eq!(iter.next_back(), Some(JsValue::from("c")));
+
+ assert_eq!(iter.size_hint(), (2, Some(2)));
+ assert_eq!(iter.next_back(), Some(JsValue::from("b")));
+
+ assert_eq!(iter.size_hint(), (1, Some(1)));
+ assert_eq!(iter.next_back(), Some(JsValue::from("a")));
+
+ assert_eq!(iter.size_hint(), (0, Some(0)));
+ assert_eq!(iter.next_back(), None);
+}
+
+#[wasm_bindgen_test]
+fn new_with_length() {
+ let array = Array::new_with_length(5);
+ assert_eq!(array.length(), 5);
+ assert_eq!(array.get(4), JsValue::undefined());
+ array.set(4, JsValue::from("a"));
+ assert_eq!(array.get(4), "a");
+ assert_eq!(array.length(), 5);
+}
+
+#[wasm_bindgen_test]
+fn get() {
+ let array = js_array!["a", "c", "x", "n"];
+ assert_eq!(array.length(), 4);
+ assert_eq!(array.get(0), "a");
+ assert_eq!(array.get(3), "n");
+ assert_eq!(array.get(4), JsValue::undefined());
+}
+
+#[wasm_bindgen_test]
+fn set() {
+ let array = js_array!["a", "c", "x", "n"];
+ assert_eq!(array.length(), 4);
+ assert_eq!(array.get(0), "a");
+ array.set(0, JsValue::from("b"));
+ assert_eq!(array.get(0), "b");
+
+ assert_eq!(array.get(4), JsValue::undefined());
+ assert_eq!(array.length(), 4);
+ array.set(4, JsValue::from("d"));
+ assert_eq!(array.length(), 5);
+ assert_eq!(array.get(4), "d");
+
+ assert_eq!(array.get(10), JsValue::undefined());
+ assert_eq!(array.length(), 5);
+ array.set(10, JsValue::from("z"));
+ assert_eq!(array.length(), 11);
+ assert_eq!(array.get(10), "z");
+ assert_eq!(array.get(9), JsValue::undefined());
+}
+
+#[wasm_bindgen_test]
+fn delete() {
+ let array = js_array!["a", "c", "x", "n"];
+ assert_eq!(array.length(), 4);
+ assert_eq!(array.get(0), "a");
+ array.delete(0);
+ assert_eq!(array.get(0), JsValue::undefined());
+}
+
+#[wasm_bindgen_test]
+fn filter() {
+ let array = js_array!["a", "c", "x", "n"];
+ assert!(array.filter(&mut |x, _, _| x.as_f64().is_some()).length() == 0);
+
+ let array = js_array![1, 2, 3, 4];
+ assert_eq!(
+ array.filter(&mut |x, _, _| x.as_f64().is_some()).length(),
+ 4
+ );
+
+ let array = js_array!["a", 1, "b", 2];
+ assert_eq!(
+ array.filter(&mut |x, _, _| x.as_f64().is_some()).length(),
+ 2
+ );
+}
+
+#[wasm_bindgen_test]
+fn flat() {
+ let array = js_array![
+ js_array!["a", "b", "c"],
+ "d",
+ js_array!["e", js_array!["f", "g"]]
+ ];
+
+ assert_eq!(
+ to_rust(&array.flat(1).slice(0, 5)),
+ vec!["a", "b", "c", "d", "e"]
+ );
+
+ assert_eq!(array.flat(1).length(), 6);
+
+ assert_eq!(
+ to_rust(&array.flat(2)),
+ vec!["a", "b", "c", "d", "e", "f", "g"]
+ );
+}
+
+#[wasm_bindgen_test]
+fn flat_map() {
+ let array = js_array![1, 2, 3, 1];
+
+ assert_eq!(
+ to_rust(
+ &array.flat_map(&mut |val, _, _| match val.as_f64().map(|v| v as i32) {
+ Some(1) => vec![JsString::from("x").into(), JsString::from("x").into()],
+ Some(2) => vec![],
+ Some(3) => vec![JsString::from("z").into()],
+ _ => panic!("Unexpected conversion"),
+ })
+ ),
+ vec!["x", "x", "z", "x", "x"]
+ );
+}
+
+#[wasm_bindgen_test]
+fn index_of() {
+ let chars = js_array!["a", "c", "x", "n"];
+ assert_eq!(chars.index_of(&"x".into(), 0), 2);
+ assert_eq!(chars.index_of(&"z".into(), 0), -1);
+ assert_eq!(chars.index_of(&"x".into(), -3), 2);
+ assert_eq!(chars.index_of(&"z".into(), -2), -1);
+}
+
+#[wasm_bindgen_test]
+fn is_array() {
+ assert!(Array::is_array(&Array::new().into()));
+ assert!(Array::is_array(&js_array![1].into()));
+ assert!(!Array::is_array(&JsValue::null()));
+ assert!(!Array::is_array(&JsValue::undefined()));
+ assert!(!Array::is_array(&10.into()));
+ assert!(!Array::is_array(&"x".into()));
+ assert!(!Array::is_array(&true.into()));
+ assert!(!Array::is_array(&false.into()));
+}
+
+#[wasm_bindgen_test]
+fn sort() {
+ let array = js_array![3, 1, 6, 2];
+ let sorted = array.sort();
+ assert_eq!(to_rust(&sorted), array![1, 2, 3, 6]);
+}
+
+#[wasm_bindgen_test]
+fn some() {
+ let array = js_array!["z", 1, "y", 2];
+ assert!(array.some(&mut |e| e == JsValue::from(2)));
+ assert!(array.some(&mut |e| e == JsValue::from("y")));
+ assert!(!array.some(&mut |e| e == JsValue::from("nope")));
+}
+
+#[wasm_bindgen_test]
+fn last_index_of() {
+ let characters = js_array!["a", "x", "c", "x", "n"];
+ assert_eq!(characters.last_index_of(&"x".into(), 5), 3);
+ assert_eq!(characters.last_index_of(&"z".into(), 5), -1);
+ assert_eq!(characters.last_index_of(&"x".into(), 2), 1);
+ assert_eq!(characters.last_index_of(&"x".into(), 0), -1);
+}
+
+#[wasm_bindgen_test]
+fn join() {
+ let characters = js_array!["a", "c", "x", "n"];
+ assert_eq!(String::from(characters.join(", ")), "a, c, x, n");
+ assert_eq!(String::from(characters.join("/")), "a/c/x/n");
+}
+
+#[wasm_bindgen_test]
+fn slice() {
+ let characters = js_array!["a", "c", "x", "n", 1, "8"];
+ let subset = characters.slice(1, 3);
+
+ assert_eq!(to_rust(&subset), array!["c", "x"]);
+}
+
+#[wasm_bindgen_test]
+fn splice() {
+ let characters = js_array!["a", "c", "x", "n", 1, "8"];
+ let removed = characters.splice(1, 3, &"b".into());
+
+ assert_eq!(to_rust(&removed), array!["c", "x", "n"]);
+ assert_eq!(to_rust(&characters), array!["a", "b", 1, "8"]);
+}
+
+#[wasm_bindgen_test]
+fn fill() {
+ let characters = js_array!["a", "c", "x", "n", 1, "8"];
+ let subset = characters.fill(&0.into(), 0, 3);
+
+ assert_eq!(to_rust(&subset), array![0, 0, 0, "n", 1, "8"]);
+}
+
+#[wasm_bindgen_test]
+fn copy_within() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ characters.copy_within(1, 4, 5);
+
+ assert_eq!(to_rust(&characters)[1], JsValue::from(1));
+
+ // if negatives were used
+ characters.copy_within(-1, -3, -2);
+ assert_eq!(to_rust(&characters)[5], JsValue::from(3));
+}
+
+#[wasm_bindgen_test]
+fn of() {
+ let a = JsValue::from("a");
+ let b = JsValue::from("b");
+ let c = JsValue::from("c");
+ let arr = Array::of3(&a, &b, &c);
+ let vec = to_rust(&arr);
+ assert_eq!(vec.len(), 3);
+ assert_eq!(vec[0], a);
+ assert_eq!(vec[1], b);
+ assert_eq!(vec[2], c);
+}
+
+#[wasm_bindgen_test]
+fn pop() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ let item = characters.pop();
+ assert_eq!(item, JsValue::from(2));
+ assert_eq!(characters.length(), 5);
+}
+
+#[wasm_bindgen_test]
+fn push() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ let length = characters.push(&"a".into());
+ assert_eq!(length, 7);
+ assert_eq!(to_rust(&characters)[6], "a");
+}
+
+#[wasm_bindgen_test]
+fn reverse() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ let reversed = characters.reverse();
+ assert_eq!(to_rust(&reversed), array![2, 1, 3, 4, 5, 8]);
+}
+
+#[wasm_bindgen_test]
+fn shift() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ let shiftedItem = characters.shift();
+
+ assert_eq!(shiftedItem, 8);
+ assert_eq!(characters.length(), 5);
+}
+
+#[wasm_bindgen_test]
+fn unshift() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ let length = characters.unshift(&"abba".into());
+
+ assert_eq!(length, 7);
+ assert_eq!(to_rust(&characters)[0], "abba");
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ assert_eq!(String::from(characters.to_string()), "8,5,4,3,1,2");
+}
+
+#[wasm_bindgen_test]
+fn includes() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ assert!(characters.includes(&2.into(), 0));
+ assert!(!characters.includes(&9.into(), 0));
+ assert!(!characters.includes(&3.into(), 4));
+}
+
+#[wasm_bindgen_test]
+fn concat() {
+ let arr1 = js_array![1, 2, 3];
+ let arr2 = js_array![4, 5, 6];
+
+ let new_array = arr1.concat(&arr2);
+ assert_eq!(to_rust(&new_array), array![1, 2, 3, 4, 5, 6]);
+}
+
+#[wasm_bindgen_test]
+fn length() {
+ let characters = js_array![8, 5, 4, 3, 1, 2];
+ assert_eq!(characters.length(), 6);
+ assert_eq!(Array::new().length(), 0);
+}
+
+#[wasm_bindgen_test]
+fn every() {
+ let even = js_array![2, 4, 6, 8];
+ assert!(even.every(&mut |x, _, _| x.as_f64().unwrap() % 2.0 == 0.0));
+ let odd = js_array![1, 3, 5, 7];
+ assert!(!odd.every(&mut |x, _, _| x.as_f64().unwrap() % 2.0 == 0.0));
+ let mixed = js_array![2, 3, 4, 5];
+ assert!(!mixed.every(&mut |x, _, _| x.as_f64().unwrap() % 2.0 == 0.0));
+}
+
+#[wasm_bindgen_test]
+fn find() {
+ let even = js_array![2, 4, 6, 8];
+ assert_eq!(
+ even.find(&mut |x, _, _| x.as_f64().unwrap() % 2.0 == 0.0),
+ 2
+ );
+ let odd = js_array![1, 3, 5, 7];
+ assert_eq!(
+ odd.find(&mut |x, _, _| x.as_f64().unwrap() % 2.0 == 0.0),
+ JsValue::undefined(),
+ );
+ let mixed = js_array![3, 5, 7, 10];
+ assert_eq!(
+ mixed.find(&mut |x, _, _| x.as_f64().unwrap() % 2.0 == 0.0),
+ 10
+ );
+}
+
+#[wasm_bindgen_test]
+fn map() {
+ let numbers = js_array![1, 4, 9];
+ let sqrt = numbers.map(&mut |x, _, _| x.as_f64().unwrap().sqrt().into());
+ assert_eq!(to_rust(&sqrt), array![1, 2, 3]);
+}
+
+#[wasm_bindgen_test]
+fn reduce() {
+ let arr = js_array!["0", "1", "2", "3", "4"].reduce(
+ &mut |ac, cr, _, _| {
+ format!("{}{}", &ac.as_string().unwrap(), &cr.as_string().unwrap()).into()
+ },
+ &"".into(),
+ );
+ assert_eq!(arr, "01234");
+}
+
+#[wasm_bindgen_test]
+fn reduce_right() {
+ let arr = js_array!["0", "1", "2", "3", "4"].reduce_right(
+ &mut |ac, cr, _, _| {
+ format!("{}{}", &ac.as_string().unwrap(), &cr.as_string().unwrap()).into()
+ },
+ &"".into(),
+ );
+ assert_eq!(arr, "43210");
+}
+
+#[wasm_bindgen_test]
+fn find_index() {
+ let even = js_array![2, 4, 6, 8];
+ assert_eq!(
+ even.find_index(&mut |e, _, _| e.as_f64().unwrap() % 2. == 0.),
+ 0
+ );
+ let odd = js_array![1, 3, 5, 7];
+ assert_eq!(
+ odd.find_index(&mut |e, _, _| e.as_f64().unwrap() % 2. == 0.),
+ -1
+ );
+ let mixed = js_array![3, 5, 7, 10];
+ assert_eq!(
+ mixed.find_index(&mut |e, _, _| e.as_f64().unwrap() % 2. == 0.),
+ 3
+ );
+}
+
+#[wasm_bindgen_test]
+fn to_locale_string() {
+ let output = js_array![1, "a", Date::new(&"21 Dec 1997 14:12:00 UTC".into())]
+ .to_locale_string(&"en".into(), &JsValue::undefined());
+ assert!(String::from(output).len() > 0);
+}
+
+#[wasm_bindgen_test]
+fn for_each() {
+ fn sum_indices_of_evens(array: &Array) -> u32 {
+ let mut res = 0;
+ array.for_each(&mut |elem: JsValue, i, _| match elem.as_f64() {
+ Some(val) if val % 2. == 0. => res += i,
+ _ => {}
+ });
+ res
+ }
+
+ assert_eq!(sum_indices_of_evens(&js_array![2, 4, 6, 8]), 0 + 1 + 2 + 3);
+ assert_eq!(sum_indices_of_evens(&js_array![1, 3, 5, 7]), 0);
+ assert_eq!(sum_indices_of_evens(&js_array![3, 5, 7, 10]), 3);
+}
+
+#[wasm_bindgen_test]
+fn array_inheritance() {
+ let array = Array::new();
+ assert!(array.is_instance_of::<Array>());
+ assert!(array.is_instance_of::<Object>());
+ let _: &Object = array.as_ref();
+}
+
+#[wasm_bindgen(module = "tests/wasm/Array.js")]
+extern "C" {
+ fn populate_array(arr: JsValue, start: JsValue, len: JsValue) -> JsValue;
+}
+
+fn test_array_view_mut_raw<ElemT: std::cmp::PartialEq + std::fmt::Debug, ArrT>(
+ sut: unsafe fn(*mut ElemT, usize) -> ArrT,
+ u8ToElem: fn(u8) -> ElemT,
+ arrToJsValue: fn(ArrT) -> JsValue,
+) {
+ let start: u8 = 10;
+ let len: usize = 32;
+ let end: u8 = start + len as u8;
+ let mut buffer: Vec<ElemT> = Vec::new();
+ buffer.reserve(len);
+ unsafe {
+ let array: ArrT = sut(buffer.as_mut_ptr(), len);
+ populate_array(
+ arrToJsValue(array),
+ JsValue::from(start),
+ JsValue::from(len as u32),
+ );
+ buffer.set_len(len);
+ }
+ let expected: Vec<ElemT> = (start..end).map(u8ToElem).collect();
+ assert_eq!(buffer, expected)
+}
+
+#[wasm_bindgen_test]
+fn Int8Array_view_mut_raw() {
+ fn u8Toi8_unsafe(x: u8) -> i8 {
+ x as i8
+ }
+ test_array_view_mut_raw(
+ js_sys::Int8Array::view_mut_raw,
+ u8Toi8_unsafe,
+ JsValue::from,
+ );
+}
+
+#[wasm_bindgen_test]
+fn Int16Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Int16Array::view_mut_raw, i16::from, JsValue::from);
+}
+
+#[wasm_bindgen_test]
+fn Int32Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Int32Array::view_mut_raw, i32::from, JsValue::from);
+}
+
+#[wasm_bindgen_test]
+fn BigInt64Array_view_mut_raw() {
+ test_array_view_mut_raw(
+ js_sys::BigInt64Array::view_mut_raw,
+ i64::from,
+ JsValue::from,
+ );
+}
+
+#[wasm_bindgen_test]
+fn Uint8Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Uint8Array::view_mut_raw, u8::from, JsValue::from);
+}
+
+#[wasm_bindgen_test]
+fn Uint8ClampedArray_view_mut_raw() {
+ test_array_view_mut_raw(
+ js_sys::Uint8ClampedArray::view_mut_raw,
+ u8::from,
+ JsValue::from,
+ );
+}
+
+#[wasm_bindgen_test]
+fn Uint16Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Uint16Array::view_mut_raw, u16::from, JsValue::from);
+}
+
+#[wasm_bindgen_test]
+fn Uint32Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Uint32Array::view_mut_raw, u32::from, JsValue::from);
+}
+
+#[wasm_bindgen_test]
+fn BigUint64Array_view_mut_raw() {
+ test_array_view_mut_raw(
+ js_sys::BigUint64Array::view_mut_raw,
+ u64::from,
+ JsValue::from,
+ );
+}
+
+#[wasm_bindgen_test]
+fn Float32Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Float32Array::view_mut_raw, f32::from, JsValue::from);
+}
+
+#[wasm_bindgen_test]
+fn Float64Array_view_mut_raw() {
+ test_array_view_mut_raw(js_sys::Float64Array::view_mut_raw, f64::from, JsValue::from);
+}
diff --git a/vendor/js-sys/tests/wasm/ArrayBuffer.rs b/vendor/js-sys/tests/wasm/ArrayBuffer.rs
new file mode 100644
index 000000000..1bf099aef
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/ArrayBuffer.rs
@@ -0,0 +1,45 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn new() {
+ let x = ArrayBuffer::new(42);
+ let y: JsValue = x.into();
+ assert!(y.is_object());
+}
+
+#[wasm_bindgen_test]
+fn byte_length() {
+ let buf = ArrayBuffer::new(42);
+ assert_eq!(buf.byte_length(), 42);
+}
+
+#[wasm_bindgen_test]
+fn is_view() {
+ let x = Uint8Array::new(&JsValue::from(42));
+ assert!(ArrayBuffer::is_view(&JsValue::from(x)));
+}
+
+#[wasm_bindgen_test]
+fn slice() {
+ let buf = ArrayBuffer::new(4);
+ let slice = buf.slice(2);
+ assert!(JsValue::from(slice).is_object());
+}
+
+#[wasm_bindgen_test]
+fn slice_with_end() {
+ let buf = ArrayBuffer::new(4);
+ let slice = buf.slice_with_end(1, 2);
+ assert!(JsValue::from(slice).is_object());
+}
+
+#[wasm_bindgen_test]
+fn arraybuffer_inheritance() {
+ let buf = ArrayBuffer::new(4);
+ assert!(buf.is_instance_of::<ArrayBuffer>());
+ assert!(buf.is_instance_of::<Object>());
+ let _: &Object = buf.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/ArrayIterator.rs b/vendor/js-sys/tests/wasm/ArrayIterator.rs
new file mode 100644
index 000000000..87e67fd2c
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/ArrayIterator.rs
@@ -0,0 +1,39 @@
+use js_sys::*;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn keys() {
+ let array = Array::new();
+ array.push(&JsValue::from(1));
+ array.push(&JsValue::from(2));
+ array.push(&JsValue::from(3));
+ array.push(&JsValue::from(4));
+ array.push(&JsValue::from(5));
+
+ let new_array = Array::from(&array.keys().into());
+
+ let mut result = Vec::new();
+ new_array.for_each(&mut |i, _, _| result.push(i.as_f64().unwrap()));
+ assert_eq!(result, [0.0, 1.0, 2.0, 3.0, 4.0]);
+}
+
+#[wasm_bindgen_test]
+fn entries() {
+ let array = Array::new();
+ array.push(&JsValue::from(1));
+ array.push(&JsValue::from(2));
+ array.push(&JsValue::from(3));
+ array.push(&JsValue::from(4));
+ array.push(&JsValue::from(5));
+
+ let new_array = Array::from(&array.entries().into());
+
+ new_array.for_each(&mut |a, i, _| {
+ assert!(a.is_object());
+ let array: Array = a.into();
+ assert_eq!(array.shift().as_f64().unwrap(), i as f64);
+ assert_eq!(array.shift().as_f64().unwrap(), (i + 1) as f64);
+ assert_eq!(array.length(), 0);
+ });
+}
diff --git a/vendor/js-sys/tests/wasm/BigInt.rs b/vendor/js-sys/tests/wasm/BigInt.rs
new file mode 100644
index 000000000..a9cd30dfb
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/BigInt.rs
@@ -0,0 +1,43 @@
+use js_sys::BigInt;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::wasm_bindgen_test;
+
+/// `assert_eq!`, but the arguments are converted to `JsValue`s.
+#[track_caller]
+fn assert_jsvalue_eq(a: impl Into<JsValue>, b: impl Into<JsValue>) {
+ assert_eq!(a.into(), b.into());
+}
+
+#[wasm_bindgen_test]
+fn from() {
+ // Test that all the `From` impls work properly.
+ assert_jsvalue_eq(BigInt::from(1u8), 1u64);
+ assert_jsvalue_eq(BigInt::from(1u16), 1u64);
+ assert_jsvalue_eq(BigInt::from(1u32), 1u64);
+ assert_jsvalue_eq(BigInt::from(1u64), 1u64);
+ assert_jsvalue_eq(BigInt::from(1u128), 1u64);
+ assert_jsvalue_eq(BigInt::from(1usize), 1u64);
+ assert_jsvalue_eq(BigInt::from(-3i8), -3i64);
+ assert_jsvalue_eq(BigInt::from(-3i16), -3i64);
+ assert_jsvalue_eq(BigInt::from(-3i32), -3i64);
+ assert_jsvalue_eq(BigInt::from(-3i64), -3i64);
+ assert_jsvalue_eq(BigInt::from(-3i128), -3i64);
+ assert_jsvalue_eq(BigInt::from(-3isize), -3i64);
+}
+
+#[wasm_bindgen_test]
+fn eq() {
+ // Test that all the `Eq` impls work properly.
+ assert_eq!(BigInt::from(1u64), 1u8);
+ assert_eq!(BigInt::from(1u64), 1u16);
+ assert_eq!(BigInt::from(1u64), 1u32);
+ assert_eq!(BigInt::from(1u64), 1u64);
+ assert_eq!(BigInt::from(1u64), 1u128);
+ assert_eq!(BigInt::from(1u64), 1usize);
+ assert_eq!(BigInt::from(-3i64), -3i8);
+ assert_eq!(BigInt::from(-3i64), -3i16);
+ assert_eq!(BigInt::from(-3i64), -3i32);
+ assert_eq!(BigInt::from(-3i64), -3i64);
+ assert_eq!(BigInt::from(-3i64), -3i128);
+ assert_eq!(BigInt::from(-3i64), -3isize);
+}
diff --git a/vendor/js-sys/tests/wasm/Boolean.rs b/vendor/js-sys/tests/wasm/Boolean.rs
new file mode 100644
index 000000000..5e4b3faa4
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Boolean.rs
@@ -0,0 +1,25 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[allow(deprecated)]
+#[wasm_bindgen_test]
+fn new_undefined() {
+ assert_eq!(Boolean::new(&JsValue::undefined()).value_of(), false);
+}
+
+#[allow(deprecated)]
+#[wasm_bindgen_test]
+fn new_truely() {
+ assert_eq!(Boolean::new(&JsValue::from("foo")).value_of(), true);
+}
+
+#[allow(deprecated)]
+#[wasm_bindgen_test]
+fn boolean_inheritance() {
+ let b = Boolean::new(&JsValue::from(true));
+ assert!(b.is_instance_of::<Boolean>());
+ assert!(b.is_instance_of::<Object>());
+ let _: &Object = b.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/DataView.rs b/vendor/js-sys/tests/wasm/DataView.rs
new file mode 100644
index 000000000..7747019a5
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/DataView.rs
@@ -0,0 +1,84 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn test() {
+ let bytes = Int8Array::new(&JsValue::from(10));
+
+ // TODO: figure out how to do `bytes[2] = 2`
+ bytes.subarray(2, 3).fill(2, 0, 1);
+
+ let v = DataView::new(&bytes.buffer(), 2, 8);
+ assert_eq!(v.byte_offset(), 2);
+ assert_eq!(v.byte_length(), 8);
+ assert_eq!(v.get_int8(0), 2);
+ assert_eq!(v.get_uint8(0), 2);
+
+ v.set_int8(0, 42);
+ assert_eq!(v.get_int8(0), 42);
+ v.set_uint8(0, 255);
+ assert_eq!(v.get_uint8(0), 255);
+
+ v.set_int16(0, 32767);
+ assert_eq!(v.get_int16(0), 32767);
+ v.set_int16_endian(0, 0x1122, true);
+ assert_eq!(v.get_int16_endian(0, true), 0x1122);
+ assert_eq!(v.get_int16_endian(0, false), 0x2211);
+ v.set_uint16(0, 65535);
+ assert_eq!(v.get_uint16(0), 65535);
+ v.set_uint16_endian(0, 0x1122, true);
+ assert_eq!(v.get_uint16_endian(0, true), 0x1122);
+ assert_eq!(v.get_uint16_endian(0, false), 0x2211);
+
+ v.set_int32(0, 123456789);
+ assert_eq!(v.get_int32(0), 123456789);
+ v.set_int32_endian(0, 0x11223344, true);
+ assert_eq!(v.get_int32_endian(0, true), 0x11223344);
+ assert_eq!(v.get_int32_endian(0, false), 0x44332211);
+ v.set_uint32(0, 3_123_456_789);
+ assert_eq!(v.get_uint32(0), 3_123_456_789);
+ v.set_uint32_endian(0, 0x11223344, true);
+ assert_eq!(v.get_uint32_endian(0, true), 0x11223344);
+ assert_eq!(v.get_uint32_endian(0, false), 0x44332211);
+
+ v.set_float32(0, 100.123);
+ assert_eq!(v.get_float32(0), 100.123);
+ v.set_float32_endian(0, f32::from_bits(0x11223344), true);
+ assert_eq!(v.get_float32_endian(0, true), f32::from_bits(0x11223344));
+ assert_eq!(v.get_float32_endian(0, false), f32::from_bits(0x44332211));
+
+ v.set_float64(0, 123456789.123456);
+ assert_eq!(v.get_float64(0), 123456789.123456);
+ v.set_float64_endian(0, f64::from_bits(0x1122334411223344), true);
+ assert_eq!(
+ v.get_float64_endian(0, true),
+ f64::from_bits(0x1122334411223344)
+ );
+ assert_eq!(
+ v.get_float64_endian(0, false),
+ f64::from_bits(0x4433221144332211)
+ );
+
+ v.set_int8(0, 42);
+
+ // TODO: figure out how to do `bytes[2]`
+ bytes
+ .subarray(2, 3)
+ .for_each(&mut |x, _, _| assert_eq!(x, 42));
+}
+
+#[wasm_bindgen_test]
+fn dataview_inheritance() {
+ let bytes = Int8Array::new(&JsValue::from(10));
+
+ // TODO: figure out how to do `bytes[2] = 2`
+ bytes.subarray(2, 3).fill(2, 0, 1);
+
+ let v = DataView::new(&bytes.buffer(), 2, 8);
+
+ assert!(v.is_instance_of::<DataView>());
+ assert!(v.is_instance_of::<Object>());
+ let _: &Object = v.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Date.rs b/vendor/js-sys/tests/wasm/Date.rs
new file mode 100644
index 000000000..484498d47
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Date.rs
@@ -0,0 +1,530 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn get_date() {
+ let date = Date::new(&"August 19, 1975 23:15:30".into());
+ assert_eq!(date.get_date(), 19);
+}
+
+#[wasm_bindgen_test]
+fn get_day() {
+ let date = Date::new(&"August 19, 1975 23:15:30".into());
+ assert_eq!(date.get_day(), 2);
+}
+
+#[wasm_bindgen_test]
+fn get_full_year() {
+ let date = Date::new(&"July 20, 1969 00:20:18".into());
+ let abbr = Date::new(&"Thu, 06 Sep 12 00:00:00".into());
+
+ assert_eq!(date.get_full_year(), 1969);
+ assert_eq!(abbr.get_full_year(), 2012);
+}
+
+#[wasm_bindgen_test]
+fn get_hours() {
+ let date = Date::new(&"March 13, 08 04:20".into());
+ assert_eq!(date.get_hours(), 4);
+}
+
+#[wasm_bindgen_test]
+fn get_milliseconds() {
+ let date = Date::new(&"1995-12-17T09:24:00Z".into());
+ let ms = Date::new(&"1995-12-17T09:24:00.123Z".into());
+
+ assert_eq!(date.get_milliseconds(), 0);
+ assert_eq!(ms.get_milliseconds(), 123);
+}
+
+#[wasm_bindgen_test]
+fn get_minutes() {
+ let date = Date::new(&"March 13, 08 04:20".into());
+
+ assert_eq!(date.get_minutes(), 20);
+}
+
+#[wasm_bindgen_test]
+fn get_month() {
+ let date = Date::new(&"July 20, 69 00:20:18".into());
+
+ assert_eq!(date.get_month(), 6);
+}
+
+#[wasm_bindgen_test]
+fn get_seconds() {
+ let date = Date::new(&"July 20, 69 00:20:18".into());
+
+ assert_eq!(date.get_seconds(), 18);
+}
+
+#[wasm_bindgen_test]
+fn get_time() {
+ let date = Date::new(&"July 20, 69 00:20:18 GMT+00:00".into());
+
+ assert_eq!(date.get_time(), -14254782000.0);
+}
+
+#[wasm_bindgen_test]
+fn get_timezone_offset() {
+ let date1 = Date::new(&"August 19, 1975 23:15:30 GMT+07:00".into());
+ let date2 = Date::new(&"August 19, 1975 23:15:30 GMT-02:00".into());
+ assert_eq!(date1.get_timezone_offset(), date2.get_timezone_offset());
+}
+
+#[wasm_bindgen_test]
+fn get_utc_date() {
+ let date1 = Date::new(&"August 19, 1975 23:15:30 GMT+11:00".into());
+ let date2 = Date::new(&"August 19, 1975 23:15:30 GMT-11:00".into());
+ assert_eq!(date1.get_utc_date(), 19);
+ assert_eq!(date2.get_utc_date(), 20);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_day() {
+ let date1 = Date::new(&"August 19, 1975 23:15:30 GMT+11:00".into());
+ let date2 = Date::new(&"August 19, 1975 23:15:30 GMT-11:00".into());
+
+ assert_eq!(date1.get_utc_day(), 2);
+ assert_eq!(date2.get_utc_day(), 3);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_full_year() {
+ let date1 = Date::new(&"December 31, 1975, 23:15:30 GMT+11:00".into());
+ let date2 = Date::new(&"December 31, 1975, 23:15:30 GMT-11:00".into());
+ assert_eq!(date1.get_utc_full_year(), 1975);
+ assert_eq!(date2.get_utc_full_year(), 1976);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_hours() {
+ let date1 = Date::new(&"December 31, 1975, 23:15:30 GMT+11:00".into());
+ let date2 = Date::new(&"December 31, 1975, 23:15:30 GMT-11:00".into());
+
+ assert_eq!(date1.get_utc_hours(), 12);
+ assert_eq!(date2.get_utc_hours(), 10);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_milliseconds() {
+ let date = Date::new(&"2018-01-02T03:04:05.678Z".into());
+ assert_eq!(date.get_utc_milliseconds(), 678);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_minutes() {
+ let date1 = Date::new(&"1 January 2000 03:15:30 GMT+07:00".into());
+ let date2 = Date::new(&"1 January 2000 03:15:30 GMT+03:30".into());
+ assert_eq!(date1.get_utc_minutes(), 15);
+ assert_eq!(date2.get_utc_minutes(), 45);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_month() {
+ let date1 = Date::new(&"December 31, 1975, 23:15:30 GMT+11:00".into());
+ let date2 = Date::new(&"December 31, 1975, 23:15:30 GMT-11:00".into());
+
+ assert_eq!(date1.get_utc_month(), 11);
+ assert_eq!(date2.get_utc_month(), 0);
+}
+
+#[wasm_bindgen_test]
+fn get_utc_seconds() {
+ let date = Date::new(&"July 20, 1969, 20:18:04 UTC".into());
+
+ assert_eq!(date.get_utc_seconds(), 4);
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ assert!(JsValue::from(Date::new(&JsValue::undefined())).is_object());
+}
+
+#[wasm_bindgen_test]
+fn new_with_year_month() {
+ let date1 = Date::new_with_year_month(1975, 7);
+
+ assert_eq!(date1.get_full_year(), 1975);
+ assert_eq!(date1.get_month(), 7);
+}
+
+#[wasm_bindgen_test]
+fn new_with_year_month_day() {
+ let date1 = Date::new_with_year_month_day(1975, 7, 8);
+
+ assert_eq!(date1.get_full_year(), 1975);
+ assert_eq!(date1.get_month(), 7);
+ assert_eq!(date1.get_date(), 8);
+}
+
+#[wasm_bindgen_test]
+fn new_with_year_month_day_hr() {
+ let date1 = Date::new_with_year_month_day_hr(1975, 7, 8, 4);
+
+ assert_eq!(date1.get_full_year(), 1975);
+ assert_eq!(date1.get_month(), 7);
+ assert_eq!(date1.get_date(), 8);
+ assert_eq!(date1.get_hours(), 4);
+}
+
+#[wasm_bindgen_test]
+fn new_with_year_month_day_hr_min() {
+ let date1 = Date::new_with_year_month_day_hr_min(1975, 7, 8, 4, 35);
+
+ assert_eq!(date1.get_full_year(), 1975);
+ assert_eq!(date1.get_month(), 7);
+ assert_eq!(date1.get_date(), 8);
+ assert_eq!(date1.get_hours(), 4);
+ assert_eq!(date1.get_minutes(), 35);
+}
+
+#[wasm_bindgen_test]
+fn new_with_year_month_day_hr_min_sec() {
+ let date1 = Date::new_with_year_month_day_hr_min_sec(1975, 7, 8, 4, 35, 25);
+
+ assert_eq!(date1.get_full_year(), 1975);
+ assert_eq!(date1.get_month(), 7);
+ assert_eq!(date1.get_date(), 8);
+ assert_eq!(date1.get_hours(), 4);
+ assert_eq!(date1.get_minutes(), 35);
+ assert_eq!(date1.get_seconds(), 25);
+}
+
+#[wasm_bindgen_test]
+fn new_with_year_month_day_hr_min_sec_milli() {
+ let date1 = Date::new_with_year_month_day_hr_min_sec_milli(1975, 7, 8, 4, 35, 25, 300);
+
+ assert_eq!(date1.get_full_year(), 1975);
+ assert_eq!(date1.get_month(), 7);
+ assert_eq!(date1.get_date(), 8);
+ assert_eq!(date1.get_hours(), 4);
+ assert_eq!(date1.get_minutes(), 35);
+ assert_eq!(date1.get_seconds(), 25);
+ assert_eq!(date1.get_milliseconds(), 300);
+}
+
+#[wasm_bindgen_test]
+fn now() {
+ assert!(Date::now() > 0.);
+}
+
+#[wasm_bindgen_test]
+fn parse() {
+ let date = Date::parse("04 Dec 1995 00:12:00 GMT");
+ let zero = Date::parse("01 Jan 1970 00:00:00 GMT");
+
+ assert_eq!(date, 818035920000.0);
+ assert_eq!(zero, 0.0);
+}
+
+#[wasm_bindgen_test]
+fn set_date() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30".into());
+ let event2 = Date::new(&"August 24, 1975 23:15:30".into());
+
+ let ms = event1.set_date(24);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_date(), 24);
+}
+
+#[wasm_bindgen_test]
+fn set_full_year() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30".into());
+ let event2 = Date::new(&"August 19, 1976 23:15:30".into());
+
+ let ms = event1.set_full_year(1976);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_full_year(), 1976);
+}
+
+#[wasm_bindgen_test]
+fn set_full_year_with_month() {
+ let event1 = Date::new(&"August 19, 1976 23:15:30".into());
+
+ event1.set_full_year_with_month(1979, 4);
+
+ assert_eq!(event1.get_full_year(), 1979);
+ assert_eq!(event1.get_month(), 4);
+}
+
+#[wasm_bindgen_test]
+fn set_full_year_with_month_date() {
+ let event1 = Date::new(&"August 19, 1976 23:15:30".into());
+
+ event1.set_full_year_with_month_date(1979, -1, 25);
+
+ assert_eq!(event1.get_full_year(), 1978);
+ assert_eq!(event1.get_month(), 11);
+ assert_eq!(event1.get_date(), 25);
+}
+
+#[wasm_bindgen_test]
+fn set_hours() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30".into());
+ let event2 = Date::new(&"August 19, 1975 20:15:30".into());
+
+ let ms = event1.set_hours(20);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_hours(), 20);
+}
+
+#[wasm_bindgen_test]
+fn set_milliseconds() {
+ let event = Date::new(&"August 19, 1975 23:15:30".into());
+
+ let ms = event.set_milliseconds(456);
+
+ assert_eq!(ms, event.get_time());
+ assert_eq!(event.get_milliseconds(), 456);
+}
+
+#[wasm_bindgen_test]
+fn set_minutes() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30".into());
+ let event2 = Date::new(&"August 19, 1975 23:45:30".into());
+
+ let ms = event1.set_minutes(45);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_minutes(), 45);
+}
+
+#[wasm_bindgen_test]
+fn set_month() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30".into());
+ let event2 = Date::new(&"April 19, 1975 23:15:30".into());
+
+ let ms = event1.set_month(3);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_month(), 3);
+}
+
+#[wasm_bindgen_test]
+fn set_seconds() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30".into());
+ let event2 = Date::new(&"August 19, 1975 23:15:42".into());
+
+ let ms = event1.set_seconds(42);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_seconds(), 42);
+}
+
+#[wasm_bindgen_test]
+fn set_time() {
+ let event1 = Date::new(&"July 1, 1999".into());
+ let event2 = Date::new(&JsValue::undefined());
+
+ let ms = event2.set_time(event1.get_time());
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+}
+
+#[wasm_bindgen_test]
+fn set_utc_date() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30 GMT-3:00".into());
+ let event2 = Date::new(&"August 19, 1975 02:15:30 GMT".into());
+
+ let ms = event1.set_utc_date(19);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_date(), 19);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_full_year() {
+ let event1 = Date::new(&"December 31, 1975 23:15:30 GMT-3:00".into());
+ let event2 = Date::new(&"January 01, 1975 02:15:30 GMT".into());
+
+ let ms = event1.set_utc_full_year(1975);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_full_year(), 1975);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_full_year_with_month() {
+ let event1 = Date::new(&"December 31, 1975 23:15:30 GMT-3:00".into());
+
+ event1.set_utc_full_year_with_month(1975, 6);
+
+ assert_eq!(event1.get_utc_full_year(), 1975);
+ assert_eq!(event1.get_utc_month(), 6);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_full_year_with_month_date() {
+ let event1 = Date::new(&"December 31, 1975 23:15:30 GMT-3:00".into());
+
+ event1.set_utc_full_year_with_month_date(1975, -2, 21);
+
+ assert_eq!(event1.get_utc_full_year(), 1974);
+ assert_eq!(event1.get_utc_month(), 10);
+ assert_eq!(event1.get_utc_date(), 21);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_hours() {
+ let event1 = Date::new(&"August 19, 1975 23:15:30 GMT-3:00".into());
+ let event2 = Date::new(&"August 20, 1975 23:15:30 GMT".into());
+
+ let ms = event1.set_utc_hours(23);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_hours(), 23);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_milliseconds() {
+ let event1 = Date::new(&"1995-12-17T09:24:00Z".into());
+ let event2 = Date::new(&"1995-12-17T09:24:00.420Z".into());
+
+ let ms = event1.set_utc_milliseconds(420);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_milliseconds(), 420);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_minutes() {
+ let event1 = Date::new(&"December 31, 1975, 23:15:30 GMT-3:00".into());
+ let event2 = Date::new(&"January 01, 1976 02:25:30 GMT".into());
+
+ let ms = event1.set_utc_minutes(25);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_minutes(), 25);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_month() {
+ let event1 = Date::new(&"December 31, 1975 23:15:30 GMT-3:00".into());
+ let event2 = Date::new(&"December 01, 1976 02:15:30 GMT".into());
+
+ let ms = event1.set_utc_month(11);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_month(), 11);
+}
+
+#[wasm_bindgen_test]
+fn set_utc_seconds() {
+ let event1 = Date::new(&"December 31, 1975 23:15:30 GMT-3:00".into());
+ let event2 = Date::new(&"January 01, 1976 02:15:39 GMT".into());
+
+ let ms = event1.set_utc_seconds(39);
+
+ assert_eq!(ms, event2.get_time());
+ assert_eq!(event1.get_time(), event2.get_time());
+ assert_eq!(event1.get_utc_seconds(), 39);
+}
+
+#[wasm_bindgen_test]
+fn to_date_string() {
+ // Create the date from date components rather than a string because this
+ // constructor interprets it as a date in the local time zone, which is how
+ // `toDateString` outputs it. This makes sure that this test will work in any
+ // time zone.
+ // October is 9 rather than 10 because the months count from 0.
+ let date = Date::new_with_year_month_day_hr_min(2011, 9, 5, 14, 48);
+ assert_eq!(JsValue::from(date.to_date_string()), "Wed Oct 05 2011");
+}
+
+#[wasm_bindgen_test]
+fn to_iso_string() {
+ let date = Date::new(&"05 October 2011 14:48 UTC".into());
+ assert_eq!(
+ JsValue::from(date.to_iso_string()),
+ "2011-10-05T14:48:00.000Z"
+ );
+}
+
+#[wasm_bindgen_test]
+fn to_json() {
+ let date = Date::new(&"August 19, 1975 23:15:30 UTC".into());
+
+ assert_eq!(JsValue::from(date.to_json()), "1975-08-19T23:15:30.000Z");
+}
+
+#[wasm_bindgen_test]
+fn to_locale_date_string() {
+ let date = Date::new(&"August 19, 1975 23:15:30 UTC".into());
+ let s = date.to_locale_date_string("de-DE", &JsValue::undefined());
+ assert!(s.length() > 0);
+}
+
+#[wasm_bindgen_test]
+fn to_locale_string() {
+ let date = Date::new(&"August 19, 1975 23:15:30 UTC".into());
+ let s = date.to_locale_string("de-DE", &JsValue::undefined());
+ assert!(s.length() > 0);
+}
+
+#[wasm_bindgen_test]
+fn to_locale_time_string() {
+ let date = Date::new(&"August 19, 1975 23:15:30".into());
+ assert_eq!(
+ JsValue::from(date.to_locale_time_string("en-US")),
+ "11:15:30 PM",
+ );
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ let date = Date::new(&"August 19, 1975 23:15:30".into());
+ let s = JsValue::from(date.to_string()).as_string().unwrap();
+ assert_eq!(&s[0..15], "Tue Aug 19 1975");
+}
+
+#[wasm_bindgen_test]
+fn to_time_string() {
+ let date = Date::new(&"August 19, 1975 23:15:30".into());
+ let s = JsValue::from(date.to_time_string()).as_string().unwrap();
+ assert_eq!(&s[0..8], "23:15:30");
+}
+
+#[wasm_bindgen_test]
+fn to_utc_string() {
+ let date = Date::new(&"14 Jun 2017 00:00:00 PDT".into());
+ let s = JsValue::from(date.to_utc_string()).as_string().unwrap();
+ assert_eq!(s, "Wed, 14 Jun 2017 07:00:00 GMT");
+}
+
+#[wasm_bindgen_test]
+fn utc() {
+ assert_eq!(Date::utc(2018f64, 6f64), 1530403200000.0);
+}
+
+#[wasm_bindgen_test]
+fn value_of() {
+ let date = Date::new(&Date::utc(2018f64, 6f64).into());
+ assert_eq!(date.value_of(), 1530403200000.0);
+}
+
+#[wasm_bindgen_test]
+fn date_inheritance() {
+ let date = Date::new(&"August 19, 1975 23:15:30".into());
+ assert!(date.is_instance_of::<Date>());
+ assert!(date.is_instance_of::<Object>());
+ let _: &Object = date.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Error.rs b/vendor/js-sys/tests/wasm/Error.rs
new file mode 100644
index 000000000..efe6dfcaf
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Error.rs
@@ -0,0 +1,75 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn new() {
+ let error = Error::new("some message");
+ assert_eq!(JsValue::from(error.message()), "some message");
+}
+
+#[wasm_bindgen_test]
+fn new_with_cause() {
+ let options = Object::new();
+ Reflect::set(
+ options.as_ref(),
+ &JsValue::from("cause"),
+ &JsValue::from("some cause"),
+ )
+ .unwrap();
+ let error = Error::new_with_options("some message", &options);
+ assert_eq!(error.cause(), "some cause");
+}
+
+#[wasm_bindgen_test]
+fn empty_cause() {
+ let error = Error::new("test");
+ assert_eq!(error.cause(), JsValue::UNDEFINED);
+}
+
+#[wasm_bindgen_test]
+fn set_cause() {
+ let error = Error::new("test");
+ error.set_cause(&JsValue::from("different"));
+ assert_eq!(error.cause(), "different");
+}
+
+#[wasm_bindgen_test]
+fn set_message() {
+ let error = Error::new("test");
+ error.set_message("another");
+ assert_eq!(JsValue::from(error.message()), "another");
+}
+
+#[wasm_bindgen_test]
+fn name() {
+ let error = Error::new("test");
+ assert_eq!(JsValue::from(error.name()), "Error");
+}
+
+#[wasm_bindgen_test]
+fn set_name() {
+ let error = Error::new("test");
+ error.set_name("different");
+ assert_eq!(JsValue::from(error.name()), "different");
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ let error = Error::new("error message 1");
+ assert_eq!(JsValue::from(error.to_string()), "Error: error message 1");
+ error.set_name("error_name_1");
+ assert_eq!(
+ JsValue::from(error.to_string()),
+ "error_name_1: error message 1"
+ );
+}
+
+#[wasm_bindgen_test]
+fn error_inheritance() {
+ let error = Error::new("test");
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Object = error.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/EvalError.rs b/vendor/js-sys/tests/wasm/EvalError.rs
new file mode 100644
index 000000000..52abe06ca
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/EvalError.rs
@@ -0,0 +1,62 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+// Note: This error is not thrown any more, so there are no tests that will generate this error.
+// Instead we just have to manually construct it
+
+#[wasm_bindgen_test]
+fn new() {
+ let error = EvalError::new("some message");
+ let base_error: &Error = error.dyn_ref().unwrap();
+ assert_eq!(JsValue::from(base_error.message()), "some message");
+}
+
+#[wasm_bindgen_test]
+fn set_message() {
+ let error = EvalError::new("test");
+ let base_error: &Error = error.dyn_ref().unwrap();
+ base_error.set_message("another");
+ assert_eq!(JsValue::from(base_error.message()), "another");
+}
+
+#[wasm_bindgen_test]
+fn name() {
+ let error = EvalError::new("test");
+ let base_error: &Error = error.dyn_ref().unwrap();
+ assert_eq!(JsValue::from(base_error.name()), "EvalError");
+}
+
+#[wasm_bindgen_test]
+fn set_name() {
+ let error = EvalError::new("test");
+ let base_error: &Error = error.dyn_ref().unwrap();
+ base_error.set_name("different");
+ assert_eq!(JsValue::from(base_error.name()), "different");
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ let error = EvalError::new("error message 1");
+ let base_error: &Error = error.dyn_ref().unwrap();
+ assert_eq!(
+ JsValue::from(base_error.to_string()),
+ "EvalError: error message 1"
+ );
+ base_error.set_name("error_name_1");
+ assert_eq!(
+ JsValue::from(base_error.to_string()),
+ "error_name_1: error message 1"
+ );
+}
+
+#[wasm_bindgen_test]
+fn evalerror_inheritance() {
+ let error = EvalError::new("some message");
+ assert!(error.is_instance_of::<EvalError>());
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Error = error.as_ref();
+ let _: &Object = error.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Function.js b/vendor/js-sys/tests/wasm/Function.js
new file mode 100644
index 000000000..14242a63c
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Function.js
@@ -0,0 +1,19 @@
+// Used for `Function.rs` tests
+exports.get_function_to_bind = function() {
+ return function() { return this.x || 1; }
+};
+exports.get_value_to_bind_to = function() {
+ return { x: 2 };
+};
+exports.list = function() {
+ return function() {return Array.prototype.slice.call(arguments);}
+};
+exports.add_arguments = function() {
+ return function(arg1, arg2) {return arg1 + arg2}
+};
+exports.call_function = function(f) {
+ return f();
+};
+exports.call_function_arg = function(f, arg1) {
+ return f(arg1);
+}; \ No newline at end of file
diff --git a/vendor/js-sys/tests/wasm/Function.rs b/vendor/js-sys/tests/wasm/Function.rs
new file mode 100644
index 000000000..c87a46cca
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Function.rs
@@ -0,0 +1,134 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_name = max, js_namespace = Math)]
+ static MAX: Function;
+
+ type ArrayPrototype;
+ #[wasm_bindgen(method, getter, structural)]
+ pub fn push(this: &ArrayPrototype) -> Function;
+ #[wasm_bindgen(js_name = prototype, js_namespace = Array)]
+ static ARRAY_PROTOTYPE2: ArrayPrototype;
+}
+
+#[wasm_bindgen_test]
+fn apply() {
+ let args = Array::new();
+ args.push(&1.into());
+ args.push(&2.into());
+ args.push(&3.into());
+ assert_eq!(MAX.apply(&JsValue::undefined(), &args).unwrap(), 3);
+
+ let arr = JsValue::from(Array::new());
+ let args = Array::new();
+ args.push(&1.into());
+ ARRAY_PROTOTYPE2.push().apply(&arr, &args).unwrap();
+ assert_eq!(Array::from(&arr).length(), 1);
+}
+
+#[wasm_bindgen(module = "tests/wasm/Function.js")]
+extern "C" {
+ fn get_function_to_bind() -> Function;
+ fn get_value_to_bind_to() -> JsValue;
+ fn list() -> Function;
+ fn add_arguments() -> Function;
+ fn call_function(f: &Function) -> JsValue;
+ fn call_function_arg(f: &Function, arg0: JsValue) -> JsValue;
+
+}
+
+#[wasm_bindgen_test]
+fn bind() {
+ let f = get_function_to_bind();
+ let new_f = f.bind(&get_value_to_bind_to());
+ assert_eq!(call_function(&f), 1);
+ assert_eq!(call_function(&new_f), 2);
+}
+
+#[wasm_bindgen_test]
+fn bind0() {
+ let f = get_function_to_bind();
+ let new_f = f.bind0(&get_value_to_bind_to());
+ assert_eq!(call_function(&f), 1);
+ assert_eq!(call_function(&new_f), 2);
+}
+
+#[wasm_bindgen_test]
+fn bind1() {
+ let a_list = list();
+ let prepended_list = a_list.bind1(&JsValue::NULL, &JsValue::from(2));
+
+ assert_eq!(Array::from(&call_function(&prepended_list)).pop(), 2);
+
+ let adder = add_arguments();
+ let add_42 = adder.bind1(&JsValue::NULL, &JsValue::from(42));
+
+ assert_eq!(call_function_arg(&add_42, JsValue::from(1)), 43);
+ assert_eq!(call_function_arg(&add_42, JsValue::from(378)), 420);
+}
+
+#[wasm_bindgen_test]
+fn bind2() {
+ let a_list = list();
+ let prepended_list = a_list.bind2(&JsValue::NULL, &JsValue::from(2), &JsValue::from(3));
+
+ let arr = Array::from(&call_function(&prepended_list));
+
+ assert_eq!(arr.pop(), 3);
+ assert_eq!(arr.pop(), 2);
+
+ let adder = add_arguments();
+ let always_69 = adder.bind2(&JsValue::NULL, &JsValue::from(66), &JsValue::from(3));
+
+ assert_eq!(call_function(&always_69), 69);
+}
+
+#[wasm_bindgen_test]
+fn bind3() {
+ let a_list = list();
+ let prepended_list = a_list.bind3(
+ &JsValue::NULL,
+ &JsValue::from(2),
+ &JsValue::from(3),
+ &JsValue::from(4),
+ );
+
+ let arr = Array::from(&call_function(&prepended_list));
+
+ assert_eq!(arr.pop(), 4);
+ assert_eq!(arr.pop(), 3);
+ assert_eq!(arr.pop(), 2);
+
+ let adder = add_arguments();
+ let always_69 = adder.bind2(&JsValue::NULL, &JsValue::from(66), &JsValue::from(3));
+
+ assert_eq!(call_function(&always_69), 69);
+}
+
+#[wasm_bindgen_test]
+fn length() {
+ assert_eq!(MAX.length(), 2);
+ assert_eq!(ARRAY_PROTOTYPE2.push().length(), 1);
+}
+
+#[wasm_bindgen_test]
+fn name() {
+ assert_eq!(JsValue::from(MAX.name()), "max");
+ assert_eq!(JsValue::from(ARRAY_PROTOTYPE2.push().name()), "push");
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ assert!(MAX.to_string().length() > 0);
+}
+
+#[wasm_bindgen_test]
+fn function_inheritance() {
+ assert!(MAX.is_instance_of::<Function>());
+ assert!(MAX.is_instance_of::<Object>());
+ let _: &Object = MAX.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Generator.js b/vendor/js-sys/tests/wasm/Generator.js
new file mode 100644
index 000000000..2cb59cca3
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Generator.js
@@ -0,0 +1,23 @@
+exports.one_two_generator = function() {
+ function* generator() {
+ yield 1;
+ yield 2;
+ }
+ return generator();
+};
+
+exports.dummy_generator = function() {
+ function* generator() {
+ const reply = yield '2 * 2';
+ return reply === 4;
+ }
+ return generator();
+};
+
+exports.broken_generator = function() {
+ function* brokenGenerator() {
+ throw new Error('Something went wrong');
+ yield 1;
+ }
+ return brokenGenerator();
+};
diff --git a/vendor/js-sys/tests/wasm/Generator.rs b/vendor/js-sys/tests/wasm/Generator.rs
new file mode 100644
index 000000000..690bb2260
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Generator.rs
@@ -0,0 +1,66 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Generator.js")]
+extern "C" {
+ fn one_two_generator() -> Generator;
+ fn dummy_generator() -> Generator;
+ fn broken_generator() -> Generator;
+
+ type GeneratorResult;
+
+ #[wasm_bindgen(method, getter, structural)]
+ fn value(this: &GeneratorResult) -> JsValue;
+ #[wasm_bindgen(method, getter, structural)]
+ fn done(this: &GeneratorResult) -> bool;
+
+}
+
+#[wasm_bindgen_test]
+fn return_() {
+ let gen = one_two_generator();
+ gen.next(&JsValue::undefined()).unwrap();
+
+ let res = GeneratorResult::from(gen.return_(&42.into()));
+ assert_eq!(res.value(), 42);
+ assert!(res.done());
+
+ let next = GeneratorResult::from(gen.next(&JsValue::undefined()).unwrap());
+ assert!(next.value().is_undefined());
+ assert!(next.done());
+}
+
+#[wasm_bindgen_test]
+fn next() {
+ let gen = dummy_generator();
+
+ let result = GeneratorResult::from(gen.next(&JsValue::undefined()).unwrap());
+ assert!(!result.done());
+ assert_eq!(result.value(), "2 * 2");
+
+ let result = GeneratorResult::from(gen.next(&4.into()).unwrap());
+ assert!(result.done());
+ assert_eq!(result.value(), true);
+
+ assert!(broken_generator().next(&3.into()).is_err());
+}
+
+#[wasm_bindgen_test]
+fn throw() {
+ let gen = one_two_generator();
+ gen.next(&JsValue::undefined()).unwrap();
+
+ assert!(gen.throw(&Error::new("something went wrong")).is_err());
+ let next = GeneratorResult::from(gen.next(&JsValue::undefined()).unwrap());
+ assert!(next.value().is_undefined());
+ assert!(next.done());
+}
+
+#[wasm_bindgen_test]
+fn generator_inheritance() {
+ let gen = dummy_generator();
+
+ assert!(gen.is_instance_of::<Object>());
+}
diff --git a/vendor/js-sys/tests/wasm/Intl.rs b/vendor/js-sys/tests/wasm/Intl.rs
new file mode 100644
index 000000000..427ea00a5
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Intl.rs
@@ -0,0 +1,124 @@
+use js_sys::*;
+use wasm_bindgen::{JsCast, JsValue};
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn get_canonical_locales() {
+ let locales = Array::new();
+ locales.push(&"EN-US".into());
+ locales.push(&"Fr".into());
+ let locales = JsValue::from(locales);
+ let canonical_locales = Intl::get_canonical_locales(&locales);
+ assert_eq!(canonical_locales.length(), 2);
+ canonical_locales.for_each(&mut |l, i, _| {
+ if i == 0 {
+ assert_eq!(l, "en-US");
+ } else {
+ assert_eq!(l, "fr");
+ }
+ });
+ let canonical_locales = Intl::get_canonical_locales(&"EN-US".into());
+ assert_eq!(canonical_locales.length(), 1);
+ canonical_locales.for_each(&mut |l, _, _| {
+ assert_eq!(l, "en-US");
+ });
+}
+
+#[wasm_bindgen_test]
+fn collator() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+
+ let c = Intl::Collator::new(&locales, &opts);
+ assert!(c.compare().is_instance_of::<Function>());
+ assert!(c.resolved_options().is_instance_of::<Object>());
+
+ let a = Intl::Collator::supported_locales_of(&locales, &opts);
+ assert!(a.is_instance_of::<Array>());
+}
+
+#[wasm_bindgen_test]
+fn collator_inheritance() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+ let c = Intl::Collator::new(&locales, &opts);
+
+ assert!(c.is_instance_of::<Intl::Collator>());
+ assert!(c.is_instance_of::<Object>());
+ let _: &Object = c.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn date_time_format() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+ let epoch = Date::new(&JsValue::from(0));
+
+ let c = Intl::DateTimeFormat::new(&locales, &opts);
+ assert!(c.format().is_instance_of::<Function>());
+ assert!(c.format_to_parts(&epoch).is_instance_of::<Array>());
+ assert!(c.resolved_options().is_instance_of::<Object>());
+
+ let a = Intl::DateTimeFormat::supported_locales_of(&locales, &opts);
+ assert!(a.is_instance_of::<Array>());
+}
+
+#[wasm_bindgen_test]
+fn date_time_format_inheritance() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+ let c = Intl::DateTimeFormat::new(&locales, &opts);
+
+ assert!(c.is_instance_of::<Intl::DateTimeFormat>());
+ assert!(c.is_instance_of::<Object>());
+ let _: &Object = c.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn number_format() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+
+ let n = Intl::NumberFormat::new(&locales, &opts);
+ assert!(n.format().is_instance_of::<Function>());
+ assert!(n.format_to_parts(42.5).is_instance_of::<Array>());
+ assert!(n.resolved_options().is_instance_of::<Object>());
+
+ let a = Intl::NumberFormat::supported_locales_of(&locales, &opts);
+ assert!(a.is_instance_of::<Array>());
+}
+
+#[wasm_bindgen_test]
+fn number_format_inheritance() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+ let n = Intl::NumberFormat::new(&locales, &opts);
+
+ assert!(n.is_instance_of::<Intl::NumberFormat>());
+ assert!(n.is_instance_of::<Object>());
+ let _: &Object = n.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn plural_rules() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+
+ let r = Intl::PluralRules::new(&locales, &opts);
+ assert!(r.resolved_options().is_instance_of::<Object>());
+ assert_eq!(r.select(1_f64), "one");
+
+ let a = Intl::PluralRules::supported_locales_of(&locales, &opts);
+ assert!(a.is_instance_of::<Array>());
+}
+
+#[wasm_bindgen_test]
+fn plural_rules_inheritance() {
+ let locales = Array::of1(&JsValue::from("en-US"));
+ let opts = Object::new();
+ let r = Intl::PluralRules::new(&locales, &opts);
+
+ assert!(r.is_instance_of::<Intl::PluralRules>());
+ assert!(r.is_instance_of::<Object>());
+ let _: &Object = r.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Iterator.js b/vendor/js-sys/tests/wasm/Iterator.js
new file mode 100644
index 000000000..79b8c5006
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Iterator.js
@@ -0,0 +1,19 @@
+exports.get_iterable = () => ["one", "two", "three"];
+
+exports.get_not_iterable = () => new Object;
+
+exports.get_symbol_iterator_throws = () => ({
+ [Symbol.iterator]: () => { throw new Error("nope"); },
+});
+
+exports.get_symbol_iterator_not_function = () => ({
+ [Symbol.iterator]: 5,
+});
+
+exports.get_symbol_iterator_returns_not_object = () => ({
+ [Symbol.iterator]: () => 5,
+});
+
+exports.get_symbol_iterator_returns_object_without_next = () => ({
+ [Symbol.iterator]: () => new Object,
+});
diff --git a/vendor/js-sys/tests/wasm/Iterator.rs b/vendor/js-sys/tests/wasm/Iterator.rs
new file mode 100644
index 000000000..f06c58b54
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Iterator.rs
@@ -0,0 +1,42 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Iterator.js")]
+extern "C" {
+ fn get_iterable() -> JsValue;
+
+ fn get_not_iterable() -> JsValue;
+
+ fn get_symbol_iterator_throws() -> JsValue;
+
+ fn get_symbol_iterator_not_function() -> JsValue;
+
+ fn get_symbol_iterator_returns_not_object() -> JsValue;
+
+ fn get_symbol_iterator_returns_object_without_next() -> JsValue;
+}
+
+#[wasm_bindgen_test]
+fn try_iter_handles_iteration_protocol() {
+ assert_eq!(
+ try_iter(&get_iterable())
+ .unwrap()
+ .unwrap()
+ .map(|x| x.unwrap().as_string().unwrap())
+ .collect::<Vec<_>>(),
+ vec!["one", "two", "three"]
+ );
+
+ assert!(try_iter(&get_not_iterable()).unwrap().is_none());
+ assert!(try_iter(&get_symbol_iterator_throws()).is_err());
+ assert!(try_iter(&get_symbol_iterator_not_function())
+ .unwrap()
+ .is_none());
+ assert!(try_iter(&get_symbol_iterator_returns_not_object())
+ .unwrap()
+ .is_none());
+ assert!(try_iter(&get_symbol_iterator_returns_object_without_next())
+ .unwrap()
+ .is_none());
+}
diff --git a/vendor/js-sys/tests/wasm/JSON.rs b/vendor/js-sys/tests/wasm/JSON.rs
new file mode 100644
index 000000000..920ac1d6f
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/JSON.rs
@@ -0,0 +1,198 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn parse_array() {
+ let js_array = JSON::parse("[1, 2, 3]").unwrap();
+ assert!(Array::is_array(&js_array));
+
+ let array = Array::from(&js_array);
+ assert_eq!(array.length(), 3);
+ assert_eq!(array.pop(), 3);
+ assert_eq!(array.pop(), 2);
+ assert_eq!(array.pop(), 1);
+}
+
+#[wasm_bindgen_test]
+fn parse_object() {
+ let js_object = JSON::parse("{\"x\": 5, \"y\": true, \"z\": [\"foo\", \"bar\"]}").unwrap();
+ assert!(js_object.is_object());
+
+ let obj = Object::from(js_object);
+ let keys = Object::keys(&obj);
+ assert_eq!(keys.length(), 3);
+ assert_eq!(keys.pop().as_string().unwrap(), "z");
+ assert_eq!(keys.pop().as_string().unwrap(), "y");
+ assert_eq!(keys.pop().as_string().unwrap(), "x");
+
+ let values = Object::values(&obj);
+ assert_eq!(values.length(), 3);
+
+ let z = values.pop();
+ assert!(Array::is_array(&z));
+ let z_array = Array::from(&z);
+ assert_eq!(z_array.length(), 2);
+
+ let y = values.pop();
+ assert_eq!(y.as_bool(), Some(true));
+
+ let x = values.pop();
+ assert_eq!(x.as_f64().unwrap(), 5.0);
+}
+
+#[wasm_bindgen_test]
+fn parse_error() {
+ let js_object = JSON::parse("invalid json");
+ assert!(js_object.is_err());
+ let err = js_object.unwrap_err();
+ assert!(err.is_instance_of::<Error>());
+}
+
+#[wasm_bindgen_test]
+fn stringify() {
+ let arr = Array::new();
+ arr.push(&JsValue::from(1));
+ arr.push(&JsValue::from(true));
+ arr.push(&JsValue::from("hello"));
+
+ let str1: String = JSON::stringify(&JsValue::from(arr)).unwrap().into();
+ assert_eq!(str1, "[1,true,\"hello\"]");
+
+ let obj = Object::new();
+ Reflect::set(obj.as_ref(), &JsValue::from("foo"), &JsValue::from("bar")).unwrap();
+ let str2: String = JSON::stringify(&JsValue::from(obj)).unwrap().into();
+ assert_eq!(str2, "{\"foo\":\"bar\"}");
+}
+
+#[wasm_bindgen_test]
+fn stringify_error() {
+ let func = Function::new_no_args("throw new Error(\"rust really rocks\")");
+ let obj = Object::new();
+ Reflect::set(obj.as_ref(), &JsValue::from("toJSON"), func.as_ref()).unwrap();
+
+ let result = JSON::stringify(&JsValue::from(obj));
+ assert!(result.is_err());
+ let err_obj = result.unwrap_err();
+ assert!(err_obj.is_instance_of::<Error>());
+ let err: &Error = err_obj.dyn_ref().unwrap();
+ let err_msg: String = From::from(err.message());
+ assert!(err_msg.contains("rust really rocks"));
+}
+
+#[wasm_bindgen_test]
+fn stringify_with_replacer() {
+ let obj = Object::new();
+ Reflect::set(obj.as_ref(), &JsValue::from("foo"), &JsValue::from("bar")).unwrap();
+ Reflect::set(
+ obj.as_ref(),
+ &JsValue::from("hello"),
+ &JsValue::from("world"),
+ )
+ .unwrap();
+
+ let replacer_array = Array::new();
+ replacer_array.push(&JsValue::from("hello"));
+ let output1: String =
+ JSON::stringify_with_replacer(&JsValue::from(obj.clone()), &JsValue::from(replacer_array))
+ .unwrap()
+ .into();
+ assert_eq!(output1, "{\"hello\":\"world\"}");
+
+ let replacer_func =
+ Function::new_with_args("key, value", "return key === 'hello' ? undefined : value");
+ let output2: String =
+ JSON::stringify_with_replacer(&JsValue::from(obj), &JsValue::from(replacer_func))
+ .unwrap()
+ .into();
+ assert_eq!(output2, "{\"foo\":\"bar\"}");
+}
+
+#[wasm_bindgen_test]
+fn stringify_with_replacer_error() {
+ let arr = Array::new();
+ arr.push(&JsValue::from(1));
+ arr.push(&JsValue::from(true));
+ arr.push(&JsValue::from("hello"));
+
+ let replacer = Function::new_no_args("throw new Error(\"rust really rocks\")");
+
+ let result = JSON::stringify_with_replacer(&JsValue::from(arr), &JsValue::from(replacer));
+ assert!(result.is_err());
+ let err_obj = result.unwrap_err();
+ assert!(err_obj.is_instance_of::<Error>());
+ let err: &Error = err_obj.dyn_ref().unwrap();
+ let err_msg: String = From::from(err.message());
+ assert!(err_msg.contains("rust really rocks"));
+}
+
+#[wasm_bindgen_test]
+fn stringify_with_replacer_and_space() {
+ let arr = Array::new();
+ arr.push(&JsValue::from(1));
+ arr.push(&JsValue::from(true));
+ arr.push(&JsValue::from("hello"));
+
+ let output1: String = JSON::stringify_with_replacer_and_space(
+ &JsValue::from(arr),
+ &JsValue::NULL,
+ &JsValue::from(4),
+ )
+ .unwrap()
+ .into();
+ assert_eq!(output1, "[\n 1,\n true,\n \"hello\"\n]");
+
+ let obj = Object::new();
+ Reflect::set(obj.as_ref(), &JsValue::from("foo"), &JsValue::from("bar")).unwrap();
+ Reflect::set(
+ obj.as_ref(),
+ &JsValue::from("hello"),
+ &JsValue::from("world"),
+ )
+ .unwrap();
+
+ let replacer_array = Array::new();
+ replacer_array.push(&JsValue::from("hello"));
+ let output2: String = JSON::stringify_with_replacer_and_space(
+ &JsValue::from(obj.clone()),
+ &JsValue::from(replacer_array),
+ &JsValue::from(4),
+ )
+ .unwrap()
+ .into();
+ assert_eq!(output2, "{\n \"hello\": \"world\"\n}");
+
+ let replacer_func =
+ Function::new_with_args("key, value", "return key === 'hello' ? undefined : value");
+ let output3: String = JSON::stringify_with_replacer_and_space(
+ &JsValue::from(obj),
+ &JsValue::from(replacer_func),
+ &JsValue::from(4),
+ )
+ .unwrap()
+ .into();
+ assert_eq!(output3, "{\n \"foo\": \"bar\"\n}");
+}
+
+#[wasm_bindgen_test]
+fn stringify_with_replacer_and_space_error() {
+ let arr = Array::new();
+ arr.push(&JsValue::from(1));
+ arr.push(&JsValue::from(true));
+ arr.push(&JsValue::from("hello"));
+
+ let replacer = Function::new_no_args("throw new Error(\"rust really rocks\")");
+
+ let result = JSON::stringify_with_replacer_and_space(
+ &JsValue::from(arr),
+ &JsValue::from(replacer),
+ &JsValue::from(4),
+ );
+ assert!(result.is_err());
+ let err_obj = result.unwrap_err();
+ assert!(err_obj.is_instance_of::<Error>());
+ let err: &Error = err_obj.dyn_ref().unwrap();
+ let err_msg: String = From::from(err.message());
+ assert!(err_msg.contains("rust really rocks"));
+}
diff --git a/vendor/js-sys/tests/wasm/JsString.js b/vendor/js-sys/tests/wasm/JsString.js
new file mode 100644
index 000000000..fbaec7ae8
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/JsString.js
@@ -0,0 +1,7 @@
+exports.new_string_object = () => new String("hi");
+
+exports.get_replacer_function = function() {
+ return function upperToHyphenLower(match, offset, string) {
+ return (offset > 0 ? '-' : '') + match.toLowerCase();
+ };
+};
diff --git a/vendor/js-sys/tests/wasm/JsString.rs b/vendor/js-sys/tests/wasm/JsString.rs
new file mode 100644
index 000000000..33cd53bce
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/JsString.rs
@@ -0,0 +1,612 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/JsString.js")]
+extern "C" {
+ fn new_string_object() -> JsValue;
+ fn get_replacer_function() -> Function;
+}
+
+#[wasm_bindgen_test]
+fn js_string_inheritance() {
+ let string = new_string_object();
+ assert!(string.is_instance_of::<JsString>());
+ assert!(string.is_instance_of::<Object>());
+}
+
+#[wasm_bindgen_test]
+fn length() {
+ fn test(s: &str) {
+ assert_eq!(JsString::from(s).length(), s.len() as u32);
+ }
+ test("Mozilla");
+ test("");
+}
+
+#[wasm_bindgen_test]
+fn char_at() {
+ let s = JsString::from("Brave new world");
+ assert_eq!(JsValue::from(s.char_at(0)), "B");
+ assert_eq!(JsValue::from(s.char_at(999)), "");
+}
+
+#[wasm_bindgen_test]
+fn char_code_at() {
+ let s = "Brave new world";
+ let js = JsString::from(s);
+ for (i, b) in s.char_indices() {
+ assert_eq!(js.char_code_at(i as u32), b as u32 as f64);
+ }
+ assert!(js.char_code_at(s.len() as u32).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn code_point_at() {
+ assert_eq!(JsString::from("ABC").code_point_at(1), b'B');
+ assert!(JsString::from("ABC").code_point_at(42).is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn concat() {
+ // TODO: Implement ability to receive multiple optional arguments
+ let s = JsString::from("Hello ").concat(&"World".into());
+ assert_eq!(JsValue::from(s), "Hello World");
+ let foo = JsString::from("foo");
+ assert_eq!(
+ JsValue::from(foo.concat(&Object::new().into())),
+ "foo[object Object]"
+ );
+ assert_eq!(JsValue::from(foo.concat(&Array::new().into())), "foo");
+ assert_eq!(JsValue::from(foo.concat(&JsValue::null())), "foonull");
+ assert_eq!(JsValue::from(foo.concat(&true.into())), "footrue");
+ assert_eq!(JsValue::from(foo.concat(&1234.into())), "foo1234");
+}
+
+#[wasm_bindgen_test]
+fn ends_with() {
+ let s = "To be, or not to be, that is the question.";
+ let js = JsString::from(s);
+
+ // TODO: remove third parameter once we have optional parameters
+ assert_eq!(js.ends_with("question.", s.len() as i32), true);
+ assert_eq!(js.ends_with("to be", s.len() as i32), false);
+ assert_eq!(js.ends_with("to be", 19), true);
+}
+
+#[wasm_bindgen_test]
+fn from_char_code() {
+ let s = "½+¾=";
+ let codes: Vec<u32> = s.chars().map(|char| char as u32).collect();
+
+ assert_eq!(JsString::from_char_code1(codes[0]), "½");
+ assert_eq!(JsString::from_char_code2(codes[0], codes[1]), "½+");
+ assert_eq!(
+ JsString::from_char_code3(codes[0], codes[1], codes[2]),
+ "½+¾"
+ );
+ assert_eq!(
+ JsString::from_char_code4(codes[0], codes[1], codes[2], codes[3]),
+ "½+¾="
+ );
+
+ let codes_u16: Vec<u16> = codes
+ .into_iter()
+ .map(|code| {
+ assert!(code <= u32::from(u16::max_value()));
+ code as u16
+ })
+ .collect();
+
+ assert_eq!(JsString::from_char_code(&codes_u16), "½+¾=");
+}
+
+#[wasm_bindgen_test]
+fn from_code_point() {
+ let s = "☃★♲你";
+ let codes: Vec<u32> = s.chars().map(|char| char as u32).collect();
+
+ assert_eq!(JsString::from_code_point1(codes[0]).unwrap(), "☃");
+ assert_eq!(
+ JsString::from_code_point2(codes[0], codes[1]).unwrap(),
+ "☃★"
+ );
+ assert_eq!(
+ JsString::from_code_point3(codes[0], codes[1], codes[2]).unwrap(),
+ "☃★♲"
+ );
+ assert_eq!(
+ JsString::from_code_point4(codes[0], codes[1], codes[2], codes[3]).unwrap(),
+ "☃★♲你"
+ );
+ assert_eq!(JsString::from_code_point(&codes).unwrap(), "☃★♲你");
+
+ assert!(!JsString::from_code_point1(0x10FFFF).is_err());
+ assert!(JsString::from_code_point1(0x110000).is_err());
+ assert!(JsString::from_code_point1(u32::max_value()).is_err());
+}
+
+#[wasm_bindgen_test]
+fn includes() {
+ let str = JsString::from("Blue Whale");
+
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(str.includes("Blue", 0), true);
+ assert_eq!(str.includes("Blute", 0), false);
+ assert_eq!(str.includes("Whale", 0), true);
+ assert_eq!(str.includes("Whale", 5), true);
+ assert_eq!(str.includes("Whale", 7), false);
+ assert_eq!(str.includes("", 0), true);
+ assert_eq!(str.includes("", 16), true);
+}
+
+#[wasm_bindgen_test]
+fn index_of() {
+ let str = JsString::from("Blue Whale");
+
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(str.index_of("Blue", 0), 0);
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(str.index_of("Blute", 0), -1);
+ assert_eq!(str.index_of("Whale", 0), 5);
+ assert_eq!(str.index_of("Whale", 5), 5);
+ assert_eq!(str.index_of("Whale", 7), -1);
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(str.index_of("", 0), 0);
+ assert_eq!(str.index_of("", 9), 9);
+ assert_eq!(str.index_of("", 10), 10);
+ assert_eq!(str.index_of("", 11), 10);
+}
+
+#[wasm_bindgen_test]
+fn last_index_of() {
+ let js = JsString::from("canal");
+ let len = js.length() as i32;
+
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(js.last_index_of("a", len), 3);
+ assert_eq!(js.last_index_of("a", 2), 1);
+ assert_eq!(js.last_index_of("a", 0), -1);
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(js.last_index_of("x", len), -1);
+ assert_eq!(js.last_index_of("c", -5), 0);
+ assert_eq!(js.last_index_of("c", 0), 0);
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(js.last_index_of("", len), 5);
+ assert_eq!(js.last_index_of("", 2), 2);
+}
+
+#[wasm_bindgen_test]
+fn match_() {
+ let s = "The quick brown fox jumped over the lazy dog. It barked.";
+ let re = RegExp::new("[A-Z]", "g");
+ let result = JsString::from(s).match_(&re);
+ let obj = result.unwrap();
+
+ assert_eq!(Reflect::get(obj.as_ref(), &"0".into()).unwrap(), "T");
+ assert_eq!(Reflect::get(obj.as_ref(), &"1".into()).unwrap(), "I");
+
+ let re = RegExp::new("[A-Z]([a-z]*)", "g");
+ let result = JsString::from(s).match_(&re);
+ let obj = result.unwrap();
+
+ assert_eq!(Reflect::get(obj.as_ref(), &"0".into()).unwrap(), "The");
+ assert_eq!(Reflect::get(obj.as_ref(), &"1".into()).unwrap(), "It");
+
+ let result = JsString::from("foo").match_(&re);
+ assert!(result.is_none());
+
+ let s = "For more information, see Chapter 3.4.5.1";
+ let re = RegExp::new("see (chapter \\d+(\\.\\d)*)", "i");
+ let result = JsString::from(s).match_(&re);
+ let obj = result.unwrap();
+
+ assert_eq!(
+ Reflect::get(obj.as_ref(), &"0".into()).unwrap(),
+ "see Chapter 3.4.5.1"
+ );
+ assert_eq!(
+ Reflect::get(obj.as_ref(), &"1".into()).unwrap(),
+ "Chapter 3.4.5.1"
+ );
+ assert_eq!(Reflect::get(obj.as_ref(), &"2".into()).unwrap(), ".1");
+ assert_eq!(Reflect::get(obj.as_ref(), &"index".into()).unwrap(), 22);
+ assert_eq!(Reflect::get(obj.as_ref(), &"input".into()).unwrap(), s);
+}
+
+#[wasm_bindgen_test]
+fn match_all() {
+ let s = "The quick brown fox jumped over the lazy dog. It barked.";
+ let re = RegExp::new("[A-Z]([a-z]*)", "g");
+ let result: Vec<_> = JsString::from(s)
+ .match_all(&re)
+ .into_iter()
+ .collect::<Result<_, _>>()
+ .unwrap();
+
+ let obj = &result[0];
+ assert_eq!(Reflect::get(obj.as_ref(), &"0".into()).unwrap(), "The");
+ assert_eq!(Reflect::get(obj.as_ref(), &"1".into()).unwrap(), "he");
+
+ let obj = &result[1];
+ assert_eq!(Reflect::get(obj.as_ref(), &"0".into()).unwrap(), "It");
+ assert_eq!(Reflect::get(obj.as_ref(), &"1".into()).unwrap(), "t");
+
+ let result: Vec<_> = JsString::from("foo")
+ .match_all(&re)
+ .into_iter()
+ .collect::<Result<_, _>>()
+ .unwrap();
+ assert_eq!(result.len(), 0);
+
+ let s = "For more information, see Chapter 3.4.5.1. Also see Chapter 3.1.4";
+ let re = RegExp::new("see (chapter \\d+(\\.\\d)*)", "gi");
+ let result: Vec<_> = JsString::from(s)
+ .match_all(&re)
+ .into_iter()
+ .collect::<Result<_, _>>()
+ .unwrap();
+
+ let obj = &result[0];
+ assert_eq!(
+ Reflect::get(obj.as_ref(), &"0".into()).unwrap(),
+ "see Chapter 3.4.5.1"
+ );
+ assert_eq!(
+ Reflect::get(obj.as_ref(), &"1".into()).unwrap(),
+ "Chapter 3.4.5.1"
+ );
+ assert_eq!(Reflect::get(obj.as_ref(), &"2".into()).unwrap(), ".1");
+ assert_eq!(Reflect::get(obj.as_ref(), &"index".into()).unwrap(), 22);
+ assert_eq!(Reflect::get(obj.as_ref(), &"input".into()).unwrap(), s);
+
+ let obj = &result[1];
+ assert_eq!(
+ Reflect::get(obj.as_ref(), &"0".into()).unwrap(),
+ "see Chapter 3.1.4"
+ );
+ assert_eq!(
+ Reflect::get(obj.as_ref(), &"1".into()).unwrap(),
+ "Chapter 3.1.4"
+ );
+ assert_eq!(Reflect::get(obj.as_ref(), &"2".into()).unwrap(), ".4");
+ assert_eq!(Reflect::get(obj.as_ref(), &"index".into()).unwrap(), 48);
+ assert_eq!(Reflect::get(obj.as_ref(), &"input".into()).unwrap(), s);
+}
+
+#[wasm_bindgen_test]
+fn normalize() {
+ let js = JsString::from("\u{1E9B}\u{0323}");
+
+ // TODO: Handle undefined
+ assert_eq!(JsValue::from(js.normalize("NFC")), "\u{1E9B}\u{0323}");
+ assert_eq!(
+ JsValue::from(js.normalize("NFD")),
+ "\u{017F}\u{0323}\u{0307}"
+ );
+ assert_eq!(JsValue::from(js.normalize("NFKC")), "\u{1E69}");
+ assert_eq!(
+ JsValue::from(js.normalize("NFKD")),
+ "\u{0073}\u{0323}\u{0307}"
+ );
+}
+
+#[wasm_bindgen_test]
+fn pad_end() {
+ let js = JsString::from("abc");
+
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(JsValue::from(js.pad_end(10, " ")), "abc ");
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(JsValue::from(js.pad_end(10, " ")), "abc ");
+ assert_eq!(JsValue::from(js.pad_end(10, "foo")), "abcfoofoof");
+ assert_eq!(JsValue::from(js.pad_end(6, "123456")), "abc123");
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(JsValue::from(js.pad_end(1, " ")), "abc");
+}
+
+#[wasm_bindgen_test]
+fn pad_start() {
+ let js = JsString::from("abc");
+
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(js.pad_start(10, " "), " abc");
+ assert_eq!(js.pad_start(10, "foo"), "foofoofabc");
+ assert_eq!(js.pad_start(6, "123465"), "123abc");
+ assert_eq!(js.pad_start(8, "0"), "00000abc");
+ // TODO: remove second parameter once we have optional parameters
+ assert_eq!(js.pad_start(1, " "), "abc");
+}
+
+#[wasm_bindgen_test]
+fn repeat() {
+ assert_eq!(JsString::from("test").repeat(3), "testtesttest");
+}
+
+#[wasm_bindgen_test]
+fn replace() {
+ let js = JsString::from(
+ "The quick brown fox jumped over the lazy dog. If the dog reacted, was it really lazy?",
+ );
+ let result = js.replace("dog", "ferret");
+
+ assert_eq!(
+ result,
+ "The quick brown fox jumped over the lazy ferret. If the dog reacted, was it really lazy?"
+ );
+
+ let js = JsString::from("borderTop");
+ let result = js.replace_with_function("T", &get_replacer_function());
+
+ assert_eq!(result, "border-top");
+
+ let js = JsString::from(
+ "The quick brown fox jumped over the lazy dog. If the dog reacted, was it really lazy?",
+ );
+ let re = RegExp::new("dog", "g");
+ let result = js.replace_by_pattern(&re, "ferret");
+
+ assert_eq!(result, "The quick brown fox jumped over the lazy ferret. If the ferret reacted, was it really lazy?");
+
+ let js = JsString::from("borderTop");
+ let re = RegExp::new("[A-Z]", "g");
+ let result = js.replace_by_pattern_with_function(&re, &get_replacer_function());
+
+ assert_eq!(result, "border-top");
+}
+
+#[wasm_bindgen_test]
+fn replace_all() {
+ let js = JsString::from(
+ "The quick brown fox jumped over the lazy dog. If the dog reacted, was it really lazy?",
+ );
+ let result = js.replace_all("dog", "ferret");
+
+ assert_eq!(
+ result,
+ "The quick brown fox jumped over the lazy ferret. If the ferret reacted, was it really lazy?"
+ );
+
+ let js = JsString::from("borderTopTest");
+ let result = js.replace_all_with_function("T", &get_replacer_function());
+
+ assert_eq!(result, "border-top-test");
+
+ let js = JsString::from(
+ "The quick brown fox jumped over the lazy dog. If the dog reacted, was it really lazy?",
+ );
+ let re = RegExp::new("dog", "g");
+ let result = js.replace_all_by_pattern(&re, "ferret");
+
+ assert_eq!(result, "The quick brown fox jumped over the lazy ferret. If the ferret reacted, was it really lazy?");
+
+ let js = JsString::from("borderTopTest");
+ let re = RegExp::new("[A-Z]", "g");
+ let result = js.replace_all_by_pattern_with_function(&re, &get_replacer_function());
+
+ assert_eq!(result, "border-top-test");
+}
+
+#[wasm_bindgen_test]
+fn search() {
+ let js = JsString::from(
+ "The quick brown fox jumped over the lazy dog. If the dog reacted, was it really lazy?",
+ );
+ let re = RegExp::new("[^\\w\\s]", "g");
+
+ assert_eq!(js.search(&re), 44);
+
+ let js = JsString::from("hey JudE");
+ let re1 = RegExp::new("[A-Z]", "g");
+ let re2 = RegExp::new("[.]", "g");
+
+ assert_eq!(js.search(&re1), 4);
+ assert_eq!(js.search(&re2), -1);
+}
+
+#[wasm_bindgen_test]
+fn slice() {
+ let characters = JsString::from("acxn18");
+ assert_eq!(characters.slice(1, 3), "cx");
+}
+
+#[wasm_bindgen_test]
+fn split() {
+ let js = JsString::from("Oh brave new world");
+ let result = js.split(" ");
+
+ let mut v = Vec::with_capacity(result.length() as usize);
+ result.for_each(&mut |x, _, _| v.push(x));
+
+ assert_eq!(v[0], "Oh");
+ assert_eq!(v[1], "brave");
+ assert_eq!(v[2], "new");
+ assert_eq!(v[3], "world");
+
+ let js = JsString::from("Oct,Nov,Dec");
+ let result = js.split(",");
+
+ let mut v = Vec::with_capacity(result.length() as usize);
+ result.for_each(&mut |x, _, _| v.push(x));
+
+ assert_eq!(v[0], "Oct");
+ assert_eq!(v[1], "Nov");
+ assert_eq!(v[2], "Dec");
+
+ let result = js.split_limit(",", 2);
+
+ let mut v = Vec::with_capacity(result.length() as usize);
+ result.for_each(&mut |x, _, _| v.push(x));
+
+ assert_eq!(result.length(), 2);
+ assert_eq!(v[0], "Oct");
+ assert_eq!(v[1], "Nov");
+
+ let js = JsString::from("Oh brave new world");
+ let re = RegExp::new("\\s", "g");
+ let result = js.split_by_pattern(&re);
+
+ let mut v = Vec::with_capacity(result.length() as usize);
+ result.for_each(&mut |x, _, _| v.push(x));
+
+ assert_eq!(v[0], "Oh");
+ assert_eq!(v[1], "brave");
+ assert_eq!(v[2], "new");
+ assert_eq!(v[3], "world");
+
+ let result = js.split_by_pattern_limit(&re, 2);
+
+ let mut v = Vec::with_capacity(result.length() as usize);
+ result.for_each(&mut |x, _, _| v.push(x));
+
+ assert_eq!(result.length(), 2);
+ assert_eq!(v[0], "Oh");
+ assert_eq!(v[1], "brave");
+}
+
+#[wasm_bindgen_test]
+fn starts_with() {
+ let js = JsString::from("To be, or not to be, that is the question.");
+
+ // TODO: remove second parameter for both assertions once we have optional parameters
+ assert!(js.starts_with("To be", 0));
+ assert!(!js.starts_with("not to be", 0));
+ assert!(js.starts_with("not to be", 10));
+}
+
+#[wasm_bindgen_test]
+fn substring() {
+ let js = JsString::from("Mozilla");
+
+ assert_eq!(js.substring(0, 1), "M");
+ assert_eq!(js.substring(1, 0), "M");
+
+ assert_eq!(js.substring(0, 6), "Mozill");
+
+ // TODO: Add test once we have optional parameters
+ // assert_eq!(js.substring(4), "lla");
+ assert_eq!(js.substring(4, 7), "lla");
+ assert_eq!(js.substring(7, 4), "lla");
+
+ assert_eq!(js.substring(0, 7), "Mozilla");
+ assert_eq!(js.substring(0, 10), "Mozilla");
+}
+
+#[wasm_bindgen_test]
+fn substr() {
+ let js = JsString::from("Mozilla");
+
+ assert_eq!(js.substr(0, 1), "M");
+ assert_eq!(js.substr(1, 0), "");
+ assert_eq!(js.substr(-1, 1), "a");
+ assert_eq!(js.substr(1, -1), "");
+ // TODO: Uncomment and test these assertions, once we have support for optional parameters
+ // assert_eq!(js.substr(-3), "lla");
+ // assert_eq!(js.substr(1), "ozilla");
+ assert_eq!(js.substr(-20, 2), "Mo");
+ assert_eq!(js.substr(20, 2), "");
+}
+
+#[wasm_bindgen_test]
+fn to_locale_lower_case() {
+ let js = JsString::from("Mozilla");
+ assert_eq!(js.to_locale_lower_case(None), "mozilla");
+ let s = JsString::from("\u{0130}");
+ assert_eq!(s.to_locale_lower_case(Some("tr".into())), "i");
+ assert_ne!(s.to_locale_lower_case(Some("en-US".into())), "i");
+}
+
+#[wasm_bindgen_test]
+fn to_locale_upper_case() {
+ let js = JsString::from("mozilla");
+ assert_eq!(js.to_locale_upper_case(None), "MOZILLA");
+ let s = JsString::from("i\u{0307}");
+ assert_eq!(s.to_locale_upper_case(Some("lt".into())), "I");
+ assert_ne!(s.to_locale_upper_case(Some("en-US".into())), "I");
+}
+
+#[wasm_bindgen_test]
+fn to_lower_case() {
+ assert_eq!(JsString::from("Mozilla").to_lower_case(), "mozilla");
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ assert_eq!(JsString::from("foo").to_string(), "foo");
+}
+
+#[wasm_bindgen_test]
+fn to_upper_case() {
+ assert_eq!(JsString::from("Mozilla").to_upper_case(), "MOZILLA");
+}
+
+#[wasm_bindgen_test]
+fn trim() {
+ assert_eq!(JsString::from(" foo ").trim(), "foo");
+ // Another example of .trim() removing whitespace from just one side.
+ assert_eq!(JsString::from("foo ").trim(), "foo");
+}
+
+#[wasm_bindgen_test]
+fn trim_end_and_trim_right() {
+ let greeting = JsString::from(" Hello world! ");
+ let trimmed = " Hello world!";
+ assert_eq!(greeting.trim_end(), trimmed);
+ assert_eq!(greeting.trim_right(), trimmed);
+}
+
+#[wasm_bindgen_test]
+fn trim_start_and_trim_left() {
+ let greeting = JsString::from(" Hello world! ");
+ let trimmed = "Hello world! ";
+ assert_eq!(greeting.trim_start(), trimmed);
+ assert_eq!(greeting.trim_left(), trimmed);
+}
+
+#[wasm_bindgen_test]
+fn value_of() {
+ let greeting = JsString::from("Hello world!");
+ assert_eq!(greeting.value_of(), "Hello world!");
+}
+
+#[wasm_bindgen_test]
+fn raw() {
+ let call_site = Object::new();
+ let raw = Array::of3(&"foo".into(), &"bar".into(), &"123".into());
+ Reflect::set(&call_site.as_ref(), &"raw".into(), &raw.into()).unwrap();
+ assert_eq!(
+ JsString::raw_2(&call_site, "5", "JavaScript").unwrap(),
+ "foo5barJavaScript123"
+ );
+ let substitutions = Array::of2(&"5".into(), &"JavaScript".into());
+ assert_eq!(
+ JsString::raw(&call_site, &substitutions).unwrap(),
+ "foo5barJavaScript123"
+ );
+ assert!(JsString::raw_0(&JsValue::null().unchecked_into()).is_err());
+}
+
+#[wasm_bindgen_test]
+fn is_valid_utf16() {
+ assert!(JsString::from("a").is_valid_utf16());
+ assert!(JsString::from("").is_valid_utf16());
+ assert!(JsString::from("🥑").is_valid_utf16());
+ assert!(JsString::from("Why hello there this, 🥑, is 🥑 and is 🥑").is_valid_utf16());
+
+ assert!(JsString::from_char_code1(0x00).is_valid_utf16());
+ assert!(!JsString::from_char_code1(0xd800).is_valid_utf16());
+ assert!(!JsString::from_char_code1(0xdc00).is_valid_utf16());
+}
+
+#[wasm_bindgen_test]
+fn as_char() {
+ assert_eq!(JsString::from('a').as_char(), Some('a'));
+ assert_eq!(JsString::from('🥑').as_char(), Some('🥑'));
+ assert_eq!(JsString::from("").as_char(), None);
+ assert_eq!(JsString::from("ab").as_char(), None);
+ assert_eq!(JsString::from_char_code1(0xd800).as_char(), None);
+ assert_eq!(JsString::from_char_code1(0xdc00).as_char(), None);
+ assert_eq!(JsString::from_char_code1(0xdfff).as_char(), None);
+}
diff --git a/vendor/js-sys/tests/wasm/Map.rs b/vendor/js-sys/tests/wasm/Map.rs
new file mode 100644
index 000000000..8223c6e70
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Map.rs
@@ -0,0 +1,97 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn clear() {
+ let map = Map::new();
+ map.set(&"foo".into(), &"bar".into());
+ map.set(&"bar".into(), &"baz".into());
+ assert_eq!(map.size(), 2);
+ map.clear();
+ assert_eq!(map.size(), 0);
+ map.clear();
+ assert_eq!(map.size(), 0);
+}
+
+#[wasm_bindgen_test]
+fn delete() {
+ let map = Map::new();
+ map.set(&"foo".into(), &"bar".into());
+ assert_eq!(map.size(), 1);
+ assert_eq!(map.delete(&"foo".into()), true);
+ assert_eq!(map.delete(&"bar".into()), false);
+ assert_eq!(map.size(), 0);
+}
+
+#[wasm_bindgen_test]
+fn for_each() {
+ let map = Map::new();
+ map.set(&1.into(), &true.into());
+ map.set(&2.into(), &false.into());
+ map.set(&3.into(), &"awoo".into());
+ map.set(&4.into(), &100.into());
+ map.set(&5.into(), &Array::new().into());
+ map.set(&6.into(), &Object::new().into());
+
+ let mut res = Vec::new();
+ map.for_each(&mut |value, key| {
+ if value.as_bool().is_some() {
+ res.push((key, value));
+ }
+ });
+
+ assert_eq!(map.size(), 6);
+ assert_eq!(res.len(), 2);
+ assert_eq!(res[0].0, 1);
+ assert_eq!(res[0].1, true);
+ assert_eq!(res[1].0, 2);
+ assert_eq!(res[1].1, false);
+}
+
+#[wasm_bindgen_test]
+fn get() {
+ let map = Map::new();
+ map.set(&"foo".into(), &"bar".into());
+ map.set(&1.into(), &2.into());
+ assert_eq!(map.get(&"foo".into()), "bar");
+ assert_eq!(map.get(&1.into()), 2);
+ assert!(map.get(&2.into()).is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn has() {
+ let map = Map::new();
+ map.set(&"foo".into(), &"bar".into());
+ assert_eq!(map.has(&"foo".into()), true);
+ assert_eq!(map.has(&"bar".into()), false);
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ assert_eq!(Map::new().size(), 0);
+}
+
+#[wasm_bindgen_test]
+fn set() {
+ let map = Map::new();
+ let new = map.set(&"foo".into(), &"bar".into());
+ assert_eq!(map.has(&"foo".into()), true);
+ assert_eq!(new.has(&"foo".into()), true);
+}
+
+#[wasm_bindgen_test]
+fn size() {
+ let map = Map::new();
+ map.set(&"foo".into(), &"bar".into());
+ map.set(&"bar".into(), &"baz".into());
+ assert_eq!(map.size(), 2);
+}
+
+#[wasm_bindgen_test]
+fn map_inheritance() {
+ let map = Map::new();
+ assert!(map.is_instance_of::<Map>());
+ assert!(map.is_instance_of::<Object>());
+ let _: &Object = map.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/MapIterator.rs b/vendor/js-sys/tests/wasm/MapIterator.rs
new file mode 100644
index 000000000..6a6eec391
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/MapIterator.rs
@@ -0,0 +1,52 @@
+use js_sys::*;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn entries() {
+ let map = Map::new();
+ map.set(&"uno".into(), &1.into());
+
+ let entries = map.entries();
+
+ let next = entries.next().unwrap();
+ assert_eq!(next.done(), false);
+ assert!(next.value().is_object());
+ assert_eq!(Reflect::get(&next.value(), &0.into()).unwrap(), "uno");
+ assert_eq!(Reflect::get(&next.value(), &1.into()).unwrap(), 1);
+
+ let next = entries.next().unwrap();
+ assert!(next.done());
+ assert!(next.value().is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn keys() {
+ let map = Map::new();
+ map.set(&"uno".into(), &1.into());
+
+ let keys = map.keys();
+
+ let next = keys.next().unwrap();
+ assert_eq!(next.done(), false);
+ assert_eq!(next.value(), "uno");
+
+ let next = keys.next().unwrap();
+ assert!(next.done());
+ assert!(next.value().is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn values() {
+ let map = Map::new();
+ map.set(&"uno".into(), &1.into());
+
+ let values = map.values();
+
+ let next = values.next().unwrap();
+ assert_eq!(next.done(), false);
+ assert_eq!(next.value(), 1);
+
+ let next = values.next().unwrap();
+ assert!(next.done());
+ assert!(next.value().is_undefined());
+}
diff --git a/vendor/js-sys/tests/wasm/Math.rs b/vendor/js-sys/tests/wasm/Math.rs
new file mode 100644
index 000000000..95b70b5c0
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Math.rs
@@ -0,0 +1,271 @@
+use std::f64::consts::PI;
+use std::f64::{NAN, NEG_INFINITY};
+
+use js_sys::*;
+use wasm_bindgen_test::*;
+
+macro_rules! assert_eq {
+ ($a:expr, $b:expr) => {{
+ let (a, b) = (&$a, &$b);
+ if f64::is_infinite(*a) && f64::is_infinite(*b) {
+ assert!(a == b);
+ } else {
+ assert!(
+ (*a - *b).abs() < 1.0e-6,
+ "not approximately equal {:?} ?= {:?}",
+ a,
+ b
+ );
+ }
+ }};
+}
+
+#[wasm_bindgen_test]
+fn abs() {
+ assert_eq!(Math::abs(-32.), 32.);
+ assert_eq!(Math::abs(-32.), 32.);
+ assert_eq!(Math::abs(-4.7), 4.7);
+}
+
+#[wasm_bindgen_test]
+fn acos() {
+ assert_eq!(Math::acos(-1.), PI);
+ assert_eq!(Math::acos(0.5), 1.0471975511965979);
+ assert!(Math::acos(2.).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn acosh() {
+ assert_eq!(Math::acosh(1.), 0.);
+ assert_eq!(Math::acosh(2.), 2.0f64.acosh());
+ assert!(Math::acosh(0.5).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn asin() {
+ assert_eq!(Math::asin(1.), 1.0f64.asin());
+ assert_eq!(Math::asin(0.5), 0.5f64.asin());
+ assert!(Math::asin(2.).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn asinh() {
+ assert_eq!(Math::asinh(1.0), 1f64.asinh());
+ assert_eq!(Math::asinh(0.5), 0.5f64.asinh());
+}
+
+#[wasm_bindgen_test]
+fn atan() {
+ assert_eq!(Math::atan(1.0), 1f64.atan());
+ assert_eq!(Math::atan(0.5), 0.5f64.atan());
+}
+
+#[wasm_bindgen_test]
+fn atan2() {
+ assert_eq!(Math::atan2(1.0, 2.0), 1f64.atan2(2.));
+ assert_eq!(Math::atan2(0.7, 3.8), 0.7f64.atan2(3.8f64));
+}
+
+#[wasm_bindgen_test]
+fn atanh() {
+ assert_eq!(Math::atanh(1.), 1f64.atanh());
+ assert_eq!(Math::atanh(0.5), 0.5f64.atanh());
+ assert!(Math::atanh(2.).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn cbrt() {
+ assert_eq!(Math::cbrt(27.), 3.);
+ assert_eq!(Math::cbrt(12.3), 12.3f64.cbrt());
+}
+
+#[wasm_bindgen_test]
+fn ceil() {
+ assert_eq!(Math::ceil(1.1), 2.);
+ assert_eq!(Math::ceil(-1.1), -1.);
+}
+
+#[wasm_bindgen_test]
+fn clz32() {
+ assert!(Math::clz32(1) == 31);
+ assert!(Math::clz32(1000) == 22);
+}
+
+#[wasm_bindgen_test]
+fn cos() {
+ assert_eq!(Math::cos(0.0), 1.);
+ assert_eq!(Math::cos(1.5), 1.5f64.cos());
+}
+
+#[wasm_bindgen_test]
+fn cosh() {
+ assert_eq!(Math::cosh(0.), 1.);
+ assert_eq!(Math::cosh(2.), 3.7621956910836314);
+}
+
+#[wasm_bindgen_test]
+fn exp() {
+ assert_eq!(Math::exp(0.), 1.);
+ assert_eq!(Math::exp(-1.), 0.36787944117144233);
+ assert_eq!(Math::exp(2.), 7.38905609893065);
+}
+
+#[wasm_bindgen_test]
+fn expm1() {
+ assert_eq!(Math::expm1(0.), 0.);
+ assert_eq!(Math::expm1(1.), 1.718281828459045);
+ assert_eq!(Math::expm1(-1.), -0.6321205588285577);
+ assert_eq!(Math::expm1(2.), 6.38905609893065);
+}
+
+#[wasm_bindgen_test]
+fn floor() {
+ assert_eq!(Math::floor(5.95), 5.);
+ assert_eq!(Math::floor(-5.05), -6.);
+}
+
+#[wasm_bindgen_test]
+fn fround() {
+ assert!(Math::fround(5.5) == 5.5);
+ assert!(Math::fround(5.05) == 5.050000190734863);
+ assert!(Math::fround(5.) == 5.);
+ assert!(Math::fround(-5.05) == -5.050000190734863);
+}
+
+#[wasm_bindgen_test]
+fn hypot() {
+ assert!(Math::hypot(3., 4.) == 5.);
+ assert!(Math::hypot(3.9, 5.2) == 6.5);
+ assert!(Math::hypot(6., 8.) == 10.);
+ assert!(Math::hypot(7., 24.) == 25.);
+}
+
+#[wasm_bindgen_test]
+fn imul() {
+ assert!(Math::imul(3, 4) == 12);
+ assert!(Math::imul(-5, 12) == -60);
+ assert!(Math::imul(0xffffffffu32 as i32, 5) == 0xffffffffu32.wrapping_mul(5) as i32);
+}
+
+#[wasm_bindgen_test]
+fn log() {
+ assert_eq!(Math::log(8.) / Math::log(2.), 3.);
+ assert_eq!(Math::log(625.) / Math::log(5.), 4.);
+}
+
+#[wasm_bindgen_test]
+fn log10() {
+ assert_eq!(Math::log10(100000.), 5.);
+ assert_eq!(Math::log10(1.), 0.);
+ assert_eq!(Math::log10(2.), 0.3010299956639812);
+}
+
+#[wasm_bindgen_test]
+fn log1p() {
+ assert_eq!(Math::log1p(1.), 0.6931471805599453);
+ assert_eq!(Math::log1p(0.), 0.);
+ assert_eq!(Math::log1p(-1.), NEG_INFINITY);
+ assert!(Math::log1p(-2.).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn log2() {
+ assert_eq!(Math::log2(3.), 1.584962500721156);
+ assert_eq!(Math::log2(2.), 1.);
+ assert_eq!(Math::log2(1.), 0.);
+ assert_eq!(Math::log2(0.), NEG_INFINITY);
+}
+
+#[wasm_bindgen_test]
+fn max() {
+ assert_eq!(Math::max(3., 1.), 3.);
+ assert_eq!(Math::max(-3., 1.), 1.);
+ assert_eq!(Math::max(9913., 43.4), 9913.);
+ assert_eq!(Math::max(-27., -43.), -27.);
+ assert_eq!(Math::max(-423.27, -43.1), -43.1);
+}
+
+#[wasm_bindgen_test]
+fn min() {
+ assert_eq!(Math::min(3., 1.), 1.);
+ assert_eq!(Math::min(-3., 1.), -3.);
+ assert_eq!(Math::min(9913., 43.4), 43.4);
+ assert_eq!(Math::min(-27., -43.), -43.);
+ assert_eq!(Math::min(-423.27, -43.1), -423.27);
+}
+
+#[wasm_bindgen_test]
+fn pow() {
+ assert_eq!(Math::pow(7., 2.), 49.);
+ assert_eq!(Math::pow(3.8, 0.5), 3.8f64.powf(0.5f64));
+ assert!(Math::pow(-2., 0.5).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn random() {
+ assert!(Math::random() < 1.);
+ assert!(Math::random() >= 0.);
+}
+
+#[wasm_bindgen_test]
+fn round() {
+ assert_eq!(Math::round(20.49), 20.);
+ assert_eq!(Math::round(20.5), 21.);
+ assert_eq!(Math::round(42.), 42.);
+ assert_eq!(Math::round(-20.5), -20.);
+ assert_eq!(Math::round(-20.51), -21.);
+}
+
+#[wasm_bindgen_test]
+fn sign() {
+ assert_eq!(Math::sign(3.), 1.);
+ assert_eq!(Math::sign(-3.), -1.);
+ assert_eq!(Math::sign(2.3), 1.);
+ assert_eq!(Math::sign(0.), 0.);
+ assert!(Math::sign(NAN).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn sin() {
+ assert_eq!(Math::sin(0.), 0.);
+ assert_eq!(Math::sin(1.), 1f64.sin());
+ assert_eq!(Math::sin(PI / 2.), 1.);
+}
+
+#[wasm_bindgen_test]
+fn sinh() {
+ assert_eq!(Math::sinh(0.), 0.);
+ assert_eq!(Math::sinh(1.), 1f64.sinh());
+ assert_eq!(Math::sinh(2.3), 2.3f64.sinh());
+}
+
+#[wasm_bindgen_test]
+fn sqrt() {
+ assert_eq!(Math::sqrt(9.), 3.);
+ assert_eq!(Math::sqrt(2.), 2f64.sqrt());
+ assert_eq!(Math::sqrt(42.42), 42.42f64.sqrt());
+ assert_eq!(Math::sqrt(1.), 1.);
+ assert!(Math::sqrt(-1.).is_nan());
+}
+
+#[wasm_bindgen_test]
+fn tan() {
+ assert_eq!(Math::tan(0.), 0.);
+ assert_eq!(Math::tan(1.), 1f64.tan());
+ assert_eq!(Math::tan(0.5), 0.5f64.tan());
+}
+
+#[wasm_bindgen_test]
+fn tanh() {
+ assert_eq!(Math::tanh(0.), 0.);
+ assert_eq!(Math::tanh(1.), 1f64.tanh());
+ assert_eq!(Math::tanh(0.5), 0.5f64.tanh());
+}
+
+#[wasm_bindgen_test]
+fn trunc() {
+ assert_eq!(Math::trunc(13.37), 13.);
+ assert_eq!(Math::trunc(42.84), 42.);
+ assert_eq!(Math::trunc(0.123), 0.);
+ assert_eq!(Math::trunc(-0.123), 0.);
+}
diff --git a/vendor/js-sys/tests/wasm/Number.js b/vendor/js-sys/tests/wasm/Number.js
new file mode 100644
index 000000000..c3258885a
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Number.js
@@ -0,0 +1,22 @@
+
+exports.const_epsilon = function() {
+ return Number.EPSILON;
+};
+exports.const_max_safe_integer = function() {
+ return Number.MAX_SAFE_INTEGER;
+};
+exports.const_max_value = function() {
+ return Number.MAX_VALUE;
+};
+exports.const_min_safe_integer = function() {
+ return Number.MIN_SAFE_INTEGER;
+};
+exports.const_min_value = function() {
+ return Number.MIN_VALUE;
+};
+exports.const_negative_infinity = function() {
+ return Number.NEGATIVE_INFINITY;
+};
+exports.const_positive_infinity = function() {
+ return Number.POSITIVE_INFINITY;
+};
diff --git a/vendor/js-sys/tests/wasm/Number.rs b/vendor/js-sys/tests/wasm/Number.rs
new file mode 100644
index 000000000..6c3416eda
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Number.rs
@@ -0,0 +1,158 @@
+use std::f64::{INFINITY, NAN};
+
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Number.js")]
+extern "C" {
+ fn const_epsilon() -> f64;
+ fn const_max_safe_integer() -> f64;
+ fn const_max_value() -> f64;
+ fn const_min_safe_integer() -> f64;
+ fn const_min_value() -> f64;
+ fn const_negative_infinity() -> f64;
+ fn const_positive_infinity() -> f64;
+}
+
+#[wasm_bindgen_test]
+fn is_finite() {
+ assert!(Number::is_finite(&42.into()));
+ assert!(Number::is_finite(&42.1.into()));
+ assert!(!Number::is_finite(&"42".into()));
+ assert!(!Number::is_finite(&NAN.into()));
+ assert!(!Number::is_finite(&INFINITY.into()));
+}
+
+#[wasm_bindgen_test]
+fn is_integer() {
+ assert!(Number::is_integer(&42.into()));
+ assert!(!Number::is_integer(&42.1.into()));
+}
+
+#[wasm_bindgen_test]
+fn is_nan() {
+ assert!(Number::is_nan(&NAN.into()));
+
+ assert!(!Number::is_nan(&JsValue::TRUE));
+ assert!(!Number::is_nan(&JsValue::NULL));
+ assert!(!Number::is_nan(&37.into()));
+ assert!(!Number::is_nan(&"37".into()));
+ assert!(!Number::is_nan(&"37.37".into()));
+ assert!(!Number::is_nan(&"".into()));
+ assert!(!Number::is_nan(&" ".into()));
+
+ // These would all return true with the global isNaN()
+ assert!(!Number::is_nan(&"NaN".into()));
+ assert!(!Number::is_nan(&JsValue::UNDEFINED));
+ assert!(!Number::is_nan(&"blabla".into()));
+}
+
+#[wasm_bindgen_test]
+fn is_safe_integer() {
+ assert_eq!(Number::is_safe_integer(&42.into()), true);
+ assert_eq!(
+ Number::is_safe_integer(&(Math::pow(2., 53.) - 1.).into()),
+ true
+ );
+ assert_eq!(Number::is_safe_integer(&Math::pow(2., 53.).into()), false);
+ assert_eq!(Number::is_safe_integer(&"42".into()), false);
+ assert_eq!(Number::is_safe_integer(&42.1.into()), false);
+ assert_eq!(Number::is_safe_integer(&NAN.into()), false);
+ assert_eq!(Number::is_safe_integer(&INFINITY.into()), false);
+}
+
+#[allow(deprecated)]
+#[wasm_bindgen_test]
+fn new() {
+ let n = Number::new(&JsValue::from(42));
+ let v = JsValue::from(n);
+ assert!(v.is_object());
+ assert_eq!(Number::from(v).value_of(), 42.);
+}
+
+#[wasm_bindgen_test]
+fn parse_int_float() {
+ assert_eq!(Number::parse_int("42", 10), 42.);
+ assert_eq!(Number::parse_int("42", 16), 66.); // 0x42 == 66
+ assert!(Number::parse_int("invalid int", 10).is_nan());
+
+ assert_eq!(Number::parse_float("123456.789"), 123456.789);
+ assert!(Number::parse_float("invalid float").is_nan());
+}
+
+#[wasm_bindgen_test]
+fn to_locale_string() {
+ let number = Number::from(1234.45);
+ assert_eq!(number.to_locale_string("en-US"), "1,234.45");
+ // TODO: these tests seems to be system dependent, disable for now
+ // assert_eq!(wasm.to_locale_string(number, "de-DE"), "1,234.45");
+ // assert_eq!(wasm.to_locale_string(number, "zh-Hans-CN-u-nu-hanidec"), "1,234.45");
+}
+
+#[wasm_bindgen_test]
+fn to_precision() {
+ assert_eq!(Number::from(0.1).to_precision(3).unwrap(), "0.100");
+ assert!(Number::from(10).to_precision(101).is_err());
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ assert_eq!(Number::from(42).to_string(10).unwrap(), "42");
+ assert_eq!(Number::from(233).to_string(16).unwrap(), "e9");
+ assert!(Number::from(100).to_string(100).is_err());
+}
+
+#[wasm_bindgen_test]
+fn value_of() {
+ assert_eq!(Number::from(42).value_of(), 42.);
+}
+
+#[wasm_bindgen_test]
+fn to_fixed() {
+ assert_eq!(Number::from(123.456).to_fixed(2).unwrap(), "123.46");
+ assert!(Number::from(10).to_fixed(101).is_err());
+}
+
+#[wasm_bindgen_test]
+fn to_exponential() {
+ assert_eq!(Number::from(123456).to_exponential(2).unwrap(), "1.23e+5");
+ assert!(Number::from(10).to_exponential(101).is_err());
+}
+
+#[allow(deprecated)]
+#[wasm_bindgen_test]
+fn number_inheritance() {
+ let n = Number::new(&JsValue::from(42));
+ assert!(n.is_instance_of::<Number>());
+ assert!(n.is_instance_of::<Object>());
+ let _: &Object = n.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn consts() {
+ assert_eq!(const_epsilon(), Number::EPSILON, "EPSILON");
+ assert_eq!(
+ const_max_safe_integer(),
+ Number::MAX_SAFE_INTEGER,
+ "MAX_SAFE_INTEGER"
+ );
+ assert_eq!(const_max_value(), Number::MAX_VALUE, "MAX_VALUE");
+ assert_eq!(
+ const_min_safe_integer(),
+ Number::MIN_SAFE_INTEGER,
+ "MIN_SAFE_INTEGER"
+ );
+ assert_eq!(const_min_value(), Number::MIN_VALUE, "MIN_VALUE");
+ assert_eq!(
+ const_negative_infinity(),
+ Number::NEGATIVE_INFINITY,
+ "NEGATIVE_INFINITY"
+ );
+ assert_eq!(
+ const_positive_infinity(),
+ Number::POSITIVE_INFINITY,
+ "POSITIVE_INFINITY"
+ );
+}
diff --git a/vendor/js-sys/tests/wasm/Object.js b/vendor/js-sys/tests/wasm/Object.js
new file mode 100644
index 000000000..3f82fc9b7
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Object.js
@@ -0,0 +1,11 @@
+const symbol_key = Symbol();
+
+exports.map_with_symbol_key = function() {
+ return { [symbol_key]: 42 };
+};
+exports.symbol_key = function() {
+ return symbol_key;
+};
+
+exports.Foo = class {};
+exports.Bar = class {};
diff --git a/vendor/js-sys/tests/wasm/Object.rs b/vendor/js-sys/tests/wasm/Object.rs
new file mode 100644
index 000000000..4f1ade972
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Object.rs
@@ -0,0 +1,304 @@
+use js_sys::*;
+use std::f64::NAN;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen]
+extern "C" {
+ type Foo42;
+ #[wasm_bindgen(method, setter, structural)]
+ fn set_foo(this: &Foo42, val: JsValue);
+
+ #[wasm_bindgen(js_name = prototype, js_namespace = Object)]
+ static OBJECT_PROTOTYPE: JsValue;
+ #[wasm_bindgen(js_name = prototype, js_namespace = Array)]
+ static ARRAY_PROTOTYPE: JsValue;
+
+ type DefinePropertyAttrs;
+ #[wasm_bindgen(method, setter, structural)]
+ fn set_value(this: &DefinePropertyAttrs, val: &JsValue);
+
+ type PropertyDescriptor;
+ #[wasm_bindgen(method, getter, structural)]
+ fn value(this: &PropertyDescriptor) -> JsValue;
+}
+
+#[wasm_bindgen(module = "tests/wasm/Object.js")]
+extern "C" {
+ fn map_with_symbol_key() -> Object;
+ fn symbol_key() -> JsValue;
+
+ type Foo;
+ #[wasm_bindgen(constructor)]
+ fn new() -> Foo;
+
+ #[wasm_bindgen(js_name = prototype, js_namespace = Foo)]
+ static FOO_PROTOTYPE: Object;
+ #[wasm_bindgen(js_name = prototype, js_namespace = Bar)]
+ static BAR_PROTOTYPE: Object;
+}
+
+fn foo_42() -> Object {
+ let foo = Foo42::from(JsValue::from(Object::new()));
+ foo.set_foo(42.into());
+ JsValue::from(foo).into()
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ assert!(JsValue::from(Object::new()).is_object());
+}
+
+#[wasm_bindgen_test]
+fn assign() {
+ let a = JsValue::from("a");
+ let b = JsValue::from("b");
+ let c = JsValue::from("c");
+
+ let target = Object::new();
+ Reflect::set(target.as_ref(), a.as_ref(), a.as_ref()).unwrap();
+
+ let src1 = Object::new();
+ Reflect::set(src1.as_ref(), &a, &c).unwrap();
+
+ let src2 = Object::new();
+ Reflect::set(src2.as_ref(), &b, &b).unwrap();
+
+ let src3 = Object::new();
+ Reflect::set(src3.as_ref(), &c, &c).unwrap();
+
+ let res = Object::assign3(&target, &src1, &src2, &src3);
+
+ assert!(Object::is(target.as_ref(), res.as_ref()));
+ assert_eq!(Reflect::get(target.as_ref(), &a).unwrap(), c);
+ assert_eq!(Reflect::get(target.as_ref(), &b).unwrap(), b);
+ assert_eq!(Reflect::get(target.as_ref(), &c).unwrap(), c);
+}
+
+#[wasm_bindgen_test]
+fn create() {
+ let array_proto = eval("Array.prototype")
+ .unwrap()
+ .dyn_into::<Object>()
+ .unwrap();
+ let my_array = Object::create(&array_proto);
+ assert!(my_array.is_instance_of::<Array>());
+}
+
+#[wasm_bindgen_test]
+fn define_property() {
+ let value = DefinePropertyAttrs::from(JsValue::from(Object::new()));
+ value.set_value(&43.into());
+ let descriptor = Object::from(JsValue::from(value));
+ let foo = foo_42();
+ let foo = Object::define_property(&foo, &"bar".into(), &descriptor);
+ assert!(foo.has_own_property(&"bar".into()));
+}
+
+#[wasm_bindgen_test]
+fn define_properties() {
+ let props = Object::new();
+ let descriptor = DefinePropertyAttrs::from(JsValue::from(Object::new()));
+ descriptor.set_value(&42.into());
+ let descriptor = JsValue::from(descriptor);
+ Reflect::set(props.as_ref(), &JsValue::from("bar"), &descriptor).unwrap();
+ Reflect::set(props.as_ref(), &JsValue::from("car"), &descriptor).unwrap();
+ let foo = foo_42();
+ let foo = Object::define_properties(&foo, &props);
+ assert!(foo.has_own_property(&"bar".into()));
+ assert!(foo.has_own_property(&"car".into()));
+}
+
+#[wasm_bindgen_test]
+fn entries() {
+ let entries = Object::entries(&foo_42());
+ assert_eq!(entries.length(), 1);
+ entries.for_each(&mut |x, _, _| {
+ assert!(x.is_object());
+ let array: Array = x.into();
+ assert_eq!(array.shift(), "foo");
+ assert_eq!(array.shift(), 42);
+ assert_eq!(array.length(), 0);
+ });
+}
+
+#[wasm_bindgen_test]
+fn from_entries() {
+ let array = Array::new();
+ let entry_one = Array::new();
+ let entry_two = Array::new();
+ entry_one.push(&"foo".into());
+ entry_one.push(&"bar".into());
+ entry_two.push(&"baz".into());
+ entry_two.push(&42.into());
+ array.push(&entry_one);
+ array.push(&entry_two);
+ let object = Object::from_entries(&array).unwrap();
+
+ assert_eq!(Reflect::get(object.as_ref(), &"foo".into()).unwrap(), "bar");
+ assert_eq!(Reflect::get(object.as_ref(), &"baz".into()).unwrap(), 42);
+
+ let not_iterable = Object::new();
+ let error = Object::from_entries(&not_iterable).unwrap_err();
+ assert!(error.is_instance_of::<TypeError>());
+}
+
+#[wasm_bindgen_test]
+fn get_own_property_descriptor() {
+ let foo = foo_42();
+ let desc = Object::get_own_property_descriptor(&foo, &"foo".into());
+ assert_eq!(PropertyDescriptor::from(desc).value(), 42);
+ let desc = Object::get_own_property_descriptor(&foo, &"bar".into());
+ assert!(desc.is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn get_own_property_descriptors() {
+ let foo = foo_42();
+ let descriptors = Object::get_own_property_descriptors(&foo);
+ let foo_desc = Reflect::get(&descriptors, &"foo".into()).unwrap();
+ assert_eq!(PropertyDescriptor::from(foo_desc).value(), 42);
+}
+
+#[wasm_bindgen_test]
+fn get_own_property_names() {
+ let names = Object::get_own_property_names(&foo_42());
+ assert_eq!(names.length(), 1);
+ names.for_each(&mut |x, _, _| {
+ assert_eq!(x, "foo");
+ });
+}
+
+#[wasm_bindgen_test]
+fn get_own_property_symbols() {
+ let symbols = Object::get_own_property_symbols(&map_with_symbol_key());
+ assert_eq!(symbols.length(), 1);
+}
+
+#[wasm_bindgen_test]
+fn get_prototype_of() {
+ let proto = JsValue::from(Object::get_prototype_of(&Object::new().into()));
+ assert_eq!(proto, *OBJECT_PROTOTYPE);
+ let proto = JsValue::from(Object::get_prototype_of(&Array::new().into()));
+ assert_eq!(proto, *ARRAY_PROTOTYPE);
+}
+
+#[wasm_bindgen_test]
+fn has_own_property() {
+ assert!(foo_42().has_own_property(&"foo".into()));
+ assert!(!foo_42().has_own_property(&"bar".into()));
+ assert!(map_with_symbol_key().has_own_property(&symbol_key()));
+}
+
+#[wasm_bindgen_test]
+fn has_own() {
+ assert!(Object::has_own(&foo_42(), &"foo".into()));
+ assert!(!Object::has_own(&foo_42(), &"bar".into()));
+ assert!(Object::has_own(&map_with_symbol_key(), &symbol_key()));
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ assert_eq!(Object::new().to_string(), "[object Object]");
+ assert_eq!(foo_42().to_string(), "[object Object]");
+}
+
+#[wasm_bindgen_test]
+fn is() {
+ let object = JsValue::from(Object::new());
+ assert!(Object::is(&object, &object));
+ assert!(Object::is(&JsValue::undefined(), &JsValue::undefined()));
+ assert!(Object::is(&JsValue::null(), &JsValue::null()));
+ assert!(Object::is(&JsValue::TRUE, &JsValue::TRUE));
+ assert!(Object::is(&JsValue::FALSE, &JsValue::FALSE));
+ assert!(Object::is(&"foo".into(), &"foo".into()));
+ assert!(Object::is(&JsValue::from(42), &JsValue::from(42)));
+ assert!(Object::is(&JsValue::from(NAN), &JsValue::from(NAN)));
+
+ let another_object = JsValue::from(Object::new());
+ assert!(!Object::is(&object, &another_object));
+ assert!(!Object::is(&JsValue::TRUE, &JsValue::FALSE));
+ assert!(!Object::is(&"foo".into(), &"bar".into()));
+ assert!(!Object::is(&JsValue::from(23), &JsValue::from(42)));
+}
+
+#[wasm_bindgen_test]
+fn is_extensible() {
+ let object = Object::new();
+ assert!(Object::is_extensible(&object));
+ Object::prevent_extensions(&object);
+ assert!(!Object::is_extensible(&object));
+}
+
+#[wasm_bindgen_test]
+fn is_frozen() {
+ let object = Object::new();
+ assert!(!Object::is_frozen(&object));
+ Object::freeze(&object);
+ assert!(Object::is_frozen(&object));
+}
+
+#[wasm_bindgen_test]
+fn is_sealed() {
+ let object = Object::new();
+ assert!(!Object::is_sealed(&object));
+ Object::seal(&object);
+ assert!(Object::is_sealed(&object));
+}
+
+#[wasm_bindgen_test]
+fn is_prototype_of() {
+ let foo = JsValue::from(Foo::new());
+ assert!(FOO_PROTOTYPE.is_prototype_of(&foo));
+ assert!(!BAR_PROTOTYPE.is_prototype_of(&foo));
+}
+
+#[wasm_bindgen_test]
+fn keys() {
+ let keys = Object::keys(&foo_42());
+ assert_eq!(keys.length(), 1);
+ keys.for_each(&mut |x, _, _| {
+ assert_eq!(x, "foo");
+ });
+}
+
+#[wasm_bindgen_test]
+fn values() {
+ let values = Object::values(&foo_42());
+ assert_eq!(values.length(), 1);
+ values.for_each(&mut |x, _, _| {
+ assert_eq!(x, 42);
+ });
+}
+
+#[wasm_bindgen_test]
+fn property_is_enumerable() {
+ assert!(foo_42().property_is_enumerable(&"foo".into()));
+ assert!(!foo_42().property_is_enumerable(&42.into()));
+ assert!(!Object::new().property_is_enumerable(&"foo".into()));
+}
+
+#[wasm_bindgen_test]
+fn set_prototype_of() {
+ let a = foo_42();
+ let b = foo_42();
+ Object::set_prototype_of(&a, &b);
+ assert!(b.is_prototype_of(&a.into()));
+}
+
+#[wasm_bindgen_test]
+fn to_locale_string() {
+ assert_eq!(Object::new().to_locale_string(), "[object Object]");
+}
+
+#[wasm_bindgen_test]
+fn value_of() {
+ let a = JsValue::from(foo_42());
+ let b = JsValue::from(foo_42());
+ let a2 = JsValue::from(Object::from(a.clone()).value_of());
+ assert_eq!(a, a);
+ assert_eq!(a, a2);
+ assert_ne!(a, b);
+ assert_ne!(a2, b);
+}
diff --git a/vendor/js-sys/tests/wasm/Promise.rs b/vendor/js-sys/tests/wasm/Promise.rs
new file mode 100644
index 000000000..5502a6156
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Promise.rs
@@ -0,0 +1,11 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn promise_inheritance() {
+ let promise = Promise::new(&mut |_, _| ());
+ assert!(promise.is_instance_of::<Promise>());
+ assert!(promise.is_instance_of::<Object>());
+ let _: &Object = promise.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Proxy.js b/vendor/js-sys/tests/wasm/Proxy.js
new file mode 100644
index 000000000..eb0a12583
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Proxy.js
@@ -0,0 +1,11 @@
+exports.proxy_target = function() {
+ return { a: 100 };
+};
+
+exports.proxy_handler = function() {
+ return {
+ get: function(obj, prop) {
+ return prop in obj ? obj[prop] : 37;
+ }
+ };
+};
diff --git a/vendor/js-sys/tests/wasm/Proxy.rs b/vendor/js-sys/tests/wasm/Proxy.rs
new file mode 100644
index 000000000..3aca98084
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Proxy.rs
@@ -0,0 +1,45 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Proxy.js")]
+extern "C" {
+ fn proxy_target() -> JsValue;
+ fn proxy_handler() -> Object;
+
+ type Custom;
+ #[wasm_bindgen(method, getter, structural, catch)]
+ fn a(this: &Custom) -> Result<u32, JsValue>;
+ #[wasm_bindgen(method, getter, structural, catch)]
+ fn b(this: &Custom) -> Result<u32, JsValue>;
+
+ type RevocableResult;
+ #[wasm_bindgen(method, getter, structural)]
+ fn proxy(this: &RevocableResult) -> JsValue;
+ #[wasm_bindgen(method, getter, structural)]
+ fn revoke(this: &RevocableResult) -> Function;
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ let proxy = Proxy::new(&proxy_target(), &proxy_handler());
+ let proxy = Custom::from(JsValue::from(proxy));
+ assert_eq!(proxy.a().unwrap(), 100);
+ assert_eq!(proxy.b().unwrap(), 37);
+}
+
+#[wasm_bindgen_test]
+fn revocable() {
+ let result = Proxy::revocable(&proxy_target(), &proxy_handler());
+ let result = RevocableResult::from(JsValue::from(result));
+ let proxy = result.proxy();
+ let revoke = result.revoke();
+
+ let obj = Custom::from(proxy);
+ assert_eq!(obj.a().unwrap(), 100);
+ assert_eq!(obj.b().unwrap(), 37);
+ revoke.apply(&JsValue::undefined(), &Array::new()).unwrap();
+ assert!(obj.a().is_err());
+ assert!(obj.b().is_err());
+ assert!(JsValue::from(obj).is_object());
+}
diff --git a/vendor/js-sys/tests/wasm/RangeError.rs b/vendor/js-sys/tests/wasm/RangeError.rs
new file mode 100644
index 000000000..97cd08b2b
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/RangeError.rs
@@ -0,0 +1,17 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn range_error() {
+ let error = RangeError::new("out of range yo");
+ assert!(error.is_instance_of::<RangeError>());
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Error = error.as_ref();
+ let _: &Object = error.as_ref();
+
+ let base: &Error = error.as_ref();
+ assert_eq!(JsValue::from(base.message()), "out of range yo");
+}
diff --git a/vendor/js-sys/tests/wasm/ReferenceError.rs b/vendor/js-sys/tests/wasm/ReferenceError.rs
new file mode 100644
index 000000000..a40f5b165
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/ReferenceError.rs
@@ -0,0 +1,17 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn reference_error() {
+ let error = ReferenceError::new("bad reference, fool");
+ assert!(error.is_instance_of::<ReferenceError>());
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Error = error.as_ref();
+ let _: &Object = error.as_ref();
+
+ let base: &Error = error.as_ref();
+ assert_eq!(JsValue::from(base.message()), "bad reference, fool");
+}
diff --git a/vendor/js-sys/tests/wasm/Reflect.js b/vendor/js-sys/tests/wasm/Reflect.js
new file mode 100644
index 000000000..98169e2e1
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Reflect.js
@@ -0,0 +1,41 @@
+exports.get_char_at = function() {
+ return "foo".charAt;
+};
+
+exports.Rectangle = class {
+ constructor(x, y){
+ this.x = x,
+ this.y = y
+ }
+
+ static eq(x, y) {
+ return x === y;
+ }
+};
+
+exports.Rectangle2 = class {
+ constructor(x, y){
+ this.x = x,
+ this.y = y
+ }
+
+ static eq(x, y) {
+ return x === y;
+ }
+};
+
+exports.throw_all_the_time = () => new Proxy({}, {
+ getPrototypeOf() { throw new Error("nope"); },
+ setPrototypeOf() { throw new Error("nope"); },
+ isExtensible() { throw new Error("nope"); },
+ preventExtensions() { throw new Error("nope"); },
+ getOwnPropertyDescriptor() { throw new Error("nope"); },
+ defineProperty() { throw new Error("nope"); },
+ has() { throw new Error("nope"); },
+ get() { throw new Error("nope"); },
+ set() { throw new Error("nope"); },
+ deleteProperty() { throw new Error("nope"); },
+ ownKeys() { throw new Error("nope"); },
+ apply() { throw new Error("nope"); },
+ construct() { throw new Error("nope"); },
+});
diff --git a/vendor/js-sys/tests/wasm/Reflect.rs b/vendor/js-sys/tests/wasm/Reflect.rs
new file mode 100644
index 000000000..d50629ec1
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Reflect.rs
@@ -0,0 +1,263 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Reflect.js")]
+extern "C" {
+ fn get_char_at() -> Function;
+
+ #[wasm_bindgen(js_name = Rectangle)]
+ static RECTANGLE_CLASS: Function;
+ #[wasm_bindgen(js_name = Rectangle2)]
+ static RECTANGLE2_CLASS: Function;
+
+ #[derive(Clone)]
+ type Rectangle;
+ #[wasm_bindgen(constructor)]
+ fn new() -> Rectangle;
+ #[wasm_bindgen(method, getter, structural)]
+ fn x(this: &Rectangle) -> u32;
+ #[wasm_bindgen(method, getter, structural, js_name = x)]
+ fn x_jsval(this: &Rectangle) -> JsValue;
+ #[wasm_bindgen(method, setter, structural)]
+ fn set_x(this: &Rectangle, x: u32);
+
+ fn throw_all_the_time() -> Object;
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_name = prototype, js_namespace = Object)]
+ static OBJECT_PROTOTYPE: JsValue;
+ #[wasm_bindgen(js_name = prototype, js_namespace = Array)]
+ static ARRAY_PROTOTYPE: JsValue;
+
+ type DefinePropertyAttrs;
+ #[wasm_bindgen(method, setter, structural)]
+ fn set_value(this: &DefinePropertyAttrs, val: &JsValue);
+
+ type PropertyDescriptor;
+ #[wasm_bindgen(method, getter, structural)]
+ fn value(this: &PropertyDescriptor) -> JsValue;
+}
+
+#[wasm_bindgen_test]
+fn apply() {
+ let args = Array::new();
+ args.push(&3.into());
+ assert_eq!(
+ Reflect::apply(&get_char_at(), &"ponies".into(), &args).unwrap(),
+ "i"
+ );
+}
+
+#[wasm_bindgen_test]
+fn construct() {
+ let args = Array::new();
+ args.push(&10.into());
+ args.push(&10.into());
+ let instance = Reflect::construct(&RECTANGLE_CLASS, &args).unwrap();
+ assert_eq!(Rectangle::from(instance).x(), 10);
+}
+
+#[wasm_bindgen_test]
+fn construct_with_new_target() {
+ let args = Array::new();
+ args.push(&10.into());
+ args.push(&10.into());
+ let instance =
+ Reflect::construct_with_new_target(&RECTANGLE_CLASS, &args, &RECTANGLE2_CLASS).unwrap();
+ assert_eq!(Rectangle::from(instance).x(), 10);
+}
+
+#[wasm_bindgen_test]
+fn define_property() {
+ let value = DefinePropertyAttrs::from(JsValue::from(Object::new()));
+ value.set_value(&42.into());
+ let obj = Object::from(JsValue::from(value));
+ assert!(Reflect::define_property(&obj, &"key".into(), &obj).unwrap());
+}
+
+#[wasm_bindgen_test]
+fn delete_property() {
+ let r = Rectangle::new();
+ r.set_x(10);
+
+ let obj = Object::from(JsValue::from(r.clone()));
+ Reflect::delete_property(&obj, &"x".into()).unwrap();
+ assert!(r.x_jsval().is_undefined());
+
+ let array = Array::new();
+ array.push(&1.into());
+ let obj = Object::from(JsValue::from(array));
+ Reflect::delete_property(&obj, &0.into()).unwrap();
+ let array = Array::from(&JsValue::from(obj));
+ assert!(array.length() == 1);
+ array.for_each(&mut |x, _, _| assert!(x.is_undefined()));
+}
+
+#[wasm_bindgen_test]
+fn get() {
+ let r = Rectangle::new();
+ r.set_x(10);
+
+ let obj = JsValue::from(r.clone());
+ assert_eq!(Reflect::get(&obj, &"x".into()).unwrap(), 10);
+}
+
+#[wasm_bindgen_test]
+fn get_f64() {
+ let a = Array::new();
+ assert_eq!(Reflect::get_f64(&a, 0.0).unwrap(), JsValue::UNDEFINED);
+ assert_eq!(a.push(&JsValue::from_str("Hi!")), 1);
+ assert_eq!(Reflect::get_f64(&a, 0.0).unwrap(), JsValue::from_str("Hi!"));
+}
+
+#[wasm_bindgen_test]
+fn get_u32() {
+ let a = Array::new();
+ assert_eq!(Reflect::get_u32(&a, 0).unwrap(), JsValue::UNDEFINED);
+ assert_eq!(a.push(&JsValue::from_str("Hi!")), 1);
+ assert_eq!(Reflect::get_u32(&a, 0).unwrap(), JsValue::from_str("Hi!"));
+}
+
+#[wasm_bindgen_test]
+fn get_own_property_descriptor() {
+ let r = Rectangle::new();
+ r.set_x(10);
+
+ let obj = Object::from(JsValue::from(r.clone()));
+ let desc = Reflect::get_own_property_descriptor(&obj, &"x".into()).unwrap();
+ assert_eq!(PropertyDescriptor::from(desc).value(), 10);
+ let desc = Reflect::get_own_property_descriptor(&obj, &"foo".into()).unwrap();
+ assert!(desc.is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn get_prototype_of() {
+ let proto = JsValue::from(Reflect::get_prototype_of(&Object::new().into()).unwrap());
+ assert_eq!(proto, *OBJECT_PROTOTYPE);
+ let proto = JsValue::from(Reflect::get_prototype_of(&Array::new().into()).unwrap());
+ assert_eq!(proto, *ARRAY_PROTOTYPE);
+}
+
+#[wasm_bindgen_test]
+fn has() {
+ let obj = JsValue::from(Rectangle::new());
+ assert!(Reflect::has(&obj, &"x".into()).unwrap());
+ assert!(!Reflect::has(&obj, &"foo".into()).unwrap());
+}
+
+#[wasm_bindgen_test]
+fn is_extensible() {
+ let obj = Object::from(JsValue::from(Rectangle::new()));
+ assert!(Reflect::is_extensible(&obj).unwrap());
+ Reflect::prevent_extensions(&obj).unwrap();
+ assert!(!Reflect::is_extensible(&obj).unwrap());
+ let obj = Object::seal(&Object::new());
+ assert!(!Reflect::is_extensible(&obj).unwrap());
+}
+
+#[wasm_bindgen_test]
+fn own_keys() {
+ let obj = JsValue::from(Rectangle::new());
+ let keys = Reflect::own_keys(&obj).unwrap();
+ assert!(keys.length() == 2);
+ keys.for_each(&mut |k, _, _| {
+ assert!(k == "x" || k == "y");
+ });
+}
+
+#[wasm_bindgen_test]
+fn prevent_extensions() {
+ let obj = Object::new();
+ Reflect::prevent_extensions(&obj).unwrap();
+ assert!(!Reflect::is_extensible(&obj).unwrap());
+}
+
+#[wasm_bindgen_test]
+fn set() {
+ let obj = JsValue::from(Object::new());
+ assert!(Reflect::set(&obj, &"key".into(), &"value".into()).unwrap());
+ assert_eq!(Reflect::get(&obj, &"key".into()).unwrap(), "value");
+}
+
+#[wasm_bindgen_test]
+fn set_f64() {
+ let a = Array::new();
+ a.push(&JsValue::from_str("Hi!"));
+
+ assert_eq!(Reflect::get_f64(&a, 0.0).unwrap(), JsValue::from_str("Hi!"));
+
+ Reflect::set_f64(&a, 0.0, &JsValue::from_str("Bye!")).unwrap();
+
+ assert_eq!(
+ Reflect::get_f64(&a, 0.0).unwrap(),
+ JsValue::from_str("Bye!")
+ );
+}
+
+#[wasm_bindgen_test]
+fn set_u32() {
+ let a = Array::new();
+ a.push(&JsValue::from_str("Hi!"));
+
+ assert_eq!(Reflect::get_u32(&a, 0).unwrap(), JsValue::from_str("Hi!"));
+
+ Reflect::set_u32(&a, 0, &JsValue::from_str("Bye!")).unwrap();
+
+ assert_eq!(Reflect::get_u32(&a, 0).unwrap(), JsValue::from_str("Bye!"));
+}
+
+#[wasm_bindgen_test]
+fn set_with_receiver() {
+ let obj1 = JsValue::from(Object::new());
+ let obj2 = JsValue::from(Object::new());
+ assert!(Reflect::set_with_receiver(&obj2, &"key".into(), &"value".into(), &obj2).unwrap());
+ assert!(Reflect::get(&obj1, &"key".into()).unwrap().is_undefined());
+ assert_eq!(Reflect::get(&obj2, &"key".into()).unwrap(), "value");
+}
+
+#[wasm_bindgen_test]
+fn set_prototype_of() {
+ let obj = Object::new();
+ assert!(Reflect::set_prototype_of(&obj, &JsValue::null()).unwrap());
+ let obj = JsValue::from(obj);
+ assert_eq!(
+ JsValue::from(Reflect::get_prototype_of(&obj).unwrap()),
+ JsValue::null()
+ );
+}
+
+#[wasm_bindgen_test]
+fn reflect_bindings_handle_proxies_that_just_throw_for_everything() {
+ let p = throw_all_the_time();
+
+ let desc = Object::new();
+ Reflect::set(desc.as_ref(), &"value".into(), &1.into()).unwrap();
+ assert!(Reflect::define_property(&p, &"a".into(), &desc).is_err());
+
+ assert!(Reflect::delete_property(&p, &"a".into()).is_err());
+
+ assert!(Reflect::get(p.as_ref(), &"a".into()).is_err());
+ assert!(Reflect::get_f64(p.as_ref(), 0.0).is_err());
+ assert!(Reflect::get_u32(p.as_ref(), 0).is_err());
+
+ assert!(Reflect::get_own_property_descriptor(&p, &"a".into()).is_err());
+
+ assert!(Reflect::get_prototype_of(p.as_ref()).is_err());
+
+ assert!(Reflect::has(p.as_ref(), &"a".into()).is_err());
+
+ assert!(Reflect::is_extensible(&p).is_err());
+
+ assert!(Reflect::own_keys(p.as_ref()).is_err());
+
+ assert!(Reflect::prevent_extensions(&p).is_err());
+
+ assert!(Reflect::set(p.as_ref(), &"a".into(), &1.into()).is_err());
+ assert!(Reflect::set_f64(p.as_ref(), 0.0, &1.into()).is_err());
+ assert!(Reflect::set_u32(p.as_ref(), 0, &1.into()).is_err());
+
+ assert!(Reflect::set_prototype_of(&p, Object::new().as_ref()).is_err());
+}
diff --git a/vendor/js-sys/tests/wasm/RegExp.rs b/vendor/js-sys/tests/wasm/RegExp.rs
new file mode 100644
index 000000000..6351a9a3f
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/RegExp.rs
@@ -0,0 +1,160 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn regexp_inheritance() {
+ let re = RegExp::new(".", "");
+ assert!(re.is_instance_of::<RegExp>());
+ assert!(re.is_instance_of::<Object>());
+ let _: &Object = re.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn exec() {
+ let re = RegExp::new("quick\\s(brown).+?(jumps)", "ig");
+ let result = re.exec("The Quick Brown Fox Jumps Over The Lazy Dog");
+
+ let mut v = vec![];
+ result.unwrap().for_each(&mut |x, _, _| v.push(x));
+
+ assert_eq!(v[0], "Quick Brown Fox Jumps");
+ assert_eq!(v[1], "Brown");
+ assert_eq!(v[2], "Jumps");
+
+ let result = re.exec("foo");
+ assert!(result.is_none());
+}
+
+#[wasm_bindgen_test]
+fn flags() {
+ let re = RegExp::new("foo", "ig");
+ assert_eq!(re.flags(), "gi");
+}
+
+#[wasm_bindgen_test]
+fn global() {
+ let re = RegExp::new("foo", "g");
+ assert!(re.global());
+
+ let re = RegExp::new("bar", "i");
+ assert!(!re.global());
+}
+
+#[wasm_bindgen_test]
+fn ignore_case() {
+ let re = RegExp::new("foo", "");
+ assert!(!re.ignore_case());
+
+ let re = RegExp::new("foo", "i");
+ assert!(re.ignore_case());
+}
+
+#[wasm_bindgen_test]
+fn input() {
+ let re = RegExp::new("hi", "g");
+ re.test("hi there!");
+ assert_eq!(RegExp::input(), "hi there!");
+}
+
+#[wasm_bindgen_test]
+fn last_index() {
+ let re = RegExp::new("hi", "g");
+ assert_eq!(re.last_index(), 0);
+
+ re.set_last_index(42);
+ assert_eq!(re.last_index(), 42);
+}
+
+#[wasm_bindgen_test]
+fn last_match() {
+ let re = RegExp::new("hi", "g");
+ re.test("hi there!");
+ assert_eq!(RegExp::last_match(), "hi");
+}
+
+#[wasm_bindgen_test]
+fn last_paren() {
+ let re = RegExp::new("(hi)", "g");
+ re.test("hi there!");
+ assert_eq!(RegExp::last_paren(), "hi");
+}
+
+#[wasm_bindgen_test]
+fn left_context() {
+ let re = RegExp::new("world", "g");
+ re.test("hello world!");
+ assert_eq!(RegExp::left_context(), "hello ");
+}
+
+#[wasm_bindgen_test]
+fn multiline() {
+ let re = RegExp::new("foo", "m");
+ assert!(re.multiline());
+}
+
+#[wasm_bindgen_test]
+fn n1_to_n9() {
+ let re = RegExp::new(
+ r"(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)",
+ "",
+ );
+ re.test("The Quick Brown Fox Jumps Over The Lazy Dog");
+ assert_eq!(RegExp::n1(), "The");
+ assert_eq!(RegExp::n2(), "Quick");
+ assert_eq!(RegExp::n3(), "Brown");
+ assert_eq!(RegExp::n4(), "Fox");
+ assert_eq!(RegExp::n5(), "Jumps");
+ assert_eq!(RegExp::n6(), "Over");
+ assert_eq!(RegExp::n7(), "The");
+ assert_eq!(RegExp::n8(), "Lazy");
+ assert_eq!(RegExp::n9(), "Dog");
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ let re = RegExp::new("foo", "");
+ let re = RegExp::new_regexp(&re, "g");
+ assert_eq!(re.to_string(), "/foo/g");
+}
+
+#[wasm_bindgen_test]
+fn right_context() {
+ let re = RegExp::new("hello", "g");
+ re.test("hello world!");
+ assert_eq!(RegExp::right_context(), " world!");
+}
+
+#[wasm_bindgen_test]
+fn source() {
+ let re = RegExp::new("fooBar", "ig");
+ assert_eq!(re.source(), "fooBar");
+
+ let re = RegExp::new("", "ig");
+ assert_eq!(re.source(), "(?:)");
+}
+
+#[wasm_bindgen_test]
+fn sticky() {
+ let re = RegExp::new("foo", "y");
+ assert!(re.sticky());
+}
+
+#[wasm_bindgen_test]
+fn test() {
+ let re = RegExp::new("foo", "");
+ assert!(re.test("football"));
+ assert!(!re.test("bar"));
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ let re = RegExp::new("a+b+c", "g");
+ assert_eq!(re.to_string(), "/a+b+c/g");
+}
+
+#[wasm_bindgen_test]
+fn unicode() {
+ let re = RegExp::new("\u{61}", "u");
+ assert!(re.unicode());
+}
diff --git a/vendor/js-sys/tests/wasm/Set.rs b/vendor/js-sys/tests/wasm/Set.rs
new file mode 100644
index 000000000..045e192e6
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Set.rs
@@ -0,0 +1,127 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+fn set2vec(s: &Set) -> Vec<JsValue> {
+ let mut result = Vec::new();
+ s.for_each(&mut |x, _, _| result.push(x));
+ return result;
+}
+
+#[wasm_bindgen_test]
+fn add() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&100.into());
+ assert_eq!(set.size(), 1);
+ assert_eq!(set2vec(&set)[0], 100);
+}
+
+#[wasm_bindgen_test]
+fn clear() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&1.into());
+ set.add(&2.into());
+ set.add(&3.into());
+ assert_eq!(set.size(), 3);
+ set.clear();
+ assert_eq!(set.size(), 0);
+}
+
+#[wasm_bindgen_test]
+fn delete() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&1.into());
+ set.add(&2.into());
+ set.add(&3.into());
+
+ assert!(set.delete(&3.into()));
+ assert!(!set.delete(&3.into()));
+ assert!(!set.delete(&4.into()));
+}
+
+#[wasm_bindgen_test]
+fn for_each() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&1.into());
+ set.add(&2.into());
+ set.add(&3.into());
+
+ let v = set2vec(&set);
+ assert_eq!(v.len(), 3);
+ assert!(v.iter().any(|v| *v == 1));
+ assert!(v.iter().any(|v| *v == 2));
+ assert!(v.iter().any(|v| *v == 3));
+}
+
+#[wasm_bindgen_test]
+fn has() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&1.into());
+ set.add(&2.into());
+ set.add(&3.into());
+
+ assert!(set.has(&1.into()));
+ assert!(!set.has(&1.3.into()));
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ assert_eq!(Set::new(&JsValue::undefined()).size(), 0);
+}
+
+#[wasm_bindgen_test]
+fn size() {
+ let set = Set::new(&JsValue::undefined());
+ assert_eq!(set.size(), 0);
+ set.add(&1.into());
+ assert_eq!(set.size(), 1);
+ set.add(&2.into());
+ assert_eq!(set.size(), 2);
+ set.add(&3.into());
+ assert_eq!(set.size(), 3);
+}
+
+#[wasm_bindgen_test]
+fn set_inheritance() {
+ let set = Set::new(&JsValue::undefined());
+ assert!(set.is_instance_of::<Set>());
+ assert!(set.is_instance_of::<Object>());
+ let _: &Object = set.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn keys() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&1.into());
+ set.add(&2.into());
+ set.add(&3.into());
+
+ let list = set
+ .keys()
+ .into_iter()
+ .map(|e| e.unwrap())
+ .collect::<Vec<_>>();
+ assert_eq!(list.len(), 3);
+ assert!(list.iter().any(|l| *l == 1));
+ assert!(list.iter().any(|l| *l == 2));
+ assert!(list.iter().any(|l| *l == 3));
+}
+
+#[wasm_bindgen_test]
+fn values() {
+ let set = Set::new(&JsValue::undefined());
+ set.add(&1.into());
+ set.add(&2.into());
+ set.add(&3.into());
+
+ let list = set
+ .values()
+ .into_iter()
+ .map(|e| e.unwrap())
+ .collect::<Vec<_>>();
+ assert_eq!(list.len(), 3);
+ assert!(list.iter().any(|l| *l == 1));
+ assert!(list.iter().any(|l| *l == 2));
+ assert!(list.iter().any(|l| *l == 3));
+}
diff --git a/vendor/js-sys/tests/wasm/SetIterator.rs b/vendor/js-sys/tests/wasm/SetIterator.rs
new file mode 100644
index 000000000..ff853825b
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/SetIterator.rs
@@ -0,0 +1,41 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn entries() {
+ let s = Set::new(&JsValue::undefined());
+ s.add(&1.into());
+ let iter = s.entries();
+ let obj = iter.next().unwrap();
+ assert!(!obj.done());
+ let array = Array::from(&obj.value());
+ assert_eq!(array.length(), 2);
+ array.for_each(&mut |a, _, _| {
+ assert_eq!(a, 1);
+ });
+
+ assert!(iter.next().unwrap().done());
+}
+
+#[wasm_bindgen_test]
+fn keys() {
+ let s = Set::new(&JsValue::undefined());
+ s.add(&1.into());
+ let iter = s.keys();
+ let obj = iter.next().unwrap();
+ assert!(!obj.done());
+ assert_eq!(obj.value(), 1);
+ assert!(iter.next().unwrap().done());
+}
+
+#[wasm_bindgen_test]
+fn values() {
+ let s = Set::new(&JsValue::undefined());
+ s.add(&1.into());
+ let iter = s.values();
+ let obj = iter.next().unwrap();
+ assert!(!obj.done());
+ assert_eq!(obj.value(), 1);
+ assert!(iter.next().unwrap().done());
+}
diff --git a/vendor/js-sys/tests/wasm/SharedArrayBuffer.js b/vendor/js-sys/tests/wasm/SharedArrayBuffer.js
new file mode 100644
index 000000000..6fa189b1c
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/SharedArrayBuffer.js
@@ -0,0 +1,3 @@
+exports.is_shared_array_buffer_supported = function () {
+ return typeof SharedArrayBuffer === 'function';
+};
diff --git a/vendor/js-sys/tests/wasm/SharedArrayBuffer.rs b/vendor/js-sys/tests/wasm/SharedArrayBuffer.rs
new file mode 100644
index 000000000..fdfd55d9b
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/SharedArrayBuffer.rs
@@ -0,0 +1,59 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/SharedArrayBuffer.js")]
+extern "C" {
+ fn is_shared_array_buffer_supported() -> bool;
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ if !is_shared_array_buffer_supported() {
+ return;
+ }
+ let x = SharedArrayBuffer::new(42);
+ let y: JsValue = x.into();
+ assert!(y.is_object());
+}
+
+#[wasm_bindgen_test]
+fn byte_length() {
+ if !is_shared_array_buffer_supported() {
+ return;
+ }
+ let buf = SharedArrayBuffer::new(42);
+ assert_eq!(buf.byte_length(), 42);
+}
+
+#[wasm_bindgen_test]
+fn slice() {
+ if !is_shared_array_buffer_supported() {
+ return;
+ }
+ let buf = SharedArrayBuffer::new(4);
+ let slice = buf.slice(2);
+ assert!(JsValue::from(slice).is_object());
+}
+
+#[wasm_bindgen_test]
+fn slice_with_end() {
+ if !is_shared_array_buffer_supported() {
+ return;
+ }
+ let buf = SharedArrayBuffer::new(4);
+ let slice = buf.slice_with_end(1, 2);
+ assert!(JsValue::from(slice).is_object());
+}
+
+#[wasm_bindgen_test]
+fn sharedarraybuffer_inheritance() {
+ if !is_shared_array_buffer_supported() {
+ return;
+ }
+ let buf = SharedArrayBuffer::new(4);
+ assert!(buf.is_instance_of::<SharedArrayBuffer>());
+ assert!(buf.is_instance_of::<Object>());
+ let _: &Object = buf.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/Symbol.js b/vendor/js-sys/tests/wasm/Symbol.js
new file mode 100644
index 000000000..a66691fd9
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Symbol.js
@@ -0,0 +1,162 @@
+const assert = require('assert');
+
+exports.test_has_instance = function(sym) {
+ class Array1 {
+ static [sym](instance) {
+ return Array.isArray(instance);
+ }
+ }
+
+ assert.equal(typeof sym, "symbol");
+ assert.ok([] instanceof Array1);
+};
+
+exports.test_is_concat_spreadable = function(sym) {
+ const alpha = ['a', 'b', 'c'];
+ const numeric = [1, 2, 3];
+ let alphaNumeric = alpha.concat(numeric);
+
+ assert.deepEqual(alphaNumeric, ["a", "b", "c", 1, 2, 3]);
+
+ numeric[sym] = false;
+ alphaNumeric = alpha.concat(numeric);
+
+ assert.deepEqual(alphaNumeric, ["a", "b", "c", numeric]);
+};
+
+exports.test_iterator = function(sym) {
+ const iterable1 = new Object();
+
+ iterable1[sym] = function* () {
+ yield 1;
+ yield 2;
+ yield 3;
+ };
+
+ assert.deepEqual([...iterable1], [1, 2, 3]);
+};
+
+exports.test_async_iterator = async function(sym) {
+ const iterable1 = new Object();
+
+ iterable1[sym] = function () {
+ let done = false;
+
+ return {
+ next() {
+ if (done) {
+ return Promise.resolve({
+ done: true,
+ value: 1
+ });
+
+ } else {
+ done = true;
+
+ return Promise.resolve({
+ done: false,
+ value: 0
+ });
+ }
+ }
+ };
+ };
+
+ const values = [];
+
+ for await (let value of iterable1) {
+ values.push(value);
+ }
+
+ assert.deepEqual(values, [0]);
+};
+
+exports.test_match = function(sym) {
+ const regexp1 = /foo/;
+ assert.throws(() => '/foo/'.startsWith(regexp1));
+
+ regexp1[sym] = false;
+
+ assert.ok('/foo/'.startsWith(regexp1));
+
+ assert.equal('/baz/'.endsWith(regexp1), false);
+};
+
+exports.test_replace = function(sym) {
+ class Replace1 {
+ constructor(value) {
+ this.value = value;
+ }
+ [sym](string) {
+ return `s/${string}/${this.value}/g`;
+ }
+ }
+
+ assert.equal('foo'.replace(new Replace1('bar')), 's/foo/bar/g');
+};
+
+exports.test_search = function(sym) {
+ class Search1 {
+ constructor(value) {
+ this.value = value;
+ }
+
+ [sym](string) {
+ return string.indexOf(this.value);
+ }
+ }
+
+ assert.equal('foobar'.search(new Search1('bar')), 3);
+};
+
+exports.test_species = function(sym) {
+ class Array1 extends Array {
+ static get [sym]() { return Array; }
+ }
+
+ const a = new Array1(1, 2, 3);
+ const mapped = a.map(x => x * x);
+
+ assert.equal(mapped instanceof Array1, false);
+
+ assert.ok(mapped instanceof Array);
+};
+
+exports.test_split = function(sym) {
+ class Split1 {
+ constructor(value) {
+ this.value = value;
+ }
+
+ [sym](string) {
+ var index = string.indexOf(this.value);
+ return this.value + string.substr(0, index) + "/"
+ + string.substr(index + this.value.length);
+ }
+ }
+
+ assert.equal('foobar'.split(new Split1('foo')), 'foo/bar');
+};
+
+exports.test_to_primitive = function(sym) {
+ const object1 = {
+ [sym](hint) {
+ if (hint == 'number') {
+ return 42;
+ }
+ return null;
+ }
+ };
+
+ assert.equal(+object1, 42);
+};
+
+exports.test_to_string_tag = function(sym) {
+ class ValidatorClass {
+ get [sym]() {
+ return 'Validator';
+ }
+ }
+
+ assert.equal(Object.prototype.toString.call(new ValidatorClass()), '[object Validator]');
+};
diff --git a/vendor/js-sys/tests/wasm/Symbol.rs b/vendor/js-sys/tests/wasm/Symbol.rs
new file mode 100644
index 000000000..0f1e3d0f6
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Symbol.rs
@@ -0,0 +1,130 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen_futures::JsFuture;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Symbol.js")]
+extern "C" {
+ fn test_has_instance(sym: &Symbol);
+ fn test_is_concat_spreadable(sym: &Symbol);
+ fn test_iterator(sym: &Symbol);
+ fn test_async_iterator(sym: &Symbol) -> Promise;
+ fn test_match(sym: &Symbol);
+ fn test_replace(sym: &Symbol);
+ fn test_search(sym: &Symbol);
+ fn test_species(sym: &Symbol);
+ fn test_split(sym: &Symbol);
+ fn test_to_primitive(sym: &Symbol);
+ fn test_to_string_tag(sym: &Symbol);
+}
+
+#[wasm_bindgen]
+extern "C" {
+ #[wasm_bindgen(js_name = Symbol)]
+ fn gensym(val: JsValue) -> Symbol;
+}
+
+#[wasm_bindgen_test]
+fn has_instance() {
+ test_has_instance(&Symbol::has_instance());
+}
+
+#[wasm_bindgen_test]
+fn is_concat_spreadable() {
+ test_is_concat_spreadable(&Symbol::is_concat_spreadable());
+}
+
+#[wasm_bindgen_test]
+fn iterator() {
+ test_iterator(&Symbol::iterator());
+}
+
+#[wasm_bindgen_test]
+async fn async_iterator() {
+ JsFuture::from(test_async_iterator(&Symbol::async_iterator()))
+ .await
+ .unwrap_throw();
+}
+
+#[wasm_bindgen_test]
+fn match_() {
+ test_match(&Symbol::match_());
+}
+
+#[wasm_bindgen_test]
+fn replace() {
+ test_replace(&Symbol::replace());
+}
+
+#[wasm_bindgen_test]
+fn search() {
+ test_search(&Symbol::search());
+}
+
+#[wasm_bindgen_test]
+fn species() {
+ test_species(&Symbol::species());
+}
+
+#[wasm_bindgen_test]
+fn split() {
+ test_split(&Symbol::split());
+}
+
+#[wasm_bindgen_test]
+fn to_primitive() {
+ test_to_primitive(&Symbol::to_primitive());
+}
+
+#[wasm_bindgen_test]
+fn to_string_tag() {
+ test_to_string_tag(&Symbol::to_string_tag());
+}
+
+#[wasm_bindgen_test]
+fn for_() {
+ let foo = JsValue::from(Symbol::for_("foo"));
+ let bar = JsValue::from(Symbol::for_("bar"));
+ assert_eq!(foo, foo);
+ assert_eq!(bar, bar);
+ assert_ne!(foo, bar);
+ assert_ne!(bar, foo);
+
+ assert_eq!(Symbol::for_("mario").to_string(), "Symbol(mario)");
+}
+
+#[wasm_bindgen_test]
+fn key_for() {
+ let sym = Symbol::for_("foo");
+ assert_eq!(Symbol::key_for(&sym), "foo");
+ assert!(Symbol::key_for(&Symbol::iterator()).is_undefined());
+ assert!(Symbol::key_for(&Symbol::async_iterator()).is_undefined());
+ assert!(Symbol::key_for(&gensym(JsValue::undefined())).is_undefined());
+}
+
+#[wasm_bindgen_test]
+fn to_string() {
+ assert_eq!(Symbol::iterator().to_string(), "Symbol(Symbol.iterator)");
+ assert_eq!(
+ Symbol::async_iterator().to_string(),
+ "Symbol(Symbol.asyncIterator)"
+ );
+ assert_eq!(Symbol::for_("foo").to_string(), "Symbol(foo)");
+ assert_eq!(gensym("desc".into()).to_string(), "Symbol(desc)");
+}
+
+#[wasm_bindgen_test]
+fn unscopables() {
+ assert_eq!(
+ Symbol::unscopables().to_string(),
+ "Symbol(Symbol.unscopables)"
+ );
+}
+
+#[wasm_bindgen_test]
+fn value_of() {
+ let a = Symbol::for_("foo");
+ assert_eq!(JsValue::from(a.value_of()), JsValue::from(a));
+ let a = gensym(JsValue::undefined());
+ assert_eq!(JsValue::from(a.value_of()), JsValue::from(a));
+}
diff --git a/vendor/js-sys/tests/wasm/SyntaxError.rs b/vendor/js-sys/tests/wasm/SyntaxError.rs
new file mode 100644
index 000000000..b76b71ca6
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/SyntaxError.rs
@@ -0,0 +1,17 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn syntax_error() {
+ let error = SyntaxError::new("msg");
+ assert!(error.is_instance_of::<SyntaxError>());
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Error = error.as_ref();
+ let _: &Object = error.as_ref();
+
+ let base: &Error = error.as_ref();
+ assert_eq!(JsValue::from(base.message()), "msg");
+}
diff --git a/vendor/js-sys/tests/wasm/Temporal.js b/vendor/js-sys/tests/wasm/Temporal.js
new file mode 100644
index 000000000..f006a7bb8
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Temporal.js
@@ -0,0 +1,3 @@
+exports.is_temporal_supported = function () {
+ return typeof Temporal === 'object';
+};
diff --git a/vendor/js-sys/tests/wasm/Temporal.rs b/vendor/js-sys/tests/wasm/Temporal.rs
new file mode 100644
index 000000000..5ea651bee
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/Temporal.rs
@@ -0,0 +1,81 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen(module = "tests/wasm/Temporal.js")]
+extern "C" {
+ fn is_temporal_supported() -> bool;
+}
+
+#[wasm_bindgen_test]
+fn now() {
+ if !is_temporal_supported() {
+ return;
+ }
+ let x = Temporal::Now::plain_date("iso8086");
+ let y: JsValue = x.into();
+ assert!(y.is_object());
+}
+
+#[wasm_bindgen_test]
+fn duration() {
+ if !is_temporal_supported() {
+ return;
+ }
+ let x = Temporal::Duration::from(&"PT1.00001S".into());
+ assert_eq!(x.years(), 0);
+ assert_eq!(x.microseconds(), 10);
+}
+
+#[wasm_bindgen_test]
+fn zoned_date_time() {
+ if !is_temporal_supported() {
+ return;
+ }
+ let zdt = Temporal::ZonedDateTime::from(&"2020-03-09T00:00-07:00[America/Los_Angeles]".into());
+ let earlier_day = zdt.subtract(
+ &Temporal::Duration::from(&"P1D".into()),
+ &JsValue::UNDEFINED,
+ );
+ let earlier_hours = zdt.subtract(
+ &Temporal::Duration::from(&"PT24H".into()),
+ &JsValue::UNDEFINED,
+ );
+ assert_eq!(earlier_day.hour(), 0);
+ assert_eq!(earlier_hours.hour(), 23);
+}
+
+#[wasm_bindgen_test]
+fn plain_time() {
+ if !is_temporal_supported() {
+ return;
+ }
+ let time = Temporal::PlainTime::from(&"19:39:09.068346205".into());
+ assert_eq!(time.microsecond(), 346);
+ assert_eq!(time.round(&"hour".into()).hour(), 20);
+}
+
+#[wasm_bindgen_test]
+fn plain_date() {
+ if !is_temporal_supported() {
+ return;
+ }
+ let x = Temporal::PlainDate::new(2022, 2, 2).with_calendar("persian");
+ let y = Temporal::PlainDate::new(2022, 2, 5);
+ let z = Temporal::PlainDate::from(&"-002022-02-02[u-ca=gregory]".into());
+ assert_eq!(Temporal::PlainDate::compare(&x, &y), -1);
+ assert_eq!(x.year(), 1400);
+ assert_eq!(x.month(), 11);
+ assert_eq!(x.month_code(), "M11");
+ assert_eq!(x.day(), 13);
+ assert_eq!(x.era(), "ap");
+ assert_eq!(y.era(), JsValue::UNDEFINED);
+ assert_eq!(z.era_year(), 2023i32);
+ assert_eq!(y.day_of_week(), 6);
+ assert_eq!(
+ Reflect::get(&x.get_iso_fields(), &"isoYear".into()).unwrap(),
+ 2022i32
+ );
+ assert_eq!(x.in_leap_year(), false);
+}
diff --git a/vendor/js-sys/tests/wasm/TypeError.rs b/vendor/js-sys/tests/wasm/TypeError.rs
new file mode 100644
index 000000000..0fdbde1d3
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/TypeError.rs
@@ -0,0 +1,17 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn type_error() {
+ let error = TypeError::new("msg");
+ assert!(error.is_instance_of::<TypeError>());
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Error = error.as_ref();
+ let _: &Object = error.as_ref();
+
+ let base: &Error = error.as_ref();
+ assert_eq!(JsValue::from(base.message()), "msg");
+}
diff --git a/vendor/js-sys/tests/wasm/TypedArray.rs b/vendor/js-sys/tests/wasm/TypedArray.rs
new file mode 100644
index 000000000..ef06a4c44
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/TypedArray.rs
@@ -0,0 +1,175 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+macro_rules! each {
+ ($m:ident) => {
+ $m!(Uint8Array);
+ $m!(Uint8ClampedArray);
+ $m!(Uint16Array);
+ $m!(Uint32Array);
+ $m!(Int8Array);
+ $m!(Int16Array);
+ $m!(Int32Array);
+ $m!(Float32Array);
+ $m!(Float64Array);
+ };
+}
+
+macro_rules! test_inheritence {
+ ($arr:ident) => {{
+ let arr = $arr::new(&JsValue::undefined());
+ assert!(arr.is_instance_of::<$arr>());
+ let _: &Object = arr.as_ref();
+ assert!(arr.is_instance_of::<Object>());
+ }};
+}
+#[wasm_bindgen_test]
+fn inheritence() {
+ each!(test_inheritence);
+}
+
+macro_rules! test_undefined {
+ ($arr:ident) => {{
+ let arr = $arr::new(&JsValue::undefined());
+ assert_eq!(arr.length(), 0);
+ assert_eq!(arr.byte_length(), 0);
+ assert_eq!(arr.byte_offset(), 0);
+ assert!(JsValue::from(arr.buffer()).is_object());
+ }};
+}
+#[wasm_bindgen_test]
+fn new_undefined() {
+ each!(test_undefined);
+}
+
+macro_rules! test_length {
+ ($arr:ident) => {{
+ let arr = $arr::new(&4.into());
+ assert_eq!(arr.length(), 4);
+ assert!(arr.byte_length() != 0);
+ assert_eq!(arr.byte_offset(), 0);
+ assert!(JsValue::from(arr.buffer()).is_object());
+ }};
+}
+#[wasm_bindgen_test]
+fn new_length() {
+ each!(test_length);
+}
+
+macro_rules! test_subarray {
+ ($arr:ident) => {{
+ assert_eq!($arr::new(&4.into()).subarray(0, 1).length(), 1);
+ }};
+}
+#[wasm_bindgen_test]
+fn new_subarray() {
+ each!(test_subarray);
+}
+
+macro_rules! test_fill {
+ ($arr:ident) => {{
+ let arr = $arr::new(&4.into());
+ arr.for_each(&mut |x, _, _| {
+ assert_eq!(x as f64, 0.0);
+ });
+ arr.fill(2 as _, 0, 2);
+ arr.for_each(&mut |x, i, _| {
+ if i < 2 {
+ assert_eq!(x as f64, 2.0);
+ } else {
+ assert_eq!(x as f64, 0.0);
+ }
+ });
+ }};
+}
+#[wasm_bindgen_test]
+fn new_fill() {
+ each!(test_fill);
+}
+
+macro_rules! test_at {
+ ($arr:ident) => {{
+ let arr = $arr::new(&2.into());
+ arr.set_index(1, 1 as _);
+ assert_eq!(arr.at(-1).unwrap() as f64, 1 as f64);
+ }};
+}
+#[wasm_bindgen_test]
+fn new_at() {
+ each!(test_at);
+}
+
+macro_rules! test_get_set {
+ ($arr:ident) => {{
+ let arr = $arr::new(&1.into());
+ assert_eq!(arr.get_index(0) as f64, 0 as f64);
+ arr.set_index(0, 1 as _);
+ assert_eq!(arr.get_index(0) as f64, 1 as f64);
+ }};
+}
+#[wasm_bindgen_test]
+fn new_get_set() {
+ each!(test_get_set);
+}
+
+macro_rules! test_slice {
+ ($arr:ident) => {{
+ let arr = $arr::new(&4.into());
+ assert_eq!(arr.length(), 4);
+ assert_eq!(arr.slice(1, 2).length(), 1);
+ }};
+}
+#[wasm_bindgen_test]
+fn new_slice() {
+ each!(test_slice);
+}
+
+#[wasm_bindgen_test]
+fn view() {
+ let x = [1, 2, 3];
+ let array = unsafe { Int32Array::view(&x) };
+ assert_eq!(array.length(), 3);
+ array.for_each(&mut |x, i, _| {
+ assert_eq!(x, (i + 1) as i32);
+ });
+}
+
+#[wasm_bindgen_test]
+fn from() {
+ let x: Vec<i32> = vec![1, 2, 3];
+ let array = Int32Array::from(x.as_slice());
+ assert_eq!(array.length(), 3);
+ array.for_each(&mut |x, i, _| {
+ assert_eq!(x, (i + 1) as i32);
+ });
+}
+
+#[wasm_bindgen_test]
+fn copy_to() {
+ let mut x = [0; 10];
+ let array = Int32Array::new(&10.into());
+ array.fill(5, 0, 10);
+ array.copy_to(&mut x);
+ for i in x.iter() {
+ assert_eq!(*i, 5);
+ }
+}
+
+#[wasm_bindgen_test]
+fn copy_from() {
+ let x = [1, 2, 3];
+ let array = Int32Array::new(&3.into());
+ array.copy_from(&x);
+ array.for_each(&mut |x, i, _| {
+ assert_eq!(x, (i + 1) as i32);
+ });
+}
+
+#[wasm_bindgen_test]
+fn to_vec() {
+ let array = Int32Array::new(&10.into());
+ array.fill(5, 0, 10);
+ assert_eq!(array.to_vec(), vec![5, 5, 5, 5, 5, 5, 5, 5, 5, 5]);
+}
diff --git a/vendor/js-sys/tests/wasm/UriError.rs b/vendor/js-sys/tests/wasm/UriError.rs
new file mode 100644
index 000000000..0e5720c51
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/UriError.rs
@@ -0,0 +1,17 @@
+use js_sys::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen::JsValue;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn uri_error() {
+ let error = UriError::new("msg");
+ assert!(error.is_instance_of::<UriError>());
+ assert!(error.is_instance_of::<Error>());
+ assert!(error.is_instance_of::<Object>());
+ let _: &Error = error.as_ref();
+ let _: &Object = error.as_ref();
+
+ let base: &Error = error.as_ref();
+ assert_eq!(JsValue::from(base.message()), "msg");
+}
diff --git a/vendor/js-sys/tests/wasm/WeakMap.rs b/vendor/js-sys/tests/wasm/WeakMap.rs
new file mode 100644
index 000000000..1eab1cb9d
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/WeakMap.rs
@@ -0,0 +1,61 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen]
+extern "C" {
+ type SomeKey;
+ #[wasm_bindgen(method, setter, structural)]
+ fn set_some(this: &SomeKey, val: JsValue);
+}
+
+fn some_key() -> Object {
+ let key = SomeKey::from(JsValue::from(Object::new()));
+ key.set_some("key".into());
+ Object::from(JsValue::from(key))
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ assert!(JsValue::from(WeakMap::new()).is_object());
+}
+
+#[wasm_bindgen_test]
+fn get_and_set() {
+ let map = WeakMap::new();
+ let key = some_key();
+ map.set(&key, &"value".into());
+ assert_eq!(map.get(&key), "value");
+ assert_eq!(map.get(&Object::new()), JsValue::undefined());
+ assert_eq!(map.get(&some_key()), JsValue::undefined());
+}
+
+#[wasm_bindgen_test]
+fn has() {
+ let map = WeakMap::new();
+ let key = some_key();
+ map.set(&key, &"value".into());
+ assert!(map.has(&key));
+ assert!(!map.has(&Object::new()));
+ assert!(!map.has(&some_key()));
+}
+
+#[wasm_bindgen_test]
+fn delete() {
+ let map = WeakMap::new();
+ let key = some_key();
+ assert!(!map.has(&key));
+ map.set(&key, &"value".into());
+ assert!(map.has(&key));
+ map.delete(&key);
+ assert!(!map.has(&key));
+}
+
+#[wasm_bindgen_test]
+fn weakmap_inheritance() {
+ let map = WeakMap::new();
+ assert!(map.is_instance_of::<WeakMap>());
+ assert!(map.is_instance_of::<Object>());
+ let _: &Object = map.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/WeakSet.rs b/vendor/js-sys/tests/wasm/WeakSet.rs
new file mode 100644
index 000000000..094038b5f
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/WeakSet.rs
@@ -0,0 +1,51 @@
+use js_sys::*;
+use wasm_bindgen::prelude::*;
+use wasm_bindgen::JsCast;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen]
+extern "C" {
+ type SomeValue;
+ #[wasm_bindgen(method, setter, structural)]
+ fn set_some(this: &SomeValue, val: JsValue);
+}
+
+fn some_value() -> Object {
+ let value = SomeValue::from(JsValue::from(Object::new()));
+ value.set_some("value".into());
+ Object::from(JsValue::from(value))
+}
+
+#[wasm_bindgen_test]
+fn new() {
+ assert!(JsValue::from(WeakSet::new()).is_object())
+}
+
+#[wasm_bindgen_test]
+fn has() {
+ let set = WeakSet::new();
+ let value = some_value();
+ assert!(!set.has(&value));
+ set.add(&value);
+ assert!(set.has(&value));
+ assert!(!set.has(&some_value()));
+}
+
+#[wasm_bindgen_test]
+fn delete() {
+ let set = WeakSet::new();
+ let value = some_value();
+ set.add(&value);
+ assert!(set.has(&value));
+ assert!(set.delete(&value));
+ assert!(!set.has(&value));
+ assert!(!set.delete(&value));
+}
+
+#[wasm_bindgen_test]
+fn weakset_inheritance() {
+ let set = WeakSet::new();
+ assert!(set.is_instance_of::<WeakSet>());
+ assert!(set.is_instance_of::<Object>());
+ let _: &Object = set.as_ref();
+}
diff --git a/vendor/js-sys/tests/wasm/WebAssembly.js b/vendor/js-sys/tests/wasm/WebAssembly.js
new file mode 100644
index 000000000..694046853
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/WebAssembly.js
@@ -0,0 +1,45 @@
+const { TextEncoder } = require("util");
+
+const data =
+ "\u0000asm\u0001\u0000\u0000\u0000\u0001\b\u0002`\u0001\u007f\u0000`\u0000" +
+ "\u0000\u0002\u0019\u0001\u0007imports\rimported_func\u0000\u0000\u0003" +
+ "\u0002\u0001\u0001\u0007\u0011\u0001\rexported_func\u0000\u0001\n\b\u0001" +
+ "\u0006\u0000A*\u0010\u0000\u000b";
+
+const encoder = new TextEncoder();
+const wasmArray = encoder.encode(data);
+
+function getWasmArray() {
+ return wasmArray;
+}
+
+function getTableObject() {
+ return { element: "anyfunc", initial: 1 }
+}
+
+function getInvalidTableObject() {
+ return { element: "anyfunc", initial: 1, maximum: 0 }
+}
+
+function getImports() {
+ return {
+ imports: {
+ imported_func: function () {
+ return 1;
+ }
+ }
+ };
+}
+
+// Polyfill `WebAssembly.instantiateStreaming` for node.
+if (!global.WebAssembly.instantiateStreaming) {
+ global.WebAssembly.instantiateStreaming =
+ (response, imports) => response.then(buf => WebAssembly.instantiate(buf, imports));
+}
+
+module.exports = {
+ getInvalidTableObject,
+ getTableObject,
+ getWasmArray,
+ getImports,
+};
diff --git a/vendor/js-sys/tests/wasm/WebAssembly.rs b/vendor/js-sys/tests/wasm/WebAssembly.rs
new file mode 100644
index 000000000..8f9a5b632
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/WebAssembly.rs
@@ -0,0 +1,205 @@
+use js_sys::*;
+use wasm_bindgen::{prelude::*, JsCast};
+use wasm_bindgen_futures::JsFuture;
+use wasm_bindgen_test::*;
+use web_sys::{Headers, Response, ResponseInit};
+
+#[wasm_bindgen(module = "tests/wasm/WebAssembly.js")]
+extern "C" {
+ #[wasm_bindgen(js_name = getWasmArray)]
+ fn get_wasm_array() -> Uint8Array;
+
+ #[wasm_bindgen(js_name = getTableObject)]
+ fn get_table_object() -> Object;
+
+ #[wasm_bindgen(js_name = getInvalidTableObject)]
+ fn get_invalid_table_object() -> Object;
+
+ #[wasm_bindgen(js_name = getImports)]
+ fn get_imports() -> Object;
+}
+
+fn get_invalid_wasm() -> JsValue {
+ ArrayBuffer::new(42).into()
+}
+
+fn get_bad_type_wasm() -> JsValue {
+ 2.into()
+}
+
+fn get_valid_wasm() -> JsValue {
+ get_wasm_array().into()
+}
+
+#[wasm_bindgen_test]
+fn validate() {
+ assert!(!WebAssembly::validate(&get_invalid_wasm()).unwrap());
+
+ assert!(WebAssembly::validate(&get_bad_type_wasm()).is_err());
+}
+
+#[wasm_bindgen_test]
+async fn compile_compile_error() {
+ let p = WebAssembly::compile(&get_invalid_wasm());
+ let e = JsFuture::from(p).await.unwrap_err();
+ assert!(e.is_instance_of::<WebAssembly::CompileError>());
+}
+
+#[wasm_bindgen_test]
+async fn compile_type_error() {
+ let p = WebAssembly::compile(&get_bad_type_wasm());
+ let e = JsFuture::from(p).await.unwrap_err();
+ assert!(e.is_instance_of::<TypeError>());
+}
+
+#[wasm_bindgen_test]
+async fn compile_valid() {
+ let p = WebAssembly::compile(&get_valid_wasm());
+ let module = JsFuture::from(p).await.unwrap();
+ assert!(module.is_instance_of::<WebAssembly::Module>());
+}
+
+#[wasm_bindgen_test]
+fn module_inheritance() {
+ let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
+ assert!(module.is_instance_of::<WebAssembly::Module>());
+ assert!(module.is_instance_of::<Object>());
+
+ let _: &Object = module.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn module_error() {
+ let error = WebAssembly::Module::new(&get_invalid_wasm()).err().unwrap();
+ assert!(error.is_instance_of::<WebAssembly::CompileError>());
+
+ let error = WebAssembly::Module::new(&get_bad_type_wasm())
+ .err()
+ .unwrap();
+ assert!(error.is_instance_of::<TypeError>());
+}
+
+#[wasm_bindgen_test]
+fn module_custom_sections() {
+ let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
+ let cust_sec = WebAssembly::Module::custom_sections(&module, "abcd");
+ assert_eq!(cust_sec.length(), 0);
+}
+
+#[wasm_bindgen_test]
+fn module_exports() {
+ let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
+ let exports = WebAssembly::Module::exports(&module);
+ assert_eq!(exports.length(), 1);
+}
+
+#[wasm_bindgen_test]
+fn module_imports() {
+ let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
+ let imports = WebAssembly::Module::imports(&module);
+ assert_eq!(imports.length(), 1);
+}
+
+#[wasm_bindgen_test]
+fn table_inheritance() {
+ let table = WebAssembly::Table::new(&get_table_object().into()).unwrap();
+ assert!(table.is_instance_of::<WebAssembly::Table>());
+ assert!(table.is_instance_of::<Object>());
+
+ let _: &Object = table.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn table_error() {
+ let error = WebAssembly::Table::new(&get_invalid_table_object())
+ .err()
+ .unwrap();
+ assert!(error.is_instance_of::<RangeError>());
+}
+
+#[wasm_bindgen_test]
+fn table() {
+ let table = WebAssembly::Table::new(&get_table_object().into()).unwrap();
+ assert_eq!(table.length(), 1);
+
+ assert!(table.get(0).is_ok());
+ assert!(table.get(999).is_err());
+
+ table.grow(1).unwrap();
+ assert_eq!(table.length(), 2);
+
+ let f = table.get(0).unwrap();
+ table.set(1, &f).unwrap();
+}
+
+#[wasm_bindgen_test]
+fn compile_error_inheritance() {
+ let error = WebAssembly::CompileError::new("");
+ assert!(error.is_instance_of::<WebAssembly::CompileError>());
+ assert!(error.is_instance_of::<Error>());
+
+ let _: &Error = error.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn link_error_inheritance() {
+ let error = WebAssembly::LinkError::new("");
+ assert!(error.is_instance_of::<WebAssembly::LinkError>());
+ assert!(error.is_instance_of::<Error>());
+
+ let _: &Error = error.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn runtime_error_inheritance() {
+ let error = WebAssembly::RuntimeError::new("");
+ assert!(error.is_instance_of::<WebAssembly::RuntimeError>());
+ assert!(error.is_instance_of::<Error>());
+
+ let _: &Error = error.as_ref();
+}
+
+#[wasm_bindgen_test]
+fn webassembly_instance() {
+ let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
+ let imports = get_imports();
+ let instance = WebAssembly::Instance::new(&module, &imports).unwrap();
+
+ // Inheritance chain is correct.
+ assert!(instance.is_instance_of::<WebAssembly::Instance>());
+ assert!(instance.is_instance_of::<Object>());
+ let _: &Object = instance.as_ref();
+
+ // Has expected exports.
+ let exports = instance.exports();
+ assert!(Reflect::has(exports.as_ref(), &"exported_func".into()).unwrap());
+}
+
+#[wasm_bindgen_test]
+async fn instantiate_module() {
+ let module = WebAssembly::Module::new(&get_valid_wasm()).unwrap();
+ let imports = get_imports();
+ let p = WebAssembly::instantiate_module(&module, &imports);
+ let inst = JsFuture::from(p).await.unwrap();
+ assert!(inst.is_instance_of::<WebAssembly::Instance>());
+}
+
+#[wasm_bindgen_test]
+fn memory_works() {
+ let obj = Object::new();
+ Reflect::set(obj.as_ref(), &"initial".into(), &1.into()).unwrap();
+ let mem = WebAssembly::Memory::new(&obj).unwrap();
+ assert!(mem.is_instance_of::<WebAssembly::Memory>());
+ assert!(mem.is_instance_of::<Object>());
+ assert!(mem.buffer().is_instance_of::<ArrayBuffer>());
+ assert_eq!(mem.grow(1), 1);
+ assert_eq!(mem.grow(2), 2);
+ assert_eq!(mem.grow(3), 4);
+ assert_eq!(
+ mem.buffer()
+ .dyn_into::<ArrayBuffer>()
+ .unwrap()
+ .byte_length(),
+ 7 * 64 * 1024,
+ );
+}
diff --git a/vendor/js-sys/tests/wasm/global_fns.rs b/vendor/js-sys/tests/wasm/global_fns.rs
new file mode 100644
index 000000000..1a2c5e1c5
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/global_fns.rs
@@ -0,0 +1,90 @@
+use std::f64::{INFINITY, NAN};
+
+use js_sys::*;
+use wasm_bindgen_test::*;
+
+#[wasm_bindgen_test]
+fn test_decode_uri() {
+ let x = decode_uri("https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B")
+ .ok()
+ .expect("should decode URI OK");
+ assert_eq!(String::from(x), "https://mozilla.org/?x=шеллы");
+
+ assert!(decode_uri("%E0%A4%A").is_err());
+}
+
+#[wasm_bindgen_test]
+fn test_decode_uri_component() {
+ let x = decode_uri_component("%3Fx%3Dtest")
+ .ok()
+ .expect("should decode URI OK");
+ assert_eq!(String::from(x), "?x=test");
+
+ assert!(decode_uri_component("%E0%A4%A").is_err());
+}
+
+#[wasm_bindgen_test]
+fn test_encode_uri() {
+ let x = encode_uri("ABC abc 123");
+ assert_eq!(String::from(x), "ABC%20abc%20123");
+}
+
+#[wasm_bindgen_test]
+fn test_encode_uri_component() {
+ let x = encode_uri_component("?x=шеллы");
+ assert_eq!(String::from(x), "%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
+}
+
+#[wasm_bindgen_test]
+fn test_eval() {
+ let x = eval("42").ok().expect("should eval OK");
+ assert_eq!(x.as_f64().unwrap(), 42.0);
+
+ let err = eval("(function () { throw 42; }())")
+ .err()
+ .expect("eval should throw");
+ assert_eq!(err.as_f64().unwrap(), 42.0);
+}
+
+#[wasm_bindgen_test]
+fn test_is_finite() {
+ assert!(is_finite(&42.into()));
+ assert!(is_finite(&42.1.into()));
+ assert!(is_finite(&"42".into()));
+ assert!(!is_finite(&NAN.into()));
+ assert!(!is_finite(&INFINITY.into()));
+}
+
+#[wasm_bindgen_test]
+fn test_parse_int_float() {
+ let i = parse_int("42", 10);
+ assert_eq!(i as i64, 42);
+
+ let i = parse_int("42", 16);
+ assert_eq!(i as i64, 66); // 0x42 == 66
+
+ let i = parse_int("invalid int", 10);
+ assert!(i.is_nan());
+
+ let f = parse_float("123456.789");
+ assert_eq!(f, 123456.789);
+
+ let f = parse_float("invalid float");
+ assert!(f.is_nan());
+}
+
+#[wasm_bindgen_test]
+fn test_escape() {
+ assert_eq!(String::from(escape("test")), "test");
+ assert_eq!(String::from(escape("äöü")), "%E4%F6%FC");
+ assert_eq!(String::from(escape("ć")), "%u0107");
+ assert_eq!(String::from(escape("@*_+-./")), "@*_+-./");
+}
+
+#[wasm_bindgen_test]
+fn test_unescape() {
+ assert_eq!(String::from(unescape("abc123")), "abc123");
+ assert_eq!(String::from(unescape("%E4%F6%FC")), "äöü");
+ assert_eq!(String::from(unescape("%u0107")), "ć");
+ assert_eq!(String::from(unescape("@*_+-./")), "@*_+-./");
+}
diff --git a/vendor/js-sys/tests/wasm/main.rs b/vendor/js-sys/tests/wasm/main.rs
new file mode 100644
index 000000000..627c88ddf
--- /dev/null
+++ b/vendor/js-sys/tests/wasm/main.rs
@@ -0,0 +1,43 @@
+#![cfg(target_arch = "wasm32")]
+#![allow(non_snake_case)]
+
+pub mod Array;
+pub mod ArrayBuffer;
+pub mod ArrayIterator;
+pub mod BigInt;
+pub mod Boolean;
+pub mod DataView;
+pub mod Date;
+pub mod Error;
+pub mod EvalError;
+pub mod Function;
+pub mod Generator;
+pub mod Intl;
+pub mod Iterator;
+pub mod JSON;
+pub mod JsString;
+pub mod Map;
+pub mod MapIterator;
+pub mod Math;
+pub mod Number;
+pub mod Object;
+pub mod Promise;
+pub mod Proxy;
+pub mod RangeError;
+pub mod ReferenceError;
+pub mod Reflect;
+pub mod RegExp;
+pub mod Set;
+pub mod SetIterator;
+pub mod SharedArrayBuffer;
+pub mod Symbol;
+pub mod SyntaxError;
+#[cfg(js_sys_unstable_apis)]
+pub mod Temporal;
+pub mod TypeError;
+pub mod TypedArray;
+pub mod UriError;
+pub mod WeakMap;
+pub mod WeakSet;
+pub mod WebAssembly;
+pub mod global_fns;