You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2022/01/24 08:54:57 UTC

[avro] branch branch-1.11 updated: AVRO-3317: JavaScript: Update dependencies (#1468)

This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch branch-1.11
in repository https://gitbox.apache.org/repos/asf/avro.git


The following commit(s) were added to refs/heads/branch-1.11 by this push:
     new 825adb2  AVRO-3317: JavaScript: Update dependencies (#1468)
825adb2 is described below

commit 825adb27867696d7864c3962f386f3bfb29726be
Author: Martin Grigorov <ma...@users.noreply.github.com>
AuthorDate: Mon Jan 24 10:54:24 2022 +0200

    AVRO-3317: JavaScript: Update dependencies (#1468)
    
    * AVRO-3317: Update dependencies
    
    Change tests style from TDD to BDD.
    TDD style was failing with: "suite is not defined"
    Replace Mocha's arguments with their long names.
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
    
    * AVRO-3317: Re-generate package-lock.json
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
    
    * AVRO-3317 JavaScript: Update dependencies
    
    Re-generate package-lock.json with Node v12 (npm 6.14.6) to preserve
    lockfileVersion=1
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
    
    * AVRO-3317 JavaScript: Update dependencies
    
    Run 'npm audit fix' to update some transitive dependencies.
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
    (cherry picked from commit d369f4013d36492236d64670c533b8e28c8b186e)
---
 lang/js/package-lock.json         | 972 +++++++++++++++-----------------------
 lang/js/package.json              |  14 +-
 lang/js/test/interop_data_test.js |   4 +-
 lang/js/test/test_files.js        |  96 ++--
 lang/js/test/test_protocols.js    | 138 +++---
 lang/js/test/test_schemas.js      | 428 ++++++++---------
 lang/js/test/test_utils.js        |  70 +--
 7 files changed, 769 insertions(+), 953 deletions(-)

diff --git a/lang/js/package-lock.json b/lang/js/package-lock.json
index a93a6d6..c1e295f 100644
--- a/lang/js/package-lock.json
+++ b/lang/js/package-lock.json
@@ -4,6 +4,12 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@ungap/promise-all-settled": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+      "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+      "dev": true
+    },
     "abbrev": {
       "version": "1.0.9",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
@@ -30,24 +36,34 @@
       "optional": true
     },
     "ansi-colors": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
-      "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
       "dev": true
     },
     "ansi-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true
     },
     "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
       "requires": {
-        "color-convert": "^1.9.0"
+        "color-convert": "^2.0.1"
+      }
+    },
+    "anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "dev": true,
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
       }
     },
     "argparse": {
@@ -113,6 +129,12 @@
         "tweetnacl": "^0.14.3"
       }
     },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "dev": true
+    },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -123,26 +145,25 @@
         "concat-map": "0.0.1"
       }
     },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
     "browser-stdout": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
       "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
       "dev": true
     },
-    "call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
     "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true
     },
     "caseless": {
@@ -152,33 +173,48 @@
       "dev": true
     },
     "chalk": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
       },
       "dependencies": {
         "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
         "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
-            "has-flag": "^3.0.0"
+            "has-flag": "^4.0.0"
           }
         }
       }
     },
+    "chokidar": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+      "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+      "dev": true,
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      }
+    },
     "cli": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
@@ -206,57 +242,29 @@
       }
     },
     "cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
       "requires": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
       }
     },
     "color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
       "requires": {
-        "color-name": "1.1.3"
+        "color-name": "~1.1.4"
       }
     },
     "color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
       "dev": true
     },
     "combined-stream": {
@@ -318,18 +326,26 @@
       "dev": true
     },
     "debug": {
-      "version": "3.2.6",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-      "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
       "dev": true,
       "requires": {
-        "ms": "^2.1.1"
+        "ms": "2.1.2"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
       }
     },
     "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
       "dev": true
     },
     "deep-is": {
@@ -338,15 +354,6 @@
       "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
       "dev": true
     },
-    "define-properties": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
-      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
-      "dev": true,
-      "requires": {
-        "object-keys": "^1.0.12"
-      }
-    },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -354,9 +361,9 @@
       "dev": true
     },
     "diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
       "dev": true
     },
     "dom-serializer": {
@@ -419,9 +426,9 @@
       }
     },
     "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
     "entities": {
@@ -430,59 +437,16 @@
       "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
       "dev": true
     },
-    "es-abstract": {
-      "version": "1.18.0-next.3",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.3.tgz",
-      "integrity": "sha512-VMzHx/Bczjg59E6jZOQjHeN3DEoptdhejpARgflAViidlqSpjdq9zA6lKwlhRRs/lOw1gHJv2xkkSFRgvEwbQg==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "es-to-primitive": "^1.2.1",
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.2",
-        "is-callable": "^1.2.3",
-        "is-negative-zero": "^2.0.1",
-        "is-regex": "^1.1.2",
-        "is-string": "^1.0.5",
-        "object-inspect": "^1.9.0",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.2",
-        "string.prototype.trimend": "^1.0.4",
-        "string.prototype.trimstart": "^1.0.4",
-        "unbox-primitive": "^1.0.0"
-      },
-      "dependencies": {
-        "object.assign": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
-          "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
-          "dev": true,
-          "requires": {
-            "call-bind": "^1.0.0",
-            "define-properties": "^1.1.3",
-            "has-symbols": "^1.0.1",
-            "object-keys": "^1.1.1"
-          }
-        }
-      }
-    },
-    "es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dev": true,
-      "requires": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      }
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
     },
     "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "dev": true
     },
     "escodegen": {
@@ -552,24 +516,31 @@
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
       "dev": true
     },
-    "find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
       "requires": {
-        "locate-path": "^3.0.0"
+        "to-regex-range": "^5.0.1"
       }
     },
-    "flat": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
-      "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
+    "find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "requires": {
-        "is-buffer": "~2.0.3"
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
       }
     },
+    "flat": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "dev": true
+    },
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -593,11 +564,12 @@
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
       "dev": true
     },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "optional": true
     },
     "get-caller-file": {
       "version": "2.0.5",
@@ -605,17 +577,6 @@
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true
     },
-    "get-intrinsic": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.1"
-      }
-    },
     "getpass": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -638,6 +599,15 @@
         "path-is-absolute": "^1.0.0"
       }
     },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
     "growl": {
       "version": "1.10.5",
       "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
@@ -681,33 +651,12 @@
         "har-schema": "^2.0.0"
       }
     },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-bigints": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
-      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
-      "dev": true
-    },
     "has-flag": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
       "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
       "dev": true
     },
-    "has-symbols": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-      "dev": true
-    },
     "he": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -754,81 +703,47 @@
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
       "dev": true
     },
-    "is-bigint": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz",
-      "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==",
-      "dev": true
-    },
-    "is-boolean-object": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
-      "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.0"
+        "binary-extensions": "^2.0.0"
       }
     },
-    "is-buffer": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-      "dev": true
-    },
-    "is-callable": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
-      "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
-      "dev": true
-    },
-    "is-date-object": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
-      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
       "dev": true
     },
     "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
-    },
-    "is-negative-zero": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
-      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
-      "dev": true
-    },
-    "is-number-object": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
-      "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true
     },
-    "is-regex": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
-      "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
       "requires": {
-        "call-bind": "^1.0.2",
-        "has-symbols": "^1.0.1"
+        "is-extglob": "^2.1.1"
       }
     },
-    "is-string": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
-      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true
     },
-    "is-symbol": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
-      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
-      "dev": true,
-      "requires": {
-        "has-symbols": "^1.0.1"
-      }
+    "is-plain-obj": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+      "dev": true
     },
     "is-typedarray": {
       "version": "1.0.0",
@@ -836,6 +751,12 @@
       "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
       "dev": true
     },
+    "is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true
+    },
     "isarray": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
@@ -917,9 +838,9 @@
       }
     },
     "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
       "dev": true
     },
     "json-schema-traverse": {
@@ -935,14 +856,14 @@
       "dev": true
     },
     "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
       "dev": true,
       "requires": {
         "assert-plus": "1.0.0",
         "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
+        "json-schema": "0.4.0",
         "verror": "1.10.0"
       }
     },
@@ -963,13 +884,12 @@
       }
     },
     "locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "requires": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
+        "p-locate": "^5.0.0"
       }
     },
     "lodash": {
@@ -985,12 +905,13 @@
       "dev": true
     },
     "log-symbols": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
-      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
       "requires": {
-        "chalk": "^2.0.1"
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
       }
     },
     "mime-db": {
@@ -1033,46 +954,47 @@
       }
     },
     "mocha": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz",
-      "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==",
+      "version": "9.1.4",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.4.tgz",
+      "integrity": "sha512-+q2aV5VlJZuLgCWoBvGI5zEwPF9eEI0kr/sAA9Jm4xMND7RfIEyF8JE7C0JIg8WXRG+P1sdIAb5ccoHPlXLzcw==",
       "dev": true,
       "requires": {
-        "ansi-colors": "3.2.3",
+        "@ungap/promise-all-settled": "1.1.2",
+        "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "debug": "3.2.6",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "find-up": "3.0.0",
-        "glob": "7.1.3",
+        "chokidar": "3.5.2",
+        "debug": "4.3.2",
+        "diff": "5.0.0",
+        "escape-string-regexp": "4.0.0",
+        "find-up": "5.0.0",
+        "glob": "7.1.7",
         "growl": "1.10.5",
         "he": "1.2.0",
-        "js-yaml": "3.13.1",
-        "log-symbols": "2.2.0",
+        "js-yaml": "4.1.0",
+        "log-symbols": "4.1.0",
         "minimatch": "3.0.4",
-        "mkdirp": "0.5.4",
-        "ms": "2.1.1",
-        "node-environment-flags": "1.0.5",
-        "object.assign": "4.1.0",
-        "strip-json-comments": "2.0.1",
-        "supports-color": "6.0.0",
-        "which": "1.3.1",
-        "wide-align": "1.1.3",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
-        "yargs-unparser": "1.6.0"
+        "ms": "2.1.3",
+        "nanoid": "3.1.25",
+        "serialize-javascript": "6.0.0",
+        "strip-json-comments": "3.1.1",
+        "supports-color": "8.1.1",
+        "which": "2.0.2",
+        "workerpool": "6.1.5",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
+        "yargs-unparser": "2.0.0"
       },
       "dependencies": {
-        "esprima": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
           "dev": true
         },
         "glob": {
-          "version": "7.1.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+          "version": "7.1.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+          "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
@@ -1084,51 +1006,56 @@
           }
         },
         "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
         "js-yaml": {
-          "version": "3.13.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-          "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
-          "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
           "dev": true,
           "requires": {
-            "minimist": "^1.2.5"
+            "argparse": "^2.0.1"
           }
         },
         "strip-json-comments": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
           "dev": true
         },
         "supports-color": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
-          "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
           "dev": true,
           "requires": {
-            "has-flag": "^3.0.0"
+            "isexe": "^2.0.0"
           }
         }
       }
     },
     "ms": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "dev": true
+    },
+    "nanoid": {
+      "version": "3.1.25",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
+      "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
       "dev": true
     },
     "neo-async": {
@@ -1137,16 +1064,6 @@
       "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
       "dev": true
     },
-    "node-environment-flags": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
-      "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
-      "dev": true,
-      "requires": {
-        "object.getownpropertydescriptors": "^2.0.3",
-        "semver": "^5.7.0"
-      }
-    },
     "nopt": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -1156,47 +1073,18 @@
         "abbrev": "1"
       }
     },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
     "oauth-sign": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
       "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
       "dev": true
     },
-    "object-inspect": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
-      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
-      "dev": true
-    },
-    "object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "dev": true
-    },
-    "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
-      "dev": true,
-      "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
-      }
-    },
-    "object.getownpropertydescriptors": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
-      "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.2"
-      }
-    },
     "once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1220,40 +1108,28 @@
         "word-wrap": "~1.2.3"
       }
     },
-    "os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
-    },
     "p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
       "requires": {
-        "p-try": "^2.0.0"
+        "yocto-queue": "^0.1.0"
       }
     },
     "p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
       "requires": {
-        "p-limit": "^2.0.0"
+        "p-limit": "^3.0.2"
       }
     },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
     "path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true
     },
     "path-is-absolute": {
@@ -1268,6 +1144,12 @@
       "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
       "dev": true
     },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -1292,6 +1174,15 @@
       "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
       "dev": true
     },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
     "readable-stream": {
       "version": "1.1.14",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
@@ -1304,6 +1195,15 @@
         "string_decoder": "~0.10.x"
       }
     },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
     "request": {
       "version": "2.88.2",
       "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -1338,18 +1238,37 @@
       "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
       "dev": true
     },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
     "resolve": {
       "version": "1.1.7",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
       "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
       "dev": true
     },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+          "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        }
+      }
+    },
     "safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -1362,17 +1281,14 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
       "dev": true
     },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
+    "serialize-javascript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+      "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
     },
     "shelljs": {
       "version": "0.3.0",
@@ -1414,33 +1330,14 @@
       }
     },
     "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
       "requires": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
-      }
-    },
-    "string.prototype.trimend": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
-      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
-      }
-    },
-    "string.prototype.trimstart": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
-      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
-      "dev": true,
-      "requires": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3"
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
       }
     },
     "string_decoder": {
@@ -1450,12 +1347,12 @@
       "dev": true
     },
     "strip-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
       "requires": {
-        "ansi-regex": "^3.0.0"
+        "ansi-regex": "^5.0.1"
       }
     },
     "strip-json-comments": {
@@ -1474,12 +1371,21 @@
       }
     },
     "tmp": {
-      "version": "0.0.28",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz",
-      "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=",
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+      "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
       "dev": true,
       "requires": {
-        "os-tmpdir": "~1.0.1"
+        "rimraf": "^3.0.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "^7.0.0"
       }
     },
     "tough-cookie": {
@@ -1523,18 +1429,6 @@
       "dev": true,
       "optional": true
     },
-    "unbox-primitive": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
-      "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has-bigints": "^1.0.0",
-        "has-symbols": "^1.0.0",
-        "which-boxed-primitive": "^1.0.1"
-      }
-    },
     "underscore": {
       "version": "1.13.2",
       "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz",
@@ -1575,34 +1469,6 @@
         "isexe": "^2.0.0"
       }
     },
-    "which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
-      "dev": true,
-      "requires": {
-        "is-bigint": "^1.0.1",
-        "is-boolean-object": "^1.1.0",
-        "is-number-object": "^1.0.4",
-        "is-string": "^1.0.5",
-        "is-symbol": "^1.0.3"
-      }
-    },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.2 || 2"
-      }
-    },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -1615,43 +1481,21 @@
       "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
       "dev": true
     },
+    "workerpool": {
+      "version": "6.1.5",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
+      "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+      "dev": true
+    },
     "wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "requires": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
       }
     },
     "wrappy": {
@@ -1661,77 +1505,49 @@
       "dev": true
     },
     "y18n": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true
     },
     "yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
       "requires": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
       }
     },
     "yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
+      "version": "20.2.4",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+      "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+      "dev": true
     },
     "yargs-unparser": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
-      "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
       "dev": true,
       "requires": {
-        "flat": "^4.1.0",
-        "lodash": "^4.17.15",
-        "yargs": "^13.3.0"
+        "camelcase": "^6.0.0",
+        "decamelize": "^4.0.0",
+        "flat": "^5.0.2",
+        "is-plain-obj": "^2.1.0"
       }
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true
     }
   }
 }
diff --git a/lang/js/package.json b/lang/js/package.json
index 0763623..7239812 100644
--- a/lang/js/package.json
+++ b/lang/js/package.json
@@ -34,22 +34,22 @@
     "crypto": "./etc/browser/crypto.js"
   },
   "scripts": {
-    "cover": "istanbul cover _mocha -- -f interop -i",
-    "test": "mocha -f interop -i",
+    "cover": "istanbul cover _mocha -- --fgrep interop --invert",
+    "test": "mocha --fgrep interop --invert",
     "clean": "rm -rf coverage node_modules",
     "lint": "jshint lib test",
     "interop-data-generate": "node test/interop_data_generate.js",
     "interop-data-test": "mocha test/interop_data_test.js"
   },
   "dependencies": {
-    "underscore": "^1.12.0"
+    "underscore": "^1.13.2"
   },
   "devDependencies": {
-    "coveralls": "^3.1.0",
+    "coveralls": "^3.1.1",
     "istanbul": "^0.4.5",
-    "jshint": "^2.12.0",
-    "mocha": "^6.2.3",
-    "tmp": "^0.0.28"
+    "jshint": "^2.13.3",
+    "mocha": "^9.1.4",
+    "tmp": "^0.2.1"
   },
   "noAnalyze": true,
   "license": "Apache-2.0",
diff --git a/lang/js/test/interop_data_test.js b/lang/js/test/interop_data_test.js
index 07468d8..4ec24ae 100644
--- a/lang/js/test/interop_data_test.js
+++ b/lang/js/test/interop_data_test.js
@@ -26,9 +26,9 @@ var files = require('../lib/files'),
        fs = require('fs'),
      path = require('path');
 
-suite('interop', function() {
+describe('interop', function() {
 
-  test('interop', function() {
+  it('interop', function() {
     var codecs = files.streams.BlockDecoder.getDefaultCodecs();
     var dir = "../../build/interop/data";
     fs.readdirSync(dir).forEach(function (file) {
diff --git a/lang/js/test/test_files.js b/lang/js/test/test_files.js
index 4586dfd..43d5df6 100644
--- a/lang/js/test/test_files.js
+++ b/lang/js/test/test_files.js
@@ -38,13 +38,13 @@ var streams = files.streams;
 var types = schemas.types;
 
 
-suite('files', function () {
+describe('files', function () {
 
-  suite('parse', function () {
+  describe('parse', function () {
 
     var parse = files.parse;
 
-    test('type object', function () {
+    it('type object', function () {
       var obj = {
         type: 'record',
         name: 'Person',
@@ -53,12 +53,12 @@ suite('files', function () {
       assert(parse(obj) instanceof types.RecordType);
     });
 
-    test('protocol object', function () {
+    it('protocol object', function () {
       var obj = {protocol: 'Foo'};
       assert(parse(obj) instanceof protocols.Protocol);
     });
 
-    test('schema instance', function () {
+    it('schema instance', function () {
       var type = parse({
         type: 'record',
         name: 'Person',
@@ -67,15 +67,15 @@ suite('files', function () {
       assert.strictEqual(parse(type), type);
     });
 
-    test('stringified schema', function () {
+    it('stringified schema', function () {
       assert(parse('"int"') instanceof types.IntType);
     });
 
-    test('type name', function () {
+    it('type name', function () {
       assert(parse('double') instanceof types.DoubleType);
     });
 
-    test('file', function () {
+    it('file', function () {
       var t1 = parse({type: 'fixed', name: 'id.Id', size: 64});
       var t2 = parse(path.join(__dirname, 'dat', 'Id.avsc'));
       assert.deepEqual(JSON.stringify(t1), JSON.stringify(t2));
@@ -83,11 +83,11 @@ suite('files', function () {
 
   });
 
-  suite('RawEncoder', function () {
+  describe('RawEncoder', function () {
 
     var RawEncoder = streams.RawEncoder;
 
-    test('flush once', function (cb) {
+    it('flush once', function (cb) {
       var t = createType('int');
       var buf;
       var encoder = new RawEncoder(t)
@@ -104,7 +104,7 @@ suite('files', function () {
       encoder.end(-2);
     });
 
-    test('write multiple', function (cb) {
+    it('write multiple', function (cb) {
       var t = createType('int');
       var bufs = [];
       var encoder = new RawEncoder(t, {batchSize: 1})
@@ -119,7 +119,7 @@ suite('files', function () {
       encoder.end(1);
     });
 
-    test('resize', function (cb) {
+    it('resize', function (cb) {
       var t = createType({type: 'fixed', name: 'A', size: 2});
       var data = Buffer.from([48, 18]);
       var buf;
@@ -136,7 +136,7 @@ suite('files', function () {
       encoder.end();
     });
 
-    test('flush when full', function (cb) {
+    it('flush when full', function (cb) {
       var t = createType({type: 'fixed', name: 'A', size: 2});
       var data = Buffer.from([48, 18]);
       var chunks = [];
@@ -151,7 +151,7 @@ suite('files', function () {
       encoder.end();
     });
 
-    test('empty', function (cb) {
+    it('empty', function (cb) {
       var t = createType('int');
       var chunks = [];
       var encoder = new RawEncoder(t, {batchSize: 2})
@@ -163,16 +163,16 @@ suite('files', function () {
       encoder.end();
     });
 
-    test('missing writer type', function () {
+    it('missing writer type', function () {
       assert.throws(function () { new RawEncoder(); });
     });
 
-    test('writer type from schema', function () {
+    it('writer type from schema', function () {
       var encoder = new RawEncoder('int');
       assert(encoder._type instanceof types.IntType);
     });
 
-    test('invalid object', function (cb) {
+    it('invalid object', function (cb) {
       var t = createType('int');
       var encoder = new RawEncoder(t)
         .on('error', function () { cb(); });
@@ -181,11 +181,11 @@ suite('files', function () {
 
   });
 
-  suite('RawDecoder', function () {
+  describe('RawDecoder', function () {
 
     var RawDecoder = streams.RawDecoder;
 
-    test('single item', function (cb) {
+    it('single item', function (cb) {
       var t = createType('int');
       var objs = [];
       var decoder = new RawDecoder(t)
@@ -197,11 +197,11 @@ suite('files', function () {
       decoder.end(Buffer.from([0]));
     });
 
-    test('no writer type', function () {
+    it('no writer type', function () {
       assert.throws(function () { new RawDecoder(); });
     });
 
-    test('decoding', function (cb) {
+    it('decoding', function (cb) {
       var t = createType('int');
       var objs = [];
       var decoder = new RawDecoder(t)
@@ -214,7 +214,7 @@ suite('files', function () {
       decoder.end(Buffer.from([4]));
     });
 
-    test('no decoding', function (cb) {
+    it('no decoding', function (cb) {
       var t = createType('int');
       var bufs = [Buffer.from([3]), Buffer.from([124])];
       var objs = [];
@@ -228,7 +228,7 @@ suite('files', function () {
       decoder.end(bufs[1]);
     });
 
-    test('write partial', function (cb) {
+    it('write partial', function (cb) {
       var t = createType('bytes');
       var objs = [];
       var decoder = new RawDecoder(t)
@@ -244,29 +244,29 @@ suite('files', function () {
 
   });
 
-  suite('BlockEncoder', function () {
+  describe('BlockEncoder', function () {
 
     var BlockEncoder = streams.BlockEncoder;
 
-    test('invalid type', function () {
+    it('invalid type', function () {
       assert.throws(function () { new BlockEncoder(); });
     });
 
-    test('invalid codec', function (cb) {
+    it('invalid codec', function (cb) {
       var t = createType('int');
       var encoder = new BlockEncoder(t, {codec: 'foo'})
         .on('error', function () { cb(); });
       encoder.write(2);
     });
 
-    test('invalid object', function (cb) {
+    it('invalid object', function (cb) {
       var t = createType('int');
       var encoder = new BlockEncoder(t)
         .on('error', function () { cb(); });
       encoder.write('hi');
     });
 
-    test('empty', function (cb) {
+    it('empty', function (cb) {
       var t = createType('int');
       var chunks = [];
       var encoder = new BlockEncoder(t)
@@ -278,7 +278,7 @@ suite('files', function () {
       encoder.end();
     });
 
-    test('flush on finish', function (cb) {
+    it('flush on finish', function (cb) {
       var t = createType('int');
       var chunks = [];
       var encoder = new BlockEncoder(t, {
@@ -299,7 +299,7 @@ suite('files', function () {
       encoder.end(4);
     });
 
-    test('flush when full', function (cb) {
+    it('flush when full', function (cb) {
       var chunks = [];
       var encoder = new BlockEncoder(createType('int'), {
         omitHeader: true,
@@ -320,7 +320,7 @@ suite('files', function () {
       encoder.end(64);
     });
 
-    test('resize', function (cb) {
+    it('resize', function (cb) {
       var t = createType({type: 'fixed', size: 8, name: 'Eight'});
       var buf = Buffer.from('abcdefgh');
       var chunks = [];
@@ -339,7 +339,7 @@ suite('files', function () {
       encoder.end(buf);
     });
 
-    test('compression error', function (cb) {
+    it('compression error', function (cb) {
       var t = createType('int');
       var codecs = {
         invalid: function (data, cb) { cb(new Error('ouch')); }
@@ -349,7 +349,7 @@ suite('files', function () {
       encoder.end(12);
     });
 
-    test('write non-canonical schema', function (cb) {
+    it('write non-canonical schema', function (cb) {
       var obj = {type: 'fixed', size: 2, name: 'Id', doc: 'An id.'};
       var id = Buffer.from([1, 2]);
       var ids = [];
@@ -370,11 +370,11 @@ suite('files', function () {
 
   });
 
-  suite('BlockDecoder', function () {
+  describe('BlockDecoder', function () {
 
     var BlockDecoder = streams.BlockDecoder;
 
-    test('invalid magic bytes', function (cb) {
+    it('invalid magic bytes', function (cb) {
       var decoder = new BlockDecoder()
         .on('data', function () {})
         .on('error', function () { cb(); });
@@ -383,7 +383,7 @@ suite('files', function () {
       decoder.end(SYNC);
     });
 
-    test('invalid sync marker', function (cb) {
+    it('invalid sync marker', function (cb) {
       var decoder = new BlockDecoder()
         .on('data', function () {})
         .on('error', function () { cb(); });
@@ -400,7 +400,7 @@ suite('files', function () {
       decoder.end(Buffer.from('alongerstringthansixteenbytes'));
     });
 
-    test('missing codec', function (cb) {
+    it('missing codec', function (cb) {
       var decoder = new BlockDecoder()
         .on('data', function () {})
         .on('end', function () { cb(); });
@@ -412,7 +412,7 @@ suite('files', function () {
       decoder.end(header.$toBuffer());
     });
 
-    test('unknown codec', function (cb) {
+    it('unknown codec', function (cb) {
       var decoder = new BlockDecoder()
         .on('data', function () {})
         .on('error', function () { cb(); });
@@ -427,7 +427,7 @@ suite('files', function () {
       decoder.end(header.$toBuffer());
     });
 
-    test('invalid schema', function (cb) {
+    it('invalid schema', function (cb) {
       var decoder = new BlockDecoder()
         .on('data', function () {})
         .on('error', function () { cb(); });
@@ -444,9 +444,9 @@ suite('files', function () {
 
   });
 
-  suite('encode & decode', function () {
+  describe('encode & decode', function () {
 
-    test('uncompressed int', function (cb) {
+    it('uncompressed int', function (cb) {
       var t = createType('int');
       var objs = [];
       var encoder = new streams.BlockEncoder(t);
@@ -462,7 +462,7 @@ suite('files', function () {
       encoder.end(48);
     });
 
-    test('uncompressed int non decoded', function (cb) {
+    it('uncompressed int non decoded', function (cb) {
       var t = createType('int');
       var objs = [];
       var encoder = new streams.BlockEncoder(t);
@@ -476,7 +476,7 @@ suite('files', function () {
       encoder.end(48);
     });
 
-    test('deflated records', function (cb) {
+    it('deflated records', function (cb) {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -506,7 +506,7 @@ suite('files', function () {
       encoder.end();
     });
 
-    test('decompression error', function (cb) {
+    it('decompression error', function (cb) {
       var t = createType('int');
       var codecs = {
         'null': function (data, cb) { cb(new Error('ouch')); }
@@ -518,7 +518,7 @@ suite('files', function () {
       encoder.end(1);
     });
 
-    test('decompression late read', function (cb) {
+    it('decompression late read', function (cb) {
       var chunks = [];
       var encoder = new streams.BlockEncoder(createType('int'));
       var decoder = new streams.BlockDecoder();
@@ -533,7 +533,7 @@ suite('files', function () {
 
   });
 
-  test('createFileDecoder', function (cb) {
+  it('createFileDecoder', function (cb) {
     var n = 0;
     var type = loadSchema(path.join(DPATH, 'Person.avsc'));
     files.createFileDecoder(path.join(DPATH, 'person-10.avro'))
@@ -550,7 +550,7 @@ suite('files', function () {
       });
   });
 
-  test('createFileEncoder', function (cb) {
+  it('createFileEncoder', function (cb) {
     var type = createType({
       type: 'record',
       name: 'Person',
@@ -577,7 +577,7 @@ suite('files', function () {
     });
   });
 
-  test('extractFileHeader', function () {
+  it('extractFileHeader', function () {
     var header;
     var fpath = path.join(DPATH, 'person-10.avro');
     header = files.extractFileHeader(fpath);
diff --git a/lang/js/test/test_protocols.js b/lang/js/test/test_protocols.js
index c3cce96..786fc8f 100644
--- a/lang/js/test/test_protocols.js
+++ b/lang/js/test/test_protocols.js
@@ -33,11 +33,11 @@ var HANDSHAKE_RESPONSE_TYPE = protocols.HANDSHAKE_RESPONSE_TYPE;
 var createProtocol = protocols.createProtocol;
 
 
-suite('protocols', function () {
+describe('protocols', function () {
 
-  suite('Protocol', function () {
+  describe('Protocol', function () {
 
-    test('get name and types', function () {
+    it('get name and types', function () {
       var p = createProtocol({
         namespace: 'foo',
         protocol: 'HelloWorld',
@@ -70,20 +70,20 @@ suite('protocols', function () {
       assert.equal(p.getType('foo.Greeting').getName(true), 'record');
     });
 
-    test('missing message', function () {
+    it('missing message', function () {
       var ptcl = createProtocol({namespace: 'com.acme', protocol: 'Hello'});
       assert.throws(function () {
         ptcl.on('add', function () {});
       }, /unknown/);
     });
 
-    test('missing name', function () {
+    it('missing name', function () {
       assert.throws(function () {
         createProtocol({namespace: 'com.acme', messages: {}});
       });
     });
 
-    test('missing type', function () {
+    it('missing type', function () {
       assert.throws(function () {
         createProtocol({
           namespace: 'com.acme',
@@ -98,7 +98,7 @@ suite('protocols', function () {
       });
     });
 
-    test('get messages', function () {
+    it('get messages', function () {
       var ptcl;
       ptcl = createProtocol({protocol: 'Empty'});
       assert.deepEqual(ptcl.getMessages(), {});
@@ -116,7 +116,7 @@ suite('protocols', function () {
       assert(messages.ping !== undefined);
     });
 
-    test('create listener', function (done) {
+    it('create listener', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var transport = new stream.PassThrough();
       var ee = ptcl.createListener(transport, function (pending) {
@@ -126,14 +126,14 @@ suite('protocols', function () {
       ee.destroy();
     });
 
-    test('subprotocol', function () {
+    it('subprotocol', function () {
       var ptcl = createProtocol({namespace: 'com.acme', protocol: 'Hello'});
       var subptcl = ptcl.subprotocol();
       assert.strictEqual(subptcl._emitterResolvers, ptcl._emitterResolvers);
       assert.strictEqual(subptcl._listenerResolvers, ptcl._listenerResolvers);
     });
 
-    test('invalid emitter', function (done) {
+    it('invalid emitter', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       ptcl.emit('hi', {}, null, function (err) {
         assert(/invalid emitter/.test(err.string));
@@ -141,7 +141,7 @@ suite('protocols', function () {
       });
     });
 
-    test('inspect', function () {
+    it('inspect', function () {
       var p = createProtocol({
         namespace: 'hello',
         protocol: 'World',
@@ -151,11 +151,11 @@ suite('protocols', function () {
 
   });
 
-  suite('Message', function () {
+  describe('Message', function () {
 
     var Message = protocols.Message;
 
-    test('empty errors', function () {
+    it('empty errors', function () {
       var m = new Message('Hi', {
         request: [{name: 'greeting', type: 'string'}],
         response: 'int'
@@ -163,7 +163,7 @@ suite('protocols', function () {
       assert.deepEqual(m.errorType.toString(), '["string"]');
     });
 
-    test('missing response', function () {
+    it('missing response', function () {
       assert.throws(function () {
         new Message('Hi', {
           request: [{name: 'greeting', type: 'string'}]
@@ -171,7 +171,7 @@ suite('protocols', function () {
       });
     });
 
-    test('invalid one-way', function () {
+    it('invalid one-way', function () {
       // Non-null response.
       assert.throws(function () {
         new Message('Hi', {
@@ -193,11 +193,11 @@ suite('protocols', function () {
 
   });
 
-  suite('MessageDecoder', function () {
+  describe('MessageDecoder', function () {
 
     var MessageDecoder = protocols.streams.MessageDecoder;
 
-    test('ok', function (done) {
+    it('ok', function (done) {
       var parts = [
         Buffer.from([0, 1]),
         Buffer.from([2]),
@@ -218,7 +218,7 @@ suite('protocols', function () {
       readable.pipe(new MessageDecoder()).pipe(writable);
     });
 
-    test('trailing data', function (done) {
+    it('trailing data', function (done) {
       var parts = [
         Buffer.from([0, 1]),
         Buffer.from([2]),
@@ -237,7 +237,7 @@ suite('protocols', function () {
         .pipe(writable);
     });
 
-    test('empty', function (done) {
+    it('empty', function (done) {
       var readable = createReadableStream([], true);
       readable
         .pipe(new MessageDecoder(true))
@@ -246,15 +246,15 @@ suite('protocols', function () {
 
   });
 
-  suite('MessageEncoder', function () {
+  describe('MessageEncoder', function () {
 
     var MessageEncoder = protocols.streams.MessageEncoder;
 
-    test('invalid frame size', function () {
+    it('invalid frame size', function () {
       assert.throws(function () { new MessageEncoder(); });
     });
 
-    test('ok', function (done) {
+    it('ok', function (done) {
       var messages = [
         Buffer.from([0, 1]),
         Buffer.from([2])
@@ -277,7 +277,7 @@ suite('protocols', function () {
         });
     });
 
-    test('all zeros', function (done) {
+    it('all zeros', function (done) {
       var messages = [Buffer.from([0, 0, 0, 0])];
       var frames = [];
       var readable = createReadableStream(messages, true);
@@ -294,7 +294,7 @@ suite('protocols', function () {
         });
     });
 
-    test('short frame size', function (done) {
+    it('short frame size', function (done) {
       var messages = [
         Buffer.from([0, 1, 2]),
         Buffer.from([2])
@@ -319,9 +319,9 @@ suite('protocols', function () {
 
   });
 
-  suite('StatefulEmitter', function () {
+  describe('StatefulEmitter', function () {
 
-    test('ok handshake', function (done) {
+    it('ok handshake', function (done) {
       var buf = HANDSHAKE_RESPONSE_TYPE.toBuffer({match: 'BOTH'});
       var bufs = [];
       var ptcl = createProtocol({protocol: 'Empty'});
@@ -345,7 +345,7 @@ suite('protocols', function () {
         });
     });
 
-    test('no server match handshake', function (done) {
+    it('no server match handshake', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var resBufs = [
         {
@@ -372,7 +372,7 @@ suite('protocols', function () {
         });
     });
 
-    test('incompatible protocol', function (done) {
+    it('incompatible protocol', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var hash = Buffer.alloc(16); // Pretend the hash was different.
       var resBufs = [
@@ -400,7 +400,7 @@ suite('protocols', function () {
         });
     });
 
-    test('handshake error', function (done) {
+    it('handshake error', function (done) {
       var resBufs = [
         Buffer.from([4, 0, 0]), // Invalid handshakes.
         Buffer.from([4, 0, 0])
@@ -418,7 +418,7 @@ suite('protocols', function () {
         });
     });
 
-    test('orphan response', function (done) {
+    it('orphan response', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var idType = protocols.IdType.createMetadataType();
       var resBufs = [
@@ -437,7 +437,7 @@ suite('protocols', function () {
         });
     });
 
-    test('ended readable', function (done) {
+    it('ended readable', function (done) {
       var bufs = [];
       var ptcl = createProtocol({protocol: 'Empty'});
       ptcl.createEmitter(createTransport([], bufs))
@@ -447,7 +447,7 @@ suite('protocols', function () {
         });
     });
 
-    test('interrupted', function (done) {
+    it('interrupted', function (done) {
       var ptcl = createProtocol({
         protocol: 'Empty',
         messages: {
@@ -473,7 +473,7 @@ suite('protocols', function () {
       }
     });
 
-    test('missing client message', function (done) {
+    it('missing client message', function (done) {
       var ptcl1 = createProtocol({
         protocol: 'Ping',
         messages: {
@@ -496,7 +496,7 @@ suite('protocols', function () {
       });
     });
 
-    test('missing server message', function (done) {
+    it('missing server message', function (done) {
       var ptcl1 = createProtocol({
         protocol: 'Ping',
         messages: {
@@ -513,7 +513,7 @@ suite('protocols', function () {
         });
     });
 
-    test('trailing data', function (done) {
+    it('trailing data', function (done) {
       var ptcl = createProtocol({
         protocol: 'Ping',
         messages: {
@@ -529,7 +529,7 @@ suite('protocols', function () {
       transports[0].readable.end(Buffer.from([2, 3]));
     });
 
-    test('invalid metadata', function (done) {
+    it('invalid metadata', function (done) {
       var ptcl = createProtocol({
         protocol: 'Ping',
         messages: {
@@ -549,7 +549,7 @@ suite('protocols', function () {
         });
     });
 
-    test('invalid response', function (done) {
+    it('invalid response', function (done) {
       var ptcl = createProtocol({
         protocol: 'Ping',
         messages: {
@@ -577,7 +577,7 @@ suite('protocols', function () {
         });
     });
 
-    test('one way', function (done) {
+    it('one way', function (done) {
       var beats = 0;
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
@@ -599,9 +599,9 @@ suite('protocols', function () {
 
   });
 
-  suite('StatelessEmitter', function () {
+  describe('StatelessEmitter', function () {
 
-    test('interrupted before response data', function (done) {
+    it('interrupted before response data', function (done) {
       var ptcl = createProtocol({
         protocol: 'Ping',
         messages: {ping: {request: [], response: 'boolean'}}
@@ -623,9 +623,9 @@ suite('protocols', function () {
 
   });
 
-  suite('StatefulListener', function () {
+  describe('StatefulListener', function () {
 
-    test('end readable', function (done) {
+    it('end readable', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var transports = createPassthroughTransports();
       ptcl.createListener(transports[0])
@@ -636,7 +636,7 @@ suite('protocols', function () {
       transports[0].readable.end();
     });
 
-    test('finish writable', function (done) {
+    it('finish writable', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var transports = createPassthroughTransports();
       ptcl.createListener(transports[0])
@@ -647,7 +647,7 @@ suite('protocols', function () {
       transports[0].writable.end();
     });
 
-    test('invalid handshake', function (done) {
+    it('invalid handshake', function (done) {
       var ptcl = createProtocol({protocol: 'Empty'});
       var transport = createTransport(
         [Buffer.from([4])], // Invalid handshake.
@@ -661,7 +661,7 @@ suite('protocols', function () {
         });
     });
 
-    test('missing server message', function (done) {
+    it('missing server message', function (done) {
       var ptcl1 = createProtocol({protocol: 'Empty'});
       var ptcl2 = createProtocol({
         protocol: 'Heartbeat',
@@ -687,7 +687,7 @@ suite('protocols', function () {
         });
     });
 
-    test('invalid metadata', function (done) {
+    it('invalid metadata', function (done) {
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
         messages: {beat: {request: [], response: 'boolean'}}
@@ -707,7 +707,7 @@ suite('protocols', function () {
         });
     });
 
-    test('unknown message', function (done) {
+    it('unknown message', function (done) {
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
         messages: {beat: {request: [], response: 'boolean'}}
@@ -746,7 +746,7 @@ suite('protocols', function () {
         });
     });
 
-    test('invalid request', function (done) {
+    it('invalid request', function (done) {
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
         messages: {beat: {
@@ -787,7 +787,7 @@ suite('protocols', function () {
         });
     });
 
-    test('destroy', function (done) {
+    it('destroy', function (done) {
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
         messages: {beat: {request: [], response: 'boolean'}}
@@ -809,9 +809,9 @@ suite('protocols', function () {
 
   });
 
-  suite('StatelessListener', function () {
+  describe('StatelessListener', function () {
 
-    test('unknown message', function (done) {
+    it('unknown message', function (done) {
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
         messages: {beat: {request: [], response: 'boolean'}}
@@ -850,7 +850,7 @@ suite('protocols', function () {
       ]));
     });
 
-    test('late writable', function (done) {
+    it('late writable', function (done) {
       var ptcl = createProtocol({
         protocol: 'Heartbeat',
         messages: {beat: {request: [], response: 'boolean'}}
@@ -876,9 +876,9 @@ suite('protocols', function () {
 
   });
 
-  suite('emit', function () {
+  describe('emit', function () {
 
-    suite('stateful', function () {
+    describe('stateful', function () {
 
       run(function (emitterPtcl, listenerPtcl, cb) {
         var pt1 = new stream.PassThrough();
@@ -892,7 +892,7 @@ suite('protocols', function () {
 
     });
 
-    suite('stateless', function () {
+    describe('stateless', function () {
 
       run(function (emitterPtcl, listenerPtcl, cb) {
         cb(emitterPtcl.createEmitter(writableFactory));
@@ -915,7 +915,7 @@ suite('protocols', function () {
 
     function run(setupFn) {
 
-      test('single', function (done) {
+      it('single', function (done) {
         var ptcl = createProtocol({
           protocol: 'Math',
           messages: {
@@ -940,7 +940,7 @@ suite('protocols', function () {
         });
       });
 
-      test('invalid request', function (done) {
+      it('invalid request', function (done) {
         var ptcl = createProtocol({
           protocol: 'Math',
           messages: {
@@ -959,7 +959,7 @@ suite('protocols', function () {
         });
       });
 
-      test('error response', function (done) {
+      it('error response', function (done) {
         var msg = 'must be non-negative';
         var ptcl = createProtocol({
           protocol: 'Math',
@@ -989,7 +989,7 @@ suite('protocols', function () {
         });
       });
 
-      test('invalid response', function (done) {
+      it('invalid response', function (done) {
         var ptcl = createProtocol({
           protocol: 'Math',
           messages: {
@@ -1019,7 +1019,7 @@ suite('protocols', function () {
         });
       });
 
-      test('invalid error', function (done) {
+      it('invalid error', function (done) {
         var ptcl = createProtocol({
           protocol: 'Math',
           messages: {
@@ -1048,7 +1048,7 @@ suite('protocols', function () {
         });
       });
 
-      test('out of order', function (done) {
+      it('out of order', function (done) {
         var ptcl = createProtocol({
           protocol: 'Delay',
           messages: {
@@ -1091,7 +1091,7 @@ suite('protocols', function () {
         });
       });
 
-      test('compatible protocols', function (done) {
+      it('compatible protocols', function (done) {
         var emitterPtcl = createProtocol({
           protocol: 'emitterProtocol',
           messages: {
@@ -1134,7 +1134,7 @@ suite('protocols', function () {
         );
       });
 
-      test('cached compatible protocols', function (done) {
+      it('cached compatible protocols', function (done) {
         var ptcl1 = createProtocol({
           protocol: 'emitterProtocol',
           messages: {
@@ -1181,7 +1181,7 @@ suite('protocols', function () {
         );
       });
 
-      test('incompatible protocols', function (done) {
+      it('incompatible protocols', function (done) {
         var emitterPtcl = createProtocol({
           protocol: 'emitterProtocol',
           messages: {
@@ -1207,7 +1207,7 @@ suite('protocols', function () {
         );
       });
 
-      test('unknown message', function (done) {
+      it('unknown message', function (done) {
         var ptcl = createProtocol({protocol: 'Empty'});
         setupFn(ptcl, ptcl, function (ee) {
           ptcl.emit('echo', {}, ee, function (err) {
@@ -1217,7 +1217,7 @@ suite('protocols', function () {
         });
       });
 
-      test('unsupported message', function (done) {
+      it('unsupported message', function (done) {
         var ptcl = createProtocol({
           protocol: 'Echo',
           messages: {
@@ -1235,7 +1235,7 @@ suite('protocols', function () {
         });
       });
 
-      test('destroy emitter noWait', function (done) {
+      it('destroy emitter noWait', function (done) {
         var ptcl = createProtocol({
           protocol: 'Delay',
           messages: {
@@ -1270,7 +1270,7 @@ suite('protocols', function () {
         });
       });
 
-      test('destroy emitter', function (done) {
+      it('destroy emitter', function (done) {
         var ptcl = createProtocol({
           protocol: 'Math',
           messages: {
@@ -1298,7 +1298,7 @@ suite('protocols', function () {
 
   });
 
-  test('throw error', function () {
+  it('throw error', function () {
     assert(!tryCatch(null));
     assert.equal(tryCatch(new Error('hi')), 'hi');
     assert.equal(tryCatch('hi'), 'hi');
diff --git a/lang/js/test/test_schemas.js b/lang/js/test/test_schemas.js
index 33797e9..0cc0996 100644
--- a/lang/js/test/test_schemas.js
+++ b/lang/js/test/test_schemas.js
@@ -31,9 +31,9 @@ var createType = schemas.createType;
 var types = schemas.types;
 
 
-suite('types', function () {
+describe('types', function () {
 
-  suite('BooleanType', function () {
+  describe('BooleanType', function () {
 
     var data = [
       {
@@ -44,12 +44,12 @@ suite('types', function () {
 
     testType(types.BooleanType, data);
 
-    test('to JSON', function () {
+    it('to JSON', function () {
       var t = new types.BooleanType();
       assert.equal(t.toJSON(), 'boolean');
     });
 
-    test('compare buffers', function () {
+    it('compare buffers', function () {
       var t = new types.BooleanType();
       var bt = t.toBuffer(true);
       var bf = t.toBuffer(false);
@@ -58,7 +58,7 @@ suite('types', function () {
       assert.equal(t.compareBuffers(bt, bt), 0);
     });
 
-    test('get name', function () {
+    it('get name', function () {
       var t = new types.BooleanType();
       assert.strictEqual(t.getName(), undefined);
       assert.equal(t.getName(true), 'boolean');
@@ -66,7 +66,7 @@ suite('types', function () {
 
   });
 
-  suite('IntType', function () {
+  describe('IntType', function () {
 
     var data = [
       {
@@ -77,7 +77,7 @@ suite('types', function () {
 
     testType(types.IntType, data);
 
-    test('toBuffer int', function () {
+    it('toBuffer int', function () {
 
       var type = createType('int');
       assert.equal(type.fromBuffer(Buffer.from([0x80, 0x01])), 64);
@@ -85,7 +85,7 @@ suite('types', function () {
 
     });
 
-    test('resolve int > long', function () {
+    it('resolve int > long', function () {
       var intType = createType('int');
       var longType = createType('long');
       var buf = intType.toBuffer(123);
@@ -95,7 +95,7 @@ suite('types', function () {
       );
     });
 
-    test('resolve int > [null, int]', function () {
+    it('resolve int > [null, int]', function () {
       var wt = createType('int');
       var rt = createType(['null', 'int']);
       var buf = wt.toBuffer(123);
@@ -105,14 +105,14 @@ suite('types', function () {
       );
     });
 
-    test('resolve int > float', function () {
+    it('resolve int > float', function () {
       var wt = createType('int');
       var rt = createType('float');
       var buf = wt.toBuffer(123);
       assert.deepEqual(rt.fromBuffer(buf, rt.createResolver(wt)), 123);
     });
 
-    test('resolve int > double', function () {
+    it('resolve int > double', function () {
       var wt = createType('int');
       var rt = createType('double');
       var n = Math.pow(2, 30) + 1;
@@ -120,23 +120,23 @@ suite('types', function () {
       assert.deepEqual(rt.fromBuffer(buf, rt.createResolver(wt)), n);
     });
 
-    test('toString', function () {
+    it('toString', function () {
       assert.equal(createType('int').toString(), '"int"');
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = createType('int');
       assert.equal(t.clone(123), 123);
       assert.throws(function () { t.clone(''); });
     });
 
-    test('resolve invalid', function () {
+    it('resolve invalid', function () {
       assert.throws(function () { getResolver('int', 'long'); });
     });
 
   });
 
-  suite('LongType', function () {
+  describe('LongType', function () {
 
     var data = [
       {
@@ -147,11 +147,11 @@ suite('types', function () {
 
     testType(types.LongType, data);
 
-    test('resolve invalid', function () {
+    it('resolve invalid', function () {
       assert.throws(function () { getResolver('long', 'double'); });
     });
 
-    test('resolve long > float', function () {
+    it('resolve long > float', function () {
       var t1 = createType('long');
       var t2 = createType('float');
       var n = 9007199254740990; // Number.MAX_SAFE_INTEGER - 1
@@ -161,19 +161,19 @@ suite('types', function () {
       assert(t2.isValid(f));
     });
 
-    test('precision loss', function () {
+    it('precision loss', function () {
       var type = createType('long');
       var buf = Buffer.from([0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x20]);
       assert.throws(function () { type.fromBuffer(buf); });
     });
 
-    test('using missing methods', function () {
+    it('using missing methods', function () {
       assert.throws(function () { types.LongType.using(); });
     });
 
   });
 
-  suite('StringType', function () {
+  describe('StringType', function () {
 
     var data = [
       {
@@ -184,7 +184,7 @@ suite('types', function () {
 
     testType(types.StringType, data);
 
-    test('fromBuffer string', function () {
+    it('fromBuffer string', function () {
       var type = createType('string');
       var buf = Buffer.from([0x06, 0x68, 0x69, 0x21]);
       var s = 'hi!';
@@ -192,13 +192,13 @@ suite('types', function () {
       assert(buf.equals(type.toBuffer(s)));
     });
 
-    test('toBuffer string', function () {
+    it('toBuffer string', function () {
       var type = createType('string');
       var buf = Buffer.from([0x06, 0x68, 0x69, 0x21]);
       assert(buf.equals(type.toBuffer('hi!', 1)));
     });
 
-    test('resolve string > bytes', function () {
+    it('resolve string > bytes', function () {
       var stringT = createType('string');
       var bytesT = createType('bytes');
       var buf = stringT.toBuffer('\x00\x01');
@@ -208,7 +208,7 @@ suite('types', function () {
       );
     });
 
-    test('encode resize', function () {
+    it('encode resize', function () {
       var t = createType('string');
       var s = 'hello';
       var b, pos;
@@ -223,7 +223,7 @@ suite('types', function () {
 
   });
 
-  suite('NullType', function () {
+  describe('NullType', function () {
 
     var data = [
       {
@@ -237,7 +237,7 @@ suite('types', function () {
 
   });
 
-  suite('FloatType', function () {
+  describe('FloatType', function () {
 
     var data = [
       {
@@ -249,7 +249,7 @@ suite('types', function () {
 
     testType(types.FloatType, data);
 
-    test('compare buffer', function () {
+    it('compare buffer', function () {
       var t = createType('float');
       var b1 = t.toBuffer(0.5);
       assert.equal(t.compareBuffers(b1, b1), 0);
@@ -259,17 +259,17 @@ suite('types', function () {
       assert.equal(t.compareBuffers(b1, b3), -1);
     });
 
-    test('resolver double > float', function () {
+    it('resolver double > float', function () {
       assert.throws(function () { getResolver('float', 'double'); });
     });
 
-    test('fromString', function () {
+    it('fromString', function () {
       var t = createType('float');
       var f = t.fromString('3.1');
       assert(t.isValid(f));
     });
 
-    test('clone from double', function () {
+    it('clone from double', function () {
       var t = createType('float');
       var d = 3.1;
       var f;
@@ -279,7 +279,7 @@ suite('types', function () {
 
   });
 
-  suite('DoubleType', function () {
+  describe('DoubleType', function () {
 
     var data = [
       {
@@ -291,11 +291,11 @@ suite('types', function () {
 
     testType(types.DoubleType, data);
 
-    test('resolver string > double', function () {
+    it('resolver string > double', function () {
       assert.throws(function () { getResolver('double', 'string'); });
     });
 
-    test('compare buffer', function () {
+    it('compare buffer', function () {
       var t = createType('double');
       var b1 = t.toBuffer(0.5);
       assert.equal(t.compareBuffers(b1, b1), 0);
@@ -307,7 +307,7 @@ suite('types', function () {
 
   });
 
-  suite('BytesType', function () {
+  describe('BytesType', function () {
 
     var data = [
       {
@@ -318,7 +318,7 @@ suite('types', function () {
 
     testType(types.BytesType, data);
 
-    test('clone', function () {
+    it('clone', function () {
       var t = createType('bytes');
       var s = '\x01\x02';
       var buf = Buffer.from(s);
@@ -333,7 +333,7 @@ suite('types', function () {
       assert.throws(function () { t.clone(1, {coerceBuffers: true}); });
     });
 
-    test('fromString', function () {
+    it('fromString', function () {
       var t = createType('bytes');
       var s = '\x01\x02';
       var buf = Buffer.from(s);
@@ -341,7 +341,7 @@ suite('types', function () {
       assert.deepEqual(clone, buf);
     });
 
-    test('compare', function () {
+    it('compare', function () {
       var t = createType('bytes');
       var b1 = t.toBuffer(Buffer.from([0, 2]));
       assert.equal(t.compareBuffers(b1, b1), 0);
@@ -353,7 +353,7 @@ suite('types', function () {
 
   });
 
-  suite('UnionType', function () {
+  describe('UnionType', function () {
 
     var data = [
       {
@@ -396,42 +396,42 @@ suite('types', function () {
 
     testType(types.UnionType, data, schemas);
 
-    test('getTypes', function () {
+    it('getTypes', function () {
       var t = createType(['null', 'int']);
       assert.deepEqual(t.getTypes(), [createType('null'), createType('int')]);
     });
 
-    test('instanceof Union', function () {
+    it('instanceof Union', function () {
       var type = new types.UnionType(['null', 'int']);
       assert(type instanceof types.UnionType);
     });
 
-    test('missing name write', function () {
+    it('missing name write', function () {
       var type = new types.UnionType(['null', 'int']);
       assert.throws(function () {
         type.toBuffer({b: 'a'});
       });
     });
 
-    test('read invalid index', function () {
+    it('read invalid index', function () {
       var type = new types.UnionType(['null', 'int']);
       var buf = Buffer.from([1, 0]);
       assert.throws(function () { type.fromBuffer(buf); });
     });
 
-    test('non wrapped write', function () {
+    it('non wrapped write', function () {
       var type = new types.UnionType(['null', 'int']);
       assert.throws(function () {
         type.toBuffer(1, true);
       }, Error);
     });
 
-    test('to JSON', function () {
+    it('to JSON', function () {
       var type = new types.UnionType(['null', 'int']);
       assert.equal(JSON.stringify(type), '["null","int"]');
     });
 
-    test('resolve int to [long, int]', function () {
+    it('resolve int to [long, int]', function () {
       var t1 = createType('int');
       var t2 = createType(['long', 'int']);
       var a = t2.createResolver(t1);
@@ -439,14 +439,14 @@ suite('types', function () {
       assert.deepEqual(t2.fromBuffer(buf, a), {'long': 23});
     });
 
-    test('resolve null to [null, int]', function () {
+    it('resolve null to [null, int]', function () {
       var t1 = createType('null');
       var t2 = createType(['null', 'int']);
       var a = t2.createResolver(t1);
       assert.deepEqual(t2.fromBuffer(Buffer.alloc(0), a), null);
     });
 
-    test('resolve [string, int] to [long, string]', function () {
+    it('resolve [string, int] to [long, string]', function () {
       var t1 = createType(['string', 'int']);
       var t2 = createType(['int', 'bytes']);
       var a = t2.createResolver(t1);
@@ -457,7 +457,7 @@ suite('types', function () {
       assert.deepEqual(t2.fromBuffer(buf, a), {'int': 1});
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = new types.UnionType(['null', 'int']);
       var o = {'int': 1};
       assert.strictEqual(t.clone(null), null);
@@ -469,7 +469,7 @@ suite('types', function () {
       assert.throws(function () { t.clone(undefined); });
     });
 
-    test('clone and wrap', function () {
+    it('clone and wrap', function () {
       var t = createType(['string', 'int']);
       var o;
       o = t.clone('hi', {wrapUnions: true});
@@ -479,7 +479,7 @@ suite('types', function () {
       assert.throws(function () { t.clone(null, {wrapUnions: 2}); });
     });
 
-    test('invalid multiple keys', function () {
+    it('invalid multiple keys', function () {
       var t = createType(['null', 'int']);
       var o = {'int': 2};
       assert(t.isValid(o));
@@ -487,13 +487,13 @@ suite('types', function () {
       assert(!t.isValid(o));
     });
 
-    test('clone multiple keys', function () {
+    it('clone multiple keys', function () {
       var t = createType(['null', 'int']);
       var o = {'int': 2, foo: 3};
       assert.throws(function () { t.clone(o); });
     });
 
-    test('clone unqualified names', function () {
+    it('clone unqualified names', function () {
       var t = createType({
         name: 'Person',
         type: 'record',
@@ -507,7 +507,7 @@ suite('types', function () {
       assert.deepEqual(t.clone(o), {id1: b, id2: {'an.Id': b}});
     });
 
-    test('clone unqualified names', function () {
+    it('clone unqualified names', function () {
       var t = createType({
         name: 'Person',
         type: 'record',
@@ -521,7 +521,7 @@ suite('types', function () {
       assert.throws(function () { t.clone(o); });
     });
 
-    test('compare buffers', function () {
+    it('compare buffers', function () {
       var t = createType(['null', 'double']);
       var b1 = t.toBuffer(null);
       assert.equal(t.compareBuffers(b1, b1), 0);
@@ -532,7 +532,7 @@ suite('types', function () {
       assert.equal(t.compareBuffers(b3, b2), 1);
     });
 
-    test('compare', function () {
+    it('compare', function () {
       var t;
       t = createType(['null', 'int']);
       assert.equal(t.compare(null, {'int': 3}), -1);
@@ -544,7 +544,7 @@ suite('types', function () {
 
   });
 
-  suite('EnumType', function () {
+  describe('EnumType', function () {
 
     var data = [
       {
@@ -570,7 +570,7 @@ suite('types', function () {
 
     testType(types.EnumType, data, schemas);
 
-    test('get full name', function () {
+    it('get full name', function () {
       var t = createType({
         type: 'enum',
         symbols: ['A', 'B'],
@@ -580,7 +580,7 @@ suite('types', function () {
       assert.equal(t.getName(), 'latin.Letter');
     });
 
-    test('get aliases', function () {
+    it('get aliases', function () {
       var t = createType({
         type: 'enum',
         symbols: ['A', 'B'],
@@ -594,7 +594,7 @@ suite('types', function () {
       assert.equal(t.getAliases().length, 3);
     });
 
-    test('get symbols', function () {
+    it('get symbols', function () {
       var t = createType({type: 'enum', symbols: ['A', 'B'], name: 'Letter'});
       var symbols = t.getSymbols();
       assert.deepEqual(symbols, ['A', 'B']);
@@ -602,26 +602,26 @@ suite('types', function () {
       assert.equal(t.getSymbols().length, 2);
     });
 
-    test('duplicate symbol', function () {
+    it('duplicate symbol', function () {
       assert.throws(function () {
         createType({type: 'enum', symbols: ['A', 'B', 'A'], name: 'B'});
       });
     });
 
-    test('write invalid', function () {
+    it('write invalid', function () {
       var type = createType({type: 'enum', symbols: ['A'], name: 'a'});
       assert.throws(function () {
         type.toBuffer('B');
       });
     });
 
-    test('read invalid index', function () {
+    it('read invalid index', function () {
       var type = new types.EnumType({type: 'enum', symbols: ['A'], name: 'a'});
       var buf = Buffer.from([2]);
       assert.throws(function () { type.fromBuffer(buf); });
     });
 
-    test('resolve', function () {
+    it('resolve', function () {
       var t1, t2, buf, resolver;
       t1 = newEnum('Foo', ['bar', 'baz']);
       t2 = newEnum('Foo', ['bar', 'baz']);
@@ -653,14 +653,14 @@ suite('types', function () {
       }
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = createType({type: 'enum', name: 'Foo', symbols: ['bar', 'baz']});
       assert.equal(t.clone('bar'), 'bar');
       assert.throws(function () { t.clone('BAR'); });
       assert.throws(function () { t.clone(null); });
     });
 
-    test('compare buffers', function () {
+    it('compare buffers', function () {
       var t = createType({type: 'enum', name: 'Foo', symbols: ['bar', 'baz']});
       var b1 = t.toBuffer('bar');
       var b2 = t.toBuffer('baz');
@@ -668,7 +668,7 @@ suite('types', function () {
       assert.equal(t.compareBuffers(b2, b1), 1);
     });
 
-    test('compare', function () {
+    it('compare', function () {
       var t = createType({type: 'enum', name: 'Foo', symbols: ['b', 'a']});
       assert.equal(t.compare('b', 'a'), -1);
       assert.equal(t.compare('a', 'a'), 0);
@@ -676,7 +676,7 @@ suite('types', function () {
 
   });
 
-  suite('FixedType', function () {
+  describe('FixedType', function () {
 
     var data = [
       {
@@ -698,7 +698,7 @@ suite('types', function () {
 
     testType(types.FixedType, data, schemas);
 
-    test('get full name', function () {
+    it('get full name', function () {
       var t = createType({
         type: 'fixed',
         size: 2,
@@ -708,7 +708,7 @@ suite('types', function () {
       assert.equal(t.getName(), 'id.Id');
     });
 
-    test('get aliases', function () {
+    it('get aliases', function () {
       var t = createType({
         type: 'fixed',
         size: 3,
@@ -720,12 +720,12 @@ suite('types', function () {
       assert.equal(t.getAliases().length, 1);
     });
 
-    test('get size', function () {
+    it('get size', function () {
       var t = createType({type: 'fixed', size: 5, name: 'Id'});
       assert.equal(t.getSize(), 5);
     });
 
-    test('resolve', function () {
+    it('resolve', function () {
       var t1 = new types.FixedType({name: 'Id', size: 4});
       var t2 = new types.FixedType({name: 'Id', size: 4});
       assert.doesNotThrow(function () { t2.createResolver(t1); });
@@ -737,7 +737,7 @@ suite('types', function () {
       assert.throws(function () { t2.createResolver(t1); });
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = new types.FixedType({name: 'Id', size: 2});
       var s = '\x01\x02';
       var buf = Buffer.from(s);
@@ -753,14 +753,14 @@ suite('types', function () {
       assert.throws(function () { t.clone(Buffer.from([2])); });
     });
 
-    test('getSchema with extra fields', function () {
+    it('getSchema with extra fields', function () {
       var t = createType({type: 'fixed', name: 'Id', size: 2, three: 3});
       t.one = 1;
       assert.equal(t.getSchema(), '{"name":"Id","type":"fixed","size":2}');
       assert.equal(t.getSchema(true), '"Id"');
     });
 
-    test('fromString', function () {
+    it('fromString', function () {
       var t = new types.FixedType({name: 'Id', size: 2});
       var s = '\x01\x02';
       var buf = Buffer.from(s);
@@ -768,7 +768,7 @@ suite('types', function () {
       assert.deepEqual(clone, buf);
     });
 
-    test('compare buffers', function () {
+    it('compare buffers', function () {
       var t = createType({type: 'fixed', name: 'Id', size: 2});
       var b1 = Buffer.from([1, 2]);
       assert.equal(t.compareBuffers(b1, b1), 0);
@@ -778,7 +778,7 @@ suite('types', function () {
 
   });
 
-  suite('MapType', function () {
+  describe('MapType', function () {
 
     var data = [
       {
@@ -812,30 +812,30 @@ suite('types', function () {
 
     testType(types.MapType, data, schemas);
 
-    test('get values type', function () {
+    it('get values type', function () {
       var t = new types.MapType({type: 'map', values: 'int'});
       assert.deepEqual(t.getValuesType(), createType('int'));
     });
 
-    test('write int', function () {
+    it('write int', function () {
       var t = new types.MapType({type: 'map', values: 'int'});
       var buf = t.toBuffer({'\x01': 3, '\x02': 4});
       assert.deepEqual(buf, Buffer.from([4, 2, 1, 6, 2, 2, 8, 0]));
     });
 
-    test('read long', function () {
+    it('read long', function () {
       var t = new types.MapType({type: 'map', values: 'long'});
       var buf = Buffer.from([4, 2, 1, 6, 2, 2, 8, 0]);
       assert.deepEqual(t.fromBuffer(buf), {'\x01': 3, '\x02': 4});
     });
 
-    test('read with sizes', function () {
+    it('read with sizes', function () {
       var t = new types.MapType({type: 'map', values: 'int'});
       var buf = Buffer.from([1,6,2,97,2,0]);
       assert.deepEqual(t.fromBuffer(buf), {a: 1});
     });
 
-    test('skip', function () {
+    it('skip', function () {
       var v1 = createType({
         name: 'Foo',
         type: 'record',
@@ -856,7 +856,7 @@ suite('types', function () {
       assert.deepEqual(v2.fromBuffer(b2, resolver), {val: 3});
     });
 
-    test('resolve int > long', function () {
+    it('resolve int > long', function () {
       var t1 = new types.MapType({type: 'map', values: 'int'});
       var t2 = new types.MapType({type: 'map', values: 'long'});
       var resolver = t2.createResolver(t1);
@@ -865,7 +865,7 @@ suite('types', function () {
       assert.deepEqual(t2.fromBuffer(buf, resolver), obj);
     });
 
-    test('resolve double > double', function () {
+    it('resolve double > double', function () {
       var t = new types.MapType({type: 'map', values: 'double'});
       var resolver = t.createResolver(t);
       var obj = {one: 1, two: 2};
@@ -873,7 +873,7 @@ suite('types', function () {
       assert.deepEqual(t.fromBuffer(buf, resolver), obj);
     });
 
-    test('resolve invalid', function () {
+    it('resolve invalid', function () {
       var t1 = new types.MapType({type: 'map', values: 'int'});
       var t2 = new types.MapType({type: 'map', values: 'string'});
       assert.throws(function () { t2.createResolver(t1); });
@@ -881,7 +881,7 @@ suite('types', function () {
       assert.throws(function () { t2.createResolver(t1); });
     });
 
-    test('resolve fixed', function () {
+    it('resolve fixed', function () {
       var t1 = createType({
         type: 'map', values: {name: 'Id', type: 'fixed', size: 2}
       });
@@ -896,7 +896,7 @@ suite('types', function () {
       assert.deepEqual(t2.fromBuffer(buf, resolver), obj);
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = new types.MapType({type: 'map', values: 'int'});
       var o = {one: 1, two: 2};
       var c = t.clone(o);
@@ -906,7 +906,7 @@ suite('types', function () {
       assert.throws(function () { t.clone(undefined); });
     });
 
-    test('clone coerce buffers', function () {
+    it('clone coerce buffers', function () {
       var t = new types.MapType({type: 'map', values: 'bytes'});
       var o = {one: {type: 'Buffer', data: [1]}};
       assert.throws(function () { t.clone(o); });
@@ -914,13 +914,13 @@ suite('types', function () {
       assert.deepEqual(c, {one: Buffer.from([1])});
     });
 
-    test('compare buffers', function () {
+    it('compare buffers', function () {
       var t = new types.MapType({type: 'map', values: 'bytes'});
       var b1 = t.toBuffer({});
       assert.throws(function () { t.compareBuffers(b1, b1); });
     });
 
-    test('isValid hook', function () {
+    it('isValid hook', function () {
       var t = new types.MapType({type: 'map', values: 'int'});
       var o = {one: 1, two: 'deux', three: null, four: 4};
       var errs = {};
@@ -934,14 +934,14 @@ suite('types', function () {
       }
     });
 
-    test('getName', function () {
+    it('getName', function () {
       var t = new types.MapType({type: 'map', values: 'int'});
       assert.strictEqual(t.getName(), undefined);
     });
 
   });
 
-  suite('ArrayType', function () {
+  describe('ArrayType', function () {
 
     var data = [
       {
@@ -960,18 +960,18 @@ suite('types', function () {
 
     testType(types.ArrayType, data, schemas);
 
-    test('get items type', function () {
+    it('get items type', function () {
       var t = new types.ArrayType({type: 'array', items: 'int'});
       assert.deepEqual(t.getItemsType(), createType('int'));
     });
 
-    test('read with sizes', function () {
+    it('read with sizes', function () {
       var t = new types.ArrayType({type: 'array', items: 'int'});
       var buf = Buffer.from([1,2,2,0]);
       assert.deepEqual(t.fromBuffer(buf), [1]);
     });
 
-    test('skip', function () {
+    it('skip', function () {
       var v1 = createType({
         name: 'Foo',
         type: 'record',
@@ -992,7 +992,7 @@ suite('types', function () {
       assert.deepEqual(v2.fromBuffer(b2, resolver), {val: 3});
     });
 
-    test('resolve string items to bytes items', function () {
+    it('resolve string items to bytes items', function () {
       var t1 = new types.ArrayType({type: 'array', items: 'string'});
       var t2 = new types.ArrayType({type: 'array', items: 'bytes'});
       var resolver = t2.createResolver(t1);
@@ -1001,7 +1001,7 @@ suite('types', function () {
       assert.deepEqual(t2.fromBuffer(buf, resolver), [Buffer.from([1, 2])]);
     });
 
-    test('resolve invalid', function () {
+    it('resolve invalid', function () {
       var t1 = new types.ArrayType({type: 'array', items: 'string'});
       var t2 = new types.ArrayType({type: 'array', items: 'long'});
       assert.throws(function () { t2.createResolver(t1); });
@@ -1009,7 +1009,7 @@ suite('types', function () {
       assert.throws(function () { t2.createResolver(t1); });
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = new types.ArrayType({type: 'array', items: 'int'});
       var o = [1, 2];
       var c = t.clone(o);
@@ -1019,7 +1019,7 @@ suite('types', function () {
       assert.throws(function () { t.clone({}); });
     });
 
-    test('clone coerce buffers', function () {
+    it('clone coerce buffers', function () {
       var t = createType({
         type: 'array',
         items: {type: 'fixed', name: 'Id', size: 2}
@@ -1030,7 +1030,7 @@ suite('types', function () {
       assert.deepEqual(c, [Buffer.from([1, 2])]);
     });
 
-    test('compare buffers', function () {
+    it('compare buffers', function () {
       var t = createType({type: 'array', items: 'int'});
       assert.equal(t.compareBuffers(t.toBuffer([]), t.toBuffer([])), 0);
       assert.equal(t.compareBuffers(t.toBuffer([1, 2]), t.toBuffer([])), 1);
@@ -1039,7 +1039,7 @@ suite('types', function () {
       assert.equal(t.compareBuffers(t.toBuffer([1, 2]), t.toBuffer([1])), 1);
     });
 
-    test('compare', function () {
+    it('compare', function () {
       var t = createType({type: 'array', items: 'int'});
       assert.equal(t.compare([], []), 0);
       assert.equal(t.compare([], [-1]), -1);
@@ -1047,7 +1047,7 @@ suite('types', function () {
       assert.equal(t.compare([2], [1, 2]), 1);
     });
 
-    test('isValid hook invalid array', function () {
+    it('isValid hook invalid array', function () {
       var t = createType({type: 'array', items: 'int'});
       var hookCalled = false;
       assert(!t.isValid({}, {errorHook: hook}));
@@ -1060,7 +1060,7 @@ suite('types', function () {
       }
     });
 
-    test('isValid hook invalid elems', function () {
+    it('isValid hook invalid elems', function () {
       var t = createType({type: 'array', items: 'int'});
       var paths = [];
       assert(!t.isValid([0, 3, 'hi', 5, 'hey'], {errorHook: hook}));
@@ -1075,7 +1075,7 @@ suite('types', function () {
 
   });
 
-  suite('RecordType', function () {
+  describe('RecordType', function () {
 
     var data = [
       {
@@ -1104,7 +1104,7 @@ suite('types', function () {
 
     testType(types.RecordType, data, schemas);
 
-    test('duplicate field names', function () {
+    it('duplicate field names', function () {
       assert.throws(function () {
         createType({
           type: 'record',
@@ -1114,7 +1114,7 @@ suite('types', function () {
       });
     });
 
-    test('default constructor', function () {
+    it('default constructor', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -1126,7 +1126,7 @@ suite('types', function () {
       assert.strictEqual(p.constructor, Person);
     });
 
-    test('default check & write', function () {
+    it('default check & write', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -1138,7 +1138,7 @@ suite('types', function () {
       assert.deepEqual(type.toBuffer({}), Buffer.from([50, 2, 1]));
     });
 
-    test('fixed string default', function () {
+    it('fixed string default', function () {
       var s = '\x01\x04';
       var b = Buffer.from(s);
       var type = createType({
@@ -1157,7 +1157,7 @@ suite('types', function () {
       assert.deepEqual(type.toBuffer({}), b);
     });
 
-    test('fixed buffer invalid default', function () {
+    it('fixed buffer invalid default', function () {
       assert.throws(function () {
         createType({
           type: 'record',
@@ -1173,7 +1173,7 @@ suite('types', function () {
       });
     });
 
-    test('union invalid default', function () {
+    it('union invalid default', function () {
       assert.throws(function () {
         createType({
           type: 'record',
@@ -1183,7 +1183,7 @@ suite('types', function () {
       });
     });
 
-    test('record default', function () {
+    it('record default', function () {
       var d = {street: null, zip: 123};
       var Person = createType({
         name: 'Person',
@@ -1207,7 +1207,7 @@ suite('types', function () {
       assert.deepEqual(p.address, {street: null, zip: {'int': 123}});
     });
 
-    test('record keyword field name', function () {
+    it('record keyword field name', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -1217,7 +1217,7 @@ suite('types', function () {
       assert.deepEqual(new Person(2), {'null': 2});
     });
 
-    test('record isValid', function () {
+    it('record isValid', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -1229,7 +1229,7 @@ suite('types', function () {
       assert(!(new Person('a')).$isValid());
     });
 
-    test('record toBuffer', function () {
+    it('record toBuffer', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -1240,7 +1240,7 @@ suite('types', function () {
       assert.throws(function () { (new Person()).$toBuffer(); });
     });
 
-    test('record compare', function () {
+    it('record compare', function () {
       var P = createType({
         type: 'record',
         name: 'Person',
@@ -1256,7 +1256,7 @@ suite('types', function () {
       assert.equal(p2.$compare(p1), 1);
     });
 
-    test('Record type', function () {
+    it('Record type', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -1266,7 +1266,7 @@ suite('types', function () {
       assert.strictEqual(Person.getType(), type);
     });
 
-    test('mutable defaults', function () {
+    it('mutable defaults', function () {
       var Person = createType({
         type: 'record',
         name: 'Person',
@@ -1285,7 +1285,7 @@ suite('types', function () {
       assert.deepEqual(p2.friends, []);
     });
 
-    test('resolve alias', function () {
+    it('resolve alias', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1309,7 +1309,7 @@ suite('types', function () {
       assert.throws(function () { v3.createResolver(v1); });
     });
 
-    test('resolve alias with namespace', function () {
+    it('resolve alias with namespace', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1332,7 +1332,7 @@ suite('types', function () {
       assert.doesNotThrow(function () { v3.createResolver(v1); });
     });
 
-    test('resolve skip field', function () {
+    it('resolve skip field', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1352,7 +1352,7 @@ suite('types', function () {
       assert.deepEqual(v2.fromBuffer(buf, resolver), {name: 'Ann'});
     });
 
-    test('resolve new field', function () {
+    it('resolve new field', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1372,7 +1372,7 @@ suite('types', function () {
       assert.deepEqual(v2.fromBuffer(buf, resolver), {name: 'Ann', age: 25});
     });
 
-    test('resolve new field no default', function () {
+    it('resolve new field no default', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1389,7 +1389,7 @@ suite('types', function () {
       assert.throws(function () { v2.createResolver(v1); });
     });
 
-    test('resolve from recursive schema', function () {
+    it('resolve from recursive schema', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1406,7 +1406,7 @@ suite('types', function () {
       assert.deepEqual(p2, {age: -1});
     });
 
-    test('resolve to recursive schema', function () {
+    it('resolve to recursive schema', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1429,7 +1429,7 @@ suite('types', function () {
       assert.deepEqual(p2, {friends: []});
     });
 
-    test('resolve from both recursive schema', function () {
+    it('resolve from both recursive schema', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1449,7 +1449,7 @@ suite('types', function () {
       assert.deepEqual(p2, {friends: [{friends: []}]});
     });
 
-    test('resolve multiple matching aliases', function () {
+    it('resolve multiple matching aliases', function () {
       var v1 = createType({
         type: 'record',
         name: 'Person',
@@ -1466,7 +1466,7 @@ suite('types', function () {
       assert.throws(function () { v2.createResolver(v1); });
     });
 
-    test('getName', function () {
+    it('getName', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1482,7 +1482,7 @@ suite('types', function () {
       assert.equal(t.getName(true), 'record');
     });
 
-    test('getSchema', function () {
+    it('getSchema', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1501,7 +1501,7 @@ suite('types', function () {
       assert.equal(t.getSchema(true), '"earth.Person"');
     });
 
-    test('getSchema recursive schema', function () {
+    it('getSchema recursive schema', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1517,7 +1517,7 @@ suite('types', function () {
       assert.equal(t.getSchema(true), '"earth.Person"');
     });
 
-    test('toString record', function () {
+    it('toString record', function () {
       var T = createType({
         type: 'record',
         name: 'Person',
@@ -1527,7 +1527,7 @@ suite('types', function () {
       assert.equal(r.$toString(), T.getType().toString(r));
     });
 
-    test('clone', function () {
+    it('clone', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1544,7 +1544,7 @@ suite('types', function () {
       assert.deepEqual(c.$clone(), c);
     });
 
-    test('clone field hook', function () {
+    it('clone field hook', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1558,7 +1558,7 @@ suite('types', function () {
       assert.deepEqual(c, {name: 'ANN', age: 25});
     });
 
-    test('get full name & aliases', function () {
+    it('get full name & aliases', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1569,7 +1569,7 @@ suite('types', function () {
       assert.deepEqual(t.getAliases(), []);
     });
 
-    test('field getters', function () {
+    it('field getters', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1588,7 +1588,7 @@ suite('types', function () {
       assert.equal(t.getFields().length, 2); // No change.
     });
 
-    test('field order', function () {
+    it('field order', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1598,7 +1598,7 @@ suite('types', function () {
       assert.equal(field.getOrder(), 'ascending'); // Default.
     });
 
-    test('compare buffers default order', function () {
+    it('compare buffers default order', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1616,7 +1616,7 @@ suite('types', function () {
       assert.equal(t.compareBuffers(b1, b3), 1);
     });
 
-    test('compare buffers custom order', function () {
+    it('compare buffers custom order', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1633,7 +1633,7 @@ suite('types', function () {
       assert.equal(t.compareBuffers(b1, b3), -1);
     });
 
-    test('compare buffers invalid order', function () {
+    it('compare buffers invalid order', function () {
       assert.throws(function () { createType({
         type: 'record',
         name: 'Person',
@@ -1641,7 +1641,7 @@ suite('types', function () {
       }); });
     });
 
-    test('error type', function () {
+    it('error type', function () {
       var t = createType({
         type: 'error',
         name: 'Ouch',
@@ -1652,7 +1652,7 @@ suite('types', function () {
       assert(err instanceof Error);
     });
 
-    test('isValid hook', function () {
+    it('isValid hook', function () {
       var t = createType({
         type: 'record',
         name: 'Person',
@@ -1684,18 +1684,18 @@ suite('types', function () {
       }
     });
 
-    test('isValid empty record', function () {
+    it('isValid empty record', function () {
       var t = createType({type: 'record', name: 'Person', fields: []});
       assert(t.isValid({}));
     });
 
   });
 
-  suite('AbstractLongType', function () {
+  describe('AbstractLongType', function () {
 
     var fastLongType = new types.LongType();
 
-    suite('unpacked', function () {
+    describe('unpacked', function () {
 
       var slowLongType = types.LongType.using({
         fromBuffer: function (buf) {
@@ -1735,30 +1735,30 @@ suite('types', function () {
         }
       });
 
-      test('encode', function () {
+      it('encode', function () {
         [123, -1, 321414, 900719925474090].forEach(function (n) {
           assert.deepEqual(slowLongType.toBuffer(n), fastLongType.toBuffer(n));
         });
       });
 
-      test('decode', function () {
+      it('decode', function () {
         [123, -1, 321414, 900719925474090].forEach(function (n) {
           var buf = fastLongType.toBuffer(n);
           assert.deepEqual(slowLongType.fromBuffer(buf), n);
         });
       });
 
-      test('clone', function () {
+      it('clone', function () {
         assert.equal(slowLongType.clone(123), 123);
         assert.equal(slowLongType.fromString('-1'), -1);
         assert.equal(slowLongType.toString(-1), '-1');
       });
 
-      test('random', function () {
+      it('random', function () {
         assert(slowLongType.isValid(slowLongType.random()));
       });
 
-      test('isValid hook', function () {
+      it('isValid hook', function () {
         var s = 'hi';
         var errs = [];
         assert(!slowLongType.isValid(s, {errorHook: hook}));
@@ -1774,7 +1774,7 @@ suite('types', function () {
 
     });
 
-    suite('packed', function () {
+    describe('packed', function () {
 
       var slowLongType = types.LongType.using({
         fromBuffer: function (buf) {
@@ -1795,32 +1795,32 @@ suite('types', function () {
         }
       }, true);
 
-      test('encode', function () {
+      it('encode', function () {
         [123, -1, 321414, 900719925474090].forEach(function (n) {
           assert.deepEqual(slowLongType.toBuffer(n), fastLongType.toBuffer(n));
         });
       });
 
-      test('decode', function () {
+      it('decode', function () {
         [123, -1, 321414, 900719925474090].forEach(function (n) {
           var buf = fastLongType.toBuffer(n);
           assert.deepEqual(slowLongType.fromBuffer(buf), n);
         });
       });
 
-      test('clone', function () {
+      it('clone', function () {
         assert.equal(slowLongType.clone(123), 123);
         assert.equal(slowLongType.fromString('-1'), -1);
         assert.equal(slowLongType.toString(-1), '-1');
       });
 
-      test('random', function () {
+      it('random', function () {
         assert(slowLongType.isValid(slowLongType.random()));
       });
 
     });
 
-    test('incomplete buffer', function () {
+    it('incomplete buffer', function () {
       // Check that `fromBuffer` doesn't get called.
       var slowLongType = new types.LongType.using({
         fromBuffer: function () { throw new Error('no'); },
@@ -1839,7 +1839,7 @@ suite('types', function () {
 
   });
 
-  suite('LogicalType', function () {
+  describe('LogicalType', function () {
 
     function DateType(attrs, opts) {
       types.LogicalType.call(this, attrs, opts, [types.LongType]);
@@ -1872,7 +1872,7 @@ suite('types', function () {
 
     var logicalTypes = {age: AgeType, date: DateType};
 
-    test('valid type', function () {
+    it('valid type', function () {
       var t = createType({
         type: 'long',
         logicalType: 'date'
@@ -1888,7 +1888,7 @@ suite('types', function () {
       assert.equal(t.getSchema(), '"long"');
     });
 
-    test('invalid type', function () {
+    it('invalid type', function () {
       var attrs = {
         type: 'int',
         logicalType: 'date'
@@ -1906,7 +1906,7 @@ suite('types', function () {
       });
     });
 
-    test('nested types', function () {
+    it('nested types', function () {
       var attrs = {
         name: 'Person',
         type: 'record',
@@ -1939,7 +1939,7 @@ suite('types', function () {
       assert(hasError);
     });
 
-    test('recursive', function () {
+    it('recursive', function () {
 
       function Person(friends) { this.friends = friends || []; }
 
@@ -1972,7 +1972,7 @@ suite('types', function () {
       assert.deepEqual(p2, p1);
     });
 
-    test('resolve underlying > logical', function () {
+    it('resolve underlying > logical', function () {
       var t1 = createType({type: 'string'});
       var t2 = createType({
         type: 'long',
@@ -1987,7 +1987,7 @@ suite('types', function () {
       assert.deepEqual('' + d2, '' + d1); // Rounding error on date objects.
     });
 
-    test('resolve logical > underlying', function () {
+    it('resolve logical > underlying', function () {
       var t1 = createType({
         type: 'long',
         logicalType: 'date'
@@ -2001,7 +2001,7 @@ suite('types', function () {
       assert.equal(t2.fromBuffer(buf, res), +d);
     });
 
-    suite('union logical types', function () {
+    describe('union logical types', function () {
       // Unions are slightly tricky to override with logical types since their
       // schemas aren't represented as objects.
 
@@ -2027,7 +2027,7 @@ suite('types', function () {
         };
       }
 
-      test('unwrapped', function () {
+      it('unwrapped', function () {
 
         /**
         * A generic union type which exposes its values directly.
@@ -2064,7 +2064,7 @@ suite('types', function () {
 
       });
 
-      test('optional', function () {
+      it('optional', function () {
 
         /**
         * A basic optional type.
@@ -2116,7 +2116,7 @@ suite('types', function () {
 
     });
 
-    test('even integer', function () {
+    it('even integer', function () {
       function EvenIntType(attrs, opts) {
         types.LogicalType.call(this, attrs, opts, [types.IntType]);
       }
@@ -2148,18 +2148,18 @@ suite('types', function () {
 
   });
 
-  suite('createType', function  () {
+  describe('createType', function  () {
 
-    test('null type', function () {
+    it('null type', function () {
       assert.throws(function () { createType(null); });
     });
 
-    test('unknown types', function () {
+    it('unknown types', function () {
       assert.throws(function () { createType('a'); });
       assert.throws(function () { createType({type: 'b'}); });
     });
 
-    test('namespaced type', function () {
+    it('namespaced type', function () {
       var type = createType({
         type: 'record',
         name: 'Human',
@@ -2188,7 +2188,7 @@ suite('types', function () {
       assert.equal(type._fields[1]._type._name, 'all.Alien');
     });
 
-    test('wrapped primitive', function () {
+    it('wrapped primitive', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -2197,45 +2197,45 @@ suite('types', function () {
       assert.strictEqual(type._fields[0]._type.constructor, types.NullType);
     });
 
-    test('fromBuffer truncated', function () {
+    it('fromBuffer truncated', function () {
       var type = createType('int');
       assert.throws(function () {
         type.fromBuffer(Buffer.from([128]));
       });
     });
 
-    test('fromBuffer bad resolver', function () {
+    it('fromBuffer bad resolver', function () {
       var type = createType('int');
       assert.throws(function () {
         type.fromBuffer(Buffer.from([0]), 123, {});
       });
     });
 
-    test('fromBuffer trailing', function () {
+    it('fromBuffer trailing', function () {
       var type = createType('int');
       assert.throws(function () {
         type.fromBuffer(Buffer.from([0, 2]));
       });
     });
 
-    test('fromBuffer trailing with resolver', function () {
+    it('fromBuffer trailing with resolver', function () {
       var type = createType('int');
       var resolver = type.createResolver(createType(['int']));
       assert.equal(type.fromBuffer(Buffer.from([0, 2]), resolver), 1);
     });
 
-    test('toBuffer', function () {
+    it('toBuffer', function () {
       var type = createType('int');
       assert.throws(function () { type.toBuffer('abc'); });
       assert.doesNotThrow(function () { type.toBuffer(123); });
     });
 
-    test('toBuffer and resize', function () {
+    it('toBuffer and resize', function () {
       var type = createType('string');
       assert.deepEqual(type.toBuffer('\x01', 1), Buffer.from([2, 1]));
     });
 
-    test('type hook', function () {
+    it('type hook', function () {
       var refs = [];
       var ts = [];
       var o = {
@@ -2265,7 +2265,7 @@ suite('types', function () {
       }
     });
 
-    test('type hook invalid return value', function () {
+    it('type hook invalid return value', function () {
       assert.throws(function () {
         createType({type: 'int'}, {typeHook: hook});
       });
@@ -2273,14 +2273,14 @@ suite('types', function () {
       function hook() { return 'int'; }
     });
 
-    test('fingerprint', function () {
+    it('fingerprint', function () {
       var t = createType('int');
       var buf = Buffer.from('ef524ea1b91e73173d938ade36c1db32', 'hex');
       assert.deepEqual(t.getFingerprint('md5'), buf);
       assert.deepEqual(t.getFingerprint(), buf);
     });
 
-    test('getSchema default', function () {
+    it('getSchema default', function () {
       var type = createType({
         type: 'record',
         name: 'Human',
@@ -2304,21 +2304,21 @@ suite('types', function () {
 
   });
 
-  suite('fromString', function () {
+  describe('fromString', function () {
 
-    test('int', function () {
+    it('int', function () {
       var t = createType('int');
       assert.equal(t.fromString('2'), 2);
       assert.throws(function () { t.fromString('"a"'); });
     });
 
-    test('string', function () {
+    it('string', function () {
       var t = createType('string');
       assert.equal(t.fromString('"2"'), '2');
       assert.throws(function () { t.fromString('a'); });
     });
 
-    test('coerce buffers', function () {
+    it('coerce buffers', function () {
       var t = createType({
         name: 'Ids',
         type: 'record',
@@ -2333,9 +2333,9 @@ suite('types', function () {
 
   });
 
-  suite('toString', function () {
+  describe('toString', function () {
 
-    test('int', function () {
+    it('int', function () {
       var t = createType('int');
       assert.equal(t.toString(2), '2');
       assert.throws(function () { t.toString('a'); });
@@ -2343,15 +2343,15 @@ suite('types', function () {
 
   });
 
-  suite('resolve', function () {
+  describe('resolve', function () {
 
-    test('non type', function () {
+    it('non type', function () {
       var t = createType({type: 'map', values: 'int'});
       var obj = {type: 'map', values: 'int'};
       assert.throws(function () { t.createResolver(obj); });
     });
 
-    test('union to valid union', function () {
+    it('union to valid union', function () {
       var t1 = createType(['int', 'string']);
       var t2 = createType(['null', 'string', 'long']);
       var resolver = t2.createResolver(t1);
@@ -2359,13 +2359,13 @@ suite('types', function () {
       assert.deepEqual(t2.fromBuffer(buf, resolver), {'long': 12});
     });
 
-    test('union to invalid union', function () {
+    it('union to invalid union', function () {
       var t1 = createType(['int', 'string']);
       var t2 = createType(['null', 'long']);
       assert.throws(function () { t2.createResolver(t1); });
     });
 
-    test('union to non union', function () {
+    it('union to non union', function () {
       var t1 = createType(['int', 'long']);
       var t2 = createType('long');
       var resolver = t2.createResolver(t1);
@@ -2375,7 +2375,7 @@ suite('types', function () {
       assert.throws(function () { t2.fromBuffer(buf, resolver); });
     });
 
-    test('union to invalid non union', function () {
+    it('union to invalid non union', function () {
       var t1 = createType(['int', 'long']);
       var t2 = createType('int');
       assert.throws(function() { t2.createResolver(t1); });
@@ -2383,9 +2383,9 @@ suite('types', function () {
 
   });
 
-  suite('type references', function () {
+  describe('type references', function () {
 
-    test('existing', function () {
+    it('existing', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -2394,7 +2394,7 @@ suite('types', function () {
       assert.strictEqual(type, type._fields[0]._type);
     });
 
-    test('namespaced', function () {
+    it('namespaced', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -2414,7 +2414,7 @@ suite('types', function () {
       assert.equal(type._fields[0]._type._name, 'a.Person');
     });
 
-    test('redefining', function () {
+    it('redefining', function () {
       assert.throws(function () {
         createType({
           type: 'record',
@@ -2433,7 +2433,7 @@ suite('types', function () {
       });
     });
 
-    test('missing', function () {
+    it('missing', function () {
       assert.throws(function () {
         createType({
           type: 'record',
@@ -2443,7 +2443,7 @@ suite('types', function () {
       });
     });
 
-    test('redefining primitive', function () {
+    it('redefining primitive', function () {
       assert.throws( // Unqualified.
         function () { createType({type: 'fixed', name: 'int', size: 2}); }
       );
@@ -2454,7 +2454,7 @@ suite('types', function () {
       );
     });
 
-    test('aliases', function () {
+    it('aliases', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -2465,7 +2465,7 @@ suite('types', function () {
       assert.deepEqual(type._aliases, ['a.Human', 'b.Being']);
     });
 
-    test('invalid', function () {
+    it('invalid', function () {
       // Name.
       assert.throws(function () {
         createType({type: 'fixed', name: 'ID$', size: 3});
@@ -2482,16 +2482,16 @@ suite('types', function () {
 
   });
 
-  suite('decode', function () {
+  describe('decode', function () {
 
-    test('long valid', function () {
+    it('long valid', function () {
       var t = createType('long');
       var buf = Buffer.from([0, 128, 2, 0]);
       var res = t.decode(buf, 1);
       assert.deepEqual(res, {value: 128, offset: 3});
     });
 
-    test('bytes invalid', function () {
+    it('bytes invalid', function () {
       var t = createType('bytes');
       var buf = Buffer.from([4, 1]);
       var res = t.decode(buf, 0);
@@ -2500,9 +2500,9 @@ suite('types', function () {
 
   });
 
-  suite('encode', function () {
+  describe('encode', function () {
 
-    test('int valid', function () {
+    it('int valid', function () {
       var t = createType('int');
       var buf = Buffer.alloc(2);
       buf.fill(0);
@@ -2511,14 +2511,14 @@ suite('types', function () {
       assert.deepEqual(buf, Buffer.from([0, 10]));
     });
 
-    test('string invalid', function () {
+    it('string invalid', function () {
       var t = createType('string');
       var buf = Buffer.alloc(1);
       var n = t.encode('\x01\x02', buf, 0);
       assert.equal(n, -2);
     });
 
-    test('invalid', function () {
+    it('invalid', function () {
       var t = createType('float');
       var buf = Buffer.alloc(2);
       assert.throws(function () { t.encode('hi', buf, 0); });
@@ -2526,9 +2526,9 @@ suite('types', function () {
 
   });
 
-  suite('inspect', function () {
+  describe('inspect', function () {
 
-    test('type', function () {
+    it('type', function () {
       assert.equal(createType('int').inspect(), '<IntType>');
       assert.equal(
         createType({type: 'map', values: 'string'}).inspect(),
@@ -2540,7 +2540,7 @@ suite('types', function () {
       );
     });
 
-    test('field', function () {
+    it('field', function () {
       var type = createType({
         type: 'record',
         name: 'Person',
@@ -2550,7 +2550,7 @@ suite('types', function () {
       assert.equal(field.inspect(), '<Field "age">');
     });
 
-    test('resolver', function () {
+    it('resolver', function () {
       var t1 = createType('int');
       var t2 = createType('double');
       var resolver = t2.createResolver(t1);
@@ -2559,7 +2559,7 @@ suite('types', function () {
 
   });
 
-  test('reset', function () {
+  it('reset', function () {
     types.Type.__reset(0);
     var t = createType('string');
     var buf = t.toBuffer('\x01');
@@ -2571,7 +2571,7 @@ suite('types', function () {
 function testType(Type, data, invalidSchemas) {
 
   data.forEach(function (elem) {
-    test('roundtrip', function () {
+    it('roundtrip', function () {
       var type = new Type(elem.schema);
       elem.valid.forEach(function (v) {
         assert(type.isValid(v), '' + v);
@@ -2594,7 +2594,7 @@ function testType(Type, data, invalidSchemas) {
     });
   });
 
-  test('skip', function () {
+  it('skip', function () {
     data.forEach(function (elem) {
       var fn = elem.check || assert.deepEqual;
       var items = elem.valid;
@@ -2612,7 +2612,7 @@ function testType(Type, data, invalidSchemas) {
   });
 
   if (invalidSchemas) {
-    test('invalid', function () {
+    it('invalid', function () {
       invalidSchemas.forEach(function (schema) {
         assert.throws(function () { new Type(schema); });
       });
diff --git a/lang/js/test/test_utils.js b/lang/js/test/test_utils.js
index f68820e..ca72891 100644
--- a/lang/js/test/test_utils.js
+++ b/lang/js/test/test_utils.js
@@ -25,33 +25,33 @@ var utils = require('../lib/utils'),
     assert = require('assert');
 
 
-suite('utils', function () {
+describe('utils', function () {
 
-  test('capitalize', function () {
+  it('capitalize', function () {
     assert.equal(utils.capitalize('abc'), 'Abc');
     assert.equal(utils.capitalize(''), '');
     assert.equal(utils.capitalize('aBc'), 'ABc');
   });
 
-  test('hasDuplicates', function () {
+  it('hasDuplicates', function () {
     assert(utils.hasDuplicates([1, 3, 1]));
     assert(!utils.hasDuplicates([]));
     assert(!utils.hasDuplicates(['ab', 'cb']));
     assert(utils.hasDuplicates(['ab', 'cb'], function (s) { return s[1]; }));
   });
 
-  test('single index of', function () {
+  it('single index of', function () {
     assert.equal(utils.singleIndexOf(null, 1), -1);
     assert.equal(utils.singleIndexOf([2], 2), 0);
     assert.equal(utils.singleIndexOf([3, 3], 3), -2);
     assert.equal(utils.singleIndexOf([2, 4], 4), 1);
   });
 
-  test('abstract function', function () {
+  it('abstract function', function () {
     assert.throws(utils.abstractFunction, utils.Error);
   });
 
-  test('OrderedQueue', function () {
+  it('OrderedQueue', function () {
 
     var seqs = [
       [0],
@@ -83,15 +83,15 @@ suite('utils', function () {
 
   });
 
-  suite('Lcg', function () {
+  describe('Lcg', function () {
 
-    test('seed', function () {
+    it('seed', function () {
       var r1 = new utils.Lcg(48);
       var r2 = new utils.Lcg(48);
       assert.equal(r1.nextInt(), r2.nextInt());
     });
 
-    test('integer', function () {
+    it('integer', function () {
       var r = new utils.Lcg(48);
       var i;
       i = r.nextInt();
@@ -102,7 +102,7 @@ suite('utils', function () {
       assert.equal(i, 1);
     });
 
-    test('float', function () {
+    it('float', function () {
       var r = new utils.Lcg(48);
       var f;
       f = r.nextFloat();
@@ -113,19 +113,19 @@ suite('utils', function () {
       assert.equal(f, 1);
     });
 
-    test('boolean', function () {
+    it('boolean', function () {
       var r = new utils.Lcg(48);
       assert(typeof r.nextBoolean() == 'boolean');
     });
 
-    test('choice', function () {
+    it('choice', function () {
       var r = new utils.Lcg(48);
       var arr = ['a'];
       assert(r.choice(arr), 'a');
       assert.throws(function () { r.choice([]); });
     });
 
-    test('string', function () {
+    it('string', function () {
       var r = new utils.Lcg(48);
       var s;
       s = r.nextString(10, 'aA#!');
@@ -136,11 +136,11 @@ suite('utils', function () {
 
   });
 
-  suite('Tap', function () {
+  describe('Tap', function () {
 
     var Tap = utils.Tap;
 
-    suite('int & long', function () {
+    describe('int & long', function () {
 
       testWriterReader({
         elems: [0, -1, 109213, -1211, -1312411211, 900719925474090],
@@ -149,7 +149,7 @@ suite('utils', function () {
         writer: function (n) { this.writeLong(n); }
       });
 
-      test('write', function () {
+      it('write', function () {
 
         var tap = newTap(6);
         tap.writeLong(1440756011948);
@@ -159,7 +159,7 @@ suite('utils', function () {
 
       });
 
-      test('read', function () {
+      it('read', function () {
 
         var buf = Buffer.from(['0xd8', '0xce', '0x80', '0xbc', '0xee', '0x53']);
         assert.equal((new Tap(buf)).readLong(), 1440756011948);
@@ -168,7 +168,7 @@ suite('utils', function () {
 
     });
 
-    suite('boolean', function () {
+    describe('boolean', function () {
 
       testWriterReader({
         elems: [true, false],
@@ -179,7 +179,7 @@ suite('utils', function () {
 
     });
 
-    suite('float', function () {
+    describe('float', function () {
 
       testWriterReader({
         elems: [1, 3,1, -5, 1e9],
@@ -190,7 +190,7 @@ suite('utils', function () {
 
     });
 
-    suite('double', function () {
+    describe('double', function () {
 
       testWriterReader({
         elems: [1, 3,1, -5, 1e12],
@@ -201,7 +201,7 @@ suite('utils', function () {
 
     });
 
-    suite('string', function () {
+    describe('string', function () {
 
       testWriterReader({
         elems: ['ahierw', '', 'alh hewlii! rew'],
@@ -212,7 +212,7 @@ suite('utils', function () {
 
     });
 
-    suite('bytes', function () {
+    describe('bytes', function () {
 
       testWriterReader({
         elems: [Buffer.from('abc'), Buffer.alloc(0), Buffer.from([1, 5, 255])],
@@ -223,7 +223,7 @@ suite('utils', function () {
 
     });
 
-    suite('fixed', function () {
+    describe('fixed', function () {
 
       testWriterReader({
         elems: [Buffer.from([1, 5, 255])],
@@ -234,16 +234,16 @@ suite('utils', function () {
 
     });
 
-    suite('binary', function () {
+    describe('binary', function () {
 
-      test('write valid', function () {
+      it('write valid', function () {
         var tap = newTap(3);
         var s = '\x01\x02';
         tap.writeBinary(s, 2);
         assert.deepEqual(tap.buf, Buffer.from([1,2,0]));
       });
 
-      test('write invalid', function () {
+      it('write invalid', function () {
         var tap = newTap(1);
         var s = '\x01\x02';
         tap.writeBinary(s, 2);
@@ -252,9 +252,9 @@ suite('utils', function () {
 
     });
 
-    suite('pack & unpack longs', function () {
+    describe('pack & unpack longs', function () {
 
-      test('unpack single byte', function () {
+      it('unpack single byte', function () {
         var t = newTap(10);
         t.writeLong(5);
         t.pos = 0;
@@ -272,7 +272,7 @@ suite('utils', function () {
         t.pos = 0;
       });
 
-      test('unpack multiple bytes', function () {
+      it('unpack multiple bytes', function () {
         var t = newTap(10);
         var l;
         l = 18932;
@@ -286,7 +286,7 @@ suite('utils', function () {
         assert.deepEqual(t.unpackLongBytes().readInt32LE(), l);
       });
 
-      test('pack single byte', function () {
+      it('pack single byte', function () {
         var t = newTap(10);
         var b = Buffer.alloc(8);
         b.fill(0);
@@ -311,7 +311,7 @@ suite('utils', function () {
         assert.deepEqual(t.readLong(), -1);
       });
 
-      test('roundtrip', function () {
+      it('roundtrip', function () {
         roundtrip(1231514);
         roundtrip(-123);
         roundtrip(124124);
@@ -350,7 +350,7 @@ suite('utils', function () {
       var skipFn = opts.skipper;
       var name = opts.name || '';
 
-      test('write read ' + name, function () {
+      it('write read ' + name, function () {
         var tap = newTap(size || 1024);
         var i, l, elem;
         for (i = 0, l = elems.length; i < l; i++) {
@@ -363,19 +363,19 @@ suite('utils', function () {
         }
       });
 
-      test('read over ' + name, function () {
+      it('read over ' + name, function () {
         var tap = new Tap(Buffer.alloc(0));
         readFn.call(tap); // Shouldn't throw.
         assert(!tap.isValid());
       });
 
-      test('write over ' + name, function () {
+      it('write over ' + name, function () {
         var tap = new Tap(Buffer.alloc(0));
         writeFn.call(tap, elems[0]); // Shouldn't throw.
         assert(!tap.isValid());
       });
 
-      test('skip ' + name, function () {
+      it('skip ' + name, function () {
         var tap = newTap(size || 1024);
         var i, l, elem, pos;
         for (i = 0, l = elems.length; i < l; i++) {