Skip to content

This is a matrix of issues and risks of using Jest with JSDOM to test browser applications. This will include several sub projects with example tests to demonstrate the failures.

License

Notifications You must be signed in to change notification settings

tmobile/jest-jsdom-browser-compatibility

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Overview

Jest is a delightful JavaScript Testing Framework with a focus on simplicity. And it is more and more popular because of simple and better engineer producitivity.

Compared to the conventional Javascript test runner Karma + Jasmine, Jest is much more lightweight and faster. It has the following benifits:

  • Headless browser environment: No need to open the real browsers as what Karma does, it saves much more time.
  • Possible to rum multiple tests in parallel: benefit from the lightweight of the headless browser environment.
  • Snapshot testing, a useful feature which is not available in Jasmine
  • Easier to use
    • CLI: filter by a filename or test name regex pattern (reducing the need for fdescribe) and rerun tests
    • Low configuration needed to get started
    • Clear documentation which makes it easy to adjust Jest to your needs
    • Testing is stable: no more sudden test runner failures while writing tests

So we want to migrate our tests from Karma + Jasmine to Jest.

However, the headless browser of Jest is not the real browser, it is based on the JSDOM, and it has still some compatibility issues. In this project, we explored all the compatibility issues and summarize them as a comparison Matrix. It will be a good reference for anyone who wants to migrate tests to Jest.

In this project, we provided 65 test cases, each test case provides a stand-alone in Angular 7 to demonstrate the compatibility issues of JSDOM.

Prerequisite

  • Node 8+
  • NPM or yarn
  • Git
  • Safari, Chrome, Firefox

How to run each test case

  1. Click the link in the following comparison matrix to see the source code of each test case.
  2. Follow the README of the test case source code to run the test.

Test Case Comparison Matrix

Test Case Description Jest (JSDOM) Karma (Chrome (R)) Karma (Safari (R)) Karma (Firefox (R)) References
Test case 1 In Jest document.activeElement is incorrect after the contenteditable element is focused ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/2
- jsdom/jsdom#2472
Test case 2 In Jest, selector is not working same as in browsers ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/3
- jsdom/jsdom#2528
Test case 3 Style property does not change when assign empty string in Jest ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/4
- jsdom/jsdom#2504
Test case 4 Notification API missing in Jest ❌ Failed ✔️ Successful ✔️ Successful
(will show ERROR: 'ERROR CONTEXT', DebugContext_ in console)
✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/5
- jsdom/jsdom#1862
Test case 5 Jest doesn't support Cryto API ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/6
- jsdom/jsdom#1612
- https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API
- https://www.w3.org/TR/WebCryptoAPI/
Test case 6 Jest doesn't support TextEncoder ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/7
- jsdom/jsdom#2524
- https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API
Test case 7 JSDOM selector doesn't support innerText ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/9
- jsdom/jsdom#1245
Test case 8 SVGElement style values are empty in JSDOM ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/10
- jsdom/jsdom#2384
Test case 9 JSDOM silently eats 'calc' and viewport units ❌ Failed ✔️ Successful ✔️ Successful ❌ Failed
Firefox is failed due to getting calc(20% + 10px) when assigned calc(10px + 20%)
- https://gitlab.com/jest-risk-discovery/test-cases-design/issues/11
- jsdom/jsdom#1332
Test case 10 JSDOM doesn't apply CSS custom properties ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/12
- jsdom/jsdom#1895
Test case 11 JSDOM unsets style.border when it is set to 'none' ❌ Failed ✔️ Successful ❌ Failed ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/13
- jsdom/jsdom#1910
Test case 12 JSDOM doesn't implement offsetTop & offsetLeft & offsetBottom & offsetRight ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/14
- jsdom/jsdom#135
- https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft
Test case 13 JSDOM can't get transform property of SVG ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/15
- jsdom/jsdom#2531
Test case 14 JSDOM parsed XML doc's XPath queries fail with upper case attributes ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/16
- jsdom/jsdom#2530
- JSDOM use a different XPath parser that is not well implemented and buggy. But they are considering switching to a well-maintained 3rd one.
Test case 15 PointerEvent is not available in JSDOM ❌ Failed ✔️ Successful ❌ Failed ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/17
- jsdom/jsdom#2527
- https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent
Test case 16 JSDOM bug - Creating FormData from form fails on input with no value set ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/18
- jsdom/jsdom#2523
- https://github.com/jsdom/jsdom/blob/16d3913eea0360c7757e75f7e266c3873c85b7dd/lib/jsdom/living/xhr/FormData-impl.js#L149
- https://github.com/jsdom/jsdom/blob/16d3913eea0360c7757e75f7e266c3873c85b7dd/lib/jsdom/living/xhr/FormData-impl.js#L163
- This is a bug in JSDOM FormData implementation, see line 149 and 163
Test case 17 JSDOM, CssStyleDeclaration doesn't apply color style when using keywords ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/19
- jsdom/jsdom#2516
- https://github.com/jsakas/CSSStyleDeclaration
- This is a bug of cssstyle project, which is a dependency of JSDOM
Test case 18 JSDOM doesn't ignore invalid style properties ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/20
- jsdom/jsdom#2513
- jestjs/jest#7920
- This is inappropriate implementation of JSDOM
Test case 19 JSDOM, 'as' attribute is not implemented in Link tag ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/22
- jsdom/jsdom#2471
- Link tag in JSDOM is not implemented appropriately, as attribute is ignored
Test case 20 JSDOM doesn't implement MessageChannel ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/23
- jsdom/jsdom#2448
- https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel
- MessageChannel API is a common feature implemented in mainstream browsers
Test case 21 JSDOM doesn't support Cache api ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/24
- jsdom/jsdom#2422
- jestjs/jest#7365
Test case 22 JSDOM, inline background-position with 0 value wil be accidentally stripped ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/25
- jsdom/jsdom#2328
- JSDOM stripped background-position with 0 value, but works for background-position: 50% 30% with none-zero value
Test case 23 JSDOM doesn't support layout property like clientWidth, clientHeight, getBoundingClientRect due to lacking in layout engine ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/26
- jsdom/jsdom#2310
- jsdom/jsdom#1322
Test case 24 JSDOM doesn't support Image.decode method ❌ Failed ✔️ Successful ✔️ Successful ❌ Failed - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/28
- jsdom/jsdom#2154
- https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode
- jsdom/jsdom#2154
- Both JSDOM anf Firefox doesn't support Image.decode method, But it's supported in Chrome and Safari
Test case 25 Text.textContent doesn't inherit from Node.textContent in JSDOM ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/29
- jsdom/jsdom#2144
- https://github.com/jsdom/jsdom#shared-constructors-and-prototypes
Test case 26 JSDOM doesn't support for window.performance.navigation ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/30
- jsdom/jsdom#2136
- Missing api, it's not likely the JSDOM team is going to support it
Test case 27 In JSDOM, querySelectorAll doesn't support namespaced attributes ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/31
- jsdom/jsdom#2028
Test case 28 JSDOM doesn't support the pseudo-element of CSS ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/32
- jsdom/jsdom#1928
Test case 29 JSDOM doesn't implement Selection API (window.getSelection()) ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/33
- Since JSDOM doesn't implement Selection API, that means jest is not suitable for testing web editors
Test case 30 In JSDOM, HSL Color Assign effect is different in browers ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/34
- jsdom/jsdom#825
Test case 31 JSDOM doesn't get current textTracks of video node ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/35
- jsdom/jsdom#2541
Test case 32 JSDOM doesn't support worker thread API
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/36
- jsdom/jsdom#2020
Test case 33 In JSDOM, window.getComputedStyle doesn't work ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/37
- jsdom/jsdom#2363
Test case 34 JSDOM dosn't support queueMicrotask API ❌ Failed ✔️ Successful ❌ Failed ❌ Failed - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/38
- jsdom/jsdom#2518
- https://github.com/whatwg/html/commit/9d7cf125f960e6bb8d9b7c9456595f505f2e9d4b
Test case 35 ValidityState patternMismatch is incorrectly implemented in JSDOM ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/39
- jsdom/jsdom#2494
- queueMicrotask is a new HTML spec proposal (proposed on Aug 2018) and not supported in most modern browsers, so currently, it's not commonly used in practice.
Test case 36 JSDOM does not support PromiseRejectionEvent ❌ Failed ✔️ Successful ✔️ Successful ❌ Failed - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/39
- jsdom/jsdom#2494
Test case 37 JSDOM failed to report "illegal invocation" when using nodes' proxies ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/42
- jsdom/jsdom#2265
- This could probably be fixed by using WeakMaps instead of symbols in webidl2js.
Test case 38 JSDOM doesn't implement Comment interface correctly ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/43
- https://developer.mozilla.org/en-US/docs/Web/API/Comment
Test case 39 JSDOM Node.replacechild removes identical elements
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/44
- https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore
- (Potential fix)https://github.com/yefremov/jsdom/commit/8708d4144b66cc03b870840251e9fe36cc806ebd
Test case 40 JSDOM maxLength property value is incorrect when it is not set
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/45
- jsdom/jsdom#522
- https://html.spec.whatwg.org/#the-maxlength-and-minlength-attributes
Test case 41 JSDOM doesn't support XMLSerializer
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/46
- https://developer.mozilla.org/en-US/docs/Web/API/XMLSerializer
- jsdom/jsdom#1368
- jsdom/jsdom#2282
- https://github.com/theneva/jest-environment-jsdom-thirteen
Test case 42 JSDOM only supports subset of performance apis
❌ Failed
Not support
clearMarks
clearMeasures
clearResourceTimings
getEntries
getEntriesByName
getEntriesByType
mark
measure
setResourceTimingBufferSize
✔️ Successful ❌ Failed
(misses toJSON and timeOrigin)
✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/47
- https://developer.mozilla.org/en-US/docs/Web/API/Performance
Test case 43 JSDOM doesn't support Pointer Lock API
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/48
- https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API
Test case 44 JSDOM only supports subsets of Navigator API
❌ Failed
Not support
navigator.doNotTrack
navigator.geolocation
navigator.getGamepads
navigator.maxTouchPoints
navigator.mediaDevices
navigator.serviceWorker
navigator.sendBeacon
navigator.request​Media​KeySystem​Access
✔️ Successful ❌ Failed
Not support
navigator.hardwareConcurrency
navigator.maxTouchPoints
navigator.request​Media​KeySystem​Access
✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/49
- https://developer.mozilla.org/en-US/docs/Web/API/Navigator
- https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/navigator/Navigator-impl.js
Test case 45 JSDOM NodeList doesn't support entries, forEach, keys, values method
❌ Failed
Not support
NodeList.item
NodeList.entries
NodeList.forEach
NodeList.keys
NodeList.values
✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/50
- https://developer.mozilla.org/en-US/docs/Web/API/NodeList
- https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/NodeList-impl.js#L23
Test case 46 JSDOM only supports subsets of events for Document.createEvent
❌ Failed
Not support
beforeunloadevent
compositionevent
devicemotionevent
deviceorientationevent
dragevent
storageevent
textevent
✔️ Successful
Not support touchEvent (Desktop version)
❌ Failed
Not support:
touchevent (Desktop version)
devicemotionevent (Desktop version)
deviceorientationevent (Desktop version)
dragevent
✔️ Successful
Not support touchEvent (Desktop version)
- https://gitlab.com/jest-risk-discovery/test-cases-design/issues/51
- https://dom.spec.whatwg.org/#dom-document-createevent
- https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/Document-impl.js#L89
Test case 47 JSDOM doesn't support TransitionEvent
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/52
- jsdom/jsdom#1781
- https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
Test case 48 JSDOM's iframe doesn't define sandbox attribute
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/53
- jsdom/jsdom#1892
- https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe
Test case 49 JSDOM doesn't support IntersectionObserver API
❌ Failed ✔️ Successful ❌ Failed ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/54
- jsdom/jsdom#2032
- https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver
Test case 50 JSDOM SVG basic geometric shapes (such as SVGPathElement) are not implemented
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/55
- jsdom/jsdom#2128
Test case 51 JSDOM doesn't support Touch interface
❌ Failed ✔️ Successful ❌ Failed ❌ Failed - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/56
- jsdom/jsdom#2152
- https://w3c.github.io/touch-events/#touch-interface
Test case 52 JSDOM styles don't inherit
❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/59
- jsdom/jsdom#2160
- The issue is that the JSDOM implements cascading, but not inheritance. Inheritance is harder
Test case 53 JSDOM ImageData API is not supported globally

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/60
- jsdom/jsdom#1749
- https://developer.mozilla.org/en-US/docs/Web/API/ImageData
- currently it's only defined under Canvas
Test case 54 JSDOM doesn't support execCommand api

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/61
- jsdom/jsdom#1742
- mattermost/mattermost-webapp#228
- nadbm/react-datasheet#123
Test case 55 JSDOM doesn't support URL.createObjectURL and URL.revokeObjectURL

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/62
- jsdom/jsdom#1721
- https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
- https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
Test case 56 JSDOM doesn't support scrollIntoView method

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/62
- jsdom/jsdom#1695
- https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
- Polyfill: Element.prototype.scrollIntoView = jest.fn()
Test case 57 JSDOM element.scrollHeight always returns 0

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/65
- jsdom/jsdom#1013
- https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight
- mui/material-ui#5015
Test case 58 JSDOM HTMLInputElement is not instanceof Object

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/66
- jsdom/jsdom#1769
Test case 59 JSDOM doesn't support WebRTC

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/67
- jsdom/jsdom#1746
- https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API
- Possible solution: https://github.com/vmolsa/webrtc-native
Test case 60 JSDOM doesn't support IndexedDB

❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/68
- jsdom/jsdom#1748
- denoland/deno#1699
Test case 61 JSDOM doesn't support fetch API ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/69
- jsdom/jsdom#1724
- https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
Test case 62 JSDOM doesn't support clipboard API ❌ Failed ✔️ Successful ❌ Failed ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/70
- jsdom/jsdom#1568
- https://developer.mozilla.org/en-US/docs/Web/API/Clipboard
Test case 63 JSDOM does not support Range and Traversal API ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/72
- jsdom/jsdom#317
- https://developer.mozilla.org/en-US/docs/Web/API/Range
- https://github.com/mui-org/material-ui/blob/57e8a88faeebba4d67aaaf6c5b178ebfe97264a6/test/utils/createDOM.js#L13
Test case 64 JSDOM doesn't support webcomponents api ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/73
- jsdom/jsdom#1030
- https://developer.mozilla.org/en-US/docs/Web/Web_Components
Test case 65 JSDOM does not implement HTMLMediaElement.prototype.load ❌ Failed ✔️ Successful ✔️ Successful ✔️ Successful - https://gitlab.com/jest-risk-discovery/test-cases-design/issues/74
- jsdom/jsdom#1515

License

Jest JSDOM Browser compability result and all the test case scripts are open-sourced under Apache 2.0 and is released AS-IS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND under the terms of Section 7 of the Apache license.

DISCLAIMER

T-Mobile® has made every reasonable effort to test the code for its intended purpose, as anticipated by T-Mobile®. T-Mobile® further acknowledges that the code may be used on a wide range of platforms and in many different contexts. Accordingly, it is likely that the code will need to be modified. Please have your IT team validate the code prior to any production use.

About

This is a matrix of issues and risks of using Jest with JSDOM to test browser applications. This will include several sub projects with example tests to demonstrate the failures.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published