diff --git a/package-lock.json b/package-lock.json
index 34988e53..89a781af 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,6 +14,7 @@
"devDependencies": {
"events": "^3.3.0",
"gh-pages": "^4.0.0",
+ "happy-dom": "^6.0.4",
"jsdoc": "^3.6.10",
"jsdoc-json": "^2.0.2",
"jsdoc-to-markdown": "^7.1.1",
@@ -2407,11 +2408,29 @@
"@types/chai": "*"
}
},
+ "node_modules/@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/estree": {
"version": "0.0.39",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
},
+ "node_modules/@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
@@ -2467,6 +2486,12 @@
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
"dev": true
},
+ "node_modules/@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+ "dev": true
+ },
"node_modules/@types/scheduler": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
@@ -2571,6 +2596,14 @@
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"dev": true
},
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -2589,6 +2622,18 @@
"node": ">=0.4.0"
}
},
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
"node_modules/acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
@@ -3017,6 +3062,14 @@
"node": ">=8"
}
},
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
@@ -3941,6 +3994,12 @@
"node": ">= 8"
}
},
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "dev": true
+ },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -3953,6 +4012,36 @@
"node": ">=4"
}
},
+ "node_modules/cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/csstype": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
@@ -3989,6 +4078,62 @@
"node": ">= 12"
}
},
+ "node_modules/data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-urls/node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-urls/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-urls/node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
@@ -4071,6 +4216,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/decimal.js": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -4107,6 +4260,14 @@
"node": ">=4.0.0"
}
},
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -4303,6 +4464,31 @@
}
]
},
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/domhandler": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
@@ -4873,6 +5059,45 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
@@ -5001,6 +5226,14 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -5749,13 +5982,28 @@
"uglify-js": "^3.1.4"
}
},
- "node_modules/handlebars/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/happy-dom": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-6.0.4.tgz",
+ "integrity": "sha512-b+ID23Ms0BY08UNLymsOMG7EI2jSlwEt4cbJs938GZfeNAg+fqgkSO3TokQMgSOFoHznpjWmpVjBUL5boJ9PWw==",
+ "dev": true,
+ "dependencies": {
+ "css.escape": "^1.5.1",
+ "he": "^1.2.0",
+ "node-fetch": "^2.x.x",
+ "sync-request": "^6.1.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0"
+ }
+ },
+ "node_modules/happy-dom/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
"dev": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
}
},
"node_modules/har-schema": {
@@ -5874,6 +6122,20 @@
"node": ">=10"
}
},
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/htmlparser2": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
@@ -5885,6 +6147,36 @@
"entities": "^2.0.0"
}
},
+ "node_modules/http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "dev": true,
+ "dependencies": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/http-basic/node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
"node_modules/http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@@ -5905,6 +6197,21 @@
"node": ">= 6"
}
},
+ "node_modules/http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "^10.0.3"
+ }
+ },
+ "node_modules/http-response-object/node_modules/@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
+ "dev": true
+ },
"node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -5921,9 +6228,9 @@
}
},
"node_modules/https-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"dependencies": {
"agent-base": "6",
@@ -5956,7 +6263,6 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
- "optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
@@ -6378,6 +6684,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -6663,6 +6977,178 @@
"node": ">=8"
}
},
+ "node_modules/jsdom": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz",
+ "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "abab": "^2.0.6",
+ "acorn": "^8.7.1",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.3.1",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "^7.0.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^3.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.8.0",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsdom/node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/jsdom/node_modules/acorn": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+ "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/jsdom/node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jsdom/node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jsdom/node_modules/tough-cookie": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+ "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsdom/node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/jsdom/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/jsdom/node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/jsdom/node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -6826,6 +7312,21 @@
"node": ">= 10.18.0"
}
},
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/libnpmaccess": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz",
@@ -8138,6 +8639,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/nwsapi": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz",
+ "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -8255,6 +8764,25 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -8472,6 +9000,12 @@
"node": ">=6"
}
},
+ "node_modules/parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
+ "dev": true
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -8534,6 +9068,34 @@
"protocols": "^1.4.0"
}
},
+ "node_modules/parse5": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
+ "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "entities": "^4.3.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
+ "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -8847,12 +9409,32 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "node_modules/promise": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
+ "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+ "dev": true,
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
"node_modules/promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
@@ -9695,12 +10277,18 @@
"url": "https://opencollective.com/postcss/"
}
},
- "node_modules/sanitize-html/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=v12.22.7"
}
},
"node_modules/scheduler": {
@@ -9978,6 +10566,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-generator": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz",
@@ -10360,6 +10956,46 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "dev": true,
+ "dependencies": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "dev": true,
+ "dependencies": {
+ "get-port": "^3.1.0"
+ }
+ },
+ "node_modules/sync-rpc/node_modules/get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/table-layout": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
@@ -10526,6 +11162,49 @@
"node": ">=0.10"
}
},
+ "node_modules/then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "dev": true,
+ "dependencies": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/then-request/node_modules/@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
+ "dev": true
+ },
+ "node_modules/then-request/node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -10692,6 +11371,20 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
+ "node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -11094,11 +11787,36 @@
}
}
},
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
"node_modules/w3c-keyname": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz",
"integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw=="
},
+ "node_modules/w3c-xmlserializer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
+ "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/walk-back": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz",
@@ -11148,6 +11866,27 @@
"node": ">0.6.x"
}
},
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/whatwg-url": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
@@ -11202,6 +11941,17 @@
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -11426,9 +12176,9 @@
}
},
"node_modules/ws": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
- "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
+ "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
"engines": {
"node": ">=10.0.0"
},
@@ -11445,6 +12195,25 @@
}
}
},
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"node_modules/xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
@@ -13940,11 +14709,29 @@
"@types/chai": "*"
}
},
+ "@types/concat-stream": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz",
+ "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"@types/estree": {
"version": "0.0.39",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
},
+ "@types/form-data": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz",
+ "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"@types/linkify-it": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz",
@@ -14000,6 +14787,12 @@
"integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
"dev": true
},
+ "@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
+ "dev": true
+ },
"@types/scheduler": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
@@ -14088,6 +14881,14 @@
}
}
},
+ "abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -14100,6 +14901,18 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
+ "acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
"acorn-node": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
@@ -14429,6 +15242,14 @@
"fill-range": "^7.0.1"
}
},
+ "browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
@@ -15164,12 +15985,47 @@
"which": "^2.0.1"
}
},
+ "css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "dev": true
+ },
"cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true
},
+ "cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "cssom": "~0.3.6"
+ },
+ "dependencies": {
+ "cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ }
+ }
+ },
"csstype": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
@@ -15197,6 +16053,52 @@
"integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
"dev": true
},
+ "data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ },
+ "dependencies": {
+ "tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ }
+ }
+ },
"dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
@@ -15254,6 +16156,14 @@
}
}
},
+ "decimal.js": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -15281,6 +16191,14 @@
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true
},
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"defaults": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -15437,6 +16355,27 @@
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
},
+ "domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "webidl-conversions": "^7.0.0"
+ },
+ "dependencies": {
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ }
+ }
+ },
"domhandler": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
@@ -15768,6 +16707,29 @@
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
+ "escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"estraverse": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
@@ -15871,6 +16833,14 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -16423,12 +17393,27 @@
"source-map": "^0.6.1",
"uglify-js": "^3.1.4",
"wordwrap": "^1.0.0"
+ }
+ },
+ "happy-dom": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-6.0.4.tgz",
+ "integrity": "sha512-b+ID23Ms0BY08UNLymsOMG7EI2jSlwEt4cbJs938GZfeNAg+fqgkSO3TokQMgSOFoHznpjWmpVjBUL5boJ9PWw==",
+ "dev": true,
+ "requires": {
+ "css.escape": "^1.5.1",
+ "he": "^1.2.0",
+ "node-fetch": "^2.x.x",
+ "sync-request": "^6.1.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0"
},
"dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
"dev": true
}
}
@@ -16512,6 +17497,17 @@
"lru-cache": "^6.0.0"
}
},
+ "html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "whatwg-encoding": "^2.0.0"
+ }
+ },
"htmlparser2": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
@@ -16523,6 +17519,32 @@
"entities": "^2.0.0"
}
},
+ "http-basic": {
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz",
+ "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==",
+ "dev": true,
+ "requires": {
+ "caseless": "^0.12.0",
+ "concat-stream": "^1.6.2",
+ "http-response-object": "^3.0.1",
+ "parse-cache-control": "^1.0.1"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ }
+ }
+ },
"http-cache-semantics": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
@@ -16540,6 +17562,23 @@
"debug": "4"
}
},
+ "http-response-object": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
+ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "^10.0.3"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "10.17.60",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
+ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
+ "dev": true
+ }
+ }
+ },
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -16552,9 +17591,9 @@
}
},
"https-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
"requires": {
"agent-base": "6",
@@ -16581,7 +17620,6 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
- "optional": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
@@ -16898,6 +17936,14 @@
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
},
+ "is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -17116,6 +18162,139 @@
"walk-back": "^5.1.0"
}
},
+ "jsdom": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz",
+ "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "abab": "^2.0.6",
+ "acorn": "^8.7.1",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.3.1",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "^7.0.0",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^3.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.8.0",
+ "xml-name-validator": "^4.0.0"
+ },
+ "dependencies": {
+ "@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "acorn": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+ "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "tough-cookie": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
+ "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.1.2"
+ }
+ },
+ "tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ }
+ }
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -17241,6 +18420,18 @@
"npmlog": "^4.1.2"
}
},
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
"libnpmaccess": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-4.0.3.tgz",
@@ -18265,6 +19456,14 @@
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
+ "nwsapi": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz",
+ "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -18346,6 +19545,22 @@
"mimic-fn": "^2.1.0"
}
},
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
@@ -18497,6 +19712,12 @@
"callsites": "^3.0.0"
}
},
+ "parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
+ "dev": true
+ },
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -18549,6 +19770,27 @@
"protocols": "^1.4.0"
}
},
+ "parse5": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
+ "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "entities": "^4.3.0"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz",
+ "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ }
+ }
+ },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -18750,12 +19992,29 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "promise": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz",
+ "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==",
+ "dev": true,
+ "requires": {
+ "asap": "~2.0.6"
+ }
+ },
"promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
@@ -19468,14 +20727,20 @@
"picocolors": "^0.2.1",
"source-map": "^0.6.1"
}
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
}
}
},
+ "saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "xmlchars": "^2.2.0"
+ }
+ },
"scheduler": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
@@ -19706,6 +20971,11 @@
"is-plain-obj": "^2.0.0"
}
},
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
"source-map-generator": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/source-map-generator/-/source-map-generator-0.8.0.tgz",
@@ -20003,6 +21273,42 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
+ "symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "sync-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz",
+ "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==",
+ "dev": true,
+ "requires": {
+ "http-response-object": "^3.0.1",
+ "sync-rpc": "^1.2.1",
+ "then-request": "^6.0.0"
+ }
+ },
+ "sync-rpc": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz",
+ "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==",
+ "dev": true,
+ "requires": {
+ "get-port": "^3.1.0"
+ },
+ "dependencies": {
+ "get-port": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
+ "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
+ "dev": true
+ }
+ }
+ },
"table-layout": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
@@ -20138,6 +21444,45 @@
"integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
"dev": true
},
+ "then-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz",
+ "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==",
+ "dev": true,
+ "requires": {
+ "@types/concat-stream": "^1.6.0",
+ "@types/form-data": "0.0.33",
+ "@types/node": "^8.0.0",
+ "@types/qs": "^6.2.31",
+ "caseless": "~0.12.0",
+ "concat-stream": "^1.6.0",
+ "form-data": "^2.2.0",
+ "http-basic": "^8.1.1",
+ "http-response-object": "^3.0.1",
+ "promise": "^8.0.0",
+ "qs": "^6.4.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.66",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz",
+ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ }
+ }
+ },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -20272,6 +21617,17 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -20534,11 +21890,33 @@
}
}
},
+ "w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
"w3c-keyname": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.4.tgz",
"integrity": "sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw=="
},
+ "w3c-xmlserializer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz",
+ "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "xml-name-validator": "^4.0.0"
+ }
+ },
"walk-back": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz",
@@ -20575,6 +21953,21 @@
"resolved": "https://registry.npmjs.org/webmidi/-/webmidi-2.5.3.tgz",
"integrity": "sha512-PyMGvKcDGpvbQUfnmBORQJciyG3VAZ4aHlGy1iRZ3uEs4kG4HCvI7KRthUpM1vuHDPL98lidRIUaoRomkJtWtg=="
},
+ "whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.6.3"
+ }
+ },
+ "whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true
+ },
"whatwg-url": {
"version": "8.7.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
@@ -20617,6 +22010,14 @@
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -20796,11 +22197,27 @@
}
},
"ws": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
- "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
+ "version": "8.8.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz",
+ "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==",
"requires": {}
},
+ "xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"xmlcreate": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
diff --git a/package.json b/package.json
index 3853da6d..85e14cf7 100644
--- a/package.json
+++ b/package.json
@@ -39,6 +39,7 @@
"devDependencies": {
"events": "^3.3.0",
"gh-pages": "^4.0.0",
+ "happy-dom": "^6.0.4",
"jsdoc": "^3.6.10",
"jsdoc-json": "^2.0.2",
"jsdoc-to-markdown": "^7.1.1",
diff --git a/packages/core/test/drawLine.test.mjs b/packages/core/test/drawLine.test.mjs
index 461cd2b3..84359a7c 100644
--- a/packages/core/test/drawLine.test.mjs
+++ b/packages/core/test/drawLine.test.mjs
@@ -5,52 +5,42 @@ This program is free software: you can redistribute it and/or modify it under th
*/
import { fastcat, stack, slowcat, silence, pure } from '../pattern.mjs';
-import { strict as assert } from 'assert';
+import { describe, it, expect } from 'vitest';
import drawLine from '../drawLine.mjs';
describe('drawLine', () => {
it('supports equal lengths', () => {
- assert.equal(drawLine(fastcat(0), 4), '|0|0');
- assert.equal(drawLine(fastcat(0, 1), 4), '|01|01');
- assert.equal(drawLine(fastcat(0, 1, 2), 6), '|012|012');
+ expect(drawLine(fastcat(0), 4)).toEqual('|0|0');
+ expect(drawLine(fastcat(0, 1), 4)).toEqual('|01|01');
+ expect(drawLine(fastcat(0, 1, 2), 6)).toEqual('|012|012');
});
it('supports unequal lengths', () => {
- assert.equal(drawLine(fastcat(0, [1, 2]), 10), '|0-12|0-12');
- assert.equal(drawLine(fastcat(0, [1, 2, 3]), 10), '|0--123|0--123');
- assert.equal(drawLine(fastcat(0, 1, [2, 3]), 10), '|0-1-23|0-1-23');
+ expect(drawLine(fastcat(0, [1, 2]), 10)).toEqual('|0-12|0-12');
+ expect(drawLine(fastcat(0, [1, 2, 3]), 10)).toEqual('|0--123|0--123');
+ expect(drawLine(fastcat(0, 1, [2, 3]), 10)).toEqual('|0-1-23|0-1-23');
});
it('supports unequal silence', () => {
- assert.equal(drawLine(fastcat(0, silence, [1, 2]), 10), '|0-..12|0-..12');
+ expect(drawLine(fastcat(0, silence, [1, 2]), 10)).toEqual('|0-..12|0-..12');
});
it('supports polyrhythms', () => {
- '0*2 1*3';
- assert.equal(drawLine(fastcat(pure(0).fast(2), pure(1).fast(3)), 10), '|0--0--1-1-1-');
+ // assert.equal(drawLine(fastcat(pure(0).fast(2), pure(1).fast(3)), 10), '|0--0--1-1-1-');
+ expect(drawLine(fastcat(pure(0).fast(2), pure(1).fast(3)), 10)).toEqual('|0--0--1-1-1-');
});
it('supports multiple lines', () => {
- assert.equal(
- drawLine(fastcat(0, stack(1, 2)), 10),
- `|01|01|01|01
-|.2|.2|.2|.2`,
- );
- assert.equal(
- drawLine(fastcat(0, 1, stack(2, 3)), 10),
- `|012|012|012
-|..3|..3|..3`,
- );
- assert.equal(
- drawLine(fastcat(0, stack(1, 2, 3)), 10),
- `|01|01|01|01
+ expect(drawLine(fastcat(0, stack(1, 2)), 10)).toEqual(`|01|01|01|01
+|.2|.2|.2|.2`);
+
+ expect(drawLine(fastcat(0, 1, stack(2, 3)), 10)).toEqual(`|012|012|012
+|..3|..3|..3`);
+
+ expect(drawLine(fastcat(0, stack(1, 2, 3)), 10)).toEqual(`|01|01|01|01
|.2|.2|.2|.2
-|.3|.3|.3|.3`,
- );
- assert.equal(
- drawLine(fastcat(0, 1, stack(2, 3, 4)), 10),
- `|012|012|012
+|.3|.3|.3|.3`);
+ expect(drawLine(fastcat(0, 1, stack(2, 3, 4)), 10)).toEqual(`|012|012|012
|..3|..3|..3
-|..4|..4|..4`,
- );
+|..4|..4|..4`);
});
it('supports unequal cycle lengths', () => {
- assert.equal(drawLine(slowcat(0, [1, 2]), 10), `|0|12|0|12`);
+ expect(drawLine(slowcat(0, [1, 2]), 10)).toEqual(`|0|12|0|12`);
});
});
diff --git a/packages/core/test/fraction.test.mjs b/packages/core/test/fraction.test.mjs
index 46e83c69..6b710d04 100644
--- a/packages/core/test/fraction.test.mjs
+++ b/packages/core/test/fraction.test.mjs
@@ -5,11 +5,11 @@ This program is free software: you can redistribute it and/or modify it under th
*/
import Fraction, { gcd } from '../fraction.mjs';
-import { strict as assert } from 'assert';
+import { describe, it, expect } from 'vitest';
describe('gcd', () => {
it('should work', () => {
const F = Fraction._original;
- assert.equal(gcd(F(1 / 6), F(1 / 4)).toFraction(), '1/12');
+ expect(gcd(F(1 / 6), F(1 / 4)).toFraction()).toEqual('1/12');
});
});
diff --git a/packages/core/test/pattern.test.mjs b/packages/core/test/pattern.test.mjs
index b37ee286..99ce8f87 100644
--- a/packages/core/test/pattern.test.mjs
+++ b/packages/core/test/pattern.test.mjs
@@ -6,7 +6,7 @@ This program is free software: you can redistribute it and/or modify it under th
import Fraction from 'fraction.js';
-import { deepStrictEqual, strict as assert } from 'assert';
+import { describe, it, expect } from 'vitest';
import {
TimeSpan,
@@ -41,15 +41,11 @@ import {
tri2,
id,
ply,
- rev
+ rev,
} from '../index.mjs';
import { steady } from '../signal.mjs';
-//import { Time } from 'tone';
-import pkg from 'tone';
-const { Time } = pkg;
-
const st = (begin, end) => new State(ts(begin, end));
const ts = (begin, end) => new TimeSpan(Fraction(begin), Fraction(end));
const hap = (whole, part, value, context = {}) => new Hap(whole, part, value, context);
@@ -58,35 +54,35 @@ const third = Fraction(1, 3);
const twothirds = Fraction(2, 3);
const sameFirst = (a, b) => {
- return assert.deepStrictEqual(a._sortHapsByPart().firstCycle(), b._sortHapsByPart().firstCycle());
+ return expect(a._sortHapsByPart().firstCycle()).toStrictEqual(b._sortHapsByPart().firstCycle());
};
-describe('TimeSpan', function () {
- describe('equals()', function () {
- it('Should be equal to the same value', function () {
- assert.equal(new TimeSpan(0, 4).equals(new TimeSpan(0, 4)), true);
+describe('TimeSpan', () => {
+ describe('equals()', () => {
+ it('Should be equal to the same value', () => {
+ expect(new TimeSpan(0, 4).equals(new TimeSpan(0, 4))).toBe(true);
});
});
- describe('splitCycles', function () {
- it('Should split two cycles into two', function () {
- assert.equal(new TimeSpan(Fraction(0), Fraction(2)).spanCycles.length, 2);
+ describe('splitCycles', () => {
+ it('Should split two cycles into two', () => {
+ expect(new TimeSpan(Fraction(0), Fraction(2)).spanCycles.length).toBe(2);
});
});
- describe('intersection_e', function () {
+ describe('intersection_e', () => {
var a = new TimeSpan(Fraction(0), Fraction(2));
var b = new TimeSpan(Fraction(1), Fraction(3));
var c = new TimeSpan(Fraction(1), Fraction(2));
var d = new TimeSpan(Fraction(1), Fraction(2));
- it('Should create an intersection', function () {
- assert.equal(a.intersection_e(b).equals(c), true);
+ it('Should create an intersection', () => {
+ expect(a.intersection_e(b).equals(c)).toBe(true);
});
});
});
-describe('Hap', function () {
- describe('hasOnset()', function () {
- it('True if part includes onset from whole', function () {
- assert.equal(new Hap(new TimeSpan(0, 1), new TimeSpan(0, 1), 'thing').hasOnset(), true);
+describe('Hap', () => {
+ describe('hasOnset()', () => {
+ it('True if part includes onset from whole', () => {
+ expect(new Hap(new TimeSpan(0, 1), new TimeSpan(0, 1), 'thing').hasOnset()).toBe(true);
});
});
var a = new Hap(new TimeSpan(Fraction(0), Fraction(0.5)), new TimeSpan(Fraction(0), Fraction(0.5)), 'a');
@@ -94,19 +90,19 @@ describe('Hap', function () {
var c = new Hap(new TimeSpan(Fraction(0), Fraction(0.25)), new TimeSpan(Fraction(0), Fraction(0.5)), 'c');
var d = new Hap(undefined, new TimeSpan(Fraction(0), Fraction(0.5)), 'd');
var e = new Hap(undefined, new TimeSpan(Fraction(0), Fraction(0.5)), 'e');
- describe('spanEquals', function () {
- it('True if two haps have the same whole and part', function () {
- assert.equal(a.spanEquals(b), true);
+ describe('spanEquals', () => {
+ it('True if two haps have the same whole and part', () => {
+ expect(a.spanEquals(b)).toBe(true);
});
- it("False if two haps don't the same whole and part", function () {
- assert.equal(a.spanEquals(c), false);
+ it("False if two haps don't the same whole and part", () => {
+ expect(a.spanEquals(c)).toBe(false);
});
- it('True if two haps have the same part and undefined wholes', function () {
- assert.equal(d.spanEquals(e), true);
+ it('True if two haps have the same part and undefined wholes', () => {
+ expect(d.spanEquals(e)).toBe(true);
});
});
describe('resolveState()', () => {
- it('Can increment some state', function () {
+ it('Can increment some state', () => {
const stateful_value = (state) => {
const newValue = state['incrementme'];
// TODO Does the state *need* duplicating here?
@@ -118,8 +114,8 @@ describe('Hap', function () {
const ev1 = new Hap(ts(0, 1), ts(0, 1), stateful_value, {}, true);
const [state2, ev2] = ev1.resolveState(state);
const [state3, ev3] = ev1.resolveState(state2);
- assert.deepStrictEqual(ev3, new Hap(ts(0, 1), ts(0, 1), 11, {}, false));
- assert.deepStrictEqual(state3, { incrementme: 12 });
+ expect(ev3).toStrictEqual(new Hap(ts(0, 1), ts(0, 1), 11, {}, false));
+ expect(state3).toStrictEqual({ incrementme: 12 });
});
});
describe('wholeOrPart()', () => {
@@ -128,42 +124,40 @@ describe('Hap', function () {
const continuousHap = new Hap(undefined, ts1, 'hello');
const discreteHap = new Hap(ts1, ts0_5, 'hello');
it('Can pick a whole', () => {
- assert.deepStrictEqual(discreteHap.wholeOrPart(), ts1);
+ expect(discreteHap.wholeOrPart()).toStrictEqual(ts1);
});
it('Can pick a part', () => {
- assert.deepStrictEqual(continuousHap.wholeOrPart(), ts1);
+ expect(continuousHap.wholeOrPart()).toStrictEqual(ts1);
});
});
});
-
-describe('Pattern', function () {
- describe('pure', function () {
- it('Can make a pattern', function () {
- assert.equal(pure('hello').query(st(0.5, 2.5)).length, 3);
+describe('Pattern', () => {
+ describe('pure', () => {
+ it('Can make a pattern', () => {
+ expect(pure('hello').query(st(0.5, 2.5)).length).toBe(3);
});
});
- describe('fmap()', function () {
- it('Can add things', function () {
- assert.equal(
+ describe('fmap()', () => {
+ it('Can add things', () => {
+ expect(
pure(3)
.fmap((x) => x + 4)
.firstCycle()[0].value,
- 7,
- );
+ ).toBe(7);
});
});
- describe('add()', function () {
- it('can structure In()', function () {
- assert.equal(pure(3).add(pure(4)).query(st(0, 1))[0].value, 7);
- assert.equal(pure(3).addIn(pure(4)).query(st(0, 1))[0].value, 7);
+ describe('add()', () => {
+ it('can structure In()', () => {
+ expect(pure(3).add(pure(4)).query(st(0, 1))[0].value).toBe(7);
+ expect(pure(3).addIn(pure(4)).query(st(0, 1))[0].value).toBe(7);
});
it('can structure Out()', () => {
sameFirst(sequence(1, 2).addOut(4), sequence(5, 6).struct(true));
});
it('can Mix() structure', () => {
- assert.deepStrictEqual(sequence(1, 2).addMix(silence, 5, silence).firstCycle(), [
- hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 6),
- hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 7),
+ expect(sequence(1, 2).addMix(silence, 5, silence).firstCycle()).toStrictEqual([
+ new Hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 6),
+ new Hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 7),
]);
});
it('can Trig() structure', () => {
@@ -197,18 +191,18 @@ describe('Pattern', function () {
);
});
});
- describe('keep()', function () {
- it('can structure In()', function () {
- assert.equal(pure(3).keep(pure(4)).query(st(0, 1))[0].value, 3);
- assert.equal(pure(3).keepIn(pure(4)).query(st(0, 1))[0].value, 3);
+ describe('keep()', () => {
+ it('can structure In()', () => {
+ expect(pure(3).keep(pure(4)).query(st(0, 1))[0].value).toBe(3);
+ expect(pure(3).keepIn(pure(4)).query(st(0, 1))[0].value).toBe(3);
});
it('can structure Out()', () => {
sameFirst(sequence(1, 2).keepOut(4), sequence(1, 2).struct(true));
});
it('can Mix() structure', () => {
- assert.deepStrictEqual(sequence(1, 2).keepMix(silence, 5, silence).firstCycle(), [
- hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 1),
- hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 2),
+ expect(sequence(1, 2).keepMix(silence, 5, silence).firstCycle()).toStrictEqual([
+ new Hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 1),
+ new Hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 2),
]);
});
it('can Trig() structure', () => {
@@ -239,8 +233,8 @@ describe('Pattern', function () {
sameFirst(sequence(1, [2, 3]).keepSqueezeOut(10, 20, 30), sequence([1, [2, 3]], [1, [2, 3]], [1, [2, 3]]));
});
});
- describe('keepif()', function () {
- it('can structure In()', function () {
+ describe('keepif()', () => {
+ it('can structure In()', () => {
sameFirst(sequence(3, 4).keepif(true, false), sequence(3, silence));
sameFirst(sequence(3, 4).keepifIn(true, false), sequence(3, silence));
});
@@ -248,9 +242,9 @@ describe('Pattern', function () {
sameFirst(pure(1).keepifOut(true, false), sequence(1, silence));
});
it('can Mix() structure', () => {
- assert.deepStrictEqual(sequence(1, 2).keepifMix(false, true, false).firstCycle(), [
- hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 1),
- hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 2),
+ expect(sequence(1, 2).keepifMix(false, true, false).firstCycle()).toStrictEqual([
+ new Hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 1),
+ new Hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 2),
]);
});
it('can Trig() structure', () => {
@@ -281,35 +275,39 @@ describe('Pattern', function () {
sameFirst(sequence(1, [2, 3]).keepifSqueezeOut(true, true, false), sequence([1, [2, 3]], [1, [2, 3]], silence));
});
});
- describe('sub()', function () {
- it('Can subtract things', function () {
- assert.equal(pure(3).sub(pure(4)).query(st(0, 1))[0].value, -1);
+ describe('sub()', () => {
+ it('Can subtract things', () => {
+ expect(pure(3).sub(pure(4)).query(st(0, 1))[0].value).toBe(-1);
});
});
- describe('mul()', function () {
- it('Can multiply things', function () {
- assert.equal(pure(3).mul(pure(2)).firstCycle()[0].value, 6);
+ describe('mul()', () => {
+ it('Can multiply things', () => {
+ expect(pure(3).mul(pure(2)).firstCycle()[0].value).toBe(6);
});
});
- describe('div()', function () {
- it('Can divide things', function () {
- assert.equal(pure(3).div(pure(2)).firstCycle()[0].value, 1.5);
+ describe('div()', () => {
+ it('Can divide things', () => {
+ expect(pure(3).div(pure(2)).firstCycle()[0].value).toBe(1.5);
});
});
- describe('set()', function () {
- it('Can set things in objects', function () {
- assert.deepStrictEqual(
+ describe('set()', () => {
+ it('Can set things in objects', () => {
+ expect(
pure({ a: 4, b: 6 })
.set(pure({ c: 7 }))
.firstCycle()[0].value,
- { a: 4, b: 6, c: 7 },
- );
+ ).toStrictEqual({
+ a: 4,
+ b: 6,
+ c: 7,
+ });
+
sameFirst(
sequence({ a: 1, b: 2 }, { a: 2, b: 2 }, { a: 3, b: 2 }).set({ a: 4, c: 5 }),
sequence({ a: 4, b: 2, c: 5 }).fast(3),
);
});
- it('Can set things with plain values', function () {
+ it('Can set things with plain values', () => {
sameFirst(sequence(1, 2, 3).set(4), sequence(4).fast(3));
});
describe('setOut()', () => {
@@ -342,94 +340,84 @@ describe('Pattern', function () {
});
});
});
- describe('stack()', function () {
- it('Can stack things', function () {
- assert.deepStrictEqual(
+ describe('stack()', () => {
+ it('Can stack things', () => {
+ expect(
stack(pure('a'), pure('b'), pure('c'))
.firstCycle()
.map((h) => h.value),
- ['a', 'b', 'c'],
- );
+ ).toStrictEqual(['a', 'b', 'c']);
});
- it('Can stack subpatterns', function () {
+ it('Can stack subpatterns', () => {
sameFirst(stack('a', ['b', 'c']), stack('a', sequence('b', 'c')));
});
});
- describe('_fast()', function () {
- it('Makes things faster', function () {
- assert.equal(pure('a')._fast(2).firstCycle().length, 2);
+ describe('_fast()', () => {
+ it('Makes things faster', () => {
+ expect(pure('a')._fast(2).firstCycle().length).toBe(2);
});
});
- describe('_fastGap()', function () {
- it('Makes things faster, with a gap', function () {
- assert.deepStrictEqual(
- sequence('a', 'b', 'c')._fastGap(2).firstCycle(),
+ describe('_fastGap()', () => {
+ it('Makes things faster, with a gap', () => {
+ expect(sequence('a', 'b', 'c')._fastGap(2).firstCycle()).toStrictEqual(
sequence(['a', 'b', 'c'], silence).firstCycle(),
);
- assert.deepStrictEqual(
- sequence('a', 'b', 'c')._fastGap(3).firstCycle(),
+ expect(sequence('a', 'b', 'c')._fastGap(3).firstCycle()).toStrictEqual(
sequence(['a', 'b', 'c'], silence, silence).firstCycle(),
);
});
- it('Makes things faster, with a gap, when speeded up further', function () {
- assert.deepStrictEqual(
- sequence('a', 'b', 'c')._fastGap(2).fast(2).firstCycle(),
+ it('Makes things faster, with a gap, when speeded up further', () => {
+ expect(sequence('a', 'b', 'c')._fastGap(2).fast(2).firstCycle()).toStrictEqual(
sequence(['a', 'b', 'c'], silence, ['a', 'b', 'c'], silence).firstCycle(),
);
});
});
- describe('_compressSpan()', function () {
- it('Can squash cycles of a pattern into a given timespan', function () {
- assert.deepStrictEqual(
- pure('a')._compressSpan(new TimeSpan(0.25, 0.5)).firstCycle(),
+ describe('_compressSpan()', () => {
+ it('Can squash cycles of a pattern into a given timespan', () => {
+ expect(pure('a')._compressSpan(ts(0.25, 0.5)).firstCycle()).toStrictEqual(
sequence(silence, 'a', silence, silence).firstCycle(),
);
});
});
- describe('fast()', function () {
- it('Makes things faster', function () {
- assert.equal(pure('a').fast(2).firstCycle().length, 2);
+ describe('fast()', () => {
+ it('Makes things faster', () => {
+ expect(pure('a').fast(2).firstCycle().length).toBe(2);
});
- it('Makes things faster, with a pattern of factors', function () {
- assert.equal(pure('a').fast(sequence(1, 4)).firstCycle().length, 3);
- // .fast(sequence(1,silence) is a quick hack to cut a hap in two..
- assert.deepStrictEqual(
- pure('a').fast(sequence(1, 4)).firstCycle(),
+ it('Makes things faster, with a pattern of factors', () => {
+ expect(pure('a').fast(sequence(1, 4)).firstCycle().length).toBe(3);
+ expect(pure('a').fast(sequence(1, 4)).firstCycle()).toStrictEqual(
stack(pure('a').fast(sequence(1, silence)), sequence(silence, ['a', 'a'])).firstCycle(),
);
});
- it('defaults to accepting sequences', function () {
- assert.deepStrictEqual(
- sequence(1, 2, 3).fast(sequence(1.5, 2)).firstCycle(),
+ it('defaults to accepting sequences', () => {
+ expect(sequence(1, 2, 3).fast(sequence(1.5, 2)).firstCycle()).toStrictEqual(
sequence(1, 2, 3).fast(1.5, 2).firstCycle(),
);
});
- it('works as a static function', function () {
- assert.deepStrictEqual(
- sequence(1, 2, 3).fast(1, 2).firstCycle(),
+ it('works as a static function', () => {
+ expect(sequence(1, 2, 3).fast(1, 2).firstCycle()).toStrictEqual(
fast(sequence(1, 2), sequence(1, 2, 3)).firstCycle(),
);
});
- it('works as a curried static function', function () {
- assert.deepStrictEqual(
- sequence(1, 2, 3).fast(1, 2).firstCycle(),
+ it('works as a curried static function', () => {
+ expect(sequence(1, 2, 3).fast(1, 2).firstCycle()).toStrictEqual(
fast(sequence(1, 2))(sequence(1, 2, 3)).firstCycle(),
);
});
});
- describe('_slow()', function () {
- it('Makes things slower', function () {
- assert.deepStrictEqual(
- pure('a')._slow(2).firstCycle()[0],
- new Hap(new TimeSpan(Fraction(0), Fraction(2)), new TimeSpan(Fraction(0), Fraction(1)), 'a'),
- );
+
+ describe('_slow()', () => {
+ it('Makes things slower', () => {
+ expect(pure('a')._slow(2).firstCycle()[0]).toStrictEqual(hap(ts(0, 2), ts(0, 1), 'a'));
const pat = sequence(pure('c3'), pure('eb3')._slow(2)); // => try mini('c3 eb3/2') in repl
- assert.deepStrictEqual(pat.query(st(0, 1))[1], hap(ts(0.5, 1.5), ts(1 / 2, 1), 'eb3'));
+
+ expect(pat.query(st(0, 1))[1]).toStrictEqual(hap(ts(0.5, 1.5), ts(1 / 2, 1), 'eb3'));
+
// the following test fails
- /* assert.deepStrictEqual(
- pat.query(ts(1,2))[1], undefined
- ) */
+ // assert.deepStrictEqual(
+ // pat.query(ts(1,2))[1], undefined
+ // )
// expecting [c3 eb3] [c3 ~]
// what happens [c3 eb3] [c3 eb3]
// notable examples:
@@ -439,134 +427,125 @@ describe('Pattern', function () {
});
describe('inside', () => {
it('can rev inside a cycle', () => {
- sameFirst(sequence('a', 'b', 'c', 'd').inside(2, rev),
- sequence('b', 'a', 'd', 'c')
- );
+ sameFirst(sequence('a', 'b', 'c', 'd').inside(2, rev), sequence('b', 'a', 'd', 'c'));
});
});
describe('outside', () => {
it('can rev outside a cycle', () => {
- sameFirst(sequence('a', 'b', 'c', 'd')._slow(2).outside(2, rev),
- sequence('d', 'c')
- );
+ sameFirst(sequence('a', 'b', 'c', 'd')._slow(2).outside(2, rev), sequence('d', 'c'));
});
});
- describe('_filterValues()', function () {
- it('Filters true', function () {
- assert.equal(
+ describe('_filterValues()', () => {
+ it('Filters true', () => {
+ expect(
pure(true)
._filterValues((x) => x)
.firstCycle().length,
- 1,
- );
+ ).toBe(1);
});
});
- describe('when()', function () {
- it('Always faster', function () {
- assert.equal(
+ describe('when()', () => {
+ it('Always faster', () => {
+ expect(
pure('a')
.when(pure(true), (x) => x._fast(2))
.firstCycle().length,
- 2,
- );
+ ).toBe(2);
});
- it('Never faster', function () {
- assert.equal(
+ it('Never faster', () => {
+ expect(
pure('a')
.when(pure(false), (x) => x._fast(2))
.firstCycle().length,
- 1,
- );
+ ).toBe(1);
});
- it('Can alternate', function () {
- assert.deepStrictEqual(
- pure(10).when(slowcat(true, false), add(3)).fast(4)._sortHapsByPart().firstCycle(),
- fastcat(13, 10, 13, 10).firstCycle(),
- );
+ it('Can alternate', () => {
+ expect(
+ pure(10)
+ .when(slowcat(true, false), (x) => x.add(3))
+ .fast(4)
+ ._sortHapsByPart()
+ .firstCycle(),
+ ).toStrictEqual(fastcat(13, 10, 13, 10).firstCycle());
});
});
- describe('fastcat()', function () {
- it('Can concatenate two things', function () {
- assert.deepStrictEqual(
+ describe('fastcat()', () => {
+ it('Can concatenate two things', () => {
+ expect(
fastcat(pure('a'), pure('b'))
.firstCycle()
.map((x) => x.value),
- ['a', 'b'],
- );
+ ).toStrictEqual(['a', 'b']);
});
});
- describe('fastcat()', function () {
- it('Can go into negative time', function () {
+ describe('fastcat()', () => {
+ it('Can go into negative time', () => {
sameFirst(fastcat('a', 'b', 'c').late(1000000), fastcat('a', 'b', 'c'));
});
});
- describe('slowcat()', function () {
- it('Can concatenate things slowly', function () {
- assert.deepStrictEqual(
+ describe('slowcat()', () => {
+ it('Can concatenate things slowly', () => {
+ expect(
slowcat('a', 'b')
.firstCycle()
.map((x) => x.value),
- ['a'],
- );
- assert.deepStrictEqual(
+ ).toStrictEqual(['a']);
+
+ expect(
slowcat('a', 'b')
._early(1)
.firstCycle()
.map((x) => x.value),
- ['b'],
- );
- assert.deepStrictEqual(
+ ).toStrictEqual(['b']);
+
+ expect(
slowcat('a', slowcat('b', 'c'))
._early(1)
.firstCycle()
.map((x) => x.value),
- ['b'],
- );
- assert.deepStrictEqual(
+ ).toStrictEqual(['b']);
+
+ expect(
slowcat('a', slowcat('b', 'c'))
._early(3)
.firstCycle()
.map((x) => x.value),
- ['c'],
- );
+ ).toStrictEqual(['c']);
});
it('Can cat subpatterns', () => {
sameFirst(slowcat('a', ['b', 'c']).fast(4), sequence('a', ['b', 'c']).fast(2));
});
});
- describe('rev()', function () {
- it('Can reverse things', function () {
- assert.deepStrictEqual(
+ describe('rev()', () => {
+ it('Can reverse things', () => {
+ expect(
fastcat('a', 'b', 'c')
.rev()
.firstCycle()
.sort((a, b) => a.part.begin.sub(b.part.begin))
.map((a) => a.value),
- ['c', 'b', 'a'],
- );
+ ).toStrictEqual(['c', 'b', 'a']);
});
});
describe('sequence()', () => {
it('Can work like fastcat', () => {
- assert.deepStrictEqual(sequence(1, 2, 3).firstCycle(), fastcat(1, 2, 3).firstCycle());
+ expect(sequence(1, 2, 3).firstCycle()).toStrictEqual(fastcat(1, 2, 3).firstCycle());
});
});
describe('polyrhythm()', () => {
it('Can layer up cycles', () => {
- assert.deepStrictEqual(
- polyrhythm(['a', 'b'], ['c']).firstCycle(),
+ expect(polyrhythm(['a', 'b'], ['c']).firstCycle()).toStrictEqual(
stack(fastcat(pure('a'), pure('b')), pure('c')).firstCycle(),
);
});
});
describe('polymeter()', () => {
it('Can layer up cycles, stepwise', () => {
- assert.deepStrictEqual(
- polymeterSteps(3, ['d', 'e']).firstCycle(),
+ expect(polymeterSteps(3, ['d', 'e']).firstCycle()).toStrictEqual(
fastcat(pure('d'), pure('e'), pure('d')).firstCycle(),
);
- assert.deepStrictEqual(
- polymeter(['a', 'b', 'c'], ['d', 'e']).fast(2).firstCycle(),
+
+ expect(polymeter(['a', 'b', 'c'], ['d', 'e']).fast(2).firstCycle()).toStrictEqual(
stack(sequence('a', 'b', 'c', 'a', 'b', 'c'), sequence('d', 'e', 'd', 'e', 'd', 'e')).firstCycle(),
);
});
@@ -574,29 +553,24 @@ describe('Pattern', function () {
describe('every()', () => {
it('Can apply a function every 3rd time', () => {
- assert.deepStrictEqual(
+ expect(
pure('a')
.every(3, (x) => x._fast(2))
._fast(3)
.firstCycle(),
- sequence(sequence('a', 'a'), 'a', 'a').firstCycle(),
- );
+ ).toStrictEqual(sequence(sequence('a', 'a'), 'a', 'a').firstCycle());
});
it('works with currying', () => {
- assert.deepStrictEqual(
- pure('a').every(3, fast(2))._fast(3).firstCycle(),
+ expect(pure('a').every(3, fast(2))._fast(3).firstCycle()).toStrictEqual(
sequence(sequence('a', 'a'), 'a', 'a').firstCycle(),
);
- assert.deepStrictEqual(
- sequence(3, 4, 5).every(3, add(3)).fast(5).firstCycle(),
+ expect(sequence(3, 4, 5).every(3, add(3)).fast(5).firstCycle()).toStrictEqual(
sequence(6, 7, 8, 3, 4, 5, 3, 4, 5, 6, 7, 8, 3, 4, 5).firstCycle(),
);
- assert.deepStrictEqual(
- sequence(3, 4, 5).every(2, sub(1)).fast(5).firstCycle(),
+ expect(sequence(3, 4, 5).every(2, sub(1)).fast(5).firstCycle()).toStrictEqual(
sequence(2, 3, 4, 3, 4, 5, 2, 3, 4, 3, 4, 5, 2, 3, 4).firstCycle(),
);
- assert.deepStrictEqual(
- sequence(3, 4, 5).every(3, add(3)).every(2, sub(1)).fast(2).firstCycle(),
+ expect(sequence(3, 4, 5).every(3, add(3)).every(2, sub(1)).fast(2).firstCycle()).toStrictEqual(
sequence(5, 6, 7, 3, 4, 5).firstCycle(),
);
});
@@ -606,98 +580,91 @@ describe('Pattern', function () {
sameFirst(sequence('a', 'b').brak()._fast(2), sequence('a', 'b', fastcat(silence, 'a'), fastcat('b', silence)));
});
});
- describe('timeCat()', function () {
- it('Can concatenate patterns with different relative durations', function () {
- assert.deepStrictEqual(
- sequence('a', ['a', 'a']).firstCycle(),
+ describe('timeCat()', () => {
+ it('Can concatenate patterns with different relative durations', () => {
+ expect(sequence('a', ['a', 'a']).firstCycle()).toStrictEqual(
timeCat([1, 'a'], [0.5, 'a'], [0.5, 'a']).firstCycle(),
);
});
});
- describe('struct()', function () {
- it('Can restructure a discrete pattern', function () {
- assert.deepStrictEqual(sequence('a', 'b').struct(sequence(true, true, true)).firstCycle(), [
+ describe('struct()', () => {
+ it('Can restructure a discrete pattern', () => {
+ expect(sequence('a', 'b').struct(sequence(true, true, true)).firstCycle()).toStrictEqual([
hap(ts(0, third), ts(0, third), 'a'),
hap(ts(third, twothirds), ts(third, 0.5), 'a'),
hap(ts(third, twothirds), ts(0.5, twothirds), 'b'),
hap(ts(twothirds, 1), ts(twothirds, 1), 'b'),
]);
- assert.deepStrictEqual(
+
+ expect(
pure('a')
.struct(sequence(true, [true, false], true))
.firstCycle(),
- sequence('a', ['a', silence], 'a').firstCycle(),
- );
- assert.deepStrictEqual(
+ ).toStrictEqual(sequence('a', ['a', silence], 'a').firstCycle());
+
+ expect(
pure('a')
.struct(sequence(true, [true, false], true).invert())
.firstCycle(),
- sequence(silence, [silence, 'a'], silence).firstCycle(),
- );
- assert.deepStrictEqual(
+ ).toStrictEqual(sequence(silence, [silence, 'a'], silence).firstCycle());
+
+ expect(
pure('a')
.struct(sequence(true, [true, silence], true))
.firstCycle(),
- sequence('a', ['a', silence], 'a').firstCycle(),
- );
+ ).toStrictEqual(sequence('a', ['a', silence], 'a').firstCycle());
});
it('Can structure a continuous pattern', () => {
- assert.deepStrictEqual(
- steady('a').struct(true, [true, true]).firstCycle(),
- sequence('a', ['a', 'a']).firstCycle(),
- );
+ expect(steady('a').struct(true, [true, true]).firstCycle()).toStrictEqual(sequence('a', ['a', 'a']).firstCycle());
});
});
- describe('mask()', function () {
- it('Can fragment a pattern', function () {
- assert.deepStrictEqual(sequence('a', 'b').mask(sequence(true, true, true)).firstCycle(), [
+ describe('mask()', () => {
+ it('Can fragment a pattern', () => {
+ expect(sequence('a', 'b').mask(sequence(true, true, true)).firstCycle()).toStrictEqual([
hap(ts(0, 0.5), ts(0, third), 'a'),
hap(ts(0, 0.5), ts(third, 0.5), 'a'),
hap(ts(0.5, 1), ts(0.5, twothirds), 'b'),
hap(ts(0.5, 1), ts(twothirds, 1), 'b'),
]);
});
- it('Can mask off parts of a pattern', function () {
- assert.deepStrictEqual(
- sequence(['a', 'b'], 'c').mask(sequence(true, false)).firstCycle(),
+ it('Can mask off parts of a pattern', () => {
+ expect(sequence(['a', 'b'], 'c').mask(sequence(true, false)).firstCycle()).toStrictEqual(
sequence(['a', 'b'], silence).firstCycle(),
);
- assert.deepStrictEqual(sequence('a').mask(sequence(true, false)).firstCycle(), [hap(ts(0, 1), ts(0, 0.5), 'a')]);
+
+ expect(sequence('a').mask(sequence(true, false)).firstCycle()).toStrictEqual([hap(ts(0, 1), ts(0, 0.5), 'a')]);
});
});
- describe('invert()', function () {
- it('Can invert a binary pattern', function () {
- assert.deepStrictEqual(
- sequence(true, false, [true, false]).invert().firstCycle(),
+ describe('invert()', () => {
+ it('Can invert a binary pattern', () => {
+ expect(sequence(true, false, [true, false]).invert().firstCycle()).toStrictEqual(
sequence(false, true, [false, true]).firstCycle(),
);
});
});
- describe('signal()', function () {
- it('Can make saw/saw2', function () {
- assert.deepStrictEqual(
- saw.struct(true, true, true, true).firstCycle(),
+ describe('signal()', () => {
+ it('Can make saw/saw2', () => {
+ expect(saw.struct(true, true, true, true).firstCycle()).toStrictEqual(
sequence(1 / 8, 3 / 8, 5 / 8, 7 / 8).firstCycle(),
);
- assert.deepStrictEqual(
- saw2.struct(true, true, true, true).firstCycle(),
+
+ expect(saw2.struct(true, true, true, true).firstCycle()).toStrictEqual(
sequence(-3 / 4, -1 / 4, 1 / 4, 3 / 4).firstCycle(),
);
});
- it('Can make isaw/isaw2', function () {
- assert.deepStrictEqual(
- isaw.struct(true, true, true, true).firstCycle(),
+ it('Can make isaw/isaw2', () => {
+ expect(isaw.struct(true, true, true, true).firstCycle()).toStrictEqual(
sequence(7 / 8, 5 / 8, 3 / 8, 1 / 8).firstCycle(),
);
- assert.deepStrictEqual(
- isaw2.struct(true, true, true, true).firstCycle(),
+
+ expect(isaw2.struct(true, true, true, true).firstCycle()).toStrictEqual(
sequence(3 / 4, 1 / 4, -1 / 4, -3 / 4).firstCycle(),
);
});
});
describe('_setContext()', () => {
it('Can set the hap context', () => {
- assert.deepStrictEqual(
+ expect(
pure('a')
._setContext([
[
@@ -706,20 +673,19 @@ describe('Pattern', function () {
],
])
.firstCycle(true),
- [
- hap(ts(0, 1), ts(0, 1), 'a', [
- [
- [0, 1],
- [1, 2],
- ],
- ]),
- ],
- );
+ ).toStrictEqual([
+ hap(ts(0, 1), ts(0, 1), 'a', [
+ [
+ [0, 1],
+ [1, 2],
+ ],
+ ]),
+ ]);
});
});
describe('_withContext()', () => {
it('Can update the hap context', () => {
- assert.deepStrictEqual(
+ expect(
pure('a')
._setContext([
[
@@ -735,52 +701,49 @@ describe('Pattern', function () {
],
])
.firstCycle(true),
- [
- hap(ts(0, 1), ts(0, 1), 'a', [
- [
- [0, 1],
- [1, 2],
- ],
- [
- [3, 4],
- [3, 4],
- ],
- ]),
- ],
- );
+ ).toStrictEqual([
+ hap(ts(0, 1), ts(0, 1), 'a', [
+ [
+ [0, 1],
+ [1, 2],
+ ],
+ [
+ [3, 4],
+ [3, 4],
+ ],
+ ]),
+ ]);
});
});
describe('apply', () => {
it('Can apply a function', () => {
- assert.deepStrictEqual(sequence('a', 'b')._apply(fast(2)).firstCycle(), sequence('a', 'b').fast(2).firstCycle());
+ expect(sequence('a', 'b')._apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle());
}),
it('Can apply a pattern of functions', () => {
- assert.deepStrictEqual(sequence('a', 'b').apply(fast(2)).firstCycle(), sequence('a', 'b').fast(2).firstCycle());
- assert.deepStrictEqual(
- sequence('a', 'b').apply(fast(2), fast(3)).firstCycle(),
+ expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle());
+ expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual(
sequence('a', 'b').fast(2, 3).firstCycle(),
);
});
});
describe('layer', () => {
it('Can layer up multiple functions', () => {
- assert.deepStrictEqual(
+ expect(
sequence(1, 2, 3)
.layer(fast(2), (pat) => pat.add(3, 4))
.firstCycle(),
- stack(sequence(1, 2, 3).fast(2), sequence(1, 2, 3).add(3, 4)).firstCycle(),
- );
+ ).toStrictEqual(stack(sequence(1, 2, 3).fast(2), sequence(1, 2, 3).add(3, 4)).firstCycle());
});
});
describe('early', () => {
it('Can shift a hap earlier', () => {
- assert.deepStrictEqual(pure(30)._late(0.25).query(st(1, 2)), [
+ expect(pure(30)._late(0.25).query(st(1, 2))).toStrictEqual([
hap(ts(1 / 4, 5 / 4), ts(1, 5 / 4), 30),
hap(ts(5 / 4, 9 / 4), ts(5 / 4, 2), 30),
]);
});
it('Can shift a hap earlier, into negative time', () => {
- assert.deepStrictEqual(pure(30)._late(0.25).query(st(0, 1)), [
+ expect(pure(30)._late(0.25).query(st(0, 1))).toStrictEqual([
hap(ts(-3 / 4, 1 / 4), ts(0, 1 / 4), 30),
hap(ts(1 / 4, 5 / 4), ts(1 / 4, 1), 30),
]);
@@ -788,16 +751,14 @@ describe('Pattern', function () {
});
describe('off', () => {
it('Can offset a transformed pattern from the original', () => {
- assert.deepStrictEqual(
- pure(30).off(0.25, add(2)).firstCycle(),
+ expect(pure(30).off(0.25, add(2)).firstCycle()).toStrictEqual(
stack(pure(30), pure(30).late(0.25).add(2)).firstCycle(),
);
});
});
describe('jux', () => {
it('Can juxtapose', () => {
- assert.deepStrictEqual(
- pure({ a: 1 }).jux(fast(2))._sortHapsByPart().firstCycle(),
+ expect(pure({ a: 1 }).jux(fast(2))._sortHapsByPart().firstCycle()).toStrictEqual(
stack(pure({ a: 1, pan: 0 }), pure({ a: 1, pan: 1 }).fast(2))
._sortHapsByPart()
.firstCycle(),
@@ -806,8 +767,7 @@ describe('Pattern', function () {
});
describe('juxBy', () => {
it('Can juxtapose by half', () => {
- assert.deepStrictEqual(
- pure({ a: 1 }).juxBy(0.5, fast(2))._sortHapsByPart().firstCycle(),
+ expect(pure({ a: 1 }).juxBy(0.5, fast(2))._sortHapsByPart().firstCycle()).toStrictEqual(
stack(pure({ a: 1, pan: 0.25 }), pure({ a: 1, pan: 0.75 }).fast(2))
._sortHapsByPart()
.firstCycle(),
@@ -816,11 +776,12 @@ describe('Pattern', function () {
});
describe('_squeezeJoin', () => {
it('Can squeeze', () => {
- assert.deepStrictEqual(
+ expect(
sequence('a', ['a', 'a'])
.fmap((a) => fastcat('b', 'c'))
._squeezeJoin()
.firstCycle(),
+ ).toStrictEqual(
sequence(
['b', 'c'],
[
@@ -833,14 +794,13 @@ describe('Pattern', function () {
});
describe('ply', () => {
it('Can ply(3)', () => {
- assert.deepStrictEqual(
- sequence('a', ['b', 'c']).ply(3).firstCycle(),
+ expect(sequence('a', ['b', 'c']).ply(3).firstCycle()).toStrictEqual(
sequence(pure('a').fast(3), [pure('b').fast(3), pure('c').fast(3)]).firstCycle(),
);
});
it('Doesnt drop haps in the 9th cycle', () => {
// fixed with https://github.com/tidalcycles/strudel/commit/72eeaf446e3d5e186d63cc0d2276f0723cde017a
- assert.equal(sequence(1, 2, 3).ply(2).early(8).firstCycle().length, 6);
+ expect(sequence(1, 2, 3).ply(2).early(8).firstCycle().length).toBe(6);
});
});
describe('striate', () => {
@@ -853,8 +813,7 @@ describe('Pattern', function () {
});
describe('chop', () => {
it('Can _chop(2)', () => {
- assert.deepStrictEqual(
- sequence({ sound: 'a' }, { sound: 'b' })._chop(2).firstCycle(),
+ expect(sequence({ sound: 'a' }, { sound: 'b' })._chop(2).firstCycle()).toStrictEqual(
sequence(
{ sound: 'a', begin: 0, end: 0.5 },
{ sound: 'a', begin: 0.5, end: 1 },
@@ -864,8 +823,7 @@ describe('Pattern', function () {
);
});
it('Can chop(2,3)', () => {
- assert.deepStrictEqual(
- pure({ sound: 'a' }).fast(2).chop(2, 3)._sortHapsByPart().firstCycle(),
+ expect(pure({ sound: 'a' }).fast(2).chop(2, 3)._sortHapsByPart().firstCycle()).toStrictEqual(
sequence(
[
{ sound: 'a', begin: 0, end: 0.5 },
@@ -884,16 +842,14 @@ describe('Pattern', function () {
});
describe('range2', () => {
it('Can change the range of a bipolar pattern', () => {
- assert.deepStrictEqual(
- sequence(-1, -0.5, 0, 0.5).range2(1000, 1100).firstCycle(),
+ expect(sequence(-1, -0.5, 0, 0.5).range2(1000, 1100).firstCycle()).toStrictEqual(
sequence(1000, 1025, 1050, 1075).firstCycle(),
);
});
});
describe('linger', () => {
it('Can linger on the first quarter of a cycle', () => {
- assert.deepStrictEqual(
- sequence(0, 1, 2, 3, 4, 5, 6, 7).linger(0.25).firstCycle(),
+ expect(sequence(0, 1, 2, 3, 4, 5, 6, 7).linger(0.25).firstCycle()).toStrictEqual(
sequence(0, 1, 0, 1, 0, 1, 0, 1).firstCycle(),
);
});
diff --git a/packages/core/test/util.test.mjs b/packages/core/test/util.test.mjs
index 4a315ea8..961ce764 100644
--- a/packages/core/test/util.test.mjs
+++ b/packages/core/test/util.test.mjs
@@ -4,117 +4,117 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
import { pure } from '../pattern.mjs';
import { isNote, tokenizeNote, toMidi, fromMidi, mod, compose, getFrequency } from '../util.mjs';
+import { describe, it, expect } from 'vitest';
describe('isNote', () => {
it('should recognize notes without accidentals', () => {
'C3 D3 E3 F3 G3 A3 B3 C4 D5 c5 d5 e5'.split(' ').forEach((note) => {
- assert.equal(isNote(note), true);
+ expect(isNote(note)).toBe(true);
});
});
it('should recognize notes with accidentals', () => {
'C#3 D##3 Eb3 Fbb3 Bb5'.split(' ').forEach((note) => {
- assert.equal(isNote(note), true);
+ expect(isNote(note)).toBe(true);
});
});
it('should not recognize invalid notes', () => {
- assert.equal(isNote('H5'), false);
- assert.equal(isNote('C'), false);
- assert.equal(isNote('X'), false);
- assert.equal(isNote(1), false);
+ expect(isNote('H5')).toBe(false);
+ expect(isNote('C')).toBe(false);
+ expect(isNote('X')).toBe(false);
+ expect(isNote(1)).toBe(false);
});
});
describe('isNote', () => {
it('should tokenize notes without accidentals', () => {
- assert.deepStrictEqual(tokenizeNote('C3'), ['C', '', 3]);
- assert.deepStrictEqual(tokenizeNote('D3'), ['D', '', 3]);
- assert.deepStrictEqual(tokenizeNote('E3'), ['E', '', 3]);
- assert.deepStrictEqual(tokenizeNote('F3'), ['F', '', 3]);
- assert.deepStrictEqual(tokenizeNote('G3'), ['G', '', 3]);
- assert.deepStrictEqual(tokenizeNote('A3'), ['A', '', 3]);
- assert.deepStrictEqual(tokenizeNote('B3'), ['B', '', 3]);
- assert.deepStrictEqual(tokenizeNote('C4'), ['C', '', 4]);
- assert.deepStrictEqual(tokenizeNote('D5'), ['D', '', 5]);
+ expect(tokenizeNote('C3')).toStrictEqual(['C', '', 3]);
+ expect(tokenizeNote('D3')).toStrictEqual(['D', '', 3]);
+ expect(tokenizeNote('E3')).toStrictEqual(['E', '', 3]);
+ expect(tokenizeNote('F3')).toStrictEqual(['F', '', 3]);
+ expect(tokenizeNote('G3')).toStrictEqual(['G', '', 3]);
+ expect(tokenizeNote('A3')).toStrictEqual(['A', '', 3]);
+ expect(tokenizeNote('B3')).toStrictEqual(['B', '', 3]);
+ expect(tokenizeNote('C4')).toStrictEqual(['C', '', 4]);
+ expect(tokenizeNote('D5')).toStrictEqual(['D', '', 5]);
});
it('should tokenize notes with accidentals', () => {
- assert.deepStrictEqual(tokenizeNote('C#3'), ['C', '#', 3]);
- assert.deepStrictEqual(tokenizeNote('D##3'), ['D', '##', 3]);
- assert.deepStrictEqual(tokenizeNote('Eb3'), ['E', 'b', 3]);
- assert.deepStrictEqual(tokenizeNote('Fbb3'), ['F', 'bb', 3]);
- assert.deepStrictEqual(tokenizeNote('Bb5'), ['B', 'b', 5]);
+ expect(tokenizeNote('C#3')).toStrictEqual(['C', '#', 3]);
+ expect(tokenizeNote('D##3')).toStrictEqual(['D', '##', 3]);
+ expect(tokenizeNote('Eb3')).toStrictEqual(['E', 'b', 3]);
+ expect(tokenizeNote('Fbb3')).toStrictEqual(['F', 'bb', 3]);
+ expect(tokenizeNote('Bb5')).toStrictEqual(['B', 'b', 5]);
});
it('should tokenize notes without octave', () => {
- assert.deepStrictEqual(tokenizeNote('C'), ['C', '', undefined]);
- assert.deepStrictEqual(tokenizeNote('C#'), ['C', '#', undefined]);
- assert.deepStrictEqual(tokenizeNote('Bb'), ['B', 'b', undefined]);
- assert.deepStrictEqual(tokenizeNote('Bbb'), ['B', 'bb', undefined]);
+ expect(tokenizeNote('C')).toStrictEqual(['C', '', undefined]);
+ expect(tokenizeNote('C#')).toStrictEqual(['C', '#', undefined]);
+ expect(tokenizeNote('Bb')).toStrictEqual(['B', 'b', undefined]);
+ expect(tokenizeNote('Bbb')).toStrictEqual(['B', 'bb', undefined]);
});
it('should not tokenize invalid notes', () => {
- assert.deepStrictEqual(tokenizeNote('X'), []);
- assert.deepStrictEqual(tokenizeNote('asfasf'), []);
- assert.deepStrictEqual(tokenizeNote(123), []);
+ expect(tokenizeNote('X')).toStrictEqual([]);
+ expect(tokenizeNote('asfasf')).toStrictEqual([]);
+ expect(tokenizeNote(123)).toStrictEqual([]);
});
});
describe('toMidi', () => {
it('should turn notes into midi', () => {
- assert.equal(toMidi('A4'), 69);
- assert.equal(toMidi('C4'), 60);
- assert.equal(toMidi('Db4'), 61);
- assert.equal(toMidi('C3'), 48);
- assert.equal(toMidi('Cb3'), 47);
- assert.equal(toMidi('Cbb3'), 46);
- assert.equal(toMidi('C#3'), 49);
- assert.equal(toMidi('C#3'), 49);
- assert.equal(toMidi('C##3'), 50);
+ expect(toMidi('A4')).toEqual(69);
+ expect(toMidi('C4')).toEqual(60);
+ expect(toMidi('Db4')).toEqual(61);
+ expect(toMidi('C3')).toEqual(48);
+ expect(toMidi('Cb3')).toEqual(47);
+ expect(toMidi('Cbb3')).toEqual(46);
+ expect(toMidi('C#3')).toEqual(49);
+ expect(toMidi('C#3')).toEqual(49);
+ expect(toMidi('C##3')).toEqual(50);
});
});
describe('fromMidi', () => {
it('should turn midi into frequency', () => {
- assert.equal(fromMidi(69), 440);
- assert.equal(fromMidi(57), 220);
+ expect(fromMidi(69)).toEqual(440);
+ expect(fromMidi(57)).toEqual(220);
});
});
describe('getFrequency', () => {
it('should turn midi into frequency', () => {
const happify = (val, context = {}) => pure(val).firstCycle()[0].setContext(context);
- assert.equal(getFrequency(happify('a4')), 440);
- assert.equal(getFrequency(happify('a3')), 220);
- assert.equal(getFrequency(happify(440, { type: 'frequency' })), 440); // TODO: migrate when values are objects..
- assert.equal(getFrequency(happify(432, { type: 'frequency' })), 432);
+ expect(getFrequency(happify('a4'))).toEqual(440);
+ expect(getFrequency(happify('a3'))).toEqual(220);
+ expect(getFrequency(happify(440, { type: 'frequency' }))).toEqual(440); // TODO: migrate when values are objects..
+ expect(getFrequency(happify(432, { type: 'frequency' }))).toEqual(432);
});
});
describe('mod', () => {
it('should work like regular modulo with positive numbers', () => {
- assert.equal(mod(0, 3), 0);
- assert.equal(mod(1, 3), 1);
- assert.equal(mod(2, 3), 2);
- assert.equal(mod(3, 3), 0);
- assert.equal(mod(4, 3), 1);
- assert.equal(mod(4, 2), 0);
+ expect(mod(0, 3)).toEqual(0);
+ expect(mod(1, 3)).toEqual(1);
+ expect(mod(2, 3)).toEqual(2);
+ expect(mod(3, 3)).toEqual(0);
+ expect(mod(4, 3)).toEqual(1);
+ expect(mod(4, 2)).toEqual(0);
});
it('should work with negative numbers', () => {
- assert.equal(mod(-1, 3), 2);
- assert.equal(mod(-2, 3), 1);
- assert.equal(mod(-3, 3), 0);
- assert.equal(mod(-4, 3), 2);
- assert.equal(mod(-5, 3), 1);
- assert.equal(mod(-3, 2), 1);
+ expect(mod(-1, 3)).toEqual(2);
+ expect(mod(-2, 3)).toEqual(1);
+ expect(mod(-3, 3)).toEqual(0);
+ expect(mod(-4, 3)).toEqual(2);
+ expect(mod(-5, 3)).toEqual(1);
+ expect(mod(-3, 2)).toEqual(1);
});
});
describe('compose', () => {
const add1 = (a) => a + 1;
it('should compose', () => {
- assert.equal(compose(add1, add1)(0), 2);
- assert.equal(compose(add1)(0), 1);
+ expect(compose(add1, add1)(0)).toEqual(2);
+ expect(compose(add1)(0)).toEqual(1);
});
const addS = (s) => (a) => a + s;
it('should compose left to right', () => {
- assert.equal(compose(addS('a'), addS('b'))(''), 'ab');
- assert.equal(compose(addS('a'), addS('b'))('x'), 'xab');
+ expect(compose(addS('a'), addS('b'))('')).toEqual('ab');
+ expect(compose(addS('a'), addS('b'))('x')).toEqual('xab');
});
});
diff --git a/packages/core/test/value.test.mjs b/packages/core/test/value.test.mjs
index 35de86b4..ae227e17 100644
--- a/packages/core/test/value.test.mjs
+++ b/packages/core/test/value.test.mjs
@@ -4,21 +4,21 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
+import { describe, it, expect } from 'vitest';
import { map, valued, mul } from '../value.mjs';
describe('Value', () => {
it('unionWith', () => {
const { value } = valued({ freq: 2000, distortion: 1.2 }).unionWith({ distortion: 2 }, mul);
- assert.deepStrictEqual(value, { freq: 2000, distortion: 2.4 });
+ expect(value).toStrictEqual({ freq: 2000, distortion: 2.4 });
});
it('experiments', () => {
- assert.equal(map(mul(5), valued(3)).value, 15);
- assert.equal(map(mul(null), valued(3)).value, 0);
- assert.equal(map(mul(3), valued(null)).value, null);
- assert.equal(valued(3).map(mul).ap(3).value, 9);
- assert.equal(valued(mul).ap(3).ap(3).value, 9);
- assert.equal(valued(3).mul(3).value, 9);
+ expect(map(mul(5), valued(3)).value).toEqual(15);
+ expect(map(mul(null), valued(3)).value).toEqual(0);
+ expect(map(mul(3), valued(null)).value).toEqual(null);
+ expect(valued(3).map(mul).ap(3).value).toEqual(9);
+ expect(valued(mul).ap(3).ap(3).value).toEqual(9);
+ expect(valued(3).mul(3).value).toEqual(9);
});
});
diff --git a/packages/core/vitest/drawLine.test.mjs b/packages/core/vitest/drawLine.test.mjs
deleted file mode 100644
index 84359a7c..00000000
--- a/packages/core/vitest/drawLine.test.mjs
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-drawLine.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { fastcat, stack, slowcat, silence, pure } from '../pattern.mjs';
-import { describe, it, expect } from 'vitest';
-import drawLine from '../drawLine.mjs';
-
-describe('drawLine', () => {
- it('supports equal lengths', () => {
- expect(drawLine(fastcat(0), 4)).toEqual('|0|0');
- expect(drawLine(fastcat(0, 1), 4)).toEqual('|01|01');
- expect(drawLine(fastcat(0, 1, 2), 6)).toEqual('|012|012');
- });
- it('supports unequal lengths', () => {
- expect(drawLine(fastcat(0, [1, 2]), 10)).toEqual('|0-12|0-12');
- expect(drawLine(fastcat(0, [1, 2, 3]), 10)).toEqual('|0--123|0--123');
- expect(drawLine(fastcat(0, 1, [2, 3]), 10)).toEqual('|0-1-23|0-1-23');
- });
- it('supports unequal silence', () => {
- expect(drawLine(fastcat(0, silence, [1, 2]), 10)).toEqual('|0-..12|0-..12');
- });
- it('supports polyrhythms', () => {
- // assert.equal(drawLine(fastcat(pure(0).fast(2), pure(1).fast(3)), 10), '|0--0--1-1-1-');
- expect(drawLine(fastcat(pure(0).fast(2), pure(1).fast(3)), 10)).toEqual('|0--0--1-1-1-');
- });
- it('supports multiple lines', () => {
- expect(drawLine(fastcat(0, stack(1, 2)), 10)).toEqual(`|01|01|01|01
-|.2|.2|.2|.2`);
-
- expect(drawLine(fastcat(0, 1, stack(2, 3)), 10)).toEqual(`|012|012|012
-|..3|..3|..3`);
-
- expect(drawLine(fastcat(0, stack(1, 2, 3)), 10)).toEqual(`|01|01|01|01
-|.2|.2|.2|.2
-|.3|.3|.3|.3`);
- expect(drawLine(fastcat(0, 1, stack(2, 3, 4)), 10)).toEqual(`|012|012|012
-|..3|..3|..3
-|..4|..4|..4`);
- });
- it('supports unequal cycle lengths', () => {
- expect(drawLine(slowcat(0, [1, 2]), 10)).toEqual(`|0|12|0|12`);
- });
-});
diff --git a/packages/core/vitest/fraction.test.mjs b/packages/core/vitest/fraction.test.mjs
deleted file mode 100644
index 6b710d04..00000000
--- a/packages/core/vitest/fraction.test.mjs
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
-fraction.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import Fraction, { gcd } from '../fraction.mjs';
-import { describe, it, expect } from 'vitest';
-
-describe('gcd', () => {
- it('should work', () => {
- const F = Fraction._original;
- expect(gcd(F(1 / 6), F(1 / 4)).toFraction()).toEqual('1/12');
- });
-});
diff --git a/packages/core/vitest/pattern.test.mjs b/packages/core/vitest/pattern.test.mjs
deleted file mode 100644
index 99ce8f87..00000000
--- a/packages/core/vitest/pattern.test.mjs
+++ /dev/null
@@ -1,857 +0,0 @@
-/*
-pattern.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import Fraction from 'fraction.js';
-
-import { describe, it, expect } from 'vitest';
-
-import {
- TimeSpan,
- Hap,
- State,
- Pattern,
- pure,
- stack,
- fastcat,
- slowcat,
- cat,
- sequence,
- polymeter,
- polymeterSteps,
- polyrhythm,
- silence,
- fast,
- timeCat,
- add,
- sub,
- mul,
- div,
- saw,
- saw2,
- isaw,
- isaw2,
- sine,
- sine2,
- square,
- square2,
- tri,
- tri2,
- id,
- ply,
- rev,
-} from '../index.mjs';
-
-import { steady } from '../signal.mjs';
-
-const st = (begin, end) => new State(ts(begin, end));
-const ts = (begin, end) => new TimeSpan(Fraction(begin), Fraction(end));
-const hap = (whole, part, value, context = {}) => new Hap(whole, part, value, context);
-
-const third = Fraction(1, 3);
-const twothirds = Fraction(2, 3);
-
-const sameFirst = (a, b) => {
- return expect(a._sortHapsByPart().firstCycle()).toStrictEqual(b._sortHapsByPart().firstCycle());
-};
-
-describe('TimeSpan', () => {
- describe('equals()', () => {
- it('Should be equal to the same value', () => {
- expect(new TimeSpan(0, 4).equals(new TimeSpan(0, 4))).toBe(true);
- });
- });
- describe('splitCycles', () => {
- it('Should split two cycles into two', () => {
- expect(new TimeSpan(Fraction(0), Fraction(2)).spanCycles.length).toBe(2);
- });
- });
- describe('intersection_e', () => {
- var a = new TimeSpan(Fraction(0), Fraction(2));
- var b = new TimeSpan(Fraction(1), Fraction(3));
- var c = new TimeSpan(Fraction(1), Fraction(2));
- var d = new TimeSpan(Fraction(1), Fraction(2));
- it('Should create an intersection', () => {
- expect(a.intersection_e(b).equals(c)).toBe(true);
- });
- });
-});
-
-describe('Hap', () => {
- describe('hasOnset()', () => {
- it('True if part includes onset from whole', () => {
- expect(new Hap(new TimeSpan(0, 1), new TimeSpan(0, 1), 'thing').hasOnset()).toBe(true);
- });
- });
- var a = new Hap(new TimeSpan(Fraction(0), Fraction(0.5)), new TimeSpan(Fraction(0), Fraction(0.5)), 'a');
- var b = new Hap(new TimeSpan(Fraction(0), Fraction(0.5)), new TimeSpan(Fraction(0), Fraction(0.5)), 'b');
- var c = new Hap(new TimeSpan(Fraction(0), Fraction(0.25)), new TimeSpan(Fraction(0), Fraction(0.5)), 'c');
- var d = new Hap(undefined, new TimeSpan(Fraction(0), Fraction(0.5)), 'd');
- var e = new Hap(undefined, new TimeSpan(Fraction(0), Fraction(0.5)), 'e');
- describe('spanEquals', () => {
- it('True if two haps have the same whole and part', () => {
- expect(a.spanEquals(b)).toBe(true);
- });
- it("False if two haps don't the same whole and part", () => {
- expect(a.spanEquals(c)).toBe(false);
- });
- it('True if two haps have the same part and undefined wholes', () => {
- expect(d.spanEquals(e)).toBe(true);
- });
- });
- describe('resolveState()', () => {
- it('Can increment some state', () => {
- const stateful_value = (state) => {
- const newValue = state['incrementme'];
- // TODO Does the state *need* duplicating here?
- const newState = { ...state };
- newState['incrementme']++;
- return [newState, newValue];
- };
- const state = { incrementme: 10 };
- const ev1 = new Hap(ts(0, 1), ts(0, 1), stateful_value, {}, true);
- const [state2, ev2] = ev1.resolveState(state);
- const [state3, ev3] = ev1.resolveState(state2);
- expect(ev3).toStrictEqual(new Hap(ts(0, 1), ts(0, 1), 11, {}, false));
- expect(state3).toStrictEqual({ incrementme: 12 });
- });
- });
- describe('wholeOrPart()', () => {
- const ts1 = new TimeSpan(Fraction(0), Fraction(1));
- const ts0_5 = new TimeSpan(Fraction(0), Fraction(0.5));
- const continuousHap = new Hap(undefined, ts1, 'hello');
- const discreteHap = new Hap(ts1, ts0_5, 'hello');
- it('Can pick a whole', () => {
- expect(discreteHap.wholeOrPart()).toStrictEqual(ts1);
- });
- it('Can pick a part', () => {
- expect(continuousHap.wholeOrPart()).toStrictEqual(ts1);
- });
- });
-});
-describe('Pattern', () => {
- describe('pure', () => {
- it('Can make a pattern', () => {
- expect(pure('hello').query(st(0.5, 2.5)).length).toBe(3);
- });
- });
- describe('fmap()', () => {
- it('Can add things', () => {
- expect(
- pure(3)
- .fmap((x) => x + 4)
- .firstCycle()[0].value,
- ).toBe(7);
- });
- });
- describe('add()', () => {
- it('can structure In()', () => {
- expect(pure(3).add(pure(4)).query(st(0, 1))[0].value).toBe(7);
- expect(pure(3).addIn(pure(4)).query(st(0, 1))[0].value).toBe(7);
- });
- it('can structure Out()', () => {
- sameFirst(sequence(1, 2).addOut(4), sequence(5, 6).struct(true));
- });
- it('can Mix() structure', () => {
- expect(sequence(1, 2).addMix(silence, 5, silence).firstCycle()).toStrictEqual([
- new Hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 6),
- new Hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 7),
- ]);
- });
- it('can Trig() structure', () => {
- sameFirst(
- slowcat(sequence(1, 2, 3, 4), 5, sequence(6, 7, 8, 9), 10).addTrig(20, 30).early(2),
- sequence(26, 27, 36, 37),
- );
- });
- it('can Trigzero() structure', () => {
- sameFirst(
- slowcat(sequence(1, 2, 3, 4), 5, sequence(6, 7, 8, 9), 10).addTrigzero(20, 30).early(2),
- sequence(21, 22, 31, 32),
- );
- });
- it('can Squeeze() structure', () => {
- sameFirst(
- sequence(1, [2, 3]).addSqueeze(sequence(10, 20, 30)),
- sequence(
- [11, 21, 31],
- [
- [12, 22, 32],
- [13, 23, 33],
- ],
- ),
- );
- });
- it('can SqueezeOut() structure', () => {
- sameFirst(
- sequence(1, [2, 3]).addSqueezeOut(10, 20, 30),
- sequence([11, [12, 13]], [21, [22, 23]], [31, [32, 33]]),
- );
- });
- });
- describe('keep()', () => {
- it('can structure In()', () => {
- expect(pure(3).keep(pure(4)).query(st(0, 1))[0].value).toBe(3);
- expect(pure(3).keepIn(pure(4)).query(st(0, 1))[0].value).toBe(3);
- });
- it('can structure Out()', () => {
- sameFirst(sequence(1, 2).keepOut(4), sequence(1, 2).struct(true));
- });
- it('can Mix() structure', () => {
- expect(sequence(1, 2).keepMix(silence, 5, silence).firstCycle()).toStrictEqual([
- new Hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 1),
- new Hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 2),
- ]);
- });
- it('can Trig() structure', () => {
- sameFirst(
- slowcat(sequence(1, 2, 3, 4), 5, sequence(6, 7, 8, 9), 10).keepTrig(20, 30).early(2),
- sequence(6, 7, 6, 7),
- );
- });
- it('can Trigzero() structure', () => {
- sameFirst(
- slowcat(sequence(1, 2, 3, 4), 5, sequence(6, 7, 8, 9), 10).keepTrigzero(20, 30).early(2),
- sequence(1, 2, 1, 2),
- );
- });
- it('can Squeeze() structure', () => {
- sameFirst(
- sequence(1, [2, 3]).keepSqueeze(sequence(10, 20, 30)),
- sequence(
- [1, 1, 1],
- [
- [2, 2, 2],
- [3, 3, 3],
- ],
- ),
- );
- });
- it('can SqueezeOut() structure', () => {
- sameFirst(sequence(1, [2, 3]).keepSqueezeOut(10, 20, 30), sequence([1, [2, 3]], [1, [2, 3]], [1, [2, 3]]));
- });
- });
- describe('keepif()', () => {
- it('can structure In()', () => {
- sameFirst(sequence(3, 4).keepif(true, false), sequence(3, silence));
- sameFirst(sequence(3, 4).keepifIn(true, false), sequence(3, silence));
- });
- it('can structure Out()', () => {
- sameFirst(pure(1).keepifOut(true, false), sequence(1, silence));
- });
- it('can Mix() structure', () => {
- expect(sequence(1, 2).keepifMix(false, true, false).firstCycle()).toStrictEqual([
- new Hap(ts(1 / 3, 1 / 2), ts(1 / 3, 1 / 2), 1),
- new Hap(ts(1 / 2, 2 / 3), ts(1 / 2, 2 / 3), 2),
- ]);
- });
- it('can Trig() structure', () => {
- sameFirst(
- slowcat(sequence(1, 2, 3, 4), 5, sequence(6, 7, 8, 9), 10).keepifTrig(false, true).early(2),
- sequence(silence, silence, 6, 7),
- );
- });
- it('can Trigzero() structure', () => {
- sameFirst(
- slowcat(sequence(1, 2, 3, 4), 5, sequence(6, 7, 8, 9), 10).keepifTrigzero(false, true).early(2),
- sequence(silence, silence, 1, 2),
- );
- });
- it('can Squeeze() structure', () => {
- sameFirst(
- sequence(1, [2, 3]).keepifSqueeze(sequence(true, true, false)),
- sequence(
- [1, 1, silence],
- [
- [2, 2, silence],
- [3, 3, silence],
- ],
- ),
- );
- });
- it('can SqueezeOut() structure', () => {
- sameFirst(sequence(1, [2, 3]).keepifSqueezeOut(true, true, false), sequence([1, [2, 3]], [1, [2, 3]], silence));
- });
- });
- describe('sub()', () => {
- it('Can subtract things', () => {
- expect(pure(3).sub(pure(4)).query(st(0, 1))[0].value).toBe(-1);
- });
- });
- describe('mul()', () => {
- it('Can multiply things', () => {
- expect(pure(3).mul(pure(2)).firstCycle()[0].value).toBe(6);
- });
- });
- describe('div()', () => {
- it('Can divide things', () => {
- expect(pure(3).div(pure(2)).firstCycle()[0].value).toBe(1.5);
- });
- });
- describe('set()', () => {
- it('Can set things in objects', () => {
- expect(
- pure({ a: 4, b: 6 })
- .set(pure({ c: 7 }))
- .firstCycle()[0].value,
- ).toStrictEqual({
- a: 4,
- b: 6,
- c: 7,
- });
-
- sameFirst(
- sequence({ a: 1, b: 2 }, { a: 2, b: 2 }, { a: 3, b: 2 }).set({ a: 4, c: 5 }),
- sequence({ a: 4, b: 2, c: 5 }).fast(3),
- );
- });
- it('Can set things with plain values', () => {
- sameFirst(sequence(1, 2, 3).set(4), sequence(4).fast(3));
- });
- describe('setOut()', () => {
- it('Can set things with structure from second pattern', () => {
- sameFirst(sequence(1, 2).setOut(4), pure(4).mask(true, true));
- });
- });
- describe('setSqueeze()', () => {
- it('Can squeeze one pattern inside the haps of another', () => {
- sameFirst(
- sequence(1, [2, 3]).setSqueeze(sequence('a', 'b', 'c')),
- sequence(
- ['a', 'b', 'c'],
- [
- ['a', 'b', 'c'],
- ['a', 'b', 'c'],
- ],
- ),
- );
- sameFirst(
- sequence(1, [2, 3]).setSqueeze('a', 'b', 'c'),
- sequence(
- ['a', 'b', 'c'],
- [
- ['a', 'b', 'c'],
- ['a', 'b', 'c'],
- ],
- ),
- );
- });
- });
- });
- describe('stack()', () => {
- it('Can stack things', () => {
- expect(
- stack(pure('a'), pure('b'), pure('c'))
- .firstCycle()
- .map((h) => h.value),
- ).toStrictEqual(['a', 'b', 'c']);
- });
- it('Can stack subpatterns', () => {
- sameFirst(stack('a', ['b', 'c']), stack('a', sequence('b', 'c')));
- });
- });
- describe('_fast()', () => {
- it('Makes things faster', () => {
- expect(pure('a')._fast(2).firstCycle().length).toBe(2);
- });
- });
- describe('_fastGap()', () => {
- it('Makes things faster, with a gap', () => {
- expect(sequence('a', 'b', 'c')._fastGap(2).firstCycle()).toStrictEqual(
- sequence(['a', 'b', 'c'], silence).firstCycle(),
- );
- expect(sequence('a', 'b', 'c')._fastGap(3).firstCycle()).toStrictEqual(
- sequence(['a', 'b', 'c'], silence, silence).firstCycle(),
- );
- });
- it('Makes things faster, with a gap, when speeded up further', () => {
- expect(sequence('a', 'b', 'c')._fastGap(2).fast(2).firstCycle()).toStrictEqual(
- sequence(['a', 'b', 'c'], silence, ['a', 'b', 'c'], silence).firstCycle(),
- );
- });
- });
- describe('_compressSpan()', () => {
- it('Can squash cycles of a pattern into a given timespan', () => {
- expect(pure('a')._compressSpan(ts(0.25, 0.5)).firstCycle()).toStrictEqual(
- sequence(silence, 'a', silence, silence).firstCycle(),
- );
- });
- });
- describe('fast()', () => {
- it('Makes things faster', () => {
- expect(pure('a').fast(2).firstCycle().length).toBe(2);
- });
- it('Makes things faster, with a pattern of factors', () => {
- expect(pure('a').fast(sequence(1, 4)).firstCycle().length).toBe(3);
- expect(pure('a').fast(sequence(1, 4)).firstCycle()).toStrictEqual(
- stack(pure('a').fast(sequence(1, silence)), sequence(silence, ['a', 'a'])).firstCycle(),
- );
- });
- it('defaults to accepting sequences', () => {
- expect(sequence(1, 2, 3).fast(sequence(1.5, 2)).firstCycle()).toStrictEqual(
- sequence(1, 2, 3).fast(1.5, 2).firstCycle(),
- );
- });
- it('works as a static function', () => {
- expect(sequence(1, 2, 3).fast(1, 2).firstCycle()).toStrictEqual(
- fast(sequence(1, 2), sequence(1, 2, 3)).firstCycle(),
- );
- });
- it('works as a curried static function', () => {
- expect(sequence(1, 2, 3).fast(1, 2).firstCycle()).toStrictEqual(
- fast(sequence(1, 2))(sequence(1, 2, 3)).firstCycle(),
- );
- });
- });
-
- describe('_slow()', () => {
- it('Makes things slower', () => {
- expect(pure('a')._slow(2).firstCycle()[0]).toStrictEqual(hap(ts(0, 2), ts(0, 1), 'a'));
-
- const pat = sequence(pure('c3'), pure('eb3')._slow(2)); // => try mini('c3 eb3/2') in repl
-
- expect(pat.query(st(0, 1))[1]).toStrictEqual(hap(ts(0.5, 1.5), ts(1 / 2, 1), 'eb3'));
-
- // the following test fails
- // assert.deepStrictEqual(
- // pat.query(ts(1,2))[1], undefined
- // )
- // expecting [c3 eb3] [c3 ~]
- // what happens [c3 eb3] [c3 eb3]
- // notable examples:
- // mini('[c3 g3]/2 eb3') always plays [c3 eb3]
- // mini('eb3 [c3 g3]/2 ') always plays [c3 g3]
- });
- });
- describe('inside', () => {
- it('can rev inside a cycle', () => {
- sameFirst(sequence('a', 'b', 'c', 'd').inside(2, rev), sequence('b', 'a', 'd', 'c'));
- });
- });
- describe('outside', () => {
- it('can rev outside a cycle', () => {
- sameFirst(sequence('a', 'b', 'c', 'd')._slow(2).outside(2, rev), sequence('d', 'c'));
- });
- });
- describe('_filterValues()', () => {
- it('Filters true', () => {
- expect(
- pure(true)
- ._filterValues((x) => x)
- .firstCycle().length,
- ).toBe(1);
- });
- });
- describe('when()', () => {
- it('Always faster', () => {
- expect(
- pure('a')
- .when(pure(true), (x) => x._fast(2))
- .firstCycle().length,
- ).toBe(2);
- });
- it('Never faster', () => {
- expect(
- pure('a')
- .when(pure(false), (x) => x._fast(2))
- .firstCycle().length,
- ).toBe(1);
- });
- it('Can alternate', () => {
- expect(
- pure(10)
- .when(slowcat(true, false), (x) => x.add(3))
- .fast(4)
- ._sortHapsByPart()
- .firstCycle(),
- ).toStrictEqual(fastcat(13, 10, 13, 10).firstCycle());
- });
- });
- describe('fastcat()', () => {
- it('Can concatenate two things', () => {
- expect(
- fastcat(pure('a'), pure('b'))
- .firstCycle()
- .map((x) => x.value),
- ).toStrictEqual(['a', 'b']);
- });
- });
- describe('fastcat()', () => {
- it('Can go into negative time', () => {
- sameFirst(fastcat('a', 'b', 'c').late(1000000), fastcat('a', 'b', 'c'));
- });
- });
- describe('slowcat()', () => {
- it('Can concatenate things slowly', () => {
- expect(
- slowcat('a', 'b')
- .firstCycle()
- .map((x) => x.value),
- ).toStrictEqual(['a']);
-
- expect(
- slowcat('a', 'b')
- ._early(1)
- .firstCycle()
- .map((x) => x.value),
- ).toStrictEqual(['b']);
-
- expect(
- slowcat('a', slowcat('b', 'c'))
- ._early(1)
- .firstCycle()
- .map((x) => x.value),
- ).toStrictEqual(['b']);
-
- expect(
- slowcat('a', slowcat('b', 'c'))
- ._early(3)
- .firstCycle()
- .map((x) => x.value),
- ).toStrictEqual(['c']);
- });
- it('Can cat subpatterns', () => {
- sameFirst(slowcat('a', ['b', 'c']).fast(4), sequence('a', ['b', 'c']).fast(2));
- });
- });
- describe('rev()', () => {
- it('Can reverse things', () => {
- expect(
- fastcat('a', 'b', 'c')
- .rev()
- .firstCycle()
- .sort((a, b) => a.part.begin.sub(b.part.begin))
- .map((a) => a.value),
- ).toStrictEqual(['c', 'b', 'a']);
- });
- });
- describe('sequence()', () => {
- it('Can work like fastcat', () => {
- expect(sequence(1, 2, 3).firstCycle()).toStrictEqual(fastcat(1, 2, 3).firstCycle());
- });
- });
- describe('polyrhythm()', () => {
- it('Can layer up cycles', () => {
- expect(polyrhythm(['a', 'b'], ['c']).firstCycle()).toStrictEqual(
- stack(fastcat(pure('a'), pure('b')), pure('c')).firstCycle(),
- );
- });
- });
- describe('polymeter()', () => {
- it('Can layer up cycles, stepwise', () => {
- expect(polymeterSteps(3, ['d', 'e']).firstCycle()).toStrictEqual(
- fastcat(pure('d'), pure('e'), pure('d')).firstCycle(),
- );
-
- expect(polymeter(['a', 'b', 'c'], ['d', 'e']).fast(2).firstCycle()).toStrictEqual(
- stack(sequence('a', 'b', 'c', 'a', 'b', 'c'), sequence('d', 'e', 'd', 'e', 'd', 'e')).firstCycle(),
- );
- });
- });
-
- describe('every()', () => {
- it('Can apply a function every 3rd time', () => {
- expect(
- pure('a')
- .every(3, (x) => x._fast(2))
- ._fast(3)
- .firstCycle(),
- ).toStrictEqual(sequence(sequence('a', 'a'), 'a', 'a').firstCycle());
- });
- it('works with currying', () => {
- expect(pure('a').every(3, fast(2))._fast(3).firstCycle()).toStrictEqual(
- sequence(sequence('a', 'a'), 'a', 'a').firstCycle(),
- );
- expect(sequence(3, 4, 5).every(3, add(3)).fast(5).firstCycle()).toStrictEqual(
- sequence(6, 7, 8, 3, 4, 5, 3, 4, 5, 6, 7, 8, 3, 4, 5).firstCycle(),
- );
- expect(sequence(3, 4, 5).every(2, sub(1)).fast(5).firstCycle()).toStrictEqual(
- sequence(2, 3, 4, 3, 4, 5, 2, 3, 4, 3, 4, 5, 2, 3, 4).firstCycle(),
- );
- expect(sequence(3, 4, 5).every(3, add(3)).every(2, sub(1)).fast(2).firstCycle()).toStrictEqual(
- sequence(5, 6, 7, 3, 4, 5).firstCycle(),
- );
- });
- });
- describe('brak()', () => {
- it('Can make something a bit breakbeaty', () => {
- sameFirst(sequence('a', 'b').brak()._fast(2), sequence('a', 'b', fastcat(silence, 'a'), fastcat('b', silence)));
- });
- });
- describe('timeCat()', () => {
- it('Can concatenate patterns with different relative durations', () => {
- expect(sequence('a', ['a', 'a']).firstCycle()).toStrictEqual(
- timeCat([1, 'a'], [0.5, 'a'], [0.5, 'a']).firstCycle(),
- );
- });
- });
- describe('struct()', () => {
- it('Can restructure a discrete pattern', () => {
- expect(sequence('a', 'b').struct(sequence(true, true, true)).firstCycle()).toStrictEqual([
- hap(ts(0, third), ts(0, third), 'a'),
- hap(ts(third, twothirds), ts(third, 0.5), 'a'),
- hap(ts(third, twothirds), ts(0.5, twothirds), 'b'),
- hap(ts(twothirds, 1), ts(twothirds, 1), 'b'),
- ]);
-
- expect(
- pure('a')
- .struct(sequence(true, [true, false], true))
- .firstCycle(),
- ).toStrictEqual(sequence('a', ['a', silence], 'a').firstCycle());
-
- expect(
- pure('a')
- .struct(sequence(true, [true, false], true).invert())
- .firstCycle(),
- ).toStrictEqual(sequence(silence, [silence, 'a'], silence).firstCycle());
-
- expect(
- pure('a')
- .struct(sequence(true, [true, silence], true))
- .firstCycle(),
- ).toStrictEqual(sequence('a', ['a', silence], 'a').firstCycle());
- });
- it('Can structure a continuous pattern', () => {
- expect(steady('a').struct(true, [true, true]).firstCycle()).toStrictEqual(sequence('a', ['a', 'a']).firstCycle());
- });
- });
- describe('mask()', () => {
- it('Can fragment a pattern', () => {
- expect(sequence('a', 'b').mask(sequence(true, true, true)).firstCycle()).toStrictEqual([
- hap(ts(0, 0.5), ts(0, third), 'a'),
- hap(ts(0, 0.5), ts(third, 0.5), 'a'),
- hap(ts(0.5, 1), ts(0.5, twothirds), 'b'),
- hap(ts(0.5, 1), ts(twothirds, 1), 'b'),
- ]);
- });
- it('Can mask off parts of a pattern', () => {
- expect(sequence(['a', 'b'], 'c').mask(sequence(true, false)).firstCycle()).toStrictEqual(
- sequence(['a', 'b'], silence).firstCycle(),
- );
-
- expect(sequence('a').mask(sequence(true, false)).firstCycle()).toStrictEqual([hap(ts(0, 1), ts(0, 0.5), 'a')]);
- });
- });
- describe('invert()', () => {
- it('Can invert a binary pattern', () => {
- expect(sequence(true, false, [true, false]).invert().firstCycle()).toStrictEqual(
- sequence(false, true, [false, true]).firstCycle(),
- );
- });
- });
- describe('signal()', () => {
- it('Can make saw/saw2', () => {
- expect(saw.struct(true, true, true, true).firstCycle()).toStrictEqual(
- sequence(1 / 8, 3 / 8, 5 / 8, 7 / 8).firstCycle(),
- );
-
- expect(saw2.struct(true, true, true, true).firstCycle()).toStrictEqual(
- sequence(-3 / 4, -1 / 4, 1 / 4, 3 / 4).firstCycle(),
- );
- });
- it('Can make isaw/isaw2', () => {
- expect(isaw.struct(true, true, true, true).firstCycle()).toStrictEqual(
- sequence(7 / 8, 5 / 8, 3 / 8, 1 / 8).firstCycle(),
- );
-
- expect(isaw2.struct(true, true, true, true).firstCycle()).toStrictEqual(
- sequence(3 / 4, 1 / 4, -1 / 4, -3 / 4).firstCycle(),
- );
- });
- });
- describe('_setContext()', () => {
- it('Can set the hap context', () => {
- expect(
- pure('a')
- ._setContext([
- [
- [0, 1],
- [1, 2],
- ],
- ])
- .firstCycle(true),
- ).toStrictEqual([
- hap(ts(0, 1), ts(0, 1), 'a', [
- [
- [0, 1],
- [1, 2],
- ],
- ]),
- ]);
- });
- });
- describe('_withContext()', () => {
- it('Can update the hap context', () => {
- expect(
- pure('a')
- ._setContext([
- [
- [0, 1],
- [1, 2],
- ],
- ])
- ._withContext((c) => [
- ...c,
- [
- [3, 4],
- [3, 4],
- ],
- ])
- .firstCycle(true),
- ).toStrictEqual([
- hap(ts(0, 1), ts(0, 1), 'a', [
- [
- [0, 1],
- [1, 2],
- ],
- [
- [3, 4],
- [3, 4],
- ],
- ]),
- ]);
- });
- });
- describe('apply', () => {
- it('Can apply a function', () => {
- expect(sequence('a', 'b')._apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle());
- }),
- it('Can apply a pattern of functions', () => {
- expect(sequence('a', 'b').apply(fast(2)).firstCycle()).toStrictEqual(sequence('a', 'b').fast(2).firstCycle());
- expect(sequence('a', 'b').apply(fast(2), fast(3)).firstCycle()).toStrictEqual(
- sequence('a', 'b').fast(2, 3).firstCycle(),
- );
- });
- });
- describe('layer', () => {
- it('Can layer up multiple functions', () => {
- expect(
- sequence(1, 2, 3)
- .layer(fast(2), (pat) => pat.add(3, 4))
- .firstCycle(),
- ).toStrictEqual(stack(sequence(1, 2, 3).fast(2), sequence(1, 2, 3).add(3, 4)).firstCycle());
- });
- });
- describe('early', () => {
- it('Can shift a hap earlier', () => {
- expect(pure(30)._late(0.25).query(st(1, 2))).toStrictEqual([
- hap(ts(1 / 4, 5 / 4), ts(1, 5 / 4), 30),
- hap(ts(5 / 4, 9 / 4), ts(5 / 4, 2), 30),
- ]);
- });
- it('Can shift a hap earlier, into negative time', () => {
- expect(pure(30)._late(0.25).query(st(0, 1))).toStrictEqual([
- hap(ts(-3 / 4, 1 / 4), ts(0, 1 / 4), 30),
- hap(ts(1 / 4, 5 / 4), ts(1 / 4, 1), 30),
- ]);
- });
- });
- describe('off', () => {
- it('Can offset a transformed pattern from the original', () => {
- expect(pure(30).off(0.25, add(2)).firstCycle()).toStrictEqual(
- stack(pure(30), pure(30).late(0.25).add(2)).firstCycle(),
- );
- });
- });
- describe('jux', () => {
- it('Can juxtapose', () => {
- expect(pure({ a: 1 }).jux(fast(2))._sortHapsByPart().firstCycle()).toStrictEqual(
- stack(pure({ a: 1, pan: 0 }), pure({ a: 1, pan: 1 }).fast(2))
- ._sortHapsByPart()
- .firstCycle(),
- );
- });
- });
- describe('juxBy', () => {
- it('Can juxtapose by half', () => {
- expect(pure({ a: 1 }).juxBy(0.5, fast(2))._sortHapsByPart().firstCycle()).toStrictEqual(
- stack(pure({ a: 1, pan: 0.25 }), pure({ a: 1, pan: 0.75 }).fast(2))
- ._sortHapsByPart()
- .firstCycle(),
- );
- });
- });
- describe('_squeezeJoin', () => {
- it('Can squeeze', () => {
- expect(
- sequence('a', ['a', 'a'])
- .fmap((a) => fastcat('b', 'c'))
- ._squeezeJoin()
- .firstCycle(),
- ).toStrictEqual(
- sequence(
- ['b', 'c'],
- [
- ['b', 'c'],
- ['b', 'c'],
- ],
- ).firstCycle(),
- );
- });
- });
- describe('ply', () => {
- it('Can ply(3)', () => {
- expect(sequence('a', ['b', 'c']).ply(3).firstCycle()).toStrictEqual(
- sequence(pure('a').fast(3), [pure('b').fast(3), pure('c').fast(3)]).firstCycle(),
- );
- });
- it('Doesnt drop haps in the 9th cycle', () => {
- // fixed with https://github.com/tidalcycles/strudel/commit/72eeaf446e3d5e186d63cc0d2276f0723cde017a
- expect(sequence(1, 2, 3).ply(2).early(8).firstCycle().length).toBe(6);
- });
- });
- describe('striate', () => {
- it('Can striate(2)', () => {
- sameFirst(
- sequence({ sound: 'a' }).striate(2),
- sequence({ sound: 'a', begin: 0, end: 0.5 }, { sound: 'a', begin: 0.5, end: 1 }),
- );
- });
- });
- describe('chop', () => {
- it('Can _chop(2)', () => {
- expect(sequence({ sound: 'a' }, { sound: 'b' })._chop(2).firstCycle()).toStrictEqual(
- sequence(
- { sound: 'a', begin: 0, end: 0.5 },
- { sound: 'a', begin: 0.5, end: 1 },
- { sound: 'b', begin: 0, end: 0.5 },
- { sound: 'b', begin: 0.5, end: 1 },
- ).firstCycle(),
- );
- });
- it('Can chop(2,3)', () => {
- expect(pure({ sound: 'a' }).fast(2).chop(2, 3)._sortHapsByPart().firstCycle()).toStrictEqual(
- sequence(
- [
- { sound: 'a', begin: 0, end: 0.5 },
- { sound: 'a', begin: 0.5, end: 1 },
- ],
- [
- { sound: 'a', begin: 0, end: 1 / 3 },
- { sound: 'a', begin: 1 / 3, end: 2 / 3 },
- { sound: 'a', begin: 2 / 3, end: 1 },
- ],
- )
- ._sortHapsByPart()
- .firstCycle(),
- );
- });
- });
- describe('range2', () => {
- it('Can change the range of a bipolar pattern', () => {
- expect(sequence(-1, -0.5, 0, 0.5).range2(1000, 1100).firstCycle()).toStrictEqual(
- sequence(1000, 1025, 1050, 1075).firstCycle(),
- );
- });
- });
- describe('linger', () => {
- it('Can linger on the first quarter of a cycle', () => {
- expect(sequence(0, 1, 2, 3, 4, 5, 6, 7).linger(0.25).firstCycle()).toStrictEqual(
- sequence(0, 1, 0, 1, 0, 1, 0, 1).firstCycle(),
- );
- });
- });
-});
diff --git a/packages/core/vitest/util.test.mjs b/packages/core/vitest/util.test.mjs
deleted file mode 100644
index 961ce764..00000000
--- a/packages/core/vitest/util.test.mjs
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
-util.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { pure } from '../pattern.mjs';
-import { isNote, tokenizeNote, toMidi, fromMidi, mod, compose, getFrequency } from '../util.mjs';
-import { describe, it, expect } from 'vitest';
-
-describe('isNote', () => {
- it('should recognize notes without accidentals', () => {
- 'C3 D3 E3 F3 G3 A3 B3 C4 D5 c5 d5 e5'.split(' ').forEach((note) => {
- expect(isNote(note)).toBe(true);
- });
- });
- it('should recognize notes with accidentals', () => {
- 'C#3 D##3 Eb3 Fbb3 Bb5'.split(' ').forEach((note) => {
- expect(isNote(note)).toBe(true);
- });
- });
- it('should not recognize invalid notes', () => {
- expect(isNote('H5')).toBe(false);
- expect(isNote('C')).toBe(false);
- expect(isNote('X')).toBe(false);
- expect(isNote(1)).toBe(false);
- });
-});
-
-describe('isNote', () => {
- it('should tokenize notes without accidentals', () => {
- expect(tokenizeNote('C3')).toStrictEqual(['C', '', 3]);
- expect(tokenizeNote('D3')).toStrictEqual(['D', '', 3]);
- expect(tokenizeNote('E3')).toStrictEqual(['E', '', 3]);
- expect(tokenizeNote('F3')).toStrictEqual(['F', '', 3]);
- expect(tokenizeNote('G3')).toStrictEqual(['G', '', 3]);
- expect(tokenizeNote('A3')).toStrictEqual(['A', '', 3]);
- expect(tokenizeNote('B3')).toStrictEqual(['B', '', 3]);
- expect(tokenizeNote('C4')).toStrictEqual(['C', '', 4]);
- expect(tokenizeNote('D5')).toStrictEqual(['D', '', 5]);
- });
- it('should tokenize notes with accidentals', () => {
- expect(tokenizeNote('C#3')).toStrictEqual(['C', '#', 3]);
- expect(tokenizeNote('D##3')).toStrictEqual(['D', '##', 3]);
- expect(tokenizeNote('Eb3')).toStrictEqual(['E', 'b', 3]);
- expect(tokenizeNote('Fbb3')).toStrictEqual(['F', 'bb', 3]);
- expect(tokenizeNote('Bb5')).toStrictEqual(['B', 'b', 5]);
- });
- it('should tokenize notes without octave', () => {
- expect(tokenizeNote('C')).toStrictEqual(['C', '', undefined]);
- expect(tokenizeNote('C#')).toStrictEqual(['C', '#', undefined]);
- expect(tokenizeNote('Bb')).toStrictEqual(['B', 'b', undefined]);
- expect(tokenizeNote('Bbb')).toStrictEqual(['B', 'bb', undefined]);
- });
- it('should not tokenize invalid notes', () => {
- expect(tokenizeNote('X')).toStrictEqual([]);
- expect(tokenizeNote('asfasf')).toStrictEqual([]);
- expect(tokenizeNote(123)).toStrictEqual([]);
- });
-});
-describe('toMidi', () => {
- it('should turn notes into midi', () => {
- expect(toMidi('A4')).toEqual(69);
- expect(toMidi('C4')).toEqual(60);
- expect(toMidi('Db4')).toEqual(61);
- expect(toMidi('C3')).toEqual(48);
- expect(toMidi('Cb3')).toEqual(47);
- expect(toMidi('Cbb3')).toEqual(46);
- expect(toMidi('C#3')).toEqual(49);
- expect(toMidi('C#3')).toEqual(49);
- expect(toMidi('C##3')).toEqual(50);
- });
-});
-describe('fromMidi', () => {
- it('should turn midi into frequency', () => {
- expect(fromMidi(69)).toEqual(440);
- expect(fromMidi(57)).toEqual(220);
- });
-});
-describe('getFrequency', () => {
- it('should turn midi into frequency', () => {
- const happify = (val, context = {}) => pure(val).firstCycle()[0].setContext(context);
- expect(getFrequency(happify('a4'))).toEqual(440);
- expect(getFrequency(happify('a3'))).toEqual(220);
- expect(getFrequency(happify(440, { type: 'frequency' }))).toEqual(440); // TODO: migrate when values are objects..
- expect(getFrequency(happify(432, { type: 'frequency' }))).toEqual(432);
- });
-});
-
-describe('mod', () => {
- it('should work like regular modulo with positive numbers', () => {
- expect(mod(0, 3)).toEqual(0);
- expect(mod(1, 3)).toEqual(1);
- expect(mod(2, 3)).toEqual(2);
- expect(mod(3, 3)).toEqual(0);
- expect(mod(4, 3)).toEqual(1);
- expect(mod(4, 2)).toEqual(0);
- });
- it('should work with negative numbers', () => {
- expect(mod(-1, 3)).toEqual(2);
- expect(mod(-2, 3)).toEqual(1);
- expect(mod(-3, 3)).toEqual(0);
- expect(mod(-4, 3)).toEqual(2);
- expect(mod(-5, 3)).toEqual(1);
- expect(mod(-3, 2)).toEqual(1);
- });
-});
-
-describe('compose', () => {
- const add1 = (a) => a + 1;
- it('should compose', () => {
- expect(compose(add1, add1)(0)).toEqual(2);
- expect(compose(add1)(0)).toEqual(1);
- });
- const addS = (s) => (a) => a + s;
- it('should compose left to right', () => {
- expect(compose(addS('a'), addS('b'))('')).toEqual('ab');
- expect(compose(addS('a'), addS('b'))('x')).toEqual('xab');
- });
-});
diff --git a/packages/core/vitest/value.test.mjs b/packages/core/vitest/value.test.mjs
deleted file mode 100644
index ae227e17..00000000
--- a/packages/core/vitest/value.test.mjs
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-value.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { describe, it, expect } from 'vitest';
-import { map, valued, mul } from '../value.mjs';
-
-describe('Value', () => {
- it('unionWith', () => {
- const { value } = valued({ freq: 2000, distortion: 1.2 }).unionWith({ distortion: 2 }, mul);
- expect(value).toStrictEqual({ freq: 2000, distortion: 2.4 });
- });
-
- it('experiments', () => {
- expect(map(mul(5), valued(3)).value).toEqual(15);
- expect(map(mul(null), valued(3)).value).toEqual(0);
- expect(map(mul(3), valued(null)).value).toEqual(null);
- expect(valued(3).map(mul).ap(3).value).toEqual(9);
- expect(valued(mul).ap(3).ap(3).value).toEqual(9);
- expect(valued(3).mul(3).value).toEqual(9);
- });
-});
diff --git a/packages/eval/evaluate.mjs b/packages/eval/evaluate.mjs
index b5cb851b..3db93b6d 100644
--- a/packages/eval/evaluate.mjs
+++ b/packages/eval/evaluate.mjs
@@ -11,7 +11,6 @@ const { isPattern, Pattern } = strudel;
export const extend = (...args) => {
console.warn('@strudel.cycles/eval extend is deprecated, please use evalScope instead');
- console.log('extend', args);
Object.assign(globalThis, ...args);
};
diff --git a/packages/eval/test/evaluate.test.mjs b/packages/eval/test/evaluate.test.mjs
index b8c4d2f2..c0853045 100644
--- a/packages/eval/test/evaluate.test.mjs
+++ b/packages/eval/test/evaluate.test.mjs
@@ -4,31 +4,34 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
-import { evaluate, extend } from '../evaluate.mjs';
+import { describe, it, expect } from 'vitest';
+
+import { evaluate, extend, evalScope } from '../evaluate.mjs';
import { mini } from '@strudel.cycles/mini';
import * as strudel from '@strudel.cycles/core';
+const { fastcat, cat, slowcat, reify } = strudel;
-const { fastcat } = strudel;
-
-extend({ mini }, strudel);
+extend({ mini, cat, fastcat, slowcat, reify });
+// Object.assign(globalThis, strudel);
+// extend({ mini }, s); // TODO: this is not working
// TODO: test evalScope
+// evalScope({ mini }, strudel);
describe('evaluate', () => {
const ev = async (code) => (await evaluate(code)).pattern._firstCycleValues;
it('Should evaluate strudel functions', async () => {
- assert.deepStrictEqual(await ev("pure('c3')"), ['c3']);
- assert.deepStrictEqual(await ev('cat(c3)'), ['c3']);
- assert.deepStrictEqual(await ev('fastcat(c3, d3)'), ['c3', 'd3']);
- assert.deepStrictEqual(await ev('slowcat(c3, d3)'), ['c3']);
+ expect(await ev('pure("c3")')).toEqual(['c3']);
+ expect(await ev('cat("c3")')).toEqual(['c3']);
+ expect(await ev('fastcat("c3", "d3")')).toEqual(['c3', 'd3']);
+ expect(await ev('slowcat("c3", "d3")')).toEqual(['c3']);
});
it('Should be extendable', async () => {
extend({ myFunction: (...x) => fastcat(...x) });
- assert.deepStrictEqual(await ev('myFunction(c3, d3)'), ['c3', 'd3']);
+ expect(await ev('myFunction("c3", "d3")')).toEqual(['c3', 'd3']);
});
it('Should evaluate simple double quoted mini notation', async () => {
- assert.deepStrictEqual(await ev('"c3"'), ['c3']);
- assert.deepStrictEqual(await ev('"c3 d3"'), ['c3', 'd3']);
- assert.deepStrictEqual(await ev('""'), ['c3']);
+ expect(await ev('"c3"')).toEqual(['c3']);
+ expect(await ev('"c3 d3"')).toEqual(['c3', 'd3']);
+ expect(await ev('""')).toEqual(['c3']);
});
});
diff --git a/packages/eval/test/shapeshifter.test.mjs b/packages/eval/test/shapeshifter.test.mjs
index 45633e8a..39d9d715 100644
--- a/packages/eval/test/shapeshifter.test.mjs
+++ b/packages/eval/test/shapeshifter.test.mjs
@@ -4,16 +4,15 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
+import { describe, it, expect } from 'vitest';
import shapeshifter from '../shapeshifter.mjs';
describe('shapeshifter', () => {
it('Should shift simple double quote string', () => {
- assert.equal(shapeshifter('"c3"'), '(async()=>{return mini("c3").withMiniLocation([1,0,15],[1,4,19])})()');
+ expect(shapeshifter('"c3"')).toEqual('(async()=>{return mini("c3").withMiniLocation([1,0,15],[1,4,19])})()');
});
it('Should handle dynamic imports', () => {
- assert.equal(
- shapeshifter('const { default: foo } = await import(\'https://bar.com/foo.js\');"c3"'),
+ expect(shapeshifter('const { default: foo } = await import(\'https://bar.com/foo.js\');"c3"')).toEqual(
'(async()=>{const{default:foo}=await import("https://bar.com/foo.js");return mini("c3").withMiniLocation([1,64,79],[1,68,83])})()',
);
});
diff --git a/packages/eval/vitest/evaluate.test.mjs b/packages/eval/vitest/evaluate.test.mjs
deleted file mode 100644
index c192becd..00000000
--- a/packages/eval/vitest/evaluate.test.mjs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-evaluate.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { describe, it, expect } from 'vitest';
-
-import { evaluate, extend, evalScope } from '../evaluate.mjs';
-import { mini } from '@strudel.cycles/mini';
-import * as strudel from '@strudel.cycles/core';
-
-const { fastcat, cat, slowcat, reify } = strudel;
-
-extend({ mini, cat, fastcat, slowcat, reify });
-// extend({ mini }, strudel); // TODO: this is not working
-// TODO: test evalScope
-// evalScope({ mini }, strudel);
-
-describe('evaluate', () => {
- const ev = async (code) => (await evaluate(code)).pattern._firstCycleValues;
- it('Should evaluate strudel functions', async () => {
- expect(await ev('pure("c3")')).toEqual(['c3']);
- expect(await ev('cat("c3")')).toEqual(['c3']);
- expect(await ev('fastcat("c3", "d3")')).toEqual(['c3', 'd3']);
- expect(await ev('slowcat("c3", "d3")')).toEqual(['c3']);
- });
- it('Should be extendable', async () => {
- extend({ myFunction: (...x) => fastcat(...x) });
- expect(await ev('myFunction("c3", "d3")')).toEqual(['c3', 'd3']);
- });
- it('Should evaluate simple double quoted mini notation', async () => {
- expect(await ev('"c3"')).toEqual(['c3']);
- expect(await ev('"c3 d3"')).toEqual(['c3', 'd3']);
- expect(await ev('""')).toEqual(['c3']);
- });
-});
diff --git a/packages/eval/vitest/shapeshifter.test.mjs b/packages/eval/vitest/shapeshifter.test.mjs
deleted file mode 100644
index 39d9d715..00000000
--- a/packages/eval/vitest/shapeshifter.test.mjs
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-shapeshifter.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { describe, it, expect } from 'vitest';
-import shapeshifter from '../shapeshifter.mjs';
-
-describe('shapeshifter', () => {
- it('Should shift simple double quote string', () => {
- expect(shapeshifter('"c3"')).toEqual('(async()=>{return mini("c3").withMiniLocation([1,0,15],[1,4,19])})()');
- });
- it('Should handle dynamic imports', () => {
- expect(shapeshifter('const { default: foo } = await import(\'https://bar.com/foo.js\');"c3"')).toEqual(
- '(async()=>{const{default:foo}=await import("https://bar.com/foo.js");return mini("c3").withMiniLocation([1,64,79],[1,68,83])})()',
- );
- });
-});
diff --git a/packages/mini/test/mini.test.mjs b/packages/mini/test/mini.test.mjs
index baf34314..88de3cee 100644
--- a/packages/mini/test/mini.test.mjs
+++ b/packages/mini/test/mini.test.mjs
@@ -4,50 +4,50 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
import { mini } from '../mini.mjs';
import '@strudel.cycles/core/euclid.mjs';
+import { describe, it, expect } from 'vitest';
describe('mini', () => {
const minV = (v) => mini(v)._firstCycleValues;
const minS = (v) => mini(v)._showFirstCycle;
it('supports single elements', () => {
- assert.deepStrictEqual(minV('a'), ['a']);
+ expect(minV('a')).toEqual(['a']);
});
it('supports rest', () => {
- assert.deepStrictEqual(minV('~'), []);
+ expect(minV('~')).toEqual([]);
});
it('supports cat', () => {
- assert.deepStrictEqual(minS('a b'), ['a: 0 - 1/2', 'b: 1/2 - 1']);
- assert.deepStrictEqual(minS('a b c'), ['a: 0 - 1/3', 'b: 1/3 - 2/3', 'c: 2/3 - 1']);
+ expect(minS('a b')).toEqual(['a: 0 - 1/2', 'b: 1/2 - 1']);
+ expect(minS('a b c')).toEqual(['a: 0 - 1/3', 'b: 1/3 - 2/3', 'c: 2/3 - 1']);
});
it('supports slowcat', () => {
- assert.deepStrictEqual(minV(''), ['a']);
+ expect(minV('')).toEqual(['a']);
});
it('supports division', () => {
- assert.deepStrictEqual(minS('a/2'), ['a: 0 - 2']);
- assert.deepStrictEqual(minS('[c3 d3]/2'), ['c3: 0 - 1']);
+ expect(minS('a/2')).toEqual(['a: 0 - 2']);
+ expect(minS('[c3 d3]/2')).toEqual(['c3: 0 - 1']);
});
it('supports multiplication', () => {
- assert.deepStrictEqual(minS('c3*2'), ['c3: 0 - 1/2', 'c3: 1/2 - 1']);
- assert.deepStrictEqual(minV('[c3 d3]*2'), ['c3', 'd3', 'c3', 'd3']);
+ expect(minS('c3*2')).toEqual(['c3: 0 - 1/2', 'c3: 1/2 - 1']);
+ expect(minV('[c3 d3]*2')).toEqual(['c3', 'd3', 'c3', 'd3']);
});
it('supports brackets', () => {
- assert.deepStrictEqual(minS('c3 [d3 e3]'), ['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 1']);
- assert.deepStrictEqual(minS('c3 [d3 [e3 f3]]'), ['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 7/8', 'f3: 7/8 - 1']);
+ expect(minS('c3 [d3 e3]')).toEqual(['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 1']);
+ expect(minS('c3 [d3 [e3 f3]]')).toEqual(['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 7/8', 'f3: 7/8 - 1']);
});
it('supports commas', () => {
- assert.deepStrictEqual(minS('c3,e3,g3'), ['c3: 0 - 1', 'e3: 0 - 1', 'g3: 0 - 1']);
- assert.deepStrictEqual(minS('[c3,e3,g3] f3'), ['c3: 0 - 1/2', 'e3: 0 - 1/2', 'g3: 0 - 1/2', 'f3: 1/2 - 1']);
+ expect(minS('c3,e3,g3')).toEqual(['c3: 0 - 1', 'e3: 0 - 1', 'g3: 0 - 1']);
+ expect(minS('[c3,e3,g3] f3')).toEqual(['c3: 0 - 1/2', 'e3: 0 - 1/2', 'g3: 0 - 1/2', 'f3: 1/2 - 1']);
});
it('supports elongation', () => {
- assert.deepStrictEqual(minS('a@3 b'), ['a: 0 - 3/4', 'b: 3/4 - 1']);
- assert.deepStrictEqual(minS('a@2 b@3'), ['a: 0 - 2/5', 'b: 2/5 - 1']);
+ expect(minS('a@3 b')).toEqual(['a: 0 - 3/4', 'b: 3/4 - 1']);
+ expect(minS('a@2 b@3')).toEqual(['a: 0 - 2/5', 'b: 2/5 - 1']);
});
it('supports replication', () => {
- assert.deepStrictEqual(minS('a!3 b'), ['a: 0 - 1/4', 'a: 1/4 - 1/2', 'a: 1/2 - 3/4', 'b: 3/4 - 1']);
+ expect(minS('a!3 b')).toEqual(['a: 0 - 1/4', 'a: 1/4 - 1/2', 'a: 1/2 - 3/4', 'b: 3/4 - 1']);
});
it('supports euclidean rhythms', () => {
- assert.deepStrictEqual(minS('a(3, 8)'), ['a: 0 - 1/8', 'a: 3/8 - 1/2', 'a: 3/4 - 7/8']);
+ expect(minS('a(3, 8)')).toEqual(['a: 0 - 1/8', 'a: 3/8 - 1/2', 'a: 3/4 - 7/8']);
});
});
diff --git a/packages/mini/vitest/mini.test.mjs b/packages/mini/vitest/mini.test.mjs
deleted file mode 100644
index 88de3cee..00000000
--- a/packages/mini/vitest/mini.test.mjs
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-mini.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { mini } from '../mini.mjs';
-import '@strudel.cycles/core/euclid.mjs';
-import { describe, it, expect } from 'vitest';
-
-describe('mini', () => {
- const minV = (v) => mini(v)._firstCycleValues;
- const minS = (v) => mini(v)._showFirstCycle;
- it('supports single elements', () => {
- expect(minV('a')).toEqual(['a']);
- });
- it('supports rest', () => {
- expect(minV('~')).toEqual([]);
- });
- it('supports cat', () => {
- expect(minS('a b')).toEqual(['a: 0 - 1/2', 'b: 1/2 - 1']);
- expect(minS('a b c')).toEqual(['a: 0 - 1/3', 'b: 1/3 - 2/3', 'c: 2/3 - 1']);
- });
- it('supports slowcat', () => {
- expect(minV('')).toEqual(['a']);
- });
- it('supports division', () => {
- expect(minS('a/2')).toEqual(['a: 0 - 2']);
- expect(minS('[c3 d3]/2')).toEqual(['c3: 0 - 1']);
- });
- it('supports multiplication', () => {
- expect(minS('c3*2')).toEqual(['c3: 0 - 1/2', 'c3: 1/2 - 1']);
- expect(minV('[c3 d3]*2')).toEqual(['c3', 'd3', 'c3', 'd3']);
- });
- it('supports brackets', () => {
- expect(minS('c3 [d3 e3]')).toEqual(['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 1']);
- expect(minS('c3 [d3 [e3 f3]]')).toEqual(['c3: 0 - 1/2', 'd3: 1/2 - 3/4', 'e3: 3/4 - 7/8', 'f3: 7/8 - 1']);
- });
- it('supports commas', () => {
- expect(minS('c3,e3,g3')).toEqual(['c3: 0 - 1', 'e3: 0 - 1', 'g3: 0 - 1']);
- expect(minS('[c3,e3,g3] f3')).toEqual(['c3: 0 - 1/2', 'e3: 0 - 1/2', 'g3: 0 - 1/2', 'f3: 1/2 - 1']);
- });
- it('supports elongation', () => {
- expect(minS('a@3 b')).toEqual(['a: 0 - 3/4', 'b: 3/4 - 1']);
- expect(minS('a@2 b@3')).toEqual(['a: 0 - 2/5', 'b: 2/5 - 1']);
- });
- it('supports replication', () => {
- expect(minS('a!3 b')).toEqual(['a: 0 - 1/4', 'a: 1/4 - 1/2', 'a: 1/2 - 3/4', 'b: 3/4 - 1']);
- });
- it('supports euclidean rhythms', () => {
- expect(minS('a(3, 8)')).toEqual(['a: 0 - 1/8', 'a: 3/8 - 1/2', 'a: 3/4 - 7/8']);
- });
-});
diff --git a/packages/tonal/test/tonal.test.mjs b/packages/tonal/test/tonal.test.mjs
index 1cc0e08b..5c039477 100644
--- a/packages/tonal/test/tonal.test.mjs
+++ b/packages/tonal/test/tonal.test.mjs
@@ -4,12 +4,14 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
+// import { strict as assert } from 'assert';
+
import '../tonal.mjs'; // need to import this to add prototypes
import { pure } from '@strudel.cycles/core';
+import { describe, it, expect } from 'vitest';
describe('tonal', () => {
it('Should run tonal functions ', () => {
- assert.deepStrictEqual(pure('c3').scale('C major').scaleTranspose(1)._firstCycleValues, ['D3']);
+ expect(pure('c3').scale('C major').scaleTranspose(1)._firstCycleValues).toEqual(['D3']);
});
});
diff --git a/packages/tonal/vitest/tonal.test.mjs b/packages/tonal/vitest/tonal.test.mjs
deleted file mode 100644
index 5c039477..00000000
--- a/packages/tonal/vitest/tonal.test.mjs
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
-tonal.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-// import { strict as assert } from 'assert';
-
-import '../tonal.mjs'; // need to import this to add prototypes
-import { pure } from '@strudel.cycles/core';
-import { describe, it, expect } from 'vitest';
-
-describe('tonal', () => {
- it('Should run tonal functions ', () => {
- expect(pure('c3').scale('C major').scaleTranspose(1)._firstCycleValues).toEqual(['D3']);
- });
-});
diff --git a/packages/tone/test/tone.test.mjs b/packages/tone/test/tone.test.mjs
index ae01190c..aced9e9a 100644
--- a/packages/tone/test/tone.test.mjs
+++ b/packages/tone/test/tone.test.mjs
@@ -4,15 +4,15 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
import '../tone.mjs';
import { pure } from '@strudel.cycles/core';
-import Tone from 'tone';
+import { describe, it, expect } from 'vitest';
describe('tone', () => {
it('Should have working tone function', () => {
- const s = synth().chain(out());
- assert.deepStrictEqual(s, new Tone.Synth().chain(out()));
- assert.deepStrictEqual(pure('c3').tone(s)._firstCycleValues, ['c3']);
+ // const s = synth().chain(out()); // TODO: mock audio context?
+ // assert.deepStrictEqual(s, new Tone.Synth().chain(out()));
+ const s = {};
+ expect(pure('c3').tone(s)._firstCycleValues).toEqual(['c3']);
});
});
diff --git a/packages/tone/vitest/tone.test.mjs b/packages/tone/vitest/tone.test.mjs
deleted file mode 100644
index aced9e9a..00000000
--- a/packages/tone/vitest/tone.test.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-tone.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import '../tone.mjs';
-import { pure } from '@strudel.cycles/core';
-import { describe, it, expect } from 'vitest';
-
-describe('tone', () => {
- it('Should have working tone function', () => {
- // const s = synth().chain(out()); // TODO: mock audio context?
- // assert.deepStrictEqual(s, new Tone.Synth().chain(out()));
- const s = {};
- expect(pure('c3').tone(s)._firstCycleValues).toEqual(['c3']);
- });
-});
diff --git a/packages/xen/test/xen.test.mjs b/packages/xen/test/xen.test.mjs
index f2923a0f..977b0f69 100644
--- a/packages/xen/test/xen.test.mjs
+++ b/packages/xen/test/xen.test.mjs
@@ -4,11 +4,11 @@ Copyright (C) 2022 Strudel contributors - see .
*/
-import { strict as assert } from 'assert';
import { edo } from '../xen.mjs';
+import { describe, it, expect } from 'vitest';
describe('xen', () => {
it('edo', () => {
- assert.deepStrictEqual(edo('3edo'), [1, Math.pow(2, 1 / 3), Math.pow(2, 2 / 3)]);
+ expect(edo('3edo')).toEqual([1, Math.pow(2, 1 / 3), Math.pow(2, 2 / 3)]);
});
});
diff --git a/packages/xen/vitest/xen.test.mjs b/packages/xen/vitest/xen.test.mjs
deleted file mode 100644
index 977b0f69..00000000
--- a/packages/xen/vitest/xen.test.mjs
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
-xen.test.mjs -
-Copyright (C) 2022 Strudel contributors - see
-This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .
-*/
-
-import { edo } from '../xen.mjs';
-import { describe, it, expect } from 'vitest';
-
-describe('xen', () => {
- it('edo', () => {
- expect(edo('3edo')).toEqual([1, Math.pow(2, 1 / 3), Math.pow(2, 2 / 3)]);
- });
-});
diff --git a/repl/src/test/tunes.test.mjs b/repl/src/test/tunes.test.mjs
index 8c658414..c5291298 100644
--- a/repl/src/test/tunes.test.mjs
+++ b/repl/src/test/tunes.test.mjs
@@ -1,12 +1,13 @@
import { queryCode, testCycles } from '../runtime.mjs';
import * as snaps from '../tunes.snapshot.mjs';
import * as tunes from '../tunes.mjs';
-import { strict as assert } from 'assert';
-
+// import { strict as assert } from 'assert';
+import { describe, it, expect } from 'vitest';
async function testTune(key) {
// console.log('test tune', key);
const haps = await queryCode(tunes[key], testCycles[key] || 1);
- assert.deepStrictEqual(haps, snaps[key]);
+ // assert.deepStrictEqual(haps, snaps[key]);
+ expect(haps).toEqual(snaps[key]);
}
describe('renders tunes', () => {
diff --git a/vitest.config.ts b/vitest.config.ts
index ba80fc54..970fa897 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -2,6 +2,8 @@ import { configDefaults, defineConfig } from 'vitest/config';
export default defineConfig({
test: {
- exclude: [...configDefaults.exclude, 'packages/*/test/*', 'repl/src/test/*'],
+ exclude: [...configDefaults.exclude, 'repl/src/test/*'],
+ environment: 'happy-dom', // or 'jsdom', 'node' // https://vitest.dev/guide/features.html#chai-and-jest-expect-compatibility
+ // environment: 'happy-dom', // or 'jsdom', 'node' // https://vitest.dev/guide/features.html#chai-and-jest-expect-compatibility
},
});