/g' ./node_modules/snackbarjs/src/snackbar.js`;
+ }
+ },
stdout: false
}
},
diff --git a/README.md b/README.md
index 48811566..18e535ca 100755
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@
# CyberChef
[](https://github.com/gchq/CyberChef/actions?query=workflow%3A%22Master+Build%2C+Test+%26+Deploy%22)
-[](https://lgtm.com/projects/g/gchq/CyberChef/context:javascript)
[](https://www.npmjs.com/package/cyberchef)
[](https://github.com/gchq/CyberChef/blob/master/LICENSE)
[](https://gitter.im/gchq/CyberChef?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
diff --git a/nightwatch.json b/nightwatch.json
index 21836547..95359f44 100644
--- a/nightwatch.json
+++ b/nightwatch.json
@@ -1,5 +1,6 @@
{
"src_folders": ["tests/browser"],
+ "exclude": ["tests/browser/browserUtils.js"],
"output_folder": "tests/browser/output",
"test_settings": {
diff --git a/package-lock.json b/package-lock.json
index 716a7307..3b70990a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,17 @@
{
"name": "cyberchef",
- "version": "9.55.0",
+ "version": "10.2.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@ampproject/remapping": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
- "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
"dev": true,
"requires": {
- "@jridgewell/trace-mapping": "^0.3.0"
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
}
},
"@astronautlabs/amf": {
@@ -27,63 +28,95 @@
"integrity": "sha512-4X5cmrB5I5g/ifKXwoVc5JwAYgn372kS0AsTdVQYY+OzlSZ92ANEHj6W5MW5haYSQbbBZ9XK55rdy6NnXOyRgA=="
},
"@babel/code-frame": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
- "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
"requires": {
- "@babel/highlight": "^7.16.7"
+ "@babel/highlight": "^7.18.6"
}
},
"@babel/compat-data": {
- "version": "7.17.10",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz",
- "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
+ "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
"dev": true
},
"@babel/core": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz",
- "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz",
+ "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==",
"dev": true,
"requires": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.16.7",
- "@babel/generator": "^7.18.2",
- "@babel/helper-compilation-targets": "^7.18.2",
- "@babel/helper-module-transforms": "^7.18.0",
- "@babel/helpers": "^7.18.2",
- "@babel/parser": "^7.18.0",
- "@babel/template": "^7.16.7",
- "@babel/traverse": "^7.18.2",
- "@babel/types": "^7.18.2",
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.21.3",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.21.2",
+ "@babel/helpers": "^7.21.0",
+ "@babel/parser": "^7.21.3",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.3",
+ "@babel/types": "^7.21.3",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
+ "json5": "^2.2.2",
"semver": "^6.3.0"
}
},
"@babel/eslint-parser": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz",
- "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz",
+ "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==",
"dev": true,
"requires": {
- "eslint-scope": "^5.1.1",
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
"eslint-visitor-keys": "^2.1.0",
"semver": "^6.3.0"
}
},
"@babel/generator": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
- "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz",
+ "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==",
"requires": {
- "@babel/types": "^7.18.2",
- "@jridgewell/gen-mapping": "^0.3.0",
+ "@babel/types": "^7.21.3",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
},
"dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "requires": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ },
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+ }
+ }
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -92,71 +125,71 @@
}
},
"@babel/helper-annotate-as-pure": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
- "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+ "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.18.6"
}
},
"@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz",
- "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz",
+ "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==",
"dev": true,
"requires": {
- "@babel/helper-explode-assignable-expression": "^7.16.7",
- "@babel/types": "^7.16.7"
+ "@babel/helper-explode-assignable-expression": "^7.18.6",
+ "@babel/types": "^7.18.9"
}
},
"@babel/helper-compilation-targets": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz",
- "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.17.10",
- "@babel/helper-validator-option": "^7.16.7",
- "browserslist": "^4.20.2",
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
"semver": "^6.3.0"
}
},
"@babel/helper-create-class-features-plugin": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz",
- "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz",
+ "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.7",
- "@babel/helper-environment-visitor": "^7.16.7",
- "@babel/helper-function-name": "^7.17.9",
- "@babel/helper-member-expression-to-functions": "^7.17.7",
- "@babel/helper-optimise-call-expression": "^7.16.7",
- "@babel/helper-replace-supers": "^7.16.7",
- "@babel/helper-split-export-declaration": "^7.16.7"
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-member-expression-to-functions": "^7.21.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/helper-replace-supers": "^7.20.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/helper-split-export-declaration": "^7.18.6"
}
},
"@babel/helper-create-regexp-features-plugin": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz",
- "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz",
+ "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.7",
- "regexpu-core": "^5.0.1"
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "regexpu-core": "^5.3.1"
}
},
"@babel/helper-define-polyfill-provider": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz",
- "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz",
+ "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==",
"dev": true,
"requires": {
- "@babel/helper-compilation-targets": "^7.13.0",
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/traverse": "^7.13.0",
+ "@babel/helper-compilation-targets": "^7.17.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
"debug": "^4.1.1",
"lodash.debounce": "^4.0.8",
"resolve": "^1.14.2",
@@ -164,360 +197,368 @@
}
},
"@babel/helper-environment-visitor": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz",
- "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ=="
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg=="
},
"@babel/helper-explode-assignable-expression": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz",
- "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz",
+ "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.18.6"
}
},
"@babel/helper-function-name": {
- "version": "7.17.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
- "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+ "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"requires": {
- "@babel/template": "^7.16.7",
- "@babel/types": "^7.17.0"
+ "@babel/template": "^7.20.7",
+ "@babel/types": "^7.21.0"
}
},
"@babel/helper-hoist-variables": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
- "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
"requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.18.6"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.17.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz",
- "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz",
+ "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==",
"dev": true,
"requires": {
- "@babel/types": "^7.17.0"
+ "@babel/types": "^7.21.0"
}
},
"@babel/helper-module-imports": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
- "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.18.6"
}
},
"@babel/helper-module-transforms": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
- "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
+ "version": "7.21.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
+ "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
"dev": true,
"requires": {
- "@babel/helper-environment-visitor": "^7.16.7",
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/helper-simple-access": "^7.17.7",
- "@babel/helper-split-export-declaration": "^7.16.7",
- "@babel/helper-validator-identifier": "^7.16.7",
- "@babel/template": "^7.16.7",
- "@babel/traverse": "^7.18.0",
- "@babel/types": "^7.18.0"
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.2",
+ "@babel/types": "^7.21.2"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz",
- "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+ "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.18.6"
}
},
"@babel/helper-plugin-utils": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
- "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
"dev": true
},
"@babel/helper-remap-async-to-generator": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz",
- "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+ "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.7",
- "@babel/helper-wrap-function": "^7.16.8",
- "@babel/types": "^7.16.8"
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-wrap-function": "^7.18.9",
+ "@babel/types": "^7.18.9"
}
},
"@babel/helper-replace-supers": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz",
- "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz",
+ "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==",
"dev": true,
"requires": {
- "@babel/helper-environment-visitor": "^7.18.2",
- "@babel/helper-member-expression-to-functions": "^7.17.7",
- "@babel/helper-optimise-call-expression": "^7.16.7",
- "@babel/traverse": "^7.18.2",
- "@babel/types": "^7.18.2"
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-member-expression-to-functions": "^7.20.7",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.7",
+ "@babel/types": "^7.20.7"
}
},
"@babel/helper-simple-access": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz",
- "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==",
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.2"
+ "@babel/types": "^7.20.2"
}
},
"@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
- "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+ "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
"dev": true,
"requires": {
- "@babel/types": "^7.16.0"
+ "@babel/types": "^7.20.0"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
- "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
"requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.18.6"
}
},
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw=="
+ },
"@babel/helper-validator-identifier": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
- "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
},
"@babel/helper-validator-option": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
- "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+ "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
"dev": true
},
"@babel/helper-wrap-function": {
- "version": "7.16.8",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz",
- "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+ "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.16.7",
- "@babel/template": "^7.16.7",
- "@babel/traverse": "^7.16.8",
- "@babel/types": "^7.16.8"
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5"
}
},
"@babel/helpers": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz",
- "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
+ "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
"dev": true,
"requires": {
- "@babel/template": "^7.16.7",
- "@babel/traverse": "^7.18.2",
- "@babel/types": "^7.18.2"
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.21.0",
+ "@babel/types": "^7.21.0"
}
},
"@babel/highlight": {
- "version": "7.16.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
- "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
"requires": {
- "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/helper-validator-identifier": "^7.18.6",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
},
"@babel/parser": {
- "version": "7.18.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
- "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow=="
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz",
+ "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ=="
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz",
- "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
+ "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz",
- "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz",
+ "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
- "@babel/plugin-proposal-optional-chaining": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.20.7"
}
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz",
- "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
+ "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-remap-async-to-generator": "^7.16.8",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-remap-async-to-generator": "^7.18.9",
"@babel/plugin-syntax-async-generators": "^7.8.4"
}
},
"@babel/plugin-proposal-class-properties": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz",
- "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.17.12",
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-proposal-class-static-block": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz",
- "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz",
+ "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.18.0",
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
}
},
"@babel/plugin-proposal-dynamic-import": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz",
- "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz",
+ "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
}
},
"@babel/plugin-proposal-export-namespace-from": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz",
- "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz",
+ "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.18.9",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
}
},
"@babel/plugin-proposal-json-strings": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz",
- "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz",
+ "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-json-strings": "^7.8.3"
}
},
"@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz",
- "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz",
+ "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.20.2",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
}
},
"@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz",
- "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
}
},
"@babel/plugin-proposal-numeric-separator": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz",
- "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz",
- "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
+ "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.17.10",
- "@babel/helper-compilation-targets": "^7.17.10",
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-plugin-utils": "^7.20.2",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.17.12"
+ "@babel/plugin-transform-parameters": "^7.20.7"
}
},
"@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz",
- "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
+ "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7",
+ "@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
}
},
"@babel/plugin-proposal-optional-chaining": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz",
- "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
}
},
"@babel/plugin-proposal-private-methods": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz",
- "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
"dev": true,
"requires": {
- "@babel/helper-create-class-features-plugin": "^7.17.12",
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-proposal-private-property-in-object": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz",
- "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz",
+ "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.7",
- "@babel/helper-create-class-features-plugin": "^7.17.12",
- "@babel/helper-plugin-utils": "^7.17.12",
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz",
- "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+ "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.17.12",
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-syntax-async-generators": {
@@ -566,12 +607,12 @@
}
},
"@babel/plugin-syntax-import-assertions": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz",
- "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==",
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+ "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.19.0"
}
},
"@babel/plugin-syntax-json-strings": {
@@ -656,333 +697,332 @@
}
},
"@babel/plugin-transform-arrow-functions": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz",
- "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz",
+ "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz",
- "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+ "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-remap-async-to-generator": "^7.16.8"
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-remap-async-to-generator": "^7.18.9"
}
},
"@babel/plugin-transform-block-scoped-functions": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz",
- "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+ "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.18.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz",
- "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz",
+ "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-classes": {
- "version": "7.18.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz",
- "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz",
+ "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.16.7",
- "@babel/helper-environment-visitor": "^7.18.2",
- "@babel/helper-function-name": "^7.17.9",
- "@babel/helper-optimise-call-expression": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-replace-supers": "^7.18.2",
- "@babel/helper-split-export-declaration": "^7.16.7",
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-replace-supers": "^7.20.7",
+ "@babel/helper-split-export-declaration": "^7.18.6",
"globals": "^11.1.0"
}
},
"@babel/plugin-transform-computed-properties": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz",
- "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz",
+ "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/template": "^7.20.7"
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz",
- "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz",
+ "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-dotall-regex": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz",
- "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
+ "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-duplicate-keys": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz",
- "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+ "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.9"
}
},
"@babel/plugin-transform-exponentiation-operator": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz",
- "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+ "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
"dev": true,
"requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-for-of": {
- "version": "7.18.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz",
- "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz",
+ "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-function-name": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz",
- "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+ "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
"dev": true,
"requires": {
- "@babel/helper-compilation-targets": "^7.16.7",
- "@babel/helper-function-name": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-compilation-targets": "^7.18.9",
+ "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.18.9"
}
},
"@babel/plugin-transform-literals": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz",
- "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+ "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.9"
}
},
"@babel/plugin-transform-member-expression-literals": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz",
- "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
+ "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-modules-amd": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz",
- "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==",
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+ "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.18.0",
- "@babel/helper-plugin-utils": "^7.17.12",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz",
- "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==",
+ "version": "7.21.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz",
+ "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.18.0",
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-simple-access": "^7.18.2",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-module-transforms": "^7.21.2",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-simple-access": "^7.20.2"
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.18.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz",
- "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==",
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz",
+ "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.16.7",
- "@babel/helper-module-transforms": "^7.18.0",
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-validator-identifier": "^7.16.7",
- "babel-plugin-dynamic-import-node": "^2.3.3"
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-validator-identifier": "^7.19.1"
}
},
"@babel/plugin-transform-modules-umd": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz",
- "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
+ "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.18.0",
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-module-transforms": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz",
- "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz",
+ "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.17.12",
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-create-regexp-features-plugin": "^7.20.5",
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-new-target": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz",
- "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz",
+ "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-object-super": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz",
- "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+ "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7",
- "@babel/helper-replace-supers": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/helper-replace-supers": "^7.18.6"
}
},
"@babel/plugin-transform-parameters": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz",
- "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz",
+ "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.20.2"
}
},
"@babel/plugin-transform-property-literals": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz",
- "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+ "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz",
- "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==",
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz",
+ "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
- "regenerator-transform": "^0.15.0"
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "regenerator-transform": "^0.15.1"
}
},
"@babel/plugin-transform-reserved-words": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz",
- "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
+ "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-runtime": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz",
- "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz",
+ "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.17.12",
- "babel-plugin-polyfill-corejs2": "^0.3.0",
- "babel-plugin-polyfill-corejs3": "^0.5.0",
- "babel-plugin-polyfill-regenerator": "^0.3.0",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "babel-plugin-polyfill-corejs2": "^0.3.3",
+ "babel-plugin-polyfill-corejs3": "^0.6.0",
+ "babel-plugin-polyfill-regenerator": "^0.4.1",
"semver": "^6.3.0"
}
},
"@babel/plugin-transform-shorthand-properties": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz",
- "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+ "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-spread": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz",
- "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+ "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
}
},
"@babel/plugin-transform-sticky-regex": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz",
- "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+ "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/plugin-transform-template-literals": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz",
- "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+ "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.9"
}
},
"@babel/plugin-transform-typeof-symbol": {
- "version": "7.17.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz",
- "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==",
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+ "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.17.12"
+ "@babel/helper-plugin-utils": "^7.18.9"
}
},
"@babel/plugin-transform-unicode-escapes": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz",
- "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==",
+ "version": "7.18.10",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz",
+ "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-plugin-utils": "^7.18.9"
}
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz",
- "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+ "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.16.7",
- "@babel/helper-plugin-utils": "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
}
},
"@babel/polyfill": {
@@ -1002,38 +1042,38 @@
}
},
"@babel/preset-env": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz",
- "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==",
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz",
+ "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.17.10",
- "@babel/helper-compilation-targets": "^7.18.2",
- "@babel/helper-plugin-utils": "^7.17.12",
- "@babel/helper-validator-option": "^7.16.7",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12",
- "@babel/plugin-proposal-async-generator-functions": "^7.17.12",
- "@babel/plugin-proposal-class-properties": "^7.17.12",
- "@babel/plugin-proposal-class-static-block": "^7.18.0",
- "@babel/plugin-proposal-dynamic-import": "^7.16.7",
- "@babel/plugin-proposal-export-namespace-from": "^7.17.12",
- "@babel/plugin-proposal-json-strings": "^7.17.12",
- "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12",
- "@babel/plugin-proposal-numeric-separator": "^7.16.7",
- "@babel/plugin-proposal-object-rest-spread": "^7.18.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
- "@babel/plugin-proposal-optional-chaining": "^7.17.12",
- "@babel/plugin-proposal-private-methods": "^7.17.12",
- "@babel/plugin-proposal-private-property-in-object": "^7.17.12",
- "@babel/plugin-proposal-unicode-property-regex": "^7.17.12",
+ "@babel/compat-data": "^7.20.1",
+ "@babel/helper-compilation-targets": "^7.20.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-validator-option": "^7.18.6",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9",
+ "@babel/plugin-proposal-async-generator-functions": "^7.20.1",
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
+ "@babel/plugin-proposal-class-static-block": "^7.18.6",
+ "@babel/plugin-proposal-dynamic-import": "^7.18.6",
+ "@babel/plugin-proposal-export-namespace-from": "^7.18.9",
+ "@babel/plugin-proposal-json-strings": "^7.18.6",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+ "@babel/plugin-proposal-numeric-separator": "^7.18.6",
+ "@babel/plugin-proposal-object-rest-spread": "^7.20.2",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.18.6",
+ "@babel/plugin-proposal-optional-chaining": "^7.18.9",
+ "@babel/plugin-proposal-private-methods": "^7.18.6",
+ "@babel/plugin-proposal-private-property-in-object": "^7.18.6",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.18.6",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.17.12",
+ "@babel/plugin-syntax-import-assertions": "^7.20.0",
"@babel/plugin-syntax-json-strings": "^7.8.3",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
@@ -1043,44 +1083,44 @@
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-transform-arrow-functions": "^7.17.12",
- "@babel/plugin-transform-async-to-generator": "^7.17.12",
- "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
- "@babel/plugin-transform-block-scoping": "^7.17.12",
- "@babel/plugin-transform-classes": "^7.17.12",
- "@babel/plugin-transform-computed-properties": "^7.17.12",
- "@babel/plugin-transform-destructuring": "^7.18.0",
- "@babel/plugin-transform-dotall-regex": "^7.16.7",
- "@babel/plugin-transform-duplicate-keys": "^7.17.12",
- "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
- "@babel/plugin-transform-for-of": "^7.18.1",
- "@babel/plugin-transform-function-name": "^7.16.7",
- "@babel/plugin-transform-literals": "^7.17.12",
- "@babel/plugin-transform-member-expression-literals": "^7.16.7",
- "@babel/plugin-transform-modules-amd": "^7.18.0",
- "@babel/plugin-transform-modules-commonjs": "^7.18.2",
- "@babel/plugin-transform-modules-systemjs": "^7.18.0",
- "@babel/plugin-transform-modules-umd": "^7.18.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12",
- "@babel/plugin-transform-new-target": "^7.17.12",
- "@babel/plugin-transform-object-super": "^7.16.7",
- "@babel/plugin-transform-parameters": "^7.17.12",
- "@babel/plugin-transform-property-literals": "^7.16.7",
- "@babel/plugin-transform-regenerator": "^7.18.0",
- "@babel/plugin-transform-reserved-words": "^7.17.12",
- "@babel/plugin-transform-shorthand-properties": "^7.16.7",
- "@babel/plugin-transform-spread": "^7.17.12",
- "@babel/plugin-transform-sticky-regex": "^7.16.7",
- "@babel/plugin-transform-template-literals": "^7.18.2",
- "@babel/plugin-transform-typeof-symbol": "^7.17.12",
- "@babel/plugin-transform-unicode-escapes": "^7.16.7",
- "@babel/plugin-transform-unicode-regex": "^7.16.7",
+ "@babel/plugin-transform-arrow-functions": "^7.18.6",
+ "@babel/plugin-transform-async-to-generator": "^7.18.6",
+ "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
+ "@babel/plugin-transform-block-scoping": "^7.20.2",
+ "@babel/plugin-transform-classes": "^7.20.2",
+ "@babel/plugin-transform-computed-properties": "^7.18.9",
+ "@babel/plugin-transform-destructuring": "^7.20.2",
+ "@babel/plugin-transform-dotall-regex": "^7.18.6",
+ "@babel/plugin-transform-duplicate-keys": "^7.18.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
+ "@babel/plugin-transform-for-of": "^7.18.8",
+ "@babel/plugin-transform-function-name": "^7.18.9",
+ "@babel/plugin-transform-literals": "^7.18.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.18.6",
+ "@babel/plugin-transform-modules-amd": "^7.19.6",
+ "@babel/plugin-transform-modules-commonjs": "^7.19.6",
+ "@babel/plugin-transform-modules-systemjs": "^7.19.6",
+ "@babel/plugin-transform-modules-umd": "^7.18.6",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1",
+ "@babel/plugin-transform-new-target": "^7.18.6",
+ "@babel/plugin-transform-object-super": "^7.18.6",
+ "@babel/plugin-transform-parameters": "^7.20.1",
+ "@babel/plugin-transform-property-literals": "^7.18.6",
+ "@babel/plugin-transform-regenerator": "^7.18.6",
+ "@babel/plugin-transform-reserved-words": "^7.18.6",
+ "@babel/plugin-transform-shorthand-properties": "^7.18.6",
+ "@babel/plugin-transform-spread": "^7.19.0",
+ "@babel/plugin-transform-sticky-regex": "^7.18.6",
+ "@babel/plugin-transform-template-literals": "^7.18.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.18.10",
+ "@babel/plugin-transform-unicode-regex": "^7.18.6",
"@babel/preset-modules": "^0.1.5",
- "@babel/types": "^7.18.2",
- "babel-plugin-polyfill-corejs2": "^0.3.0",
- "babel-plugin-polyfill-corejs3": "^0.5.0",
- "babel-plugin-polyfill-regenerator": "^0.3.0",
- "core-js-compat": "^3.22.1",
+ "@babel/types": "^7.20.2",
+ "babel-plugin-polyfill-corejs2": "^0.3.3",
+ "babel-plugin-polyfill-corejs3": "^0.6.0",
+ "babel-plugin-polyfill-regenerator": "^0.4.1",
+ "core-js-compat": "^3.25.1",
"semver": "^6.3.0"
}
},
@@ -1097,56 +1137,77 @@
"esutils": "^2.0.2"
}
},
+ "@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
+ "dev": true
+ },
"@babel/runtime": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
- "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
+ "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"requires": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.13.11"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ }
}
},
"@babel/runtime-corejs3": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz",
- "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==",
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz",
+ "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==",
"requires": {
- "core-js-pure": "^3.20.2",
- "regenerator-runtime": "^0.13.4"
+ "core-js-pure": "^3.25.1",
+ "regenerator-runtime": "^0.13.11"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ }
}
},
"@babel/template": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
- "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+ "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"requires": {
- "@babel/code-frame": "^7.16.7",
- "@babel/parser": "^7.16.7",
- "@babel/types": "^7.16.7"
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7"
}
},
"@babel/traverse": {
- "version": "7.18.2",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz",
- "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz",
+ "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==",
"requires": {
- "@babel/code-frame": "^7.16.7",
- "@babel/generator": "^7.18.2",
- "@babel/helper-environment-visitor": "^7.18.2",
- "@babel/helper-function-name": "^7.17.9",
- "@babel/helper-hoist-variables": "^7.16.7",
- "@babel/helper-split-export-declaration": "^7.16.7",
- "@babel/parser": "^7.18.0",
- "@babel/types": "^7.18.2",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.21.3",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.21.3",
+ "@babel/types": "^7.21.3",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.18.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
- "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz",
+ "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==",
"requires": {
- "@babel/helper-validator-identifier": "^7.16.7",
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
"to-fast-properties": "^2.0.0"
}
},
@@ -1155,22 +1216,105 @@
"resolved": "https://registry.npmjs.org/@blu3r4y/lzma/-/lzma-2.3.3.tgz",
"integrity": "sha512-2ckRSsYewLAgq/s8tUW3o5gurtCNYga1f9l0egV4QlT8hgVEilQHRt18s+behmPL2M/BPBxUINaOz67u++r0wA=="
},
+ "@codemirror/commands": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.2.2.tgz",
+ "integrity": "sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw==",
+ "dev": true,
+ "requires": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.2.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@codemirror/language": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.6.0.tgz",
+ "integrity": "sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "@codemirror/search": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.3.0.tgz",
+ "integrity": "sha512-rBhZxzT34CarfhgCZGhaLBScABDN3iqJxixzNuINp9lrb3lzm0nTpR77G1VrxGO3HOGK7j62jcJftQM7eCOIuw==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "@codemirror/state": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.0.tgz",
+ "integrity": "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==",
+ "dev": true
+ },
+ "@codemirror/view": {
+ "version": "6.9.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.9.3.tgz",
+ "integrity": "sha512-BJ5mvEIhFM+SrNwc5X8pLIvMM9ffjkviVbxpg84Xk2OE8ZyKaEbId8kX+nAYEEso7+qnbwsXe1bkAHsasebMow==",
+ "dev": true,
+ "requires": {
+ "@codemirror/state": "^6.1.4",
+ "style-mod": "^4.0.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
"@colors/colors": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
"integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
"dev": true
},
+ "@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true
+ },
+ "@eslint-community/eslint-utils": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz",
+ "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ }
+ }
+ },
+ "@eslint-community/regexpp": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz",
+ "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==",
+ "dev": true
+ },
"@eslint/eslintrc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
- "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
+ "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
- "espree": "^9.3.2",
- "globals": "^13.15.0",
+ "espree": "^9.5.0",
+ "globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
@@ -1179,9 +1323,9 @@
},
"dependencies": {
"globals": {
- "version": "13.15.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
- "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@@ -1189,17 +1333,29 @@
}
}
},
+ "@eslint/js": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
+ "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+ "dev": true
+ },
"@humanwhocodes/config-array": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
- "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
"dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
- "minimatch": "^3.0.4"
+ "minimatch": "^3.0.5"
}
},
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true
+ },
"@humanwhocodes/object-schema": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
@@ -1207,26 +1363,26 @@
"dev": true
},
"@jimp/bmp": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz",
- "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.13.tgz",
+ "integrity": "sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
+ "@jimp/utils": "^0.16.13",
"bmp-js": "^0.1.0"
}
},
"@jimp/core": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz",
- "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.13.tgz",
+ "integrity": "sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
+ "@jimp/utils": "^0.16.13",
"any-base": "^1.1.0",
"buffer": "^5.2.0",
"exif-parser": "^0.1.12",
- "file-type": "^9.0.0",
+ "file-type": "^16.5.4",
"load-bmfont": "^1.3.1",
"mkdirp": "^0.5.1",
"phin": "^2.9.1",
@@ -1254,312 +1410,313 @@
}
},
"@jimp/custom": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz",
- "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.13.tgz",
+ "integrity": "sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/core": "^0.16.1"
+ "@jimp/core": "^0.16.13"
}
},
"@jimp/gif": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz",
- "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.13.tgz",
+ "integrity": "sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
+ "@jimp/utils": "^0.16.13",
"gifwrap": "^0.9.2",
"omggif": "^1.0.9"
}
},
"@jimp/jpeg": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.2.tgz",
- "integrity": "sha512-BW5gZydgq6wdIwHd+3iUNgrTklvoQc/FUKSj9meM6A0FU21lUaansRX5BDdJqHkyXJLnnlDGwDt27J+hQuBAVw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.13.tgz",
+ "integrity": "sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.2",
+ "@jimp/utils": "^0.16.13",
"jpeg-js": "^0.4.2"
}
},
"@jimp/plugin-blit": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz",
- "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.13.tgz",
+ "integrity": "sha512-8Z1k96ZFxlhK2bgrY1JNWNwvaBeI/bciLM0yDOni2+aZwfIIiC7Y6PeWHTAvjHNjphz+XCt01WQmOYWCn0ML6g==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-blur": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz",
- "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.13.tgz",
+ "integrity": "sha512-PvLrfa8vkej3qinlebyhLpksJgCF5aiysDMSVhOZqwH5nQLLtDE9WYbnsofGw4r0VVpyw3H/ANCIzYTyCtP9Cg==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-circle": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz",
- "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.13.tgz",
+ "integrity": "sha512-RNave7EFgZrb5V5EpdvJGAEHMnDAJuwv05hKscNfIYxf0kR3KhViBTDy+MoTnMlIvaKFULfwIgaZWzyhuINMzA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-color": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz",
- "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.13.tgz",
+ "integrity": "sha512-xW+9BtEvoIkkH/Wde9ql4nAFbYLkVINhpgAE7VcBUsuuB34WUbcBl/taOuUYQrPEFQJ4jfXiAJZ2H/rvKjCVnQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
+ "@jimp/utils": "^0.16.13",
"tinycolor2": "^1.4.1"
}
},
"@jimp/plugin-contain": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz",
- "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.13.tgz",
+ "integrity": "sha512-QayTXw4tXMwU6q6acNTQrTTFTXpNRBe+MgTGMDU0lk+23PjlFCO/9sacflelG8lsp7vNHhAxFeHptDMAksEYzg==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-cover": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz",
- "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.13.tgz",
+ "integrity": "sha512-BSsP71GTNaqWRcvkbWuIVH+zK7b3TSNebbhDkFK0fVaUTzHuKMS/mgY4hDZIEVt7Rf5FjadAYtsujHN9w0iSYA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-crop": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz",
- "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.13.tgz",
+ "integrity": "sha512-WEl2tPVYwzYL8OKme6Go2xqiWgKsgxlMwyHabdAU4tXaRwOCnOI7v4021gCcBb9zn/oWwguHuKHmK30Fw2Z/PA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-displace": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz",
- "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.13.tgz",
+ "integrity": "sha512-qt9WKq8vWrcjySa9DyQ0x/RBMHQeiVjdVSY1SJsMjssPUf0pS74qorcuAkGi89biN3YoGUgPkpqECnAWnYwgGA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-dither": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz",
- "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.13.tgz",
+ "integrity": "sha512-5/N3yJggbWQTlGZHQYJPmQXEwR52qaXjEzkp1yRBbtdaekXE3BG/suo0fqeoV/csf8ooI78sJzYmIrxNoWVtgQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-fisheye": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz",
- "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.13.tgz",
+ "integrity": "sha512-2rZmTdFbT/cF9lEZIkXCYO0TsT114Q27AX5IAo0Sju6jVQbvIk1dFUTnwLDadTo8wkJlFzGqMQ24Cs8cHWOliA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-flip": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz",
- "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.13.tgz",
+ "integrity": "sha512-EmcgAA74FTc5u7Z+hUO/sRjWwfPPLuOQP5O64x5g4j0T12Bd29IgsYZxoutZo/rb3579+JNa/3wsSEmyVv1EpA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-gaussian": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz",
- "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.13.tgz",
+ "integrity": "sha512-A1XKfGQD0iDdIiKqFYi8nZMv4dDVYdxbrmgR7y/CzUHhSYdcmoljLIIsZZM3Iks/Wa353W3vtvkWLuDbQbch1w==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-invert": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz",
- "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.13.tgz",
+ "integrity": "sha512-xFMrIn7czEZbdbMzZWuaZFnlLGJDVJ82y5vlsKsXRTG2kcxRsMPXvZRWHV57nSs1YFsNqXSbrC8B98n0E32njQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-mask": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz",
- "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.13.tgz",
+ "integrity": "sha512-wLRYKVBXql2GAYgt6FkTnCfE+q5NomM7Dlh0oIPGAoMBWDyTx0eYutRK6PlUrRK2yMHuroAJCglICTbxqGzowQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-normalize": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz",
- "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.13.tgz",
+ "integrity": "sha512-3tfad0n9soRna4IfW9NzQdQ2Z3ijkmo21DREHbE6CGcMIxOSvfRdSvf1qQPApxjTSo8LTU4MCi/fidx/NZ0GqQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-print": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz",
- "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.13.tgz",
+ "integrity": "sha512-0m6i3p01PGRkGAK9r53hDYrkyMq+tlhLOIbsSTmZyh6HLshUKlTB7eXskF5OpVd5ZUHoltlNc6R+ggvKIzxRFw==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
+ "@jimp/utils": "^0.16.13",
"load-bmfont": "^1.4.0"
}
},
"@jimp/plugin-resize": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz",
- "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.13.tgz",
+ "integrity": "sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-rotate": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz",
- "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.13.tgz",
+ "integrity": "sha512-Ev+Jjmj1nHYw897z9C3R9dYsPv7S2/nxdgfFb/h8hOwK0Ovd1k/+yYS46A0uj/JCKK0pQk8wOslYBkPwdnLorw==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-scale": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz",
- "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.13.tgz",
+ "integrity": "sha512-05POQaEJVucjTiSGMoH68ZiELc7QqpIpuQlZ2JBbhCV+WCbPFUBcGSmE7w4Jd0E2GvCho/NoMODLwgcVGQA97A==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-shadow": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz",
- "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.13.tgz",
+ "integrity": "sha512-nmu5VSZ9hsB1JchTKhnnCY+paRBnwzSyK5fhkhtQHHoFD5ArBQ/5wU8y6tCr7k/GQhhGq1OrixsECeMjPoc8Zw==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugin-threshold": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz",
- "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.13.tgz",
+ "integrity": "sha512-+3zArBH0OE3Rhjm4HyAokMsZlIq5gpQec33CncyoSwxtRBM2WAhUVmCUKuBo+Lr/2/4ISoY4BWpHKhMLDix6cA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1"
+ "@jimp/utils": "^0.16.13"
}
},
"@jimp/plugins": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz",
- "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.13.tgz",
+ "integrity": "sha512-CJLdqODEhEVs4MgWCxpWL5l95sCBlkuSLz65cxEm56X5akIsn4LOlwnKoSEZioYcZUBvHhCheH67AyPTudfnQQ==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/plugin-blit": "^0.16.1",
- "@jimp/plugin-blur": "^0.16.1",
- "@jimp/plugin-circle": "^0.16.1",
- "@jimp/plugin-color": "^0.16.1",
- "@jimp/plugin-contain": "^0.16.1",
- "@jimp/plugin-cover": "^0.16.1",
- "@jimp/plugin-crop": "^0.16.1",
- "@jimp/plugin-displace": "^0.16.1",
- "@jimp/plugin-dither": "^0.16.1",
- "@jimp/plugin-fisheye": "^0.16.1",
- "@jimp/plugin-flip": "^0.16.1",
- "@jimp/plugin-gaussian": "^0.16.1",
- "@jimp/plugin-invert": "^0.16.1",
- "@jimp/plugin-mask": "^0.16.1",
- "@jimp/plugin-normalize": "^0.16.1",
- "@jimp/plugin-print": "^0.16.1",
- "@jimp/plugin-resize": "^0.16.1",
- "@jimp/plugin-rotate": "^0.16.1",
- "@jimp/plugin-scale": "^0.16.1",
- "@jimp/plugin-shadow": "^0.16.1",
- "@jimp/plugin-threshold": "^0.16.1",
+ "@jimp/plugin-blit": "^0.16.13",
+ "@jimp/plugin-blur": "^0.16.13",
+ "@jimp/plugin-circle": "^0.16.13",
+ "@jimp/plugin-color": "^0.16.13",
+ "@jimp/plugin-contain": "^0.16.13",
+ "@jimp/plugin-cover": "^0.16.13",
+ "@jimp/plugin-crop": "^0.16.13",
+ "@jimp/plugin-displace": "^0.16.13",
+ "@jimp/plugin-dither": "^0.16.13",
+ "@jimp/plugin-fisheye": "^0.16.13",
+ "@jimp/plugin-flip": "^0.16.13",
+ "@jimp/plugin-gaussian": "^0.16.13",
+ "@jimp/plugin-invert": "^0.16.13",
+ "@jimp/plugin-mask": "^0.16.13",
+ "@jimp/plugin-normalize": "^0.16.13",
+ "@jimp/plugin-print": "^0.16.13",
+ "@jimp/plugin-resize": "^0.16.13",
+ "@jimp/plugin-rotate": "^0.16.13",
+ "@jimp/plugin-scale": "^0.16.13",
+ "@jimp/plugin-shadow": "^0.16.13",
+ "@jimp/plugin-threshold": "^0.16.13",
"timm": "^1.6.1"
}
},
"@jimp/png": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz",
- "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.13.tgz",
+ "integrity": "sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/utils": "^0.16.1",
+ "@jimp/utils": "^0.16.13",
"pngjs": "^3.3.3"
}
},
"@jimp/tiff": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz",
- "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.13.tgz",
+ "integrity": "sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==",
"requires": {
"@babel/runtime": "^7.7.2",
"utif": "^2.0.1"
}
},
"@jimp/types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz",
- "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.13.tgz",
+ "integrity": "sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/bmp": "^0.16.1",
- "@jimp/gif": "^0.16.1",
- "@jimp/jpeg": "^0.16.1",
- "@jimp/png": "^0.16.1",
- "@jimp/tiff": "^0.16.1",
+ "@jimp/bmp": "^0.16.13",
+ "@jimp/gif": "^0.16.13",
+ "@jimp/jpeg": "^0.16.13",
+ "@jimp/png": "^0.16.13",
+ "@jimp/tiff": "^0.16.13",
"timm": "^1.6.1"
}
},
"@jimp/utils": {
- "version": "0.16.2",
- "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.2.tgz",
- "integrity": "sha512-XENrPvmigiXZQ8E2nxJqO6UVvWBLzbNwyYi3Y8Q1IECoYhYI3kgOQ0fmy4G269Vz1V0omh1bNmC42r4OfXg1Jg==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.13.tgz",
+ "integrity": "sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==",
"requires": {
"@babel/runtime": "^7.7.2",
"regenerator-runtime": "^0.13.3"
}
},
"@jridgewell/gen-mapping": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
- "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
"requires": {
"@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"@jridgewell/resolve-uri": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
- "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true
},
"@jridgewell/set-array": {
"version": "1.1.1",
@@ -1574,6 +1731,19 @@
"requires": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
}
},
"@jridgewell/sourcemap-codec": {
@@ -1582,12 +1752,21 @@
"integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
},
"@jridgewell/trace-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
- "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dev": true,
"requires": {
- "@jridgewell/resolve-uri": "^3.0.3",
- "@jridgewell/sourcemap-codec": "^1.4.10"
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ },
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ }
}
},
"@leichtgewicht/ip-codec": {
@@ -1596,6 +1775,39 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
"dev": true
},
+ "@lezer/common": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.2.tgz",
+ "integrity": "sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng==",
+ "dev": true
+ },
+ "@lezer/highlight": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.3.tgz",
+ "integrity": "sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==",
+ "dev": true,
+ "requires": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@lezer/lr": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.3.tgz",
+ "integrity": "sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w==",
+ "dev": true,
+ "requires": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "dev": true,
+ "requires": {
+ "eslint-scope": "5.1.1"
+ }
+ },
"@nightwatch/chai": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@nightwatch/chai/-/chai-5.0.2.tgz",
@@ -1610,6 +1822,12 @@
"type-detect": "4.0.8"
}
},
+ "@nightwatch/html-reporter-template": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@nightwatch/html-reporter-template/-/html-reporter-template-0.1.4.tgz",
+ "integrity": "sha512-fVylXypRuNJbyFAwY/5H2QM1A1XVoZWis0zhiMwA5LQN0cxHzpG2aUheb+qP1EfkxhFxwSUHOcrvphFLbPA8ow==",
+ "dev": true
+ },
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1645,7 +1863,7 @@
"@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
+ "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
},
"@protobufjs/base64": {
"version": "1.1.2",
@@ -1660,12 +1878,12 @@
"@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
+ "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
},
"@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"requires": {
"@protobufjs/aspromise": "^1.1.1",
"@protobufjs/inquire": "^1.1.0"
@@ -1674,32 +1892,43 @@
"@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
+ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
},
"@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
+ "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
},
"@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
+ "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
},
"@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
+ "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
},
"@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
+ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"@testim/chrome-version": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.2.tgz",
- "integrity": "sha512-1c4ZOETSRpI0iBfIFUqU4KqwBAB2lHUAlBjZz/YqOHqwM9dTTzjV6Km0ZkiEiSCx/tLr1BtESIKyWWMww+RUqw==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz",
+ "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==",
+ "dev": true
+ },
+ "@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
+ },
+ "@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
},
"@types/body-parser": {
@@ -1741,9 +1970,9 @@
}
},
"@types/eslint": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz",
- "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==",
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz",
+ "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==",
"dev": true,
"requires": {
"@types/estree": "*",
@@ -1751,9 +1980,9 @@
}
},
"@types/eslint-scope": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
- "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+ "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
"dev": true,
"requires": {
"@types/eslint": "*",
@@ -1767,21 +1996,21 @@
"dev": true
},
"@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
+ "version": "4.17.17",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
"dev": true,
"requires": {
"@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
+ "@types/express-serve-static-core": "^4.17.33",
"@types/qs": "*",
"@types/serve-static": "*"
}
},
"@types/express-serve-static-core": {
- "version": "4.17.28",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz",
- "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==",
+ "version": "4.17.33",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+ "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
"dev": true,
"requires": {
"@types/node": "*",
@@ -1796,9 +2025,9 @@
"dev": true
},
"@types/http-proxy": {
- "version": "1.17.8",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
- "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
+ "version": "1.17.10",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz",
+ "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==",
"dev": true,
"requires": {
"@types/node": "*"
@@ -1810,15 +2039,10 @@
"integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
"dev": true
},
- "@types/long": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
- "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
- },
"@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==",
"dev": true
},
"@types/node": {
@@ -1826,12 +2050,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
"integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
},
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
- "dev": true
- },
"@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
@@ -1845,9 +2063,9 @@
"dev": true
},
"@types/retry": {
- "version": "0.12.1",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
- "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
"dev": true
},
"@types/sax": {
@@ -1869,12 +2087,12 @@
}
},
"@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz",
+ "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==",
"dev": true,
"requires": {
- "@types/mime": "^1",
+ "@types/mime": "*",
"@types/node": "*"
}
},
@@ -1888,18 +2106,18 @@
}
},
"@types/ws": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz",
- "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==",
+ "version": "8.5.4",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
+ "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/yauzl": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
- "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
"dev": true,
"optional": true,
"requires": {
@@ -2070,6 +2288,12 @@
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
},
+ "abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "dev": true
+ },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -2087,11 +2311,29 @@
}
},
"acorn": {
- "version": "8.7.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
- "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
"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,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ }
+ }
+ },
"acorn-import-assertions": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
@@ -2105,9 +2347,9 @@
"dev": true
},
"acorn-walk": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
- "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
"dev": true
},
"agent-base": {
@@ -2119,16 +2361,6 @@
"debug": "4"
}
},
- "aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -2211,15 +2443,32 @@
"color-convert": "^1.9.0"
}
},
+ "ansi-to-html": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz",
+ "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==",
+ "dev": true,
+ "requires": {
+ "entities": "^2.2.0"
+ },
+ "dependencies": {
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
+ }
+ }
+ },
"any-base": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
"integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="
},
"anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
@@ -2240,7 +2489,7 @@
"array-each": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==",
"dev": true
},
"array-flatten": {
@@ -2314,17 +2563,17 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
},
"autoprefixer": {
- "version": "10.4.7",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
- "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
"dev": true,
"requires": {
- "browserslist": "^4.20.3",
- "caniuse-lite": "^1.0.30001335",
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
"fraction.js": "^4.2.0",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
@@ -2332,31 +2581,25 @@
}
},
"avsc": {
- "version": "5.7.4",
- "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.4.tgz",
- "integrity": "sha512-z4oo33lmnvvNRqfUe3YjDGGpqu/L2+wXBIhMtwq6oqZ+exOUAkQYM6zd2VWKF7AIlajOF8ZZuPFfryTG9iLC/w=="
+ "version": "5.7.7",
+ "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.7.7.tgz",
+ "integrity": "sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ=="
+ },
+ "axe-core": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz",
+ "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==",
+ "dev": true
},
"axios": {
- "version": "0.27.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
- "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
+ "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
"dev": true,
"requires": {
- "follow-redirects": "^1.14.9",
- "form-data": "^4.0.0"
- },
- "dependencies": {
- "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,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- }
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
}
},
"babel-code-frame": {
@@ -2420,7 +2663,7 @@
},
"babel-eslint": {
"version": "10.1.0",
- "resolved": "https://packages.atlassian.com/api/npm/npm-remote/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
"integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
"requires": {
"@babel/code-frame": "^7.0.0",
@@ -2433,21 +2676,19 @@
"dependencies": {
"eslint-visitor-keys": {
"version": "1.3.0",
- "resolved": "https://packages.atlassian.com/api/npm/npm-remote/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="
}
}
},
"babel-loader": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
- "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz",
+ "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==",
"dev": true,
"requires": {
- "find-cache-dir": "^3.3.1",
- "loader-utils": "^2.0.0",
- "make-dir": "^3.1.0",
- "schema-utils": "^2.6.5"
+ "find-cache-dir": "^3.3.2",
+ "schema-utils": "^4.0.0"
}
},
"babel-messages": {
@@ -2469,33 +2710,33 @@
}
},
"babel-plugin-polyfill-corejs2": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz",
- "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz",
+ "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.13.11",
- "@babel/helper-define-polyfill-provider": "^0.3.1",
+ "@babel/compat-data": "^7.17.7",
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
"semver": "^6.1.1"
}
},
"babel-plugin-polyfill-corejs3": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz",
- "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz",
+ "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==",
"dev": true,
"requires": {
- "@babel/helper-define-polyfill-provider": "^0.3.1",
- "core-js-compat": "^3.21.0"
+ "@babel/helper-define-polyfill-provider": "^0.3.3",
+ "core-js-compat": "^3.25.1"
}
},
"babel-plugin-polyfill-regenerator": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz",
- "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz",
+ "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==",
"dev": true,
"requires": {
- "@babel/helper-define-polyfill-provider": "^0.3.1"
+ "@babel/helper-define-polyfill-provider": "^0.3.3"
}
},
"babel-plugin-transform-builtin-extend": {
@@ -2649,9 +2890,9 @@
"dev": true
},
"bignumber.js": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz",
- "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw=="
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz",
+ "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig=="
},
"binary-extensions": {
"version": "2.2.0",
@@ -2690,7 +2931,7 @@
"bmp-js": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
- "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM="
+ "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw=="
},
"bn": {
"version": "1.0.5",
@@ -2715,21 +2956,23 @@
}
},
"body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
"dev": true,
"requires": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.8.1",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.9.7",
- "raw-body": "2.4.3",
- "type-is": "~1.6.18"
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
},
"dependencies": {
"bytes": {
@@ -2747,22 +2990,16 @@
"ms": "2.0.0"
}
},
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
"http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dev": true,
"requires": {
- "depd": "~1.1.2",
+ "depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
- "statuses": ">= 1.5.0 < 2",
+ "statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
@@ -2778,23 +3015,35 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
"qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
- "dev": true
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
},
"raw-body": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
- "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dev": true,
"requires": {
"bytes": "3.1.2",
- "http-errors": "1.8.1",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
@@ -2804,19 +3053,25 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true
}
}
},
"bonjour-service": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz",
- "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz",
+ "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==",
"dev": true,
"requires": {
"array-flatten": "^2.1.2",
"dns-equal": "^1.0.0",
"fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.4"
+ "multicast-dns": "^7.2.5"
}
},
"boolbase": {
@@ -2826,9 +3081,9 @@
"dev": true
},
"bootstrap": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
- "integrity": "sha512-0dj+VgI9Ecom+rvvpNZ4MUZJz8dcX7WCX+eTID9+/8HgOkv3dsRzi8BGeZJCQU6flWQVYxwTQnEZFrmJSEO7og=="
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
+ "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ=="
},
"bootstrap-colorpicker": {
"version": "3.4.0",
@@ -2936,6 +3191,12 @@
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
},
+ "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
+ },
"browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
@@ -3017,22 +3278,21 @@
}
},
"browserslist": {
- "version": "4.20.3",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
- "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001332",
- "electron-to-chromium": "^1.4.118",
- "escalade": "^3.1.1",
- "node-releases": "^2.0.3",
- "picocolors": "^1.0.0"
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
}
},
"bson": {
- "version": "4.6.4",
- "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz",
- "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==",
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+ "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
"requires": {
"buffer": "^5.6.0"
},
@@ -3060,13 +3320,13 @@
"buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"dev": true
},
"buffer-equal": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
- "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs="
+ "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA=="
},
"buffer-equal-constant-time": {
"version": "1.0.1",
@@ -3127,9 +3387,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001346",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz",
- "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==",
+ "version": "1.0.30001469",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001469.tgz",
+ "integrity": "sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==",
"dev": true
},
"cbor": {
@@ -3207,16 +3467,16 @@
"dev": true
},
"chromedriver": {
- "version": "103.0.0",
- "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-103.0.0.tgz",
- "integrity": "sha512-7BHf6HWt0PeOHCzWO8qlnD13sARzr5AKTtG8Csn+czsuAsajwPxdLNtry5GPh8HYFyl+i0M+yg3bT43AGfgU9w==",
+ "version": "110.0.0",
+ "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-110.0.0.tgz",
+ "integrity": "sha512-Le6q8xrA/3fAt+g8qiN0YjsYxINIhQMC6wj9X3W5L77uN4NspEzklDrqYNwBcEVn7PcAEJ73nLlS7mTyZRspHA==",
"dev": true,
"requires": {
- "@testim/chrome-version": "^1.1.2",
- "axios": "^0.27.2",
- "del": "^6.0.0",
+ "@testim/chrome-version": "^1.1.3",
+ "axios": "^1.2.1",
+ "compare-versions": "^5.0.1",
"extract-zip": "^2.0.1",
- "https-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
"proxy-from-env": "^1.1.0",
"tcp-port-used": "^1.0.1"
}
@@ -3253,12 +3513,6 @@
}
}
},
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true
- },
"cli-boxes": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
@@ -3275,20 +3529,30 @@
}
},
"cli-progress": {
- "version": "3.11.1",
- "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.1.tgz",
- "integrity": "sha512-TTMA2LHrYaZeNMcgZGO10oYqj9hvd03pltNtVbu4ddeyDTHlYV7gWxsFiuvaQlgwMBFCv1TukcjiODWFlb16tQ==",
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz",
+ "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==",
"dev": true,
"requires": {
"string-width": "^4.2.3"
}
},
"cli-spinners": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz",
- "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz",
+ "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
"dev": true
},
+ "cli-table3": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+ "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+ "dev": true,
+ "requires": {
+ "@colors/colors": "1.5.0",
+ "string-width": "^4.2.0"
+ }
+ },
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -3303,7 +3567,7 @@
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
"dev": true
},
"codepage": {
@@ -3322,12 +3586,12 @@
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"colorette": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
- "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz",
+ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
"colors": {
@@ -3353,7 +3617,13 @@
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "compare-versions": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz",
+ "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==",
"dev": true
},
"compressible": {
@@ -3383,7 +3653,7 @@
"bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
"dev": true
},
"debug": {
@@ -3398,7 +3668,7 @@
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
@@ -3439,9 +3709,9 @@
}
},
"connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
"dev": true
},
"connect-livereload": {
@@ -3468,9 +3738,9 @@
}
},
"content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true
},
"continuable-cache": {
@@ -3480,24 +3750,21 @@
"dev": true
},
"convert-source-map": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
- "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
},
"cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
"dev": true
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
},
"copy-webpack-plugin": {
@@ -3556,33 +3823,24 @@
}
},
"core-js": {
- "version": "3.22.8",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz",
- "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==",
+ "version": "3.29.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz",
+ "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==",
"dev": true
},
"core-js-compat": {
- "version": "3.22.8",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz",
- "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==",
+ "version": "3.29.1",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz",
+ "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==",
"dev": true,
"requires": {
- "browserslist": "^4.20.3",
- "semver": "7.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
- "dev": true
- }
+ "browserslist": "^4.21.5"
}
},
"core-js-pure": {
- "version": "3.21.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz",
- "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ=="
+ "version": "3.29.1",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.1.tgz",
+ "integrity": "sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg=="
},
"core-util-is": {
"version": "1.0.2",
@@ -3591,16 +3849,15 @@
"dev": true
},
"cosmiconfig": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
- "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+ "version": "8.1.3",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz",
+ "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==",
"dev": true,
"requires": {
- "@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
"parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "path-type": "^4.0.0"
}
},
"create-ecdh": {
@@ -3644,6 +3901,12 @@
"sha.js": "^2.4.8"
}
},
+ "crelt": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
+ "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==",
+ "dev": true
+ },
"cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -3684,29 +3947,44 @@
"integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
},
"css-loader": {
- "version": "6.7.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz",
- "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==",
+ "version": "6.7.3",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz",
+ "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==",
"dev": true,
"requires": {
"icss-utils": "^5.1.0",
- "postcss": "^8.4.7",
+ "postcss": "^8.4.19",
"postcss-modules-extract-imports": "^3.0.0",
"postcss-modules-local-by-default": "^4.0.0",
"postcss-modules-scope": "^3.0.0",
"postcss-modules-values": "^4.0.0",
"postcss-value-parser": "^4.2.0",
- "semver": "^7.3.5"
+ "semver": "^7.3.8"
},
"dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
@@ -3735,6 +4013,29 @@
"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
+ },
+ "cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": 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
+ }
+ }
+ },
"ctph.js": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/ctph.js/-/ctph.js-0.0.5.tgz",
@@ -3747,16 +4048,16 @@
"dev": true
},
"d3": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/d3/-/d3-7.4.4.tgz",
- "integrity": "sha512-97FE+MYdAlV3R9P74+R3Uar7wUKkIFu89UWMjEaDhiJ9VxKvqaMxauImy8PC2DdBkdM2BxJOIoLxPrcZUyrKoQ==",
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz",
+ "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==",
"requires": {
"d3-array": "3",
"d3-axis": "3",
"d3-brush": "3",
"d3-chord": "3",
"d3-color": "3",
- "d3-contour": "3",
+ "d3-contour": "4",
"d3-delaunay": "6",
"d3-dispatch": "3",
"d3-drag": "3",
@@ -3784,9 +4085,9 @@
}
},
"d3-array": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz",
- "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz",
+ "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==",
"requires": {
"internmap": "1 - 2"
}
@@ -3822,11 +4123,11 @@
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
},
"d3-contour": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz",
- "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
"requires": {
- "d3-array": "2 - 3"
+ "d3-array": "^3.2.0"
}
},
"d3-delaunay": {
@@ -3890,9 +4191,9 @@
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
},
"d3-geo": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz",
- "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==",
"requires": {
"d3-array": "2.5.0 - 3"
}
@@ -3903,9 +4204,9 @@
"integrity": "sha1-nFg32s/UcasFM3qeke8Qv8T5iDE="
},
"d3-hierarchy": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz",
- "integrity": "sha512-LtAIu54UctRmhGKllleflmHalttH3zkfSi4NlKrTAoFKjC+AFBJohsCAdgCBYQwH0F8hIOGY89X1pPqAchlMkA=="
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="
},
"d3-interpolate": {
"version": "3.0.1",
@@ -3916,9 +4217,9 @@
}
},
"d3-path": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
- "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="
},
"d3-polygon": {
"version": "3.0.1",
@@ -3962,17 +4263,17 @@
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="
},
"d3-shape": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
- "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"requires": {
- "d3-path": "1 - 3"
+ "d3-path": "^3.1.0"
}
},
"d3-time": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
- "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
"requires": {
"d3-array": "2 - 3"
}
@@ -4014,10 +4315,48 @@
"d3-transition": "2 - 3"
}
},
+ "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,
+ "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,
+ "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
+ },
+ "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,
+ "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",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
+ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
"dev": true
},
"debug": {
@@ -4028,6 +4367,18 @@
"ms": "2.1.2"
}
},
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ },
+ "decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "dev": true
+ },
"deep-eql": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.0.1.tgz",
@@ -4074,9 +4425,9 @@
}
},
"defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
"dev": true,
"requires": {
"clone": "^1.0.2"
@@ -4096,44 +4447,6 @@
"object-keys": "^1.0.12"
}
},
- "del": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
- "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
- "dev": true,
- "requires": {
- "globby": "^11.0.1",
- "graceful-fs": "^4.2.4",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.2",
- "p-map": "^4.0.0",
- "rimraf": "^3.0.2",
- "slash": "^3.0.0"
- },
- "dependencies": {
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- }
- }
- },
"delaunator": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz",
@@ -4145,7 +4458,7 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true
},
"depd": {
@@ -4172,7 +4485,7 @@
"detect-file": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
"dev": true
},
"detect-node": {
@@ -4225,9 +4538,9 @@
"dev": true
},
"dns-packet": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
- "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz",
+ "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==",
"dev": true,
"requires": {
"@leichtgewicht/ip-codec": "^2.0.1"
@@ -4273,6 +4586,23 @@
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
"dev": true
},
+ "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,
+ "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
+ }
+ }
+ },
"domhandler": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
@@ -4377,9 +4707,9 @@
}
},
"electron-to-chromium": {
- "version": "1.4.145",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.145.tgz",
- "integrity": "sha512-g4VQCi61gA0t5fJHsalxAc8NpvxC/CEwLAGLfJ+DmkRXTEyntJA7H01771uVD6X6nnViv3GToPgb0QOVA8ivOQ==",
+ "version": "1.4.337",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.337.tgz",
+ "integrity": "sha512-W8gdzXG86mVPoc56eM8YA+QiLxaAxJ8cmDjxZgfhLLWVvZQxyA918w5tX2JEWApZta45T1/sYcmFHTsTOUE3nw==",
"dev": true
},
"elliptic": {
@@ -4431,9 +4761,9 @@
}
},
"enhanced-resolve": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
- "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
+ "version": "5.12.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
+ "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.4",
@@ -4538,13 +4868,18 @@
}
},
"eslint": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
- "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
+ "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
"dev": true,
"requires": {
- "@eslint/eslintrc": "^1.3.0",
- "@humanwhocodes/config-array": "^0.9.2",
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.0.1",
+ "@eslint/js": "8.36.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
@@ -4552,20 +4887,22 @@
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.1",
- "eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0",
- "espree": "^9.3.2",
- "esquery": "^1.4.0",
+ "espree": "^9.5.0",
+ "esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^6.0.1",
- "globals": "^13.15.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
@@ -4573,11 +4910,9 @@
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
- "regexpp": "^3.2.0",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
+ "text-table": "^0.2.0"
},
"dependencies": {
"ansi-styles": {
@@ -4636,10 +4971,20 @@
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"dev": true
},
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"globals": {
- "version": "13.15.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
- "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@@ -4651,6 +4996,15 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
"optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@@ -4665,6 +5019,24 @@
"word-wrap": "^1.2.3"
}
},
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -4694,15 +5066,6 @@
}
}
},
- "eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^2.0.0"
- }
- },
"eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
@@ -4710,12 +5073,12 @@
"dev": true
},
"espree": {
- "version": "9.3.2",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
- "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
+ "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
"dev": true,
"requires": {
- "acorn": "^8.7.1",
+ "acorn": "^8.8.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
},
@@ -4734,9 +5097,9 @@
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
"esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -4770,7 +5133,7 @@
"eventemitter2": {
"version": "0.4.14",
"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
- "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
+ "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==",
"dev": true
},
"eventemitter3": {
@@ -4827,51 +5190,52 @@
"exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
"dev": true
},
"expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
"dev": true,
"requires": {
"homedir-polyfill": "^1.0.1"
}
},
"express": {
- "version": "4.17.3",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
- "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
"dev": true,
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.19.2",
+ "body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.4.2",
+ "cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
- "depd": "~1.1.2",
+ "depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "~1.1.2",
+ "finalhandler": "1.2.0",
"fresh": "0.5.2",
+ "http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
- "on-finished": "~2.3.0",
+ "on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
- "qs": "6.9.7",
+ "qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.17.2",
- "serve-static": "1.14.2",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
"setprototypeof": "1.2.0",
- "statuses": "~1.5.0",
+ "statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
@@ -4880,7 +5244,7 @@
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"dev": true
},
"debug": {
@@ -4892,42 +5256,57 @@
"ms": "2.0.0"
}
},
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
- "dev": true
- },
- "http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"dev": true,
"requires": {
- "depd": "~1.1.2",
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "requires": {
+ "depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
- "statuses": ">= 1.5.0 < 2",
+ "statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
"qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
- "dev": true
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
},
"safe-buffer": {
"version": "5.2.1",
@@ -4935,52 +5314,17 @@
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
},
- "send": {
- "version": "0.17.2",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
- "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "1.8.1",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
- }
- },
- "serve-static": {
- "version": "1.14.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
- "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
- "dev": true,
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.2"
- }
- },
"setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true
}
}
},
@@ -5070,7 +5414,7 @@
"fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
"dev": true,
"requires": {
"pend": "~1.2.0"
@@ -5097,9 +5441,14 @@
"dev": true
},
"file-type": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
- "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw=="
+ "version": "16.5.4",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz",
+ "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==",
+ "requires": {
+ "readable-web-to-node-stream": "^3.0.0",
+ "strtok3": "^6.2.4",
+ "token-types": "^4.1.1"
+ }
},
"filelist": {
"version": "1.0.4",
@@ -5120,9 +5469,9 @@
}
},
"minimatch": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
- "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dev": true,
"requires": {
"brace-expansion": "^2.0.1"
@@ -5183,37 +5532,25 @@
}
},
"find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
- "locate-path": "^6.0.0",
+ "locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"findup-sync": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
- "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz",
+ "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==",
"dev": true,
"requires": {
- "glob": "~5.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "5.0.15",
- "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
- "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.4",
+ "resolve-dir": "^1.0.1"
}
},
"fined": {
@@ -5251,32 +5588,43 @@
}
},
"flatted": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
- "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
"dev": true
},
"follow-redirects": {
- "version": "1.14.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
- "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"dev": true
},
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
"dev": true
},
"for-own": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==",
"dev": true,
"requires": {
"for-in": "^1.0.1"
}
},
+ "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,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -5295,6 +5643,17 @@
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"dev": true
},
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
"fs-monkey": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
@@ -5319,12 +5678,6 @@
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
"gamma": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/gamma/-/gamma-1.0.0.tgz",
@@ -5448,7 +5801,7 @@
"global-prefix": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
"dev": true,
"requires": {
"expand-tilde": "^2.0.2",
@@ -5518,9 +5871,15 @@
}
},
"graceful-fs": {
- "version": "4.2.9",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
- "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"dev": true
},
"growl": {
@@ -5530,26 +5889,24 @@
"dev": true
},
"grunt": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz",
- "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz",
+ "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==",
"dev": true,
"requires": {
- "dateformat": "~3.0.3",
+ "dateformat": "~4.6.2",
"eventemitter2": "~0.4.13",
"exit": "~0.1.2",
- "findup-sync": "~0.3.0",
+ "findup-sync": "~5.0.0",
"glob": "~7.1.6",
"grunt-cli": "~1.4.3",
"grunt-known-options": "~2.0.0",
"grunt-legacy-log": "~3.0.0",
"grunt-legacy-util": "~2.0.1",
- "iconv-lite": "~0.4.13",
+ "iconv-lite": "~0.6.3",
"js-yaml": "~3.14.0",
"minimatch": "~3.0.4",
- "mkdirp": "~1.0.4",
- "nopt": "~3.0.6",
- "rimraf": "~3.0.2"
+ "nopt": "~3.0.6"
},
"dependencies": {
"argparse": {
@@ -5561,13 +5918,29 @@
"sprintf-js": "~1.0.2"
}
},
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "grunt-cli": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
+ "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
"dev": true,
"requires": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "grunt-known-options": "~2.0.0",
+ "interpret": "~1.1.0",
+ "liftup": "~3.0.1",
+ "nopt": "~4.0.1",
+ "v8flags": "~3.2.0"
+ },
+ "dependencies": {
+ "nopt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+ "dev": true,
+ "requires": {
+ "abbrev": "1",
+ "osenv": "^0.1.4"
+ }
+ }
}
},
"js-yaml": {
@@ -5592,7 +5965,7 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
}
}
@@ -5606,31 +5979,6 @@
"shelljs": "^0.5.3"
}
},
- "grunt-cli": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz",
- "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==",
- "dev": true,
- "requires": {
- "grunt-known-options": "~2.0.0",
- "interpret": "~1.1.0",
- "liftup": "~3.0.1",
- "nopt": "~4.0.1",
- "v8flags": "~3.2.0"
- },
- "dependencies": {
- "nopt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
- "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
- "dev": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- }
- }
- },
"grunt-concurrent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-3.0.0.tgz",
@@ -5757,9 +6105,9 @@
}
},
"grunt-eslint": {
- "version": "24.0.0",
- "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.0.tgz",
- "integrity": "sha512-WpTeBBFweyhMuPjGwRSQV9JFJ+EczIdlsc7Dd/1g78QVI1aZsk4g/H3e+3S5HEwsS1RKL2YZIrGj8hMLlBfN8w==",
+ "version": "24.0.1",
+ "resolved": "https://registry.npmjs.org/grunt-eslint/-/grunt-eslint-24.0.1.tgz",
+ "integrity": "sha512-gFzp+ikAkwyu6nqBE2zx1pLVL0JPrerG7jaO4uJV3XUGKPIipv4mfhDOS5MyiMrzUtGdXSW8FkRHjoUnfqbW+g==",
"dev": true,
"requires": {
"chalk": "^4.1.2",
@@ -5844,7 +6192,7 @@
"colors": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
- "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==",
"dev": true
}
}
@@ -5928,7 +6276,7 @@
"grunt-retro": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/grunt-retro/-/grunt-retro-0.6.4.tgz",
- "integrity": "sha1-8mqEj2pHl6X/foUOYCIMDea+jnI=",
+ "integrity": "sha512-kqnvNUAngOhkDckEQPYFDqNcRlculVp/Sy+gCe4ey7utM4BCaENVf2JfDeK488mj/0cgmAZyXwpW6w9l1OAxMg==",
"dev": true
},
"grunt-webpack": {
@@ -5942,13 +6290,13 @@
}
},
"grunt-zip": {
- "version": "0.18.2",
- "resolved": "https://registry.npmjs.org/grunt-zip/-/grunt-zip-0.18.2.tgz",
- "integrity": "sha512-9o0Fmft+7C9jBqqqQRAbon1Qaz4HHqHpNrDmrWVQy9nxC9/q8budlx+J6y9ZaCs3ioAKIJl7lfXWqoOJCMnXcQ==",
+ "version": "0.20.0",
+ "resolved": "https://registry.npmjs.org/grunt-zip/-/grunt-zip-0.20.0.tgz",
+ "integrity": "sha512-W1zoPEzOYVtw5oO5eXS67QJGPuw+VdP/RcZyUZSsXVkNMP7k19aArqLkNmUjbxsE//lkryg5RteX8qsn3LC1Rg==",
"dev": true,
"requires": {
"grunt-retro": "~0.6.0",
- "jszip": "~2.5.0"
+ "jszip": "~2.7.0"
}
},
"gzip-size": {
@@ -5994,7 +6342,7 @@
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"has-symbols": {
"version": "1.0.3",
@@ -6042,9 +6390,9 @@
"dev": true
},
"highlight.js": {
- "version": "11.5.1",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.5.1.tgz",
- "integrity": "sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q=="
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz",
+ "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ=="
},
"hmac-drbg": {
"version": "1.0.1",
@@ -6068,13 +6416,13 @@
"hooker": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
- "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
+ "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==",
"dev": true
},
"hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -6084,9 +6432,9 @@
},
"dependencies": {
"readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -6109,6 +6457,15 @@
}
}
},
+ "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,
+ "requires": {
+ "whatwg-encoding": "^2.0.0"
+ }
+ },
"html-entities": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
@@ -6166,7 +6523,7 @@
"http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
"dev": true
},
"http-errors": {
@@ -6212,10 +6569,21 @@
"requires-port": "^1.0.0"
}
},
+ "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,
+ "requires": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
"http-proxy-middleware": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
- "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+ "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
"dev": true,
"requires": {
"@types/http-proxy": "^1.17.8",
@@ -6240,9 +6608,9 @@
"dev": true
},
"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",
@@ -6335,27 +6703,19 @@
}
},
"imports-loader": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-4.0.0.tgz",
- "integrity": "sha512-8PPbhk/9CEHd0WWKESw/oYTDhp3So9PWA9OfyIbH3kywIN4uxrWkQ8ux47xpk4yWUKX97Erbws9MFSaBlVvAjg==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-4.0.1.tgz",
+ "integrity": "sha512-ZiY+1xH5fqAJ1Qu1CFv+zw54rvPCC92DdYRDe0IIUboOhbJPLfOPbF/paA2iipelvMwjQUKWydcFOJ7f1+ZFcA==",
"dev": true,
"requires": {
"source-map": "^0.6.1",
"strip-comments": "^2.0.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
}
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
"dev": true
},
"indent-string": {
@@ -6393,7 +6753,7 @@
"interpret": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
- "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==",
"dev": true
},
"invariant": {
@@ -6439,7 +6799,7 @@
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true
},
"is-binary-path": {
@@ -6452,9 +6812,9 @@
}
},
"is-core-module": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
- "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
"requires": {
"has": "^1.0.3"
}
@@ -6474,9 +6834,9 @@
"dev": true
},
"is-electron": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.1.tgz",
- "integrity": "sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw=="
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz",
+ "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="
},
"is-extglob": {
"version": "2.1.1",
@@ -6525,18 +6885,18 @@
"lodash.isfinite": "^3.3.2"
}
},
- "is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
- "dev": true
- },
"is-path-inside": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true
},
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -6546,6 +6906,12 @@
"isobject": "^3.0.1"
}
},
+ "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
+ },
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -6603,9 +6969,9 @@
"dev": true
},
"is2": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz",
- "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==",
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz",
+ "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==",
"dev": true,
"requires": {
"deep-is": "^0.1.3",
@@ -6622,13 +6988,13 @@
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
"dev": true
},
"isstream": {
@@ -6729,14 +7095,14 @@
}
},
"jimp": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz",
- "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==",
+ "version": "0.16.13",
+ "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.13.tgz",
+ "integrity": "sha512-Bxz8q7V4rnCky9A0ktTNGA9SkNFVWRHodddI/DaAWZJzF7sVUlFYKQ60y9JGqrKpi48ECA/TnfMzzc5C70VByA==",
"requires": {
"@babel/runtime": "^7.7.2",
- "@jimp/custom": "^0.16.1",
- "@jimp/plugins": "^0.16.1",
- "@jimp/types": "^0.16.1",
+ "@jimp/custom": "^0.16.13",
+ "@jimp/plugins": "^0.16.13",
+ "@jimp/types": "^0.16.13",
"regenerator-runtime": "^0.13.3"
}
},
@@ -6746,15 +7112,21 @@
"integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="
},
"jquery": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
- "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
+ "version": "3.6.4",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.4.tgz",
+ "integrity": "sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ=="
},
"js-crc": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/js-crc/-/js-crc-0.2.0.tgz",
"integrity": "sha1-9yxcdhgXa/91zIEqHO2949jraDk="
},
+ "js-sdsl": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz",
+ "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==",
+ "dev": true
+ },
"js-sha3": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
@@ -6774,6 +7146,68 @@
"argparse": "^2.0.1"
}
},
+ "jsdom": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz",
+ "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.5",
+ "acorn": "^8.5.0",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.1",
+ "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.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "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": "^10.0.0",
+ "ws": "^8.2.3",
+ "xml-name-validator": "^4.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,
+ "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
+ },
+ "whatwg-url": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz",
+ "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==",
+ "dev": true,
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ }
+ }
+ }
+ },
"jsesc": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
@@ -6794,13 +7228,23 @@
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"dev": true
},
"json5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
- "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
},
"jsonpath-plus": {
"version": "7.2.0",
@@ -6837,25 +7281,17 @@
"integrity": "sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A=="
},
"jsrsasign": {
- "version": "10.5.27",
- "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.5.27.tgz",
- "integrity": "sha512-1F4LmDeJZHYwoVvB44jEo2uZL3XuwYNzXCDOu53Ui6vqofGQ/gCYDmaxfVZtN0TGd92UKXr/BONcfrPonUIcQQ=="
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.7.0.tgz",
+ "integrity": "sha512-D5V2gGpYGtwbAtQHoglTVrpYf7QJuNoPEhaLOsTFONS2jXUl3qyR1hnYrNpASAybqQeiDYA3zGthR0ubgPRoQA=="
},
"jszip": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz",
- "integrity": "sha512-IRoyf8JSYY3nx+uyh5xPc0qdy8pUDTp2UkHOWYNF/IO/3D8nx7899UlSAjD8rf8wUgOmm0lACWx/GbW3EaxIXQ==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.7.0.tgz",
+ "integrity": "sha512-JIsRKRVC3gTRo2vM4Wy9WBC3TRcfnIZU8k65Phi3izkvPH975FowRYtKGT6PxevA0XnJ/yO8b0QwV0ydVyQwfw==",
"dev": true,
"requires": {
- "pako": "~0.2.5"
- },
- "dependencies": {
- "pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
- "dev": true
- }
+ "pako": "~1.0.2"
}
},
"jwa": {
@@ -6922,9 +7358,9 @@
"dev": true
},
"klona": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
- "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
"dev": true
},
"levn": {
@@ -7022,9 +7458,9 @@
}
},
"loader-runner": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
- "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"dev": true
},
"loader-utils": {
@@ -7039,12 +7475,12 @@
}
},
"locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^5.0.0"
+ "p-locate": "^4.1.0"
}
},
"lodash": {
@@ -7055,19 +7491,19 @@
"lodash._arraycopy": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz",
- "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=",
+ "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==",
"dev": true
},
"lodash._arrayeach": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz",
- "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=",
+ "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==",
"dev": true
},
"lodash._baseassign": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
- "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==",
"dev": true,
"requires": {
"lodash._basecopy": "^3.0.0",
@@ -7077,7 +7513,7 @@
"lodash._baseclone": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz",
- "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=",
+ "integrity": "sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==",
"dev": true,
"requires": {
"lodash._arraycopy": "^3.0.0",
@@ -7091,37 +7527,37 @@
"lodash._basecopy": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==",
"dev": true
},
"lodash._basefor": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz",
- "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=",
+ "integrity": "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==",
"dev": true
},
"lodash._bindcallback": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
- "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
+ "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==",
"dev": true
},
"lodash._getnative": {
"version": "3.9.1",
"resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==",
"dev": true
},
"lodash._isiterateecall": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==",
"dev": true
},
"lodash.clone": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz",
- "integrity": "sha1-hGiMc9MrWpDKJWFpY/GJJSqZcEM=",
+ "integrity": "sha512-yVYPpFTdZDCLG2p07gVRTvcwN5X04oj2hu4gG6r0fer58JA08wAVxXzWM+CmmxO2bzOH8u8BkZTZqgX6juVF7A==",
"dev": true,
"requires": {
"lodash._baseclone": "^3.0.0",
@@ -7132,7 +7568,7 @@
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true
},
"lodash.defaultsdeep": {
@@ -7141,6 +7577,12 @@
"integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
"dev": true
},
+ "lodash.escape": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
+ "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
+ "dev": true
+ },
"lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
@@ -7149,13 +7591,13 @@
"lodash.isarguments": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==",
"dev": true
},
"lodash.isarray": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==",
"dev": true
},
"lodash.isboolean": {
@@ -7192,7 +7634,7 @@
"lodash.keys": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==",
"dev": true,
"requires": {
"lodash._getnative": "^3.0.0",
@@ -7211,6 +7653,12 @@
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
},
+ "lodash.pick": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+ "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==",
+ "dev": true
+ },
"log-symbols": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -7273,9 +7721,9 @@
}
},
"loglevel": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz",
- "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA=="
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
+ "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg=="
},
"loglevel-message-prefix": {
"version": "3.0.0",
@@ -7287,9 +7735,9 @@
}
},
"long": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
- "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz",
+ "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A=="
},
"loose-envify": {
"version": "1.4.0",
@@ -7319,18 +7767,18 @@
}
},
"lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"requires": {
- "yallist": "^4.0.0"
+ "yallist": "^3.0.2"
}
},
"lz-string": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz",
- "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ=="
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="
},
"lz4js": {
"version": "0.2.0",
@@ -7358,7 +7806,7 @@
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
"dev": true
},
"markdown-it": {
@@ -7398,22 +7846,22 @@
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true
},
"memfs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
- "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
+ "version": "3.4.13",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz",
+ "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==",
"dev": true,
"requires": {
- "fs-monkey": "1.0.3"
+ "fs-monkey": "^1.0.3"
}
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
"dev": true
},
"merge-stream": {
@@ -7431,7 +7879,7 @@
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"dev": true
},
"micromatch": {
@@ -7489,59 +7937,18 @@
"min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+ "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
"requires": {
"dom-walk": "^0.1.0"
}
},
"mini-css-extract-plugin": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz",
- "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==",
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.3.tgz",
+ "integrity": "sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w==",
"dev": true,
"requires": {
"schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
}
},
"minimalistic-assert": {
@@ -7568,16 +7975,10 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
"mkpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz",
- "integrity": "sha1-67Opd+evHGg65v2hK1Raa6bFhT0=",
+ "integrity": "sha512-PbNHr7Y/9Y/2P5pKFv5XOGBfNQqZ+fdiHWcuf7swLACN5ZW5LU7J5tMU8LSBjpluAxAxKYGD9nnaIbdRy9+m1w==",
"dev": true
},
"mocha": {
@@ -7641,6 +8042,16 @@
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
"glob": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
@@ -7672,6 +8083,15 @@
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
"minimatch": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz",
@@ -7687,6 +8107,30 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true
},
+ "nanoid": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+ "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
"supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -7727,11 +8171,11 @@
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
"moment-timezone": {
- "version": "0.5.37",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.37.tgz",
- "integrity": "sha512-uEDzDNFhfaywRl+vwXxffjjq1q0Vzr+fcQpQ1bU0kbzorfS7zVtZnCnGc8mhWmF39d4g4YriF6kwA75mJKE/Zg==",
+ "version": "0.5.41",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.41.tgz",
+ "integrity": "sha512-e0jGNZDOHfBXJGz8vR/sIMXvBIGJJcqFjmlg9lmE+5KX1U7/RZNMswfD8nKnNCnQdKTIj50IaRKwl1fvMLyyRg==",
"requires": {
- "moment": ">= 2.9.0"
+ "moment": "^2.29.4"
}
},
"more-entropy": {
@@ -7773,9 +8217,9 @@
}
},
"mrmime": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz",
- "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
"dev": true
},
"ms": {
@@ -7800,15 +8244,15 @@
"dev": true
},
"nanoid": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
- "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"dev": true
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"negotiator": {
@@ -7829,33 +8273,44 @@
"integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw=="
},
"nightwatch": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-2.1.7.tgz",
- "integrity": "sha512-NUOMAT4v52/byBYukrZYPHZlw42XYPzU7K17bGJrTSgZcZ6U2rn2Xqjmi+WgUbKiYCFJXGS1VX0VoOljVOjgYQ==",
+ "version": "2.6.19",
+ "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-2.6.19.tgz",
+ "integrity": "sha512-AxuPEWlf+MCfo4tZ0BFKkxqUIL0x/jZeFSvxV7Wwp/sBM8XmVA1rEEhNe/pCVsyjL+Q4G97rMKTonFYF/aXsBw==",
"dev": true,
"requires": {
"@nightwatch/chai": "5.0.2",
+ "@nightwatch/html-reporter-template": "0.1.4",
+ "ansi-to-html": "0.7.2",
"assertion-error": "1.1.0",
"boxen": "5.1.2",
"chai-nightwatch": "0.5.3",
"ci-info": "3.3.0",
+ "cli-table3": "^0.6.3",
"didyoumean": "1.2.2",
"dotenv": "10.0.0",
- "ejs": "^3.1.8",
+ "ejs": "3.1.8",
"envinfo": "7.8.1",
+ "fs-extra": "^10.1.0",
"glob": "^7.2.3",
+ "jsdom": "19.0.0",
"lodash.clone": "3.0.3",
"lodash.defaultsdeep": "4.6.1",
+ "lodash.escape": "4.0.1",
"lodash.merge": "4.6.2",
- "minimatch": "3.0.4",
+ "lodash.pick": "4.4.0",
+ "minimatch": "3.1.2",
"minimist": "1.2.6",
"mkpath": "1.0.0",
"mocha": "9.2.2",
+ "nightwatch-axe-verbose": "^2.1.0",
+ "open": "8.4.0",
"ora": "5.4.1",
- "selenium-webdriver": "4.1.1",
+ "selenium-webdriver": "4.6.1",
"semver": "7.3.5",
- "stacktrace-parser": "^0.1.10",
- "strip-ansi": "6.0.1"
+ "stacktrace-parser": "0.1.10",
+ "strip-ansi": "6.0.1",
+ "untildify": "^4.0.0",
+ "uuid": "8.3.2"
},
"dependencies": {
"glob": {
@@ -7870,26 +8325,15 @@
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
- },
- "dependencies": {
- "minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- }
}
},
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
- "brace-expansion": "^1.1.7"
+ "yallist": "^4.0.0"
}
},
"semver": {
@@ -7900,9 +8344,30 @@
"requires": {
"lru-cache": "^6.0.0"
}
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
+ "nightwatch-axe-verbose": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/nightwatch-axe-verbose/-/nightwatch-axe-verbose-2.2.0.tgz",
+ "integrity": "sha512-Dh2ctNE0aDCzE1H3T7PWINcx+Tz/bJUMKmwmyFLKeoo9Y0FYk/pKxs43Povyh+0RrXWx8bYyF1FZHSAQT+0jEw==",
+ "dev": true,
+ "requires": {
+ "axe-core": "^4.6.3"
+ }
+ },
"no-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
@@ -7914,9 +8379,9 @@
}
},
"node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+ "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
"requires": {
"whatwg-url": "^5.0.0"
}
@@ -7984,9 +8449,9 @@
"integrity": "sha1-9WH0WyszY1K4KXbFHMoRR9U5N/U="
},
"node-releases": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
- "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
"dev": true
},
"nodom": {
@@ -8002,7 +8467,7 @@
"nopt": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
"dev": true,
"requires": {
"abbrev": "1"
@@ -8017,7 +8482,7 @@
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true
},
"notepack.io": {
@@ -8053,12 +8518,24 @@
"resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
"integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ=="
},
+ "nwsapi": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
+ "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==",
+ "dev": true
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
+ "object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "dev": true
+ },
"object-is": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
@@ -8088,7 +8565,7 @@
"object.defaults": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==",
"dev": true,
"requires": {
"array-each": "^1.0.1",
@@ -8100,7 +8577,7 @@
"object.map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==",
"dev": true,
"requires": {
"for-own": "^1.0.0",
@@ -8110,7 +8587,7 @@
"object.pick": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
"dev": true,
"requires": {
"isobject": "^3.0.1"
@@ -8310,13 +8787,13 @@
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
"dev": true
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
"dev": true
},
"osenv": {
@@ -8338,48 +8815,31 @@
}
},
"p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "yocto-queue": "^0.1.0"
+ "p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^3.0.2"
- }
- },
- "p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "requires": {
- "aggregate-error": "^3.0.0"
+ "p-limit": "^2.2.0"
}
},
"p-retry": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
- "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
"dev": true,
"requires": {
- "@types/retry": "^0.12.0",
+ "@types/retry": "0.12.0",
"retry": "^0.13.1"
- },
- "dependencies": {
- "retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "dev": true
- }
}
},
"p-try": {
@@ -8438,12 +8898,12 @@
"parse-bmfont-ascii": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
- "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU="
+ "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="
},
"parse-bmfont-binary": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
- "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY="
+ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="
},
"parse-bmfont-xml": {
"version": "1.1.4",
@@ -8457,7 +8917,7 @@
"parse-filepath": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==",
"dev": true,
"requires": {
"is-absolute": "^1.0.0",
@@ -8485,7 +8945,13 @@
"parse-passwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+ "dev": true
+ },
+ "parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
"dev": true
},
"parseurl": {
@@ -8539,7 +9005,7 @@
"path-root": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==",
"dev": true,
"requires": {
"path-root-regex": "^0.1.0"
@@ -8548,13 +9014,13 @@
"path-root-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==",
"dev": true
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
"dev": true
},
"path-type": {
@@ -8581,10 +9047,15 @@
"sha.js": "^2.4.8"
}
},
+ "peek-readable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
+ "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="
+ },
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
"dev": true
},
"pgp-utils": {
@@ -8616,13 +9087,13 @@
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"dev": true
},
"pixelmatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
- "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=",
+ "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
"requires": {
"pngjs": "^3.0.0"
}
@@ -8634,45 +9105,6 @@
"dev": true,
"requires": {
"find-up": "^4.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- }
}
},
"pngjs": {
@@ -8707,22 +9139,14 @@
}
},
"postcss": {
- "version": "8.4.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
- "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
+ "version": "8.4.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+ "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
"dev": true,
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
- },
- "dependencies": {
- "nanoid": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
- "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
- "dev": true
- }
}
},
"postcss-css-variables": {
@@ -8737,9 +9161,9 @@
}
},
"postcss-import": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
- "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"dev": true,
"requires": {
"postcss-value-parser": "^4.0.0",
@@ -8748,24 +9172,39 @@
}
},
"postcss-loader": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz",
- "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.1.0.tgz",
+ "integrity": "sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw==",
"dev": true,
"requires": {
- "cosmiconfig": "^7.0.0",
- "klona": "^2.0.5",
- "semver": "^7.3.7"
+ "cosmiconfig": "^8.0.0",
+ "klona": "^2.0.6",
+ "semver": "^7.3.8"
},
"dependencies": {
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"semver": {
- "version": "7.3.7",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
- "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
@@ -8805,9 +9244,9 @@
}
},
"postcss-selector-parser": {
- "version": "6.0.9",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
- "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+ "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
@@ -8866,9 +9305,9 @@
}
},
"protobufjs": {
- "version": "6.11.3",
- "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
- "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz",
+ "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==",
"requires": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
@@ -8880,9 +9319,8 @@
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
"@protobufjs/utf8": "^1.1.0",
- "@types/long": "^4.0.1",
"@types/node": ">=13.7.0",
- "long": "^4.0.0"
+ "long": "^5.0.0"
}
},
"proxy-addr": {
@@ -8909,6 +9347,12 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true
},
+ "psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
+ "dev": true
+ },
"public-encrypt": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
@@ -8990,6 +9434,12 @@
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
"dev": true
},
+ "querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
"queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -9049,7 +9499,7 @@
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dev": true,
"requires": {
"pify": "^2.3.0"
@@ -9065,6 +9515,14 @@
"util-deprecate": "^1.0.1"
}
},
+ "readable-web-to-node-stream": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
+ "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==",
+ "requires": {
+ "readable-stream": "^3.6.0"
+ }
+ },
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -9095,9 +9553,9 @@
"dev": true
},
"regenerate-unicode-properties": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz",
- "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==",
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+ "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
"dev": true,
"requires": {
"regenerate": "^1.4.2"
@@ -9109,9 +9567,9 @@
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
},
"regenerator-transform": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
- "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+ "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
"dev": true,
"requires": {
"@babel/runtime": "^7.8.4"
@@ -9126,36 +9584,24 @@
"define-properties": "^1.1.3"
}
},
- "regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true
- },
"regexpu-core": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
- "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+ "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
"dev": true,
"requires": {
+ "@babel/regjsgen": "^0.8.0",
"regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.0.1",
- "regjsgen": "^0.6.0",
- "regjsparser": "^0.8.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
"unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.0.0"
+ "unicode-match-property-value-ecmascript": "^2.1.0"
}
},
- "regjsgen": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz",
- "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==",
- "dev": true
- },
"regjsparser": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz",
- "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==",
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
"dev": true,
"requires": {
"jsesc": "~0.5.0"
@@ -9164,7 +9610,7 @@
"jsesc": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
"dev": true
}
}
@@ -9191,7 +9637,7 @@
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true
},
"require-from-string": {
@@ -9203,15 +9649,15 @@
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true
},
"resolve": {
- "version": "1.22.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
- "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"requires": {
- "is-core-module": "^2.8.1",
+ "is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
@@ -9219,7 +9665,7 @@
"resolve-dir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
"dev": true,
"requires": {
"expand-tilde": "^2.0.0",
@@ -9235,7 +9681,7 @@
"resolve-url": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="
},
"restore-cursor": {
"version": "3.1.0",
@@ -9247,6 +9693,12 @@
"signal-exit": "^3.0.2"
}
},
+ "retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true
+ },
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -9294,7 +9746,7 @@
"rw": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
- "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
},
"safe-buffer": {
"version": "5.1.2",
@@ -9317,15 +9769,54 @@
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
- "schema-utils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
- "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.5",
- "ajv": "^6.12.4",
- "ajv-keywords": "^3.5.2"
+ "xmlchars": "^2.2.0"
+ }
+ },
+ "schema-utils": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+ "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.8.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.3"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ }
}
},
"scryptsy": {
@@ -9336,24 +9827,24 @@
"select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
"dev": true
},
"selenium-webdriver": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.1.1.tgz",
- "integrity": "sha512-Fr9e9LC6zvD6/j7NO8M1M/NVxFX67abHcxDJoP5w2KN/Xb1SyYLjMVPGgD14U2TOiKe4XKHf42OmFw9g2JgCBQ==",
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.6.1.tgz",
+ "integrity": "sha512-FT8Dw0tbzaTp8YYLuwhaCnve/nw03HKrOJrA3aUmTKmxaIFSP4kT2R5fN3K0RpV5kbR0ZnM4FGVI2vANBvekaA==",
"dev": true,
"requires": {
- "jszip": "^3.6.0",
+ "jszip": "^3.10.0",
"tmp": "^0.2.1",
- "ws": ">=7.4.6"
+ "ws": ">=8.7.0"
},
"dependencies": {
"jszip": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.0.tgz",
- "integrity": "sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q==",
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"dev": true,
"requires": {
"lie": "~3.3.0",
@@ -9363,9 +9854,9 @@
}
},
"readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -9389,9 +9880,9 @@
}
},
"selfsigned": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz",
- "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
+ "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
"dev": true,
"requires": {
"node-forge": "^1"
@@ -9578,6 +10069,17 @@
"integrity": "sha512-C2FisSSW8S6TIYHHiMHN0NqzdjWfTekdMpA2FJTbRWnQMLO1RRIXEB9eVZYOlofYmjZA7fY3ChoFu09MeI3wlQ==",
"dev": true
},
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
"signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -9607,12 +10109,6 @@
"sax": "^1.2.4"
}
},
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
"snackbarjs": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/snackbarjs/-/snackbarjs-1.1.0.tgz",
@@ -9651,6 +10147,12 @@
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz",
"integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w=="
},
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -9665,14 +10167,6 @@
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.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==",
- "dev": true
- }
}
},
"spdy": {
@@ -9830,6 +10324,21 @@
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
},
+ "strtok3": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz",
+ "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==",
+ "requires": {
+ "@tokenizer/token": "^0.3.0",
+ "peek-readable": "^4.1.0"
+ }
+ },
+ "style-mod": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.2.tgz",
+ "integrity": "sha512-C4myMmRTO8iaC5Gg+N1ftK2WT4eXUTMAa+HEFPPrfVeO/NtqLTtAmV1HbqnuGtLwCek44Ra76fdGUkSqjiMPcQ==",
+ "dev": true
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -9843,6 +10352,12 @@
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
+ "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
+ },
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -9871,9 +10386,9 @@
}
},
"terser": {
- "version": "5.15.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
- "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
+ "version": "5.16.6",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.6.tgz",
+ "integrity": "sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==",
"dev": true,
"requires": {
"@jridgewell/source-map": "^0.3.2",
@@ -9891,16 +10406,16 @@
}
},
"terser-webpack-plugin": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
- "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
+ "version": "5.3.7",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz",
+ "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==",
"dev": true,
"requires": {
+ "@jridgewell/trace-mapping": "^0.3.17",
"jest-worker": "^27.4.5",
"schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.0",
- "source-map": "^0.6.1",
- "terser": "^5.7.2"
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.16.5"
},
"dependencies": {
"schema-utils": {
@@ -9914,18 +10429,21 @@
"ajv-keywords": "^3.5.2"
}
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
}
}
},
"tesseract.js": {
- "version": "3.0.2",
- "resolved": "https://packages.atlassian.com/api/npm/npm-remote/tesseract.js/-/tesseract.js-3.0.2.tgz",
- "integrity": "sha512-pCJErD08bl5tD7Tswu5BhN041RxAUPdXqoNVrfICghhKEneXI5f+8/59MNvLQWUY/FJrbXEen3j6J6N+PN0I8w==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tesseract.js/-/tesseract.js-3.0.3.tgz",
+ "integrity": "sha512-eZ1+OGWvF5IMExAzIwnDf3S3kf2FeC+i4qrMTRvBSlZeHc3ONy0vCmaKmBQz6scjB6C1W2w2x0r4lCEh95qBnw==",
"requires": {
"babel-eslint": "^10.1.0",
"bmp-js": "^0.1.0",
@@ -9937,7 +10455,7 @@
"opencollective-postinstall": "^2.0.2",
"regenerator-runtime": "^0.13.3",
"resolve-url": "^0.2.1",
- "tesseract.js-core": "^3.0.1",
+ "tesseract.js-core": "^3.0.2",
"wasm-feature-detect": "^1.2.11",
"zlibjs": "^0.3.1"
},
@@ -9950,14 +10468,14 @@
}
},
"tesseract.js-core": {
- "version": "3.0.1",
- "resolved": "https://packages.atlassian.com/api/npm/npm-remote/tesseract.js-core/-/tesseract.js-core-3.0.1.tgz",
- "integrity": "sha512-kcEGcZG4Vl8tmdsPgLacPYoXFRo8IhG9SQxTLbK/6vG+aVTwD89voIJs1KgL3x+RcWDR7sNmd2sMVcpgcLBMMg=="
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-3.0.2.tgz",
+ "integrity": "sha512-2fD76ka9nO/C616R0fq+M9Zu91DA3vEfyozp0jlxaJOBmpfeprtgRP3cqVweZh2darE1kK/DazoxZ65g7WU99Q=="
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"thirty-two": {
@@ -10047,9 +10565,9 @@
}
},
"tinycolor2": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
- "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
},
"tmp": {
"version": "0.2.1",
@@ -10063,7 +10581,7 @@
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
},
"to-regex-range": {
"version": "5.0.1",
@@ -10080,16 +10598,45 @@
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true
},
+ "token-types": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz",
+ "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==",
+ "requires": {
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
+ }
+ },
"totalist": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
"integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==",
"dev": true
},
+ "tough-cookie": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+ "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true
+ }
+ }
+ },
"tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
"triplesec": {
"version": "4.0.3",
@@ -10147,9 +10694,9 @@
}
},
"ua-parser-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz",
- "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg=="
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.34.tgz",
+ "integrity": "sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew=="
},
"uc.micro": {
"version": "1.0.6",
@@ -10175,7 +10722,7 @@
"unc-path-regex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==",
"dev": true
},
"underscore.string": {
@@ -10205,15 +10752,21 @@
}
},
"unicode-match-property-value-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
- "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
"dev": true
},
"unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true
+ },
+ "universalify": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
},
"unorm": {
@@ -10227,6 +10780,22 @@
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"dev": true
},
+ "untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -10254,6 +10823,16 @@
}
}
},
+ "url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "requires": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
"utf8": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
@@ -10304,12 +10883,6 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
"integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
},
- "v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
- },
"v8flags": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
@@ -10322,7 +10895,7 @@
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true
},
"vkbeautify": {
@@ -10330,15 +10903,39 @@
"resolved": "https://registry.npmjs.org/vkbeautify/-/vkbeautify-0.99.3.tgz",
"integrity": "sha512-2ozZEFfmVvQcHWoHLNuiKlUfDKlhh4KGsy54U0UrlLMR1SO+XKAIDqBxtBwHgNrekurlJwE8A9K6L49T78ZQ9Q=="
},
+ "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,
+ "requires": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "w3c-keyname": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz",
+ "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "xml-name-validator": "^4.0.0"
+ }
+ },
"wasm-feature-detect": {
- "version": "1.2.11",
- "resolved": "https://packages.atlassian.com/api/npm/npm-remote/wasm-feature-detect/-/wasm-feature-detect-1.2.11.tgz",
- "integrity": "sha512-HUqwaodrQGaZgz1lZaNioIkog9tkeEJjrM3eq4aUL04whXOVDRc/o2EGb/8kV0QX411iAYWEqq7fMBmJ6dKS6w=="
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/wasm-feature-detect/-/wasm-feature-detect-1.5.1.tgz",
+ "integrity": "sha512-GHr23qmuehNXHY4902/hJ6EV5sUANIJC3R/yMfQ7hWDg3nfhlcJfnIL96R2ohpIwa62araN6aN4bLzzzq5GXkg=="
},
"watchpack": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
- "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
"dev": true,
"requires": {
"glob-to-regexp": "^0.4.1",
@@ -10357,7 +10954,7 @@
"wcwidth": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"dev": true,
"requires": {
"defaults": "^1.0.3"
@@ -10366,12 +10963,12 @@
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
},
"webpack": {
- "version": "5.73.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
- "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
+ "version": "5.76.3",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz",
+ "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==",
"dev": true,
"requires": {
"@types/eslint-scope": "^3.7.3",
@@ -10379,11 +10976,11 @@
"@webassemblyjs/ast": "1.11.1",
"@webassemblyjs/wasm-edit": "1.11.1",
"@webassemblyjs/wasm-parser": "1.11.1",
- "acorn": "^8.4.1",
+ "acorn": "^8.7.1",
"acorn-import-assertions": "^1.7.6",
"browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.9.3",
+ "enhanced-resolve": "^5.10.0",
"es-module-lexer": "^0.9.0",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
@@ -10396,7 +10993,7 @@
"schema-utils": "^3.1.0",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.1.3",
- "watchpack": "^2.3.1",
+ "watchpack": "^2.4.0",
"webpack-sources": "^3.2.3"
},
"dependencies": {
@@ -10420,11 +11017,12 @@
}
},
"webpack-bundle-analyzer": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz",
- "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==",
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz",
+ "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==",
"dev": true,
"requires": {
+ "@discoveryjs/json-ext": "0.5.7",
"acorn": "^8.0.4",
"acorn-walk": "^8.0.0",
"chalk": "^4.1.0",
@@ -10436,6 +11034,12 @@
"ws": "^7.3.1"
},
"dependencies": {
+ "acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true
+ },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -10486,77 +11090,37 @@
}
},
"ws": {
- "version": "7.5.7",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
- "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
"dev": true
}
}
},
"webpack-dev-middleware": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
- "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
+ "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
"dev": true,
"requires": {
"colorette": "^2.0.10",
- "memfs": "^3.4.1",
+ "memfs": "^3.4.3",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
"schema-utils": "^4.0.0"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
}
},
"webpack-dev-server": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz",
- "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz",
+ "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==",
"dev": true,
"requires": {
"@types/bonjour": "^3.5.9",
"@types/connect-history-api-fallback": "^1.3.5",
"@types/express": "^4.17.13",
"@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
"@types/sockjs": "^0.3.33",
"@types/ws": "^8.5.1",
"ansi-html-community": "^0.0.8",
@@ -10564,7 +11128,7 @@
"chokidar": "^3.5.3",
"colorette": "^2.0.10",
"compression": "^1.7.4",
- "connect-history-api-fallback": "^1.6.0",
+ "connect-history-api-fallback": "^2.0.0",
"default-gateway": "^6.0.3",
"express": "^4.17.3",
"graceful-fs": "^4.2.6",
@@ -10575,53 +11139,12 @@
"p-retry": "^4.5.0",
"rimraf": "^3.0.2",
"schema-utils": "^4.0.0",
- "selfsigned": "^2.0.1",
+ "selfsigned": "^2.1.1",
"serve-index": "^1.9.1",
"sockjs": "^0.3.24",
"spdy": "^4.0.2",
"webpack-dev-middleware": "^5.3.1",
"ws": "^8.4.2"
- },
- "dependencies": {
- "ajv": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
- "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.3"
- }
- },
- "json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true
- },
- "schema-utils": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
- "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.8.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.0.0"
- }
- }
}
},
"webpack-node-externals": {
@@ -10704,10 +11227,25 @@
}
}
},
+ "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": "5.0.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
"requires": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -10837,9 +11375,9 @@
"dev": true
},
"ws": {
- "version": "8.5.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
- "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
"dev": true
},
"xhr": {
@@ -10853,10 +11391,16 @@
"xtend": "^4.0.0"
}
},
+ "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
+ },
"xml-parse-from-string": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
- "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig="
+ "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="
},
"xml2js": {
"version": "0.4.23",
@@ -10872,6 +11416,12 @@
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
},
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
+ },
"xmldom": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.6.0.tgz",
@@ -10883,11 +11433,11 @@
"integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw=="
},
"xregexp": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.0.tgz",
- "integrity": "sha512-PynwUWtXnSZr8tpQlDPMZfPTyv78EYuA4oI959ukxcQ0a9O/lvndLVKy5wpImzzA26eMxpZmnAXJYiQA13AtWA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.1.tgz",
+ "integrity": "sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==",
"requires": {
- "@babel/runtime-corejs3": "^7.14.9"
+ "@babel/runtime-corejs3": "^7.16.5"
}
},
"xtend": {
@@ -10902,15 +11452,9 @@
"dev": true
},
"yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
"yargs": {
@@ -10944,26 +11488,12 @@
"decamelize": "^4.0.0",
"flat": "^5.0.2",
"is-plain-obj": "^2.1.0"
- },
- "dependencies": {
- "decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true
- },
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
- "dev": true
- }
}
},
"yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
"dev": true,
"requires": {
"buffer-crc32": "~0.2.3",
diff --git a/package.json b/package.json
index 866bceee..cb9762ad 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "cyberchef",
- "version": "9.55.0",
+ "version": "10.2.0",
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
"author": "n1474335
",
"homepage": "https://gchq.github.io/CyberChef",
@@ -39,49 +39,54 @@
"node >= 16"
],
"devDependencies": {
- "@babel/core": "^7.18.2",
- "@babel/eslint-parser": "^7.18.2",
- "@babel/plugin-syntax-import-assertions": "^7.17.12",
- "@babel/plugin-transform-runtime": "^7.18.2",
- "@babel/preset-env": "^7.18.2",
- "@babel/runtime": "^7.18.3",
- "autoprefixer": "^10.4.7",
- "babel-loader": "^8.2.5",
+ "@babel/core": "^7.21.0",
+ "@babel/eslint-parser": "^7.19.1",
+ "@babel/plugin-syntax-import-assertions": "^7.20.0",
+ "@babel/plugin-transform-runtime": "^7.21.0",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/runtime": "^7.21.0",
+ "@codemirror/commands": "^6.2.1",
+ "@codemirror/language": "^6.6.0",
+ "@codemirror/search": "^6.2.3",
+ "@codemirror/state": "^6.2.0",
+ "@codemirror/view": "^6.9.2",
+ "autoprefixer": "^10.4.13",
+ "babel-loader": "^9.1.2",
"babel-plugin-dynamic-import-node": "^2.3.3",
"babel-plugin-transform-builtin-extend": "1.1.2",
- "chromedriver": "^103.0.0",
- "cli-progress": "^3.11.1",
+ "chromedriver": "^110.0.0",
+ "cli-progress": "^3.12.0",
"colors": "^1.4.0",
"copy-webpack-plugin": "^11.0.0",
- "core-js": "^3.22.8",
- "css-loader": "6.7.1",
- "eslint": "^8.16.0",
- "grunt": "^1.5.3",
+ "core-js": "^3.29.0",
+ "css-loader": "6.7.3",
+ "eslint": "^8.35.0",
+ "grunt": "^1.6.1",
"grunt-chmod": "~1.1.1",
"grunt-concurrent": "^3.0.0",
"grunt-contrib-clean": "~2.0.1",
"grunt-contrib-connect": "^3.0.0",
"grunt-contrib-copy": "~1.0.0",
"grunt-contrib-watch": "^1.1.0",
- "grunt-eslint": "^24.0.0",
+ "grunt-eslint": "^24.0.1",
"grunt-exec": "~3.0.0",
"grunt-webpack": "^5.0.0",
- "grunt-zip": "^0.18.2",
+ "grunt-zip": "^0.20.0",
"html-webpack-plugin": "^5.5.0",
- "imports-loader": "^4.0.0",
- "mini-css-extract-plugin": "2.6.0",
+ "imports-loader": "^4.0.1",
+ "mini-css-extract-plugin": "2.7.3",
"modify-source-webpack-plugin": "^3.0.0",
- "nightwatch": "^2.1.7",
- "postcss": "^8.4.14",
+ "nightwatch": "^2.6.16",
+ "postcss": "^8.4.21",
"postcss-css-variables": "^0.18.0",
- "postcss-import": "^14.1.0",
- "postcss-loader": "^7.0.0",
+ "postcss-import": "^15.1.0",
+ "postcss-loader": "^7.0.2",
"prompt": "^1.3.0",
"sitemap": "^7.1.1",
- "terser": "^5.14.0",
- "webpack": "^5.73.0",
- "webpack-bundle-analyzer": "^4.5.0",
- "webpack-dev-server": "4.9.1",
+ "terser": "^5.16.6",
+ "webpack": "^5.76.0",
+ "webpack-bundle-analyzer": "^4.8.0",
+ "webpack-dev-server": "4.11.1",
"webpack-node-externals": "^3.0.0",
"worker-loader": "^3.0.8"
},
@@ -90,15 +95,15 @@
"@babel/polyfill": "^7.12.1",
"@blu3r4y/lzma": "^2.3.3",
"arrive": "^2.4.1",
- "avsc": "^5.7.4",
+ "avsc": "^5.7.7",
"bcryptjs": "^2.4.3",
- "bignumber.js": "^9.0.2",
+ "bignumber.js": "^9.1.1",
"blakejs": "^1.2.1",
- "bootstrap": "4.6.1",
+ "bootstrap": "4.6.2",
"bootstrap-colorpicker": "^3.4.0",
"bootstrap-material-design": "^4.1.3",
"browserify-zlib": "^0.2.0",
- "bson": "^4.6.4",
+ "bson": "^4.7.2",
"buffer": "^6.0.3",
"cbor": "8.1.0",
"chi-squared": "^1.1.0",
@@ -107,7 +112,7 @@
"crypto-browserify": "^3.12.0",
"crypto-js": "^4.1.1",
"ctph.js": "0.0.5",
- "d3": "7.4.4",
+ "d3": "7.8.2",
"d3-hexbin": "^0.2.2",
"diff": "^5.1.0",
"es6-promisify": "^7.0.0",
@@ -117,28 +122,28 @@
"file-saver": "^2.0.5",
"flat": "^5.0.2",
"geodesy": "1.1.3",
- "highlight.js": "^11.5.1",
- "jimp": "^0.16.1",
- "jquery": "3.6.0",
+ "highlight.js": "^11.7.0",
+ "jimp": "^0.16.13",
+ "jquery": "3.6.4",
"js-crc": "^0.2.0",
"js-sha3": "^0.8.0",
"jsesc": "^3.0.2",
- "json5": "^2.2.1",
+ "json5": "^2.2.3",
"jsonpath-plus": "^7.2.0",
- "jsonwebtoken": "^8.5.1",
+ "jsonwebtoken": "8.5.1",
"jsqr": "^1.4.0",
- "jsrsasign": "^10.5.23",
+ "jsrsasign": "^10.6.1",
"kbpgp": "2.1.15",
"libbzip2-wasm": "0.0.4",
"libyara-wasm": "^1.2.1",
"lodash": "^4.17.21",
- "loglevel": "^1.8.0",
+ "loglevel": "^1.8.1",
"loglevel-message-prefix": "^3.0.0",
- "lz-string": "^1.4.4",
+ "lz-string": "^1.5.0",
"lz4js": "^0.2.0",
"markdown-it": "^13.0.1",
- "moment": "^2.29.3",
- "moment-timezone": "^0.5.34",
+ "moment": "^2.29.4",
+ "moment-timezone": "^0.5.41",
"ngeohash": "^0.6.3",
"node-forge": "^1.3.1",
"node-md6": "^0.1.0",
@@ -150,7 +155,7 @@
"path": "^0.12.7",
"popper.js": "^1.16.1",
"process": "^0.11.10",
- "protobufjs": "^6.11.3",
+ "protobufjs": "^7.2.2",
"qr-image": "^3.2.0",
"reflect-metadata": "^0.1.13",
"scryptsy": "^2.1.0",
@@ -159,15 +164,15 @@
"split.js": "^1.6.5",
"ssdeep.js": "0.0.3",
"stream-browserify": "^3.0.0",
- "tesseract.js": "3.0.2",
- "ua-parser-js": "^1.0.2",
+ "tesseract.js": "3.0.3",
+ "ua-parser-js": "^1.0.34",
"unorm": "^1.6.0",
"utf8": "^3.0.0",
"uuid": "^9.0.0",
"vkbeautify": "^0.99.3",
"xmldom": "^0.6.0",
"xpath": "0.0.32",
- "xregexp": "^5.1.0",
+ "xregexp": "^5.1.1",
"zlibjs": "^0.3.1"
},
"scripts": {
@@ -180,7 +185,7 @@
"testui": "npx grunt testui",
"testuidev": "npx nightwatch --env=dev",
"lint": "npx grunt lint",
- "postinstall": "npx grunt exec:fixCryptoApiImports",
+ "postinstall": "npx grunt exec:fixCryptoApiImports && npx grunt exec:fixSnackbarMarkup",
"newop": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newOperation.mjs",
"minor": "node --experimental-modules --experimental-json-modules src/core/config/scripts/newMinorVersion.mjs",
"getheapsize": "node -e 'console.log(`node heap limit = ${require(\"v8\").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'",
diff --git a/src/core/Chef.mjs b/src/core/Chef.mjs
index 36998cec..ab8f83de 100755
--- a/src/core/Chef.mjs
+++ b/src/core/Chef.mjs
@@ -27,8 +27,8 @@ class Chef {
*
* @param {string|ArrayBuffer} input - The input data as a string or ArrayBuffer
* @param {Object[]} recipeConfig - The recipe configuration object
- * @param {Object} options - The options object storing various user choices
- * @param {boolean} options.attempHighlight - Whether or not to attempt highlighting
+ * @param {Object} [options={}] - The options object storing various user choices
+ * @param {string} [options.returnType] - What type to return the result as
*
* @returns {Object} response
* @returns {string} response.result - The output of the recipe
@@ -37,12 +37,11 @@ class Chef {
* @returns {number} response.duration - The number of ms it took to execute the recipe
* @returns {number} response.error - The error object thrown by a failed operation (false if no error)
*/
- async bake(input, recipeConfig, options) {
+ async bake(input, recipeConfig, options={}) {
log.debug("Chef baking");
const startTime = Date.now(),
recipe = new Recipe(recipeConfig),
- containsFc = recipe.containsFlowControl(),
- notUTF8 = options && "treatAsUtf8" in options && !options.treatAsUtf8;
+ containsFc = recipe.containsFlowControl();
let error = false,
progress = 0;
@@ -68,20 +67,13 @@ class Chef {
// Present the raw result
await recipe.present(this.dish);
- // Depending on the size of the output, we may send it back as a string or an ArrayBuffer.
- // This can prevent unnecessary casting as an ArrayBuffer can be easily downloaded as a file.
- // The threshold is specified in KiB.
- const threshold = (options.ioDisplayThreshold || 1024) * 1024;
const returnType =
- this.dish.type === Dish.HTML ?
- Dish.HTML :
- this.dish.size > threshold ?
- Dish.ARRAY_BUFFER :
- Dish.STRING;
+ this.dish.type === Dish.HTML ? Dish.HTML :
+ options?.returnType ? options.returnType : Dish.ARRAY_BUFFER;
return {
dish: rawDish,
- result: await this.dish.get(returnType, notUTF8),
+ result: await this.dish.get(returnType),
type: Dish.enumLookup(this.dish.type),
progress: progress,
duration: Date.now() - startTime,
diff --git a/src/core/ChefWorker.js b/src/core/ChefWorker.js
index f4a17f63..a43993f9 100644
--- a/src/core/ChefWorker.js
+++ b/src/core/ChefWorker.js
@@ -9,16 +9,8 @@
import Chef from "./Chef.mjs";
import OperationConfig from "./config/OperationConfig.json" assert {type: "json"};
import OpModules from "./config/modules/OpModules.mjs";
-
-// Add ">" to the start of all log messages in the Chef Worker
import loglevelMessagePrefix from "loglevel-message-prefix";
-loglevelMessagePrefix(log, {
- prefixes: [],
- staticPrefixes: [">"],
- prefixFormat: "%p"
-});
-
// Set up Chef instance
self.chef = new Chef();
@@ -56,7 +48,7 @@ self.postMessage({
self.addEventListener("message", function(e) {
// Handle message
const r = e.data;
- log.debug("ChefWorker receiving command '" + r.action + "'");
+ log.debug(`Receiving command '${r.action}'`);
switch (r.action) {
case "bake":
@@ -86,6 +78,12 @@ self.addEventListener("message", function(e) {
case "setLogLevel":
log.setLevel(r.data, false);
break;
+ case "setLogPrefix":
+ loglevelMessagePrefix(log, {
+ prefixes: [],
+ staticPrefixes: [r.data]
+ });
+ break;
default:
break;
}
@@ -101,14 +99,17 @@ async function bake(data) {
// Ensure the relevant modules are loaded
self.loadRequiredModules(data.recipeConfig);
try {
- self.inputNum = (data.inputNum !== undefined) ? data.inputNum : -1;
+ self.inputNum = data.inputNum === undefined ? -1 : data.inputNum;
const response = await self.chef.bake(
data.input, // The user's input
data.recipeConfig, // The configuration of the recipe
data.options // Options set by the user
);
- const transferable = (data.input instanceof ArrayBuffer) ? [data.input] : undefined;
+ const transferable = (response.dish.value instanceof ArrayBuffer) ?
+ [response.dish.value] :
+ undefined;
+
self.postMessage({
action: "bakeComplete",
data: Object.assign(response, {
@@ -186,7 +187,7 @@ async function getDishTitle(data) {
*
* @param {Object[]} recipeConfig
* @param {string} direction
- * @param {Object} pos - The position object for the highlight.
+ * @param {Object[]} pos - The position object for the highlight.
* @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset.
*/
diff --git a/src/core/Dish.mjs b/src/core/Dish.mjs
index 1afdef01..11b1ff9f 100755
--- a/src/core/Dish.mjs
+++ b/src/core/Dish.mjs
@@ -128,10 +128,9 @@ class Dish {
* If running in a browser, get is asynchronous.
*
* @param {number} type - The data type of value, see Dish enums.
- * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
* @returns {* | Promise} - (Browser) A promise | (Node) value of dish in given type
*/
- get(type, notUTF8=false) {
+ get(type) {
if (typeof type === "string") {
type = Dish.typeEnum(type);
}
@@ -140,13 +139,13 @@ class Dish {
// Node environment => _translate is sync
if (isNodeEnvironment()) {
- this._translate(type, notUTF8);
+ this._translate(type);
return this.value;
// Browser environment => _translate is async
} else {
return new Promise((resolve, reject) => {
- this._translate(type, notUTF8)
+ this._translate(type)
.then(() => {
resolve(this.value);
})
@@ -190,12 +189,11 @@ class Dish {
* @Node
*
* @param {number} type - The data type of value, see Dish enums.
- * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
* @returns {Dish | Promise} - (Browser) A promise | (Node) value of dish in given type
*/
- presentAs(type, notUTF8=false) {
+ presentAs(type) {
const clone = this.clone();
- return clone.get(type, notUTF8);
+ return clone.get(type);
}
@@ -414,17 +412,16 @@ class Dish {
* If running in the browser, _translate is asynchronous.
*
* @param {number} toType - The data type of value, see Dish enums.
- * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
* @returns {Promise || undefined}
*/
- _translate(toType, notUTF8=false) {
+ _translate(toType) {
log.debug(`Translating Dish from ${Dish.enumLookup(this.type)} to ${Dish.enumLookup(toType)}`);
// Node environment => translate is sync
if (isNodeEnvironment()) {
this._toArrayBuffer();
this.type = Dish.ARRAY_BUFFER;
- this._fromArrayBuffer(toType, notUTF8);
+ this._fromArrayBuffer(toType);
// Browser environment => translate is async
} else {
@@ -486,18 +483,17 @@ class Dish {
* Convert this.value to the given type from ArrayBuffer
*
* @param {number} toType - the Dish enum to convert to
- * @param {boolean} [notUTF8=false] - Do not treat strings as UTF8.
*/
- _fromArrayBuffer(toType, notUTF8) {
+ _fromArrayBuffer(toType) {
// Using 'bind' here to allow this.value to be mutated within translation functions
const toTypeFunctions = {
- [Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(notUTF8),
- [Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(notUTF8),
- [Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(notUTF8),
+ [Dish.STRING]: () => DishString.fromArrayBuffer.bind(this)(),
+ [Dish.NUMBER]: () => DishNumber.fromArrayBuffer.bind(this)(),
+ [Dish.HTML]: () => DishHTML.fromArrayBuffer.bind(this)(),
[Dish.ARRAY_BUFFER]: () => {},
- [Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(notUTF8),
- [Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(notUTF8),
+ [Dish.BIG_NUMBER]: () => DishBigNumber.fromArrayBuffer.bind(this)(),
+ [Dish.JSON]: () => DishJSON.fromArrayBuffer.bind(this)(),
[Dish.FILE]: () => DishFile.fromArrayBuffer.bind(this)(),
[Dish.LIST_FILE]: () => DishListFile.fromArrayBuffer.bind(this)(),
[Dish.BYTE_ARRAY]: () => DishByteArray.fromArrayBuffer.bind(this)(),
diff --git a/src/core/Recipe.mjs b/src/core/Recipe.mjs
index 4c778873..3ce40aa4 100755
--- a/src/core/Recipe.mjs
+++ b/src/core/Recipe.mjs
@@ -230,14 +230,12 @@ class Recipe {
this.lastRunOp = op;
} catch (err) {
// Return expected errors as output
- if (err instanceof OperationError ||
- (err.type && err.type === "OperationError")) {
+ if (err instanceof OperationError || err?.type === "OperationError") {
// Cannot rely on `err instanceof OperationError` here as extending
// native types is not fully supported yet.
dish.set(err.message, "string");
return i;
- } else if (err instanceof DishError ||
- (err.type && err.type === "DishError")) {
+ } else if (err instanceof DishError || err?.type === "DishError") {
dish.set(err.message, "string");
return i;
} else {
diff --git a/src/core/Utils.mjs b/src/core/Utils.mjs
index fe3b1a88..787ef270 100755
--- a/src/core/Utils.mjs
+++ b/src/core/Utils.mjs
@@ -4,6 +4,8 @@
* @license Apache-2.0
*/
+// loglevel import required for Node API
+import log from "loglevel";
import utf8 from "utf8";
import {fromBase64, toBase64} from "./lib/Base64.mjs";
import {fromHex} from "./lib/Hex.mjs";
@@ -174,17 +176,13 @@ class Utils {
* @returns {string}
*/
static printable(str, preserveWs=false, onlyAscii=false) {
- if (isWebEnvironment() && window.app && !window.app.options.treatAsUtf8) {
- str = Utils.byteArrayToChars(Utils.strToByteArray(str));
- }
-
if (onlyAscii) {
return str.replace(/[^\x20-\x7f]/g, ".");
}
// eslint-disable-next-line no-misleading-character-class
const re = /[\0-\x08\x0B-\x0C\x0E-\x1F\x7F-\x9F\xAD\u0378\u0379\u037F-\u0383\u038B\u038D\u03A2\u0528-\u0530\u0557\u0558\u0560\u0588\u058B-\u058E\u0590\u05C8-\u05CF\u05EB-\u05EF\u05F5-\u0605\u061C\u061D\u06DD\u070E\u070F\u074B\u074C\u07B2-\u07BF\u07FB-\u07FF\u082E\u082F\u083F\u085C\u085D\u085F-\u089F\u08A1\u08AD-\u08E3\u08FF\u0978\u0980\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09FC-\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF2-\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B55\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B78-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BFB-\u0C00\u0C04\u0C0D\u0C11\u0C29\u0C34\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5A-\u0C5F\u0C64\u0C65\u0C70-\u0C77\u0C80\u0C81\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0D01\u0D04\u0D0D\u0D11\u0D3B\u0D3C\u0D45\u0D49\u0D4F-\u0D56\u0D58-\u0D5F\u0D64\u0D65\u0D76-\u0D78\u0D80\u0D81\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DF1\u0DF5-\u0E00\u0E3B-\u0E3E\u0E5C-\u0E80\u0E83\u0E85\u0E86\u0E89\u0E8B\u0E8C\u0E8E-\u0E93\u0E98\u0EA0\u0EA4\u0EA6\u0EA8\u0EA9\u0EAC\u0EBA\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F48\u0F6D-\u0F70\u0F98\u0FBD\u0FCD\u0FDB-\u0FFF\u10C6\u10C8-\u10CC\u10CE\u10CF\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u137D-\u137F\u139A-\u139F\u13F5-\u13FF\u169D-\u169F\u16F1-\u16FF\u170D\u1715-\u171F\u1737-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17DE\u17DF\u17EA-\u17EF\u17FA-\u17FF\u180F\u181A-\u181F\u1878-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191D-\u191F\u192C-\u192F\u193C-\u193F\u1941-\u1943\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DB-\u19DD\u1A1C\u1A1D\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1A9F\u1AAE-\u1AFF\u1B4C-\u1B4F\u1B7D-\u1B7F\u1BF4-\u1BFB\u1C38-\u1C3A\u1C4A-\u1C4C\u1C80-\u1CBF\u1CC8-\u1CCF\u1CF7-\u1CFF\u1DE7-\u1DFB\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FC5\u1FD4\u1FD5\u1FDC\u1FF0\u1FF1\u1FF5\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u206F\u2072\u2073\u208F\u209D-\u209F\u20BB-\u20CF\u20F1-\u20FF\u218A-\u218F\u23F4-\u23FF\u2427-\u243F\u244B-\u245F\u2700\u2B4D-\u2B4F\u2B5A-\u2BFF\u2C2F\u2C5F\u2CF4-\u2CF8\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D71-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E3C-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u2FFC-\u2FFF\u3040\u3097\u3098\u3100-\u3104\u312E-\u3130\u318F\u31BB-\u31BF\u31E4-\u31EF\u321F\u32FF\u4DB6-\u4DBF\u9FCD-\u9FFF\uA48D-\uA48F\uA4C7-\uA4CF\uA62C-\uA63F\uA698-\uA69E\uA6F8-\uA6FF\uA78F\uA794-\uA79F\uA7AB-\uA7F7\uA82C-\uA82F\uA83A-\uA83F\uA878-\uA87F\uA8C5-\uA8CD\uA8DA-\uA8DF\uA8FC-\uA8FF\uA954-\uA95E\uA97D-\uA97F\uA9CE\uA9DA-\uA9DD\uA9E0-\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A\uAA5B\uAA7C-\uAA7F\uAAC3-\uAADA\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F-\uABBF\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBC2-\uFBD2\uFD40-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFE\uFDFF\uFE1A-\uFE1F\uFE27-\uFE2F\uFE53\uFE67\uFE6C-\uFE6F\uFE75\uFEFD-\uFF00\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]/g;
- const wsRe = /[\x09-\x10\x0D\u2028\u2029]/g;
+ const wsRe = /[\x09-\x10\u2028\u2029]/g;
str = str.replace(re, ".");
if (!preserveWs) str = str.replace(wsRe, ".");
@@ -192,6 +190,21 @@ class Utils {
}
+ /**
+ * Returns a string with whitespace represented as special characters from the
+ * Unicode Private Use Area, which CyberChef will display as control characters.
+ * Private Use Area characters are in the range U+E000..U+F8FF.
+ * https://en.wikipedia.org/wiki/Private_Use_Areas
+ * @param {string} str
+ * @returns {string}
+ */
+ static escapeWhitespace(str) {
+ return str.replace(/[\x09-\x10]/g, function(c) {
+ return String.fromCharCode(0xe000 + c.charCodeAt(0));
+ });
+ }
+
+
/**
* Parse a string entered by a user and replace escaped chars with the bytes they represent.
*
@@ -461,6 +474,9 @@ class Utils {
* Utils.strToArrayBuffer("你好");
*/
static strToArrayBuffer(str) {
+ log.debug(`Converting string[${str?.length}] to array buffer`);
+ if (!str) return new ArrayBuffer;
+
const arr = new Uint8Array(str.length);
let i = str.length, b;
while (i--) {
@@ -487,17 +503,20 @@ class Utils {
* Utils.strToUtf8ArrayBuffer("你好");
*/
static strToUtf8ArrayBuffer(str) {
- const utf8Str = utf8.encode(str);
+ log.debug(`Converting string[${str?.length}] to UTF8 array buffer`);
+ if (!str) return new ArrayBuffer;
- if (str.length !== utf8Str.length) {
- if (isWorkerEnvironment()) {
+ const buffer = new TextEncoder("utf-8").encode(str);
+
+ if (str.length !== buffer.length) {
+ if (isWorkerEnvironment() && self && typeof self.setOption === "function") {
self.setOption("attemptHighlight", false);
} else if (isWebEnvironment()) {
window.app.options.attemptHighlight = false;
}
}
- return Utils.strToArrayBuffer(utf8Str);
+ return buffer.buffer;
}
@@ -516,6 +535,8 @@ class Utils {
* Utils.strToByteArray("你好");
*/
static strToByteArray(str) {
+ log.debug(`Converting string[${str?.length}] to byte array`);
+ if (!str) return [];
const byteArray = new Array(str.length);
let i = str.length, b;
while (i--) {
@@ -542,6 +563,8 @@ class Utils {
* Utils.strToUtf8ByteArray("你好");
*/
static strToUtf8ByteArray(str) {
+ log.debug(`Converting string[${str?.length}] to UTF8 byte array`);
+ if (!str) return [];
const utf8Str = utf8.encode(str);
if (str.length !== utf8Str.length) {
@@ -570,6 +593,8 @@ class Utils {
* Utils.strToCharcode("你好");
*/
static strToCharcode(str) {
+ log.debug(`Converting string[${str?.length}] to charcode`);
+ if (!str) return [];
const charcode = [];
for (let i = 0; i < str.length; i++) {
@@ -604,20 +629,26 @@ class Utils {
* Utils.byteArrayToUtf8([228,189,160,229,165,189]);
*/
static byteArrayToUtf8(byteArray) {
- const str = Utils.byteArrayToChars(byteArray);
+ log.debug(`Converting byte array[${byteArray?.length}] to UTF8`);
+ if (!byteArray || !byteArray.length) return "";
+ if (!(byteArray instanceof Uint8Array))
+ byteArray = new Uint8Array(byteArray);
+
try {
- const utf8Str = utf8.decode(str);
- if (str.length !== utf8Str.length) {
+ const str = new TextDecoder("utf-8", {fatal: true}).decode(byteArray);
+
+ if (str.length !== byteArray.length) {
if (isWorkerEnvironment()) {
self.setOption("attemptHighlight", false);
} else if (isWebEnvironment()) {
window.app.options.attemptHighlight = false;
}
}
- return utf8Str;
+
+ return str;
} catch (err) {
// If it fails, treat it as ANSI
- return str;
+ return Utils.byteArrayToChars(byteArray);
}
}
@@ -636,11 +667,13 @@ class Utils {
* Utils.byteArrayToChars([20320,22909]);
*/
static byteArrayToChars(byteArray) {
- if (!byteArray) return "";
+ log.debug(`Converting byte array[${byteArray?.length}] to chars`);
+ if (!byteArray || !byteArray.length) return "";
let str = "";
- // String concatenation appears to be faster than an array join
- for (let i = 0; i < byteArray.length;) {
- str += String.fromCharCode(byteArray[i++]);
+ // Maxiumum arg length for fromCharCode is 65535, but the stack may already be fairly deep,
+ // so don't get too near it.
+ for (let i = 0; i < byteArray.length; i += 20000) {
+ str += String.fromCharCode(...(byteArray.slice(i, i+20000)));
}
return str;
}
@@ -658,6 +691,8 @@ class Utils {
* Utils.arrayBufferToStr(Uint8Array.from([104,101,108,108,111]).buffer);
*/
static arrayBufferToStr(arrayBuffer, utf8=true) {
+ log.debug(`Converting array buffer[${arrayBuffer?.byteLength}] to str`);
+ if (!arrayBuffer || !arrayBuffer.byteLength) return "";
const arr = new Uint8Array(arrayBuffer);
return utf8 ? Utils.byteArrayToUtf8(arr) : Utils.byteArrayToChars(arr);
}
@@ -789,10 +824,10 @@ class Utils {
}
if (removeScriptAndStyle) {
- htmlStr = recursiveRemove(/`;
}
diff --git a/src/core/operations/ParseIPv4Header.mjs b/src/core/operations/ParseIPv4Header.mjs
index 304ba0c0..84351cdc 100644
--- a/src/core/operations/ParseIPv4Header.mjs
+++ b/src/core/operations/ParseIPv4Header.mjs
@@ -49,7 +49,7 @@ class ParseIPv4Header extends Operation {
if (format === "Hex") {
input = fromHex(input);
} else if (format === "Raw") {
- input = Utils.strToByteArray(input);
+ input = new Uint8Array(Utils.strToArrayBuffer(input));
} else {
throw new OperationError("Unrecognised input format.");
}
diff --git a/src/core/operations/ParseX509Certificate.mjs b/src/core/operations/ParseX509Certificate.mjs
index 88678de9..11e63424 100644
--- a/src/core/operations/ParseX509Certificate.mjs
+++ b/src/core/operations/ParseX509Certificate.mjs
@@ -71,7 +71,7 @@ class ParseX509Certificate extends Operation {
cert.readCertHex(toHex(fromBase64(input, null, "byteArray"), ""));
break;
case "Raw":
- cert.readCertHex(toHex(Utils.strToByteArray(input), ""));
+ cert.readCertHex(toHex(Utils.strToArrayBuffer(input), ""));
break;
default:
undefinedInputFormat = true;
diff --git a/src/core/operations/PlayMedia.mjs b/src/core/operations/PlayMedia.mjs
index f16684c7..22b7d8a2 100644
--- a/src/core/operations/PlayMedia.mjs
+++ b/src/core/operations/PlayMedia.mjs
@@ -77,7 +77,7 @@ class PlayMedia extends Operation {
* Displays an audio or video element that may be able to play the media
* file.
*
- * @param data {byteArray} Data containing an audio or video file.
+ * @param {byteArray} data Data containing an audio or video file.
* @returns {string} Markup to display a media player.
*/
async present(data) {
diff --git a/src/core/operations/ROT13BruteForce.mjs b/src/core/operations/ROT13BruteForce.mjs
index aefe2ab7..7468ee11 100644
--- a/src/core/operations/ROT13BruteForce.mjs
+++ b/src/core/operations/ROT13BruteForce.mjs
@@ -86,12 +86,12 @@ class ROT13BruteForce extends Operation {
}
const rotatedString = Utils.byteArrayToUtf8(rotated);
if (rotatedString.toLowerCase().indexOf(cribLower) >= 0) {
- const rotatedStringPrintable = Utils.printable(rotatedString, false);
+ const rotatedStringEscaped = Utils.escapeWhitespace(rotatedString);
if (printAmount) {
const amountStr = "Amount = " + (" " + amount).slice(-2) + ": ";
- result.push(amountStr + rotatedStringPrintable);
+ result.push(amountStr + rotatedStringEscaped);
} else {
- result.push(rotatedStringPrintable);
+ result.push(rotatedStringEscaped);
}
}
}
diff --git a/src/core/operations/ROT47BruteForce.mjs b/src/core/operations/ROT47BruteForce.mjs
index 5f346e00..fa1e90dc 100644
--- a/src/core/operations/ROT47BruteForce.mjs
+++ b/src/core/operations/ROT47BruteForce.mjs
@@ -66,12 +66,12 @@ class ROT47BruteForce extends Operation {
}
const rotatedString = Utils.byteArrayToUtf8(rotated);
if (rotatedString.toLowerCase().indexOf(cribLower) >= 0) {
- const rotatedStringPrintable = Utils.printable(rotatedString, false);
+ const rotatedStringEscaped = Utils.escapeWhitespace(rotatedString);
if (printAmount) {
const amountStr = "Amount = " + (" " + amount).slice(-2) + ": ";
- result.push(amountStr + rotatedStringPrintable);
+ result.push(amountStr + rotatedStringEscaped);
} else {
- result.push(rotatedStringPrintable);
+ result.push(rotatedStringEscaped);
}
}
}
diff --git a/src/core/operations/RandomizeColourPalette.mjs b/src/core/operations/RandomizeColourPalette.mjs
index 9fe53a19..e3baf54b 100644
--- a/src/core/operations/RandomizeColourPalette.mjs
+++ b/src/core/operations/RandomizeColourPalette.mjs
@@ -10,8 +10,7 @@ import Utils from "../Utils.mjs";
import { isImage } from "../lib/FileType.mjs";
import { runHash } from "../lib/Hash.mjs";
import { toBase64 } from "../lib/Base64.mjs";
-import jimplib from "jimp/es/index.js";
-const jimp = jimplib.default ? jimplib.default : jimplib;
+import jimp from "jimp";
/**
* Randomize Colour Palette operation
diff --git a/src/core/operations/ResizeImage.mjs b/src/core/operations/ResizeImage.mjs
index 2a6db965..b2ed3bbf 100644
--- a/src/core/operations/ResizeImage.mjs
+++ b/src/core/operations/ResizeImage.mjs
@@ -9,8 +9,7 @@ import OperationError from "../errors/OperationError.mjs";
import { isImage } from "../lib/FileType.mjs";
import { toBase64 } from "../lib/Base64.mjs";
import { isWorkerEnvironment } from "../Utils.mjs";
-import jimplib from "jimp/es/index.js";
-const jimp = jimplib.default ? jimplib.default : jimplib;
+import jimp from "jimp";
/**
* Resize Image operation
diff --git a/src/core/operations/RotateImage.mjs b/src/core/operations/RotateImage.mjs
index 45a144ac..a4659b12 100644
--- a/src/core/operations/RotateImage.mjs
+++ b/src/core/operations/RotateImage.mjs
@@ -9,8 +9,7 @@ import OperationError from "../errors/OperationError.mjs";
import { isImage } from "../lib/FileType.mjs";
import { toBase64 } from "../lib/Base64.mjs";
import { isWorkerEnvironment } from "../Utils.mjs";
-import jimplib from "jimp/es/index.js";
-const jimp = jimplib.default ? jimplib.default : jimplib;
+import jimp from "jimp";
/**
* Rotate Image operation
diff --git a/src/core/operations/ScanForEmbeddedFiles.mjs b/src/core/operations/ScanForEmbeddedFiles.mjs
index 411b4c1d..2e83fcb9 100644
--- a/src/core/operations/ScanForEmbeddedFiles.mjs
+++ b/src/core/operations/ScanForEmbeddedFiles.mjs
@@ -60,7 +60,7 @@ class ScanForEmbeddedFiles extends Operation {
Extension: ${type.fileDetails.extension}
MIME type: ${type.fileDetails.mime}\n`;
- if (type.fileDetails.description && type.fileDetails.description.length) {
+ if (type?.fileDetails?.description?.length) {
output += ` Description: ${type.fileDetails.description}\n`;
}
});
diff --git a/src/core/operations/SharpenImage.mjs b/src/core/operations/SharpenImage.mjs
index 3882b7aa..eb033ad2 100644
--- a/src/core/operations/SharpenImage.mjs
+++ b/src/core/operations/SharpenImage.mjs
@@ -10,8 +10,7 @@ import { isImage } from "../lib/FileType.mjs";
import { toBase64 } from "../lib/Base64.mjs";
import { gaussianBlur } from "../lib/ImageManipulation.mjs";
import { isWorkerEnvironment } from "../Utils.mjs";
-import jimplib from "jimp/es/index.js";
-const jimp = jimplib.default ? jimplib.default : jimplib;
+import jimp from "jimp";
/**
* Sharpen Image operation
diff --git a/src/core/operations/ShowOnMap.mjs b/src/core/operations/ShowOnMap.mjs
index 9c81a27b..c2ac1c6e 100644
--- a/src/core/operations/ShowOnMap.mjs
+++ b/src/core/operations/ShowOnMap.mjs
@@ -90,7 +90,14 @@ class ShowOnMap extends Operation {
leafletUrl = "https://unpkg.com/leaflet@1.5.0/dist/leaflet.js",
leafletCssUrl = "https://unpkg.com/leaflet@1.5.0/dist/leaflet.css";
return `
-
+
diff --git a/src/web/stylesheets/components/_operation.css b/src/web/stylesheets/components/_operation.css
index 7d45a9e2..685a368a 100755
--- a/src/web/stylesheets/components/_operation.css
+++ b/src/web/stylesheets/components/_operation.css
@@ -27,17 +27,31 @@
}
.ingredients {
- display: grid;
- grid-template-columns: auto auto auto;
- grid-column-gap: 14px;
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: flex-start;
+ column-gap: 14px;
+ row-gap: 0;
}
-.ingredients > div {
- grid-column: 1 / span 3;
+.ing-very-wide {
+ flex: 4 400px;
}
-.ingredients > div.inline {
- grid-column: unset;
+.ing-wide {
+ flex: 3 200px;
+}
+
+.ing-medium {
+ flex: 2 120px;
+}
+
+.ing-short {
+ flex: 1 80px;
+}
+
+.ing-flexible {
+ flex-grow: 1;
}
.ingredients .form-group {
@@ -64,6 +78,11 @@ div.toggle-string {
flex: 1;
}
+input.toggle-string {
+ border-top-right-radius: 0 !important;
+ height: 42px !important;
+}
+
.operation [class^='bmd-label'],
.operation [class*=' bmd-label'] {
top: 13px !important;
@@ -160,7 +179,7 @@ div.toggle-string {
}
.input-group .form-control {
- border-top-left-radius: 4px !important;
+ border-top-left-radius: 4px;
}
.input-group-append button {
diff --git a/src/web/stylesheets/components/_pane.css b/src/web/stylesheets/components/_pane.css
index f251fa27..54e67b3b 100755
--- a/src/web/stylesheets/components/_pane.css
+++ b/src/web/stylesheets/components/_pane.css
@@ -46,72 +46,6 @@
padding: 0;
}
-.io-card.card {
- box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2);
- transition: 0.3s;
- width: 400px;
- height: 150px;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- font-family: var(--primary-font-family);
- color: var(--primary-font-colour);
- line-height: 30px;
- background-color: var(--primary-background-colour);
- flex-direction: row;
- padding-left: 10px;
-}
-
-.io-card.card:hover {
- box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
-}
-
-.io-card.card>img {
- float: left;
- width: auto;
- height: auto;
- max-width: 128px;
- max-height: 128px;
- margin-left: auto;
- margin-top: auto;
- margin-right: auto;
- margin-bottom: auto;
- padding: 0px;
-
-}
-
-.io-card.card .card-body .close {
- position: absolute;
- right: 10px;
- top: 4px;
-}
-
-.io-card.card .card-body {
- float: left;
- padding: 16px;
- width: 250px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- user-select: text;
-}
-
-.io-card.card .card-body>.btn {
- margin-bottom: 5px;
- margin-top: 5px;
-}
-
-.io-card.card input[type=number] {
- padding-right: 6px;
- padding-left: 6px;
- height: unset;
-}
-
-.io-card.card .input-group {
- padding-top: 5px;
-}
-
#files .card-header .float-right a:hover {
text-decoration: none;
}
diff --git a/src/web/stylesheets/layout/_controls.css b/src/web/stylesheets/layout/_controls.css
index c410704b..1edc41b5 100755
--- a/src/web/stylesheets/layout/_controls.css
+++ b/src/web/stylesheets/layout/_controls.css
@@ -6,27 +6,20 @@
* @license Apache-2.0
*/
-:root {
- --controls-height: 75px;
-}
-
#controls {
position: absolute;
width: 100%;
- height: var(--controls-height);
bottom: 0;
- padding: 0;
- padding-top: 12px;
+ padding: 10px 0;
border-top: 1px solid var(--primary-border-colour);
background-color: var(--secondary-background-colour);
}
#controls-content {
position: relative;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- transform-origin: center left;
+ display: flex;
+ flex-flow: row nowrap;
+ align-items: center;
}
#auto-bake-label {
@@ -56,6 +49,7 @@
#controls .btn {
border-radius: 30px;
+ margin: 0;
}
.output-maximised .hide-on-maximised-output {
diff --git a/src/web/stylesheets/layout/_io.css b/src/web/stylesheets/layout/_io.css
index 7811144a..0146bf27 100755
--- a/src/web/stylesheets/layout/_io.css
+++ b/src/web/stylesheets/layout/_io.css
@@ -7,41 +7,36 @@
*/
#input-text,
-#output-text,
-#output-html {
+#output-text {
position: relative;
width: 100%;
height: 100%;
margin: 0;
- padding: 3px;
- -moz-padding-start: 3px;
- -moz-padding-end: 3px;
- border: none;
- border-width: 0px;
- resize: none;
background-color: transparent;
- white-space: pre-wrap;
- word-wrap: break-word;
-}
-
-#output-wrapper{
- margin: 0;
- padding: 0;
-}
-
-#output-wrapper .textarea-wrapper {
- width: 100%;
- height: 100%;
- box-sizing: border-box;
overflow: hidden;
- pointer-events: auto;
+ user-select: auto;
}
-
+#output-text.html-output .cm-content,
+#output-text.html-output .cm-line,
#output-html {
+ display: block;
+ height: 100%;
+ user-select: auto;
+}
+#output-text.html-output .cm-line .cm-widgetBuffer,
+#output-text.html-output .cm-line>br {
display: none;
- overflow-y: auto;
- -moz-padding-start: 1px; /* Fixes bug in Firefox */
+}
+
+.cm-editor {
+ height: 100%;
+}
+
+.cm-editor .cm-content {
+ font-family: var(--fixed-width-font-family);
+ font-size: var(--fixed-width-font-size);
+ color: var(--fixed-width-font-colour);
}
#input-tabs-wrapper #input-tabs,
@@ -162,70 +157,25 @@
}
#input-wrapper,
-#output-wrapper,
-#input-wrapper > * ,
-#output-wrapper > .textarea-wrapper > div,
-#output-wrapper > .textarea-wrapper > textarea {
+#output-wrapper {
height: calc(100% - var(--title-height));
}
#input-wrapper.show-tabs,
-#input-wrapper.show-tabs > *,
-#output-wrapper.show-tabs,
-#output-wrapper.show-tabs > .textarea-wrapper > div,
-#output-wrapper.show-tabs > .textarea-wrapper > textarea {
+#output-wrapper.show-tabs {
height: calc(100% - var(--tab-height) - var(--title-height));
}
-#output-wrapper > .textarea-wrapper > #output-html {
- height: 100%;
-}
-
-#show-file-overlay {
- height: 32px;
-}
-
-.input-wrapper.textarea-wrapper {
- width: 100%;
- box-sizing: border-box;
- overflow: hidden;
- pointer-events: auto;
-}
-
-.textarea-wrapper textarea,
-.textarea-wrapper>div {
- font-family: var(--fixed-width-font-family);
- font-size: var(--fixed-width-font-size);
- color: var(--fixed-width-font-colour);
-}
-
-#input-highlighter,
-#output-highlighter {
- position: absolute;
- left: 0;
- bottom: 0;
- width: 100%;
- padding: 3px;
- margin: 0;
- overflow: hidden;
- letter-spacing: normal;
- white-space: pre-wrap;
- word-wrap: break-word;
- color: #fff;
- background-color: transparent;
- border: none;
- pointer-events: none;
-}
-
#output-loader {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
+ height: 100%;
margin: 0;
- background-color: var(--primary-background-colour);
- visibility: hidden;
+ background-color: var(--secondary-background-colour);
opacity: 0;
+ visibility: hidden;
display: flex;
justify-content: center;
align-items: center;
@@ -254,31 +204,6 @@
transition: all 0.5s ease;
}
-#input-file,
-#output-file {
- position: absolute;
- left: 0;
- bottom: 0;
- width: 100%;
- display: none;
-}
-
-.file-overlay {
- position: absolute;
- opacity: 0.8;
- background-color: var(--title-background-colour);
- width: 100%;
- height: 100%;
-}
-
-#show-file-overlay {
- position: absolute;
- right: 15px;
- top: calc(var(--title-height) + 10px);
- cursor: pointer;
- display: none;
-}
-
.io-info {
margin-right: 18px;
margin-top: 1px;
@@ -292,10 +217,6 @@
align-items: center;
}
-#input-info {
- line-height: 15px;
-}
-
.dropping-file {
border: 5px dashed var(--drop-file-border-colour) !important;
}
@@ -458,3 +379,214 @@
cursor: pointer;
filter: brightness(98%);
}
+
+/* Highlighting */
+.ͼ2.cm-focused .cm-selectionBackground {
+ background-color: var(--hl5);
+}
+
+.ͼ2 .cm-selectionBackground {
+ background-color: var(--hl1);
+}
+
+.ͼ1 .cm-selectionMatch {
+ background-color: var(--hl2);
+}
+
+.ͼ1.cm-focused .cm-cursor.cm-cursor-primary {
+ border-color: var(--primary-font-colour);
+}
+
+.ͼ1 .cm-cursor.cm-cursor-primary {
+ display: block;
+ border-color: var(--subtext-font-colour);
+}
+
+
+/* Status bar */
+
+.cm-panel input::placeholder {
+ font-size: 12px !important;
+}
+
+.ͼ2 .cm-panels,
+.ͼ2 .cm-side-panels {
+ background-color: var(--secondary-background-colour);
+ border-color: var(--primary-border-colour);
+ color: var(--primary-font-colour);
+}
+
+.cm-status-bar {
+ font-family: var(--fixed-width-font-family);
+ font-weight: normal;
+ font-size: 8pt;
+ margin: 0 5px;
+ display: flex;
+ flex-flow: row nowrap;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.cm-status-bar i {
+ font-size: 12pt;
+ vertical-align: middle;
+ margin-left: 8px;
+}
+.cm-status-bar>div>span:first-child i {
+ margin-left: 0;
+}
+
+.cm-status-bar .disabled {
+ background-color: unset !important;
+ cursor: not-allowed;
+}
+
+/* Dropup Button */
+.cm-status-bar-select-btn {
+ border: none;
+ cursor: pointer;
+}
+
+/* The container - needed to position the dropup content */
+.cm-status-bar-select {
+ position: relative;
+ display: inline-block;
+}
+
+/* Dropup content (Hidden by Default) */
+.cm-status-bar-select-content {
+ display: none;
+ position: absolute;
+ bottom: 20px;
+ right: 0;
+ background-color: #f1f1f1;
+ min-width: 200px;
+ box-shadow: 0px 4px 4px 0px rgba(0,0,0,0.2);
+ z-index: 1;
+}
+
+/* Links inside the dropup */
+.cm-status-bar-select-content a {
+ color: black;
+ padding: 2px 5px;
+ text-decoration: none;
+ display: block;
+}
+
+/* Change color of dropup links on hover */
+.cm-status-bar-select-content a:hover {
+ background-color: #ddd
+}
+
+/* Change the background color of the dropup button when the dropup content is shown */
+.cm-status-bar-select:hover .cm-status-bar-select-btn {
+ background-color: #f1f1f1;
+}
+
+/* The search field */
+.cm-status-bar-filter-input {
+ box-sizing: border-box;
+ font-size: 12px;
+ padding-left: 10px !important;
+ border: none;
+}
+
+.cm-status-bar-filter-search {
+ border-top: 1px solid #ddd;
+}
+
+/* Show the dropup menu */
+.cm-status-bar-select .show {
+ display: block;
+}
+
+.cm-status-bar-select-scroll {
+ overflow-y: auto;
+ max-height: 300px;
+}
+
+.chr-enc-value {
+ max-width: 150px;
+ display: inline-block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+/* File details panel */
+
+.cm-file-details {
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ overflow-y: auto;
+ padding-bottom: 21px;
+ height: 100%;
+}
+
+.file-details-toggle-shown,
+.file-details-toggle-hidden {
+ width: 8px;
+ height: 40px;
+ border: 1px solid var(--secondary-border-colour);
+ position: absolute;
+ top: calc(50% - 20px);
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: var(--secondary-border-colour);
+ color: var(--subtext-font-colour);
+ z-index: 1;
+}
+
+.file-details-toggle-shown {
+ left: 0;
+ border-left: none;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+}
+
+.file-details-toggle-hidden {
+ left: -8px;
+ border-right: none;
+ border-top-left-radius: 5px;
+ border-bottom-left-radius: 5px;
+}
+
+.file-details-toggle-shown:hover,
+.file-details-toggle-hidden:hover {
+ background-color: var(--primary-border-colour);
+ border-color: var(--primary-border-colour);
+ color: var(--primary-font-colour);
+}
+
+.file-details-heading {
+ font-weight: bold;
+ margin: 10px 0 10px 0;
+}
+
+.file-details-data {
+ text-align: left;
+ margin: 10px 2px;
+}
+
+.file-details-data td {
+ padding: 0 3px;
+ max-width: 130px;
+ min-width: 60px;
+ overflow: hidden;
+ vertical-align: top;
+ word-break: break-all;
+}
+
+.file-details-error {
+ color: #f00;
+}
+
+.file-details-thumbnail {
+ max-width: 180px;
+}
diff --git a/src/web/stylesheets/layout/_modals.css b/src/web/stylesheets/layout/_modals.css
index c1745eeb..affc372d 100755
--- a/src/web/stylesheets/layout/_modals.css
+++ b/src/web/stylesheets/layout/_modals.css
@@ -107,4 +107,4 @@
background-image:
linear-gradient(to top, var(--input-highlight-colour) 2px, rgba(0, 0, 0, 0) 2px),
linear-gradient(to top, var(--primary-border-colour) 1px, rgba(0, 0, 0, 0) 1px);
-}
\ No newline at end of file
+}
diff --git a/src/web/stylesheets/layout/_recipe.css b/src/web/stylesheets/layout/_recipe.css
index bd70d10f..339da074 100755
--- a/src/web/stylesheets/layout/_recipe.css
+++ b/src/web/stylesheets/layout/_recipe.css
@@ -7,7 +7,6 @@
*/
#rec-list {
- bottom: var(--controls-height);
overflow: auto;
}
diff --git a/src/web/stylesheets/themes/_classic.css b/src/web/stylesheets/themes/_classic.css
index 3b3bd555..971c1c57 100755
--- a/src/web/stylesheets/themes/_classic.css
+++ b/src/web/stylesheets/themes/_classic.css
@@ -110,11 +110,11 @@
/* Highlighter colours */
- --hl1: #fff000;
- --hl2: #95dfff;
- --hl3: #ffb6b6;
- --hl4: #fcf8e3;
- --hl5: #8de768;
+ --hl1: #ffee00aa;
+ --hl2: #95dfffaa;
+ --hl3: #ffb6b6aa;
+ --hl4: #fcf8e3aa;
+ --hl5: #8de768aa;
/* Scrollbar */
diff --git a/src/web/stylesheets/themes/_dark.css b/src/web/stylesheets/themes/_dark.css
index 10340ea8..4d2941f2 100755
--- a/src/web/stylesheets/themes/_dark.css
+++ b/src/web/stylesheets/themes/_dark.css
@@ -108,9 +108,9 @@
/* Highlighter colours */
--hl1: #264f78;
--hl2: #675351;
- --hl3: #ffb6b6;
+ --hl3: #c40000;
--hl4: #fcf8e3;
- --hl5: #8de768;
+ --hl5: #38811b;
/* Scrollbar */
diff --git a/src/web/stylesheets/themes/_solarizedDark.css b/src/web/stylesheets/themes/_solarizedDark.css
index 3b7d4338..5bb18d2e 100755
--- a/src/web/stylesheets/themes/_solarizedDark.css
+++ b/src/web/stylesheets/themes/_solarizedDark.css
@@ -125,9 +125,9 @@
/* Highlighter colours */
--hl1: var(--base01);
--hl2: var(--sol-blue);
- --hl3: var(--sol-magenta);
+ --hl3: var(--sol-green);
--hl4: var(--sol-yellow);
- --hl5: var(--sol-green);
+ --hl5: var(--sol-magenta);
/* Scrollbar */
diff --git a/src/web/stylesheets/themes/_solarizedLight.css b/src/web/stylesheets/themes/_solarizedLight.css
index 00b86091..f884c3e8 100755
--- a/src/web/stylesheets/themes/_solarizedLight.css
+++ b/src/web/stylesheets/themes/_solarizedLight.css
@@ -127,9 +127,9 @@
/* Highlighter colours */
--hl1: var(--base1);
--hl2: var(--sol-blue);
- --hl3: var(--sol-magenta);
+ --hl3: var(--sol-green);
--hl4: var(--sol-yellow);
- --hl5: var(--sol-green);
+ --hl5: var(--sol-magenta);
/* Scrollbar */
diff --git a/src/web/stylesheets/utils/_general.css b/src/web/stylesheets/utils/_general.css
index c40c4ccd..56a8cbfe 100755
--- a/src/web/stylesheets/utils/_general.css
+++ b/src/web/stylesheets/utils/_general.css
@@ -50,6 +50,11 @@ body {
padding-left: 2px;
}
+.modal-icon {
+ position: absolute;
+ right: 25px;
+}
+
.konami {
transform: rotate(180deg);
}
diff --git a/src/web/stylesheets/utils/_overrides.css b/src/web/stylesheets/utils/_overrides.css
index 7deabe7d..a2f8b029 100755
--- a/src/web/stylesheets/utils/_overrides.css
+++ b/src/web/stylesheets/utils/_overrides.css
@@ -13,7 +13,7 @@
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
- src: url("../static/fonts/MaterialIcons-Regular.woff2") format('woff2');
+ src: url("../static/fonts/MaterialIcons-Regular.ttf") format('truetype');
}
.material-icons {
@@ -247,3 +247,11 @@ optgroup {
.colorpicker-color div {
height: 100px;
}
+
+
+/* CodeMirror */
+
+.ͼ2 .cm-specialChar,
+.cm-specialChar {
+ color: red;
+}
diff --git a/src/web/utils/copyOverride.mjs b/src/web/utils/copyOverride.mjs
new file mode 100644
index 00000000..51b2386b
--- /dev/null
+++ b/src/web/utils/copyOverride.mjs
@@ -0,0 +1,125 @@
+/**
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ *
+ * In order to render whitespace characters as control character pictures in the output, even
+ * when they are the designated line separator, CyberChef sometimes chooses to represent them
+ * internally using the Unicode Private Use Area (https://en.wikipedia.org/wiki/Private_Use_Areas).
+ * See `Utils.escapeWhitespace()` for an example of this.
+ *
+ * The `renderSpecialChar()` function understands that it should display these characters as
+ * control pictures. When copying data from the Output, we need to replace these PUA characters
+ * with their original values, so we override the DOM "copy" event and modify the copied data
+ * if required. This handler is based closely on the built-in CodeMirror handler and defers to the
+ * built-in handler if PUA characters are not present in the copied data, in order to minimise the
+ * impact of breaking changes.
+ */
+
+import {EditorView} from "@codemirror/view";
+
+/**
+ * Copies the currently selected text from the state doc.
+ * Based on the built-in implementation with a few unrequired bits taken out:
+ * https://github.com/codemirror/view/blob/7d9c3e54396242d17b3164a0e244dcc234ee50ee/src/input.ts#L604
+ *
+ * @param {EditorState} state
+ * @returns {Object}
+ */
+function copiedRange(state) {
+ const content = [];
+ let linewise = false;
+ for (const range of state.selection.ranges) if (!range.empty) {
+ content.push(state.sliceDoc(range.from, range.to));
+ }
+ if (!content.length) {
+ // Nothing selected, do a line-wise copy
+ let upto = -1;
+ for (const {from} of state.selection.ranges) {
+ const line = state.doc.lineAt(from);
+ if (line.number > upto) {
+ content.push(line.text);
+ }
+ upto = line.number;
+ }
+ linewise = true;
+ }
+
+ return {text: content.join(state.lineBreak), linewise};
+}
+
+/**
+ * Regex to match characters in the Private Use Area of the Unicode table.
+ */
+const PUARegex = new RegExp("[\ue000-\uf8ff]");
+const PUARegexG = new RegExp("[\ue000-\uf8ff]", "g");
+/**
+ * Regex tto match Unicode Control Pictures.
+ */
+const CPRegex = new RegExp("[\u2400-\u243f]");
+const CPRegexG = new RegExp("[\u2400-\u243f]", "g");
+
+/**
+ * Overrides the DOM "copy" handler in the CodeMirror editor in order to return the original
+ * values of control characters that have been represented in the Unicode Private Use Area for
+ * visual purposes.
+ * Based on the built-in copy handler with some modifications:
+ * https://github.com/codemirror/view/blob/7d9c3e54396242d17b3164a0e244dcc234ee50ee/src/input.ts#L629
+ *
+ * This handler will defer to the built-in version if no PUA characters are present.
+ *
+ * @returns {Extension}
+ */
+export function copyOverride() {
+ return EditorView.domEventHandlers({
+ copy(event, view) {
+ const {text, linewise} = copiedRange(view.state);
+ if (!text && !linewise) return;
+
+ // If there are no PUA chars in the copied text, return false and allow the built-in
+ // copy handler to fire
+ if (!PUARegex.test(text)) return false;
+
+ // If PUA chars are detected, modify them back to their original values and copy that instead
+ const rawText = text.replace(PUARegexG, function(c) {
+ return String.fromCharCode(c.charCodeAt(0) - 0xe000);
+ });
+
+ event.preventDefault();
+ event.clipboardData.clearData();
+ event.clipboardData.setData("text/plain", rawText);
+
+ // Returning true prevents CodeMirror default handlers from firing
+ return true;
+ }
+ });
+}
+
+
+/**
+ * Handler for copy events in output-html decorations. If there are control pictures present,
+ * this handler will convert them back to their raw form before copying. If there are no
+ * control pictures present, it will do nothing and defer to the default browser handler.
+ *
+ * @param {ClipboardEvent} event
+ * @returns {boolean}
+ */
+export function htmlCopyOverride(event) {
+ const text = window.getSelection().toString();
+ if (!text) return;
+
+ // If there are no control picture chars in the copied text, return false and allow the built-in
+ // copy handler to fire
+ if (!CPRegex.test(text)) return false;
+
+ // If control picture chars are detected, modify them back to their original values and copy that instead
+ const rawText = text.replace(CPRegexG, function(c) {
+ return String.fromCharCode(c.charCodeAt(0) - 0x2400);
+ });
+
+ event.preventDefault();
+ event.clipboardData.clearData();
+ event.clipboardData.setData("text/plain", rawText);
+
+ return true;
+}
diff --git a/src/web/utils/editorUtils.mjs b/src/web/utils/editorUtils.mjs
new file mode 100644
index 00000000..e02e692b
--- /dev/null
+++ b/src/web/utils/editorUtils.mjs
@@ -0,0 +1,97 @@
+/**
+ * CodeMirror utilities that are relevant to both the input and output
+ *
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import Utils from "../../core/Utils.mjs";
+
+// Descriptions for named control characters
+const Names = {
+ 0: "null",
+ 7: "bell",
+ 8: "backspace",
+ 10: "line feed",
+ 11: "vertical tab",
+ 13: "carriage return",
+ 27: "escape",
+ 8203: "zero width space",
+ 8204: "zero width non-joiner",
+ 8205: "zero width joiner",
+ 8206: "left-to-right mark",
+ 8207: "right-to-left mark",
+ 8232: "line separator",
+ 8237: "left-to-right override",
+ 8238: "right-to-left override",
+ 8294: "left-to-right isolate",
+ 8295: "right-to-left isolate",
+ 8297: "pop directional isolate",
+ 8233: "paragraph separator",
+ 65279: "zero width no-break space",
+ 65532: "object replacement"
+};
+
+// Regex for Special Characters to be replaced
+const UnicodeRegexpSupport = /x/.unicode != null ? "gu" : "g";
+const Specials = new RegExp("[\u0000-\u0008\u000a-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc\ue000-\uf8ff]", UnicodeRegexpSupport);
+
+
+/**
+ * Override for rendering special characters.
+ * Should mirror the toDOM function in
+ * https://github.com/codemirror/view/blob/main/src/special-chars.ts#L153
+ * But reverts the replacement of line feeds with newline control pictures.
+ *
+ * @param {number} code
+ * @param {string} desc
+ * @param {string} placeholder
+ * @returns {element}
+ */
+export function renderSpecialChar(code, desc, placeholder) {
+ const s = document.createElement("span");
+
+ // CodeMirror changes 0x0a to "NL" instead of "LF". We change it back along with its description.
+ if (code === 0x0a) {
+ placeholder = "\u240a";
+ desc = desc.replace("newline", "line feed");
+ }
+
+ // Render CyberChef escaped characters correctly - see Utils.escapeWhitespace
+ if (code >= 0xe000 && code <= 0xf8ff) {
+ code = code - 0xe000;
+ placeholder = String.fromCharCode(0x2400 + code);
+ desc = "Control character " + (Names[code] || "0x" + code.toString(16));
+ }
+
+ s.textContent = placeholder;
+ s.title = desc;
+ s.setAttribute("aria-label", desc);
+ s.className = "cm-specialChar";
+ return s;
+}
+
+
+/**
+ * Given a string, returns that string with any control characters replaced with HTML
+ * renderings of control pictures.
+ *
+ * @param {string} str
+ * @param {boolean} [preserveWs=false]
+ * @param {string} [lineBreak="\n"]
+ * @returns {html}
+ */
+export function escapeControlChars(str, preserveWs=false, lineBreak="\n") {
+ if (!preserveWs)
+ str = Utils.escapeWhitespace(str);
+
+ return str.replace(Specials, function(c) {
+ if (lineBreak.includes(c)) return c;
+ const code = c.charCodeAt(0);
+ const desc = "Control character " + (Names[code] || "0x" + code.toString(16));
+ const placeholder = code > 32 ? "\u2022" : String.fromCharCode(9216 + code);
+ const n = renderSpecialChar(code, desc, placeholder);
+ return n.outerHTML;
+ });
+}
diff --git a/src/web/utils/fileDetails.mjs b/src/web/utils/fileDetails.mjs
new file mode 100644
index 00000000..94f125f8
--- /dev/null
+++ b/src/web/utils/fileDetails.mjs
@@ -0,0 +1,147 @@
+/**
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import {showSidePanel} from "./sidePanel.mjs";
+import Utils from "../../core/Utils.mjs";
+import {isImage, detectFileType} from "../../core/lib/FileType.mjs";
+
+/**
+ * A File Details extension for CodeMirror
+ */
+class FileDetailsPanel {
+
+ /**
+ * FileDetailsPanel constructor
+ * @param {Object} opts
+ */
+ constructor(opts) {
+ this.fileDetails = opts?.fileDetails;
+ this.progress = opts?.progress ?? 0;
+ this.status = opts?.status;
+ this.buffer = opts?.buffer;
+ this.renderPreview = opts?.renderPreview;
+ this.toggleHandler = opts?.toggleHandler;
+ this.hidden = opts?.hidden;
+ this.dom = this.buildDOM();
+ this.renderFileThumb();
+ }
+
+ /**
+ * Builds the file details DOM tree
+ * @returns {DOMNode}
+ */
+ buildDOM() {
+ const dom = document.createElement("div");
+
+ dom.className = "cm-file-details";
+ const fileThumb = require("../static/images/file-128x128.png");
+ dom.innerHTML = `
+
+ ${this.hidden ? "❰" : "❱"}
+
+
File details
+
+
+
+ Name:
+
+ ${Utils.escapeHtml(this.fileDetails?.name)}
+
+
+
+ Size:
+
+ ${Utils.escapeHtml(this.fileDetails?.size)} bytes
+
+
+
+ Type:
+
+ ${Utils.escapeHtml(this.fileDetails?.type)}
+
+
+
+ Loaded:
+
+ ${this.status === "error" ? "Error" : this.progress + "%"}
+
+
+
+ `;
+
+ dom.querySelector(".file-details-toggle-shown,.file-details-toggle-hidden")
+ .addEventListener("click", this.toggleHandler, false);
+
+ return dom;
+ }
+
+ /**
+ * Render the file thumbnail
+ */
+ renderFileThumb() {
+ if (!this.renderPreview) {
+ this.resetFileThumb();
+ return;
+ }
+ const fileThumb = this.dom.querySelector(".file-details-thumbnail");
+ const fileType = this.dom.querySelector(".file-details-type");
+ const fileBuffer = new Uint8Array(this.buffer);
+ const type = isImage(fileBuffer);
+
+ if (type && type !== "image/tiff" && fileBuffer.byteLength <= 512000) {
+ // Most browsers don't support displaying TIFFs, so ignore them
+ // Don't render images over 512,000 bytes
+ const blob = new Blob([fileBuffer], {type: type}),
+ url = URL.createObjectURL(blob);
+ fileThumb.src = url;
+ } else {
+ this.resetFileThumb();
+ }
+ fileType.textContent = type ? type : detectFileType(fileBuffer)[0]?.mime ?? "unknown";
+ }
+
+ /**
+ * Reset the file thumbnail to the default icon
+ */
+ resetFileThumb() {
+ const fileThumb = this.dom.querySelector(".file-details-thumbnail");
+ fileThumb.src = require("../static/images/file-128x128.png");
+ }
+
+}
+
+/**
+ * A panel constructor factory building a panel that displays file details
+ * @param {Object} opts
+ * @returns {Function
}
+ */
+function makePanel(opts) {
+ const fdPanel = new FileDetailsPanel(opts);
+
+ return (view) => {
+ return {
+ dom: fdPanel.dom,
+ width: opts?.hidden ? 1 : 200,
+ update(update) {
+ },
+ mount() {
+ $("[data-toggle='tooltip']").tooltip();
+ }
+ };
+ };
+}
+
+/**
+ * A function that build the extension that enables the panel in an editor.
+ * @param {Object} opts
+ * @returns {Extension}
+ */
+export function fileDetailsPanel(opts) {
+ const panelMaker = makePanel(opts);
+ return showSidePanel.of(panelMaker);
+}
diff --git a/src/web/utils/htmlWidget.mjs b/src/web/utils/htmlWidget.mjs
new file mode 100644
index 00000000..642cd7e1
--- /dev/null
+++ b/src/web/utils/htmlWidget.mjs
@@ -0,0 +1,134 @@
+/**
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import {WidgetType, Decoration, ViewPlugin} from "@codemirror/view";
+import {escapeControlChars} from "./editorUtils.mjs";
+import {htmlCopyOverride} from "./copyOverride.mjs";
+import Utils from "../../core/Utils.mjs";
+
+
+/**
+ * Adds an HTML widget to the Code Mirror editor
+ */
+class HTMLWidget extends WidgetType {
+
+ /**
+ * HTMLWidget consructor
+ */
+ constructor(html, view) {
+ super();
+ this.html = html;
+ this.view = view;
+ }
+
+ /**
+ * Builds the DOM node
+ * @returns {DOMNode}
+ */
+ toDOM() {
+ const wrap = document.createElement("span");
+ wrap.setAttribute("id", "output-html");
+ wrap.innerHTML = this.html;
+
+ // Find text nodes and replace unprintable chars with control codes
+ this.walkTextNodes(wrap);
+
+ // Add a handler for copy events to ensure the control codes are copied correctly
+ wrap.addEventListener("copy", htmlCopyOverride);
+ return wrap;
+ }
+
+ /**
+ * Walks all text nodes in a given element
+ * @param {DOMNode} el
+ */
+ walkTextNodes(el) {
+ for (const node of el.childNodes) {
+ switch (node.nodeType) {
+ case Node.TEXT_NODE:
+ this.replaceControlChars(node);
+ break;
+ default:
+ if (node.nodeName !== "SCRIPT" &&
+ node.nodeName !== "STYLE")
+ this.walkTextNodes(node);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Renders control characters in text nodes
+ * @param {DOMNode} textNode
+ */
+ replaceControlChars(textNode) {
+ // .nodeValue unencodes HTML encoding such as < to "<"
+ // We must remember to escape any potential HTML in TextNodes as we do not
+ // want to render it.
+ const textValue = Utils.escapeHtml(textNode.nodeValue);
+ const val = escapeControlChars(textValue, true, this.view.state.lineBreak);
+ if (val.length !== textNode.nodeValue.length) {
+ const node = document.createElement("span");
+ node.innerHTML = val;
+ textNode.parentNode.replaceChild(node, textNode);
+ }
+ }
+
+}
+
+/**
+ * Decorator function to provide a set of widgets for the editor DOM
+ * @param {EditorView} view
+ * @param {string} html
+ * @returns {DecorationSet}
+ */
+function decorateHTML(view, html) {
+ const widgets = [];
+ if (html.length) {
+ const deco = Decoration.widget({
+ widget: new HTMLWidget(html, view),
+ side: 1
+ });
+ widgets.push(deco.range(0));
+ }
+ return Decoration.set(widgets);
+}
+
+
+/**
+ * An HTML Plugin builder
+ * @param {Object} htmlOutput
+ * @returns {ViewPlugin}
+ */
+export function htmlPlugin(htmlOutput) {
+ const plugin = ViewPlugin.fromClass(
+ class {
+ /**
+ * Plugin constructor
+ * @param {EditorView} view
+ */
+ constructor(view) {
+ this.htmlOutput = htmlOutput;
+ this.decorations = decorateHTML(view, this.htmlOutput.html);
+ }
+
+ /**
+ * Editor update listener
+ * @param {ViewUpdate} update
+ */
+ update(update) {
+ if (this.htmlOutput.changed) {
+ this.decorations = decorateHTML(update.view, this.htmlOutput.html);
+ this.htmlOutput.changed = false;
+ }
+ }
+ }, {
+ decorations: v => v.decorations
+ }
+ );
+
+ return plugin;
+}
diff --git a/src/web/utils/sidePanel.mjs b/src/web/utils/sidePanel.mjs
new file mode 100644
index 00000000..b54c08a0
--- /dev/null
+++ b/src/web/utils/sidePanel.mjs
@@ -0,0 +1,263 @@
+/**
+ * A modification of the CodeMirror Panel extension to enable panels to the
+ * left and right of the editor.
+ * Based on code here: https://github.com/codemirror/view/blob/main/src/panel.ts
+ *
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import {EditorView, ViewPlugin} from "@codemirror/view";
+import {Facet} from "@codemirror/state";
+
+const panelConfig = Facet.define({
+ combine(configs) {
+ let leftContainer, rightContainer;
+ for (const c of configs) {
+ leftContainer = leftContainer || c.leftContainer;
+ rightContainer = rightContainer || c.rightContainer;
+ }
+ return {leftContainer, rightContainer};
+ }
+});
+
+/**
+ * Configures the panel-managing extension.
+ * @param {PanelConfig} config
+ * @returns Extension
+ */
+export function panels(config) {
+ return config ? [panelConfig.of(config)] : [];
+}
+
+/**
+ * Get the active panel created by the given constructor, if any.
+ * This can be useful when you need access to your panels' DOM
+ * structure.
+ * @param {EditorView} view
+ * @param {PanelConstructor} panel
+ * @returns {Panel}
+ */
+export function getPanel(view, panel) {
+ const plugin = view.plugin(panelPlugin);
+ const index = plugin ? plugin.specs.indexOf(panel) : -1;
+ return index > -1 ? plugin.panels[index] : null;
+}
+
+const panelPlugin = ViewPlugin.fromClass(class {
+
+ /**
+ * @param {EditorView} view
+ */
+ constructor(view) {
+ this.input = view.state.facet(showSidePanel);
+ this.specs = this.input.filter(s => s);
+ this.panels = this.specs.map(spec => spec(view));
+ const conf = view.state.facet(panelConfig);
+ this.left = new PanelGroup(view, true, conf.leftContainer);
+ this.right = new PanelGroup(view, false, conf.rightContainer);
+ this.left.sync(this.panels.filter(p => p.left));
+ this.right.sync(this.panels.filter(p => !p.left));
+ for (const p of this.panels) {
+ p.dom.classList.add("cm-panel");
+ if (p.mount) p.mount();
+ }
+ }
+
+ /**
+ * @param {ViewUpdate} update
+ */
+ update(update) {
+ const conf = update.state.facet(panelConfig);
+ if (this.left.container !== conf.leftContainer) {
+ this.left.sync([]);
+ this.left = new PanelGroup(update.view, true, conf.leftContainer);
+ }
+ if (this.right.container !== conf.rightContainer) {
+ this.right.sync([]);
+ this.right = new PanelGroup(update.view, false, conf.rightContainer);
+ }
+ this.left.syncClasses();
+ this.right.syncClasses();
+ const input = update.state.facet(showSidePanel);
+ if (input !== this.input) {
+ const specs = input.filter(x => x);
+ const panels = [], left = [], right = [], mount = [];
+ for (const spec of specs) {
+ const known = this.specs.indexOf(spec);
+ let panel;
+ if (known < 0) {
+ panel = spec(update.view);
+ mount.push(panel);
+ } else {
+ panel = this.panels[known];
+ if (panel.update) panel.update(update);
+ }
+ panels.push(panel)
+ ;(panel.left ? left : right).push(panel);
+ }
+ this.specs = specs;
+ this.panels = panels;
+ this.left.sync(left);
+ this.right.sync(right);
+ for (const p of mount) {
+ p.dom.classList.add("cm-panel");
+ if (p.mount) p.mount();
+ }
+ } else {
+ for (const p of this.panels) if (p.update) p.update(update);
+ }
+ }
+
+ /**
+ * Destroy panel
+ */
+ destroy() {
+ this.left.sync([]);
+ this.right.sync([]);
+ }
+}, {
+ // provide: PluginField.scrollMargins.from(value => ({left: value.left.scrollMargin(), right: value.right.scrollMargin()}))
+});
+
+/**
+ * PanelGroup
+ */
+class PanelGroup {
+
+ /**
+ * @param {EditorView} view
+ * @param {boolean} left
+ * @param {HTMLElement} container
+ */
+ constructor(view, left, container) {
+ this.view = view;
+ this.left = left;
+ this.container = container;
+ this.dom = undefined;
+ this.classes = "";
+ this.panels = [];
+ this.syncClasses();
+ }
+
+ /**
+ * @param {Panel[]} panels
+ */
+ sync(panels) {
+ for (const p of this.panels) if (p.destroy && panels.indexOf(p) < 0) p.destroy();
+ this.panels = panels;
+ this.syncDOM();
+ }
+
+ /**
+ * Synchronise the DOM
+ */
+ syncDOM() {
+ if (this.panels.length === 0) {
+ if (this.dom) {
+ this.dom.remove();
+ this.dom = undefined;
+ this.setScrollerMargin(0);
+ }
+ return;
+ }
+
+ const parent = this.container || this.view.dom;
+ if (!this.dom) {
+ this.dom = document.createElement("div");
+ this.dom.className = this.left ? "cm-side-panels cm-panels-left" : "cm-side-panels cm-panels-right";
+ parent.insertBefore(this.dom, parent.firstChild);
+ }
+
+ let curDOM = this.dom.firstChild;
+ let bufferWidth = 0;
+ for (const panel of this.panels) {
+ bufferWidth += panel.width;
+ if (panel.dom.parentNode === this.dom) {
+ while (curDOM !== panel.dom) curDOM = rm(curDOM);
+ curDOM = curDOM.nextSibling;
+ } else {
+ this.dom.insertBefore(panel.dom, curDOM);
+ panel.dom.style.width = panel.width + "px";
+ this.dom.style.width = bufferWidth + "px";
+ }
+ }
+ while (curDOM) curDOM = rm(curDOM);
+
+ this.setScrollerMargin(bufferWidth);
+ }
+
+ /**
+ * Sets the margin of the cm-scroller element to make room for the panel
+ */
+ setScrollerMargin(width) {
+ const parent = this.container || this.view.dom;
+ const margin = this.left ? "marginLeft" : "marginRight";
+ parent.querySelector(".cm-scroller").style[margin] = width + "px";
+ }
+
+ /**
+ *
+ */
+ scrollMargin() {
+ return !this.dom || this.container ? 0 :
+ Math.max(0, this.left ?
+ this.dom.getBoundingClientRect().right - Math.max(0, this.view.scrollDOM.getBoundingClientRect().left) :
+ Math.min(innerHeight, this.view.scrollDOM.getBoundingClientRect().right) - this.dom.getBoundingClientRect().left);
+ }
+
+ /**
+ *
+ */
+ syncClasses() {
+ if (!this.container || this.classes === this.view.themeClasses) return;
+ for (const cls of this.classes.split(" ")) if (cls) this.container.classList.remove(cls);
+ for (const cls of (this.classes = this.view.themeClasses).split(" ")) if (cls) this.container.classList.add(cls);
+ }
+}
+
+/**
+ * @param {ChildNode} node
+ * @returns HTMLElement
+ */
+function rm(node) {
+ const next = node.nextSibling;
+ node.remove();
+ return next;
+}
+
+const baseTheme = EditorView.baseTheme({
+ ".cm-side-panels": {
+ boxSizing: "border-box",
+ position: "absolute",
+ height: "100%",
+ top: 0,
+ bottom: 0
+ },
+ "&light .cm-side-panels": {
+ backgroundColor: "#f5f5f5",
+ color: "black"
+ },
+ "&light .cm-panels-left": {
+ borderRight: "1px solid #ddd",
+ left: 0
+ },
+ "&light .cm-panels-right": {
+ borderLeft: "1px solid #ddd",
+ right: 0
+ },
+ "&dark .cm-side-panels": {
+ backgroundColor: "#333338",
+ color: "white"
+ }
+});
+
+/**
+ * Opening a panel is done by providing a constructor function for
+ * the panel through this facet. (The panel is closed again when its
+ * constructor is no longer provided.) Values of `null` are ignored.
+ */
+export const showSidePanel = Facet.define({
+ enables: [panelPlugin, baseTheme]
+});
diff --git a/src/web/utils/statusBar.mjs b/src/web/utils/statusBar.mjs
new file mode 100644
index 00000000..81728cd9
--- /dev/null
+++ b/src/web/utils/statusBar.mjs
@@ -0,0 +1,496 @@
+/**
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import {showPanel} from "@codemirror/view";
+import {CHR_ENC_SIMPLE_LOOKUP, CHR_ENC_SIMPLE_REVERSE_LOOKUP} from "../../core/lib/ChrEnc.mjs";
+
+/**
+ * A Status bar extension for CodeMirror
+ */
+class StatusBarPanel {
+
+ /**
+ * StatusBarPanel constructor
+ * @param {Object} opts
+ */
+ constructor(opts) {
+ this.label = opts.label;
+ this.timing = opts.timing;
+ this.tabNumGetter = opts.tabNumGetter;
+ this.eolHandler = opts.eolHandler;
+ this.chrEncHandler = opts.chrEncHandler;
+ this.chrEncGetter = opts.chrEncGetter;
+ this.htmlOutput = opts.htmlOutput;
+
+ this.eolVal = null;
+ this.chrEncVal = null;
+
+ this.dom = this.buildDOM();
+ }
+
+ /**
+ * Builds the status bar DOM tree
+ * @returns {DOMNode}
+ */
+ buildDOM() {
+ const dom = document.createElement("div");
+ const lhs = document.createElement("div");
+ const rhs = document.createElement("div");
+
+ dom.className = "cm-status-bar";
+ dom.setAttribute("data-help-title", `${this.label} status bar`);
+ dom.setAttribute("data-help", `This status bar provides information about data in the ${this.label}. Help topics are available for each of the components by activating help when hovering over them.`);
+ lhs.innerHTML = this.constructLHS();
+ rhs.innerHTML = this.constructRHS();
+
+ dom.appendChild(lhs);
+ dom.appendChild(rhs);
+
+ // Event listeners
+ dom.querySelectorAll(".cm-status-bar-select-btn").forEach(
+ el => el.addEventListener("click", this.showDropUp.bind(this), false)
+ );
+ dom.querySelector(".eol-select").addEventListener("click", this.eolSelectClick.bind(this), false);
+ dom.querySelector(".chr-enc-select").addEventListener("click", this.chrEncSelectClick.bind(this), false);
+ dom.querySelector(".cm-status-bar-filter-input").addEventListener("keyup", this.chrEncFilter.bind(this), false);
+
+ return dom;
+ }
+
+ /**
+ * Handler for dropup clicks
+ * Shows/Hides the dropup
+ * @param {Event} e
+ */
+ showDropUp(e) {
+ const el = e.target
+ .closest(".cm-status-bar-select")
+ .querySelector(".cm-status-bar-select-content");
+ const btn = e.target.closest(".cm-status-bar-select-btn");
+
+ if (btn.classList.contains("disabled")) return;
+
+ el.classList.add("show");
+
+ // Focus the filter input if present
+ const filter = el.querySelector(".cm-status-bar-filter-input");
+ if (filter) filter.focus();
+
+ // Set up a listener to close the menu if the user clicks outside of it
+ hideOnClickOutside(el, e);
+ }
+
+ /**
+ * Handler for EOL Select clicks
+ * Sets the line separator
+ * @param {Event} e
+ */
+ eolSelectClick(e) {
+ // preventDefault is required to stop the URL being modified and popState being triggered
+ e.preventDefault();
+
+ const eolLookup = {
+ "LF": "\u000a",
+ "VT": "\u000b",
+ "FF": "\u000c",
+ "CR": "\u000d",
+ "CRLF": "\u000d\u000a",
+ "NEL": "\u0085",
+ "LS": "\u2028",
+ "PS": "\u2029"
+ };
+ const eolval = eolLookup[e.target.getAttribute("data-val")];
+
+ if (eolval === undefined) return;
+
+ // Call relevant EOL change handler
+ this.eolHandler(eolval);
+ hideElement(e.target.closest(".cm-status-bar-select-content"));
+ }
+
+ /**
+ * Handler for Chr Enc Select clicks
+ * Sets the character encoding
+ * @param {Event} e
+ */
+ chrEncSelectClick(e) {
+ // preventDefault is required to stop the URL being modified and popState being triggered
+ e.preventDefault();
+
+ const chrEncVal = parseInt(e.target.getAttribute("data-val"), 10);
+
+ if (isNaN(chrEncVal)) return;
+
+ this.chrEncHandler(chrEncVal);
+ this.updateCharEnc(chrEncVal);
+ hideElement(e.target.closest(".cm-status-bar-select-content"));
+ }
+
+ /**
+ * Handler for Chr Enc keyup events
+ * Filters the list of selectable character encodings
+ * @param {Event} e
+ */
+ chrEncFilter(e) {
+ const input = e.target;
+ const filter = input.value.toLowerCase();
+ const div = input.closest(".cm-status-bar-select-content");
+ const a = div.getElementsByTagName("a");
+ for (let i = 0; i < a.length; i++) {
+ const txtValue = a[i].textContent || a[i].innerText;
+ if (txtValue.toLowerCase().includes(filter)) {
+ a[i].style.display = "block";
+ } else {
+ a[i].style.display = "none";
+ }
+ }
+ }
+
+ /**
+ * Counts the stats of a document
+ * @param {EditorState} state
+ */
+ updateStats(state) {
+ const length = this.dom.querySelector(".stats-length-value"),
+ lines = this.dom.querySelector(".stats-lines-value");
+
+ let docLength = state.doc.length;
+ // CodeMirror always counts line breaks as one character.
+ // We want to show an accurate reading of how many bytes there are.
+ if (state.lineBreak.length !== 1) {
+ docLength += (state.lineBreak.length * state.doc.lines) - state.doc.lines - 1;
+ }
+ length.textContent = docLength;
+ lines.textContent = state.doc.lines;
+ }
+
+ /**
+ * Gets the current selection info
+ * @param {EditorState} state
+ * @param {boolean} selectionSet
+ */
+ updateSelection(state, selectionSet) {
+ const selLen = state?.selection?.main ?
+ state.selection.main.to - state.selection.main.from :
+ 0;
+
+ const selInfo = this.dom.querySelector(".sel-info"),
+ curOffsetInfo = this.dom.querySelector(".cur-offset-info");
+
+ if (!selectionSet) {
+ selInfo.style.display = "none";
+ curOffsetInfo.style.display = "none";
+ return;
+ }
+
+ // CodeMirror always counts line breaks as one character.
+ // We want to show an accurate reading of how many bytes there are.
+ let from = state.selection.main.from,
+ to = state.selection.main.to;
+ if (state.lineBreak.length !== 1) {
+ const fromLine = state.doc.lineAt(from).number;
+ const toLine = state.doc.lineAt(to).number;
+ from += (state.lineBreak.length * fromLine) - fromLine - 1;
+ to += (state.lineBreak.length * toLine) - toLine - 1;
+ }
+
+ if (selLen > 0) { // Range
+ const start = this.dom.querySelector(".sel-start-value"),
+ end = this.dom.querySelector(".sel-end-value"),
+ length = this.dom.querySelector(".sel-length-value");
+
+ selInfo.style.display = "inline-block";
+ curOffsetInfo.style.display = "none";
+ start.textContent = from;
+ end.textContent = to;
+ length.textContent = to - from;
+ } else { // Position
+ const offset = this.dom.querySelector(".cur-offset-value");
+
+ selInfo.style.display = "none";
+ curOffsetInfo.style.display = "inline-block";
+ offset.textContent = from;
+ }
+ }
+
+ /**
+ * Sets the current EOL separator in the status bar
+ * @param {EditorState} state
+ */
+ updateEOL(state) {
+ if (state.lineBreak === this.eolVal) return;
+
+ const eolLookup = {
+ "\u000a": ["LF", "Line Feed"],
+ "\u000b": ["VT", "Vertical Tab"],
+ "\u000c": ["FF", "Form Feed"],
+ "\u000d": ["CR", "Carriage Return"],
+ "\u000d\u000a": ["CRLF", "Carriage Return + Line Feed"],
+ "\u0085": ["NEL", "Next Line"],
+ "\u2028": ["LS", "Line Separator"],
+ "\u2029": ["PS", "Paragraph Separator"]
+ };
+
+ const val = this.dom.querySelector(".eol-value");
+ const button = val.closest(".cm-status-bar-select-btn");
+ const eolName = eolLookup[state.lineBreak];
+ val.textContent = eolName[0];
+ button.setAttribute("title", `End of line sequence: ${eolName[1]}`);
+ button.setAttribute("data-original-title", `End of line sequence: ${eolName[1]}`);
+ this.eolVal = state.lineBreak;
+ }
+
+
+ /**
+ * Sets the current character encoding of the document
+ */
+ updateCharEnc() {
+ const chrEncVal = this.chrEncGetter();
+ if (chrEncVal === this.chrEncVal) return;
+
+ const name = CHR_ENC_SIMPLE_REVERSE_LOOKUP[chrEncVal] ? CHR_ENC_SIMPLE_REVERSE_LOOKUP[chrEncVal] : "Raw Bytes";
+
+ const val = this.dom.querySelector(".chr-enc-value");
+ const button = val.closest(".cm-status-bar-select-btn");
+ val.textContent = name;
+ button.setAttribute("title", `${this.label} character encoding: ${name}`);
+ button.setAttribute("data-original-title", `${this.label} character encoding: ${name}`);
+ this.chrEncVal = chrEncVal;
+ }
+
+ /**
+ * Sets the latest timing info
+ */
+ updateTiming() {
+ if (!this.timing) return;
+
+ const bakingTime = this.dom.querySelector(".baking-time-value");
+ const bakingTimeInfo = this.dom.querySelector(".baking-time-info");
+
+ if (this.label === "Output" && this.timing) {
+ bakingTimeInfo.style.display = "inline-block";
+ bakingTime.textContent = this.timing.duration(this.tabNumGetter());
+
+ const info = this.timing.printStages(this.tabNumGetter()).replace(/\n/g, " ");
+ bakingTimeInfo.setAttribute("title", info);
+ bakingTimeInfo.setAttribute("data-original-title", info);
+ } else {
+ bakingTimeInfo.style.display = "none";
+ }
+ }
+
+ /**
+ * Updates the sizing of elements that need to fit correctly
+ * @param {EditorView} view
+ */
+ updateSizing(view) {
+ const viewHeight = view.contentDOM.parentNode.clientHeight;
+ this.dom.querySelectorAll(".cm-status-bar-select-scroll").forEach(
+ el => {
+ el.style.maxHeight = (viewHeight - 50) + "px";
+ }
+ );
+ }
+
+ /**
+ * Checks whether there is HTML output requiring some widgets to be disabled
+ */
+ monitorHTMLOutput() {
+ if (!this.htmlOutput?.changed) return;
+
+ if (this.htmlOutput?.html === "") {
+ // Enable all controls
+ this.dom.querySelectorAll(".disabled").forEach(el => {
+ el.classList.remove("disabled");
+ });
+ } else {
+ // Disable chrenc, length, selection etc.
+ this.dom.querySelectorAll(".cm-status-bar-select-btn").forEach(el => {
+ el.classList.add("disabled");
+ });
+
+ this.dom.querySelector(".stats-length-value").parentNode.classList.add("disabled");
+ this.dom.querySelector(".stats-lines-value").parentNode.classList.add("disabled");
+ this.dom.querySelector(".sel-info").classList.add("disabled");
+ this.dom.querySelector(".cur-offset-info").classList.add("disabled");
+ }
+ }
+
+ /**
+ * Builds the Left-hand-side widgets
+ * @returns {string}
+ */
+ constructLHS() {
+ return `
+
+ abc
+
+
+
+ sort
+
+
+
+
+ highlight_alt
+ \u279E
+ ( selected)
+
+
+ location_on
+
+ `;
+ }
+
+ /**
+ * Builds the Right-hand-side widgets
+ * Event listener set up in Manager
+ *
+ * @returns {string}
+ */
+ constructRHS() {
+ const chrEncOptions = Object.keys(CHR_ENC_SIMPLE_LOOKUP).map(name =>
+ `${name} `
+ ).join("");
+
+ let chrEncHelpText = "",
+ eolHelpText = "";
+ if (this.label === "Input") {
+ chrEncHelpText = "The input character encoding defines how the input text is encoded into bytes which are then processed by the Recipe. The 'Raw bytes' option attempts to treat the input as individual bytes in the range 0-255. If it detects any characters with Unicode values above 255, it will treat the entire input as UTF-8. 'Raw bytes' is usually the best option if you are inputting binary data, such as a file.";
+ eolHelpText = "The End of Line Sequence defines which bytes are considered EOL terminators. Pressing the return key will enter this value into the input and create a new line. Changing the EOL sequence will not modify any existing data in the input but may change how previously entered line breaks are displayed. Lines added while a different EOL terminator was set may not now result in a new line, but may be displayed as control characters instead.";
+ } else {
+ chrEncHelpText = "The output character encoding defines how the output bytes are decoded into text which can be displayed to you. The 'Raw bytes' option treats the output data as individual bytes in the range 0-255.";
+ eolHelpText = "The End of Line Sequence defines which bytes are considered EOL terminators. Changing this value will not modify the value of the output, but may change how certain bytes are displayed and whether they result in a new line being created.";
+ }
+
+ return `
+
+ schedule
+ ms
+
+
+
+
+ text_fields Raw Bytes
+
+
+
+
+
+
+ keyboard_return
+
+
+
`;
+ }
+
+}
+
+const elementsWithListeners = {};
+
+/**
+ * Hides the provided element when a click is made outside of it
+ * @param {Element} element
+ * @param {Event} instantiatingEvent
+ */
+function hideOnClickOutside(element, instantiatingEvent) {
+ /**
+ * Handler for document click events
+ * Closes element if click is outside it.
+ * @param {Event} event
+ */
+ const outsideClickListener = event => {
+ // Don't trigger if we're clicking inside the element, or if the element
+ // is not visible, or if this is the same click event that opened it.
+ if (!element.contains(event.target) &&
+ event.timeStamp !== instantiatingEvent.timeStamp) {
+ hideElement(element);
+ }
+ };
+
+ if (!Object.prototype.hasOwnProperty.call(elementsWithListeners, element)) {
+ elementsWithListeners[element] = outsideClickListener;
+ document.addEventListener("click", elementsWithListeners[element], false);
+ }
+}
+
+/**
+ * Hides the specified element and removes the click listener for it
+ * @param {Element} element
+ */
+function hideElement(element) {
+ element.classList.remove("show");
+ document.removeEventListener("click", elementsWithListeners[element], false);
+ delete elementsWithListeners[element];
+}
+
+
+/**
+ * A panel constructor factory building a panel that re-counts the stats every time the document changes.
+ * @param {Object} opts
+ * @returns {Function}
+ */
+function makePanel(opts) {
+ const sbPanel = new StatusBarPanel(opts);
+
+ return (view) => {
+ sbPanel.updateEOL(view.state);
+ sbPanel.updateCharEnc();
+ sbPanel.updateTiming();
+ sbPanel.updateStats(view.state);
+ sbPanel.updateSelection(view.state, false);
+ sbPanel.monitorHTMLOutput();
+
+ return {
+ "dom": sbPanel.dom,
+ update(update) {
+ sbPanel.updateEOL(update.state);
+ sbPanel.updateCharEnc();
+ sbPanel.updateSelection(update.state, update.selectionSet);
+ sbPanel.updateTiming();
+ sbPanel.monitorHTMLOutput();
+ if (update.geometryChanged) {
+ sbPanel.updateSizing(update.view);
+ }
+ if (update.docChanged) {
+ sbPanel.updateStats(update.state);
+ }
+ }
+ };
+ };
+}
+
+/**
+ * A function that build the extension that enables the panel in an editor.
+ * @param {Object} opts
+ * @returns {Extension}
+ */
+export function statusBar(opts) {
+ const panelMaker = makePanel(opts);
+ return showPanel.of(panelMaker);
+}
diff --git a/src/web/waiters/BackgroundWorkerWaiter.mjs b/src/web/waiters/BackgroundWorkerWaiter.mjs
index f06f9bce..409c2bbb 100644
--- a/src/web/waiters/BackgroundWorkerWaiter.mjs
+++ b/src/web/waiters/BackgroundWorkerWaiter.mjs
@@ -35,6 +35,14 @@ class BackgroundWorkerWaiter {
log.debug("Registering new background ChefWorker");
this.chefWorker = new ChefWorker();
this.chefWorker.addEventListener("message", this.handleChefMessage.bind(this));
+ this.chefWorker.postMessage({
+ action: "setLogPrefix",
+ data: "BGChefWorker"
+ });
+ this.chefWorker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
let docURL = document.location.href.split(/[#?]/)[0];
const index = docURL.lastIndexOf("/");
@@ -52,7 +60,7 @@ class BackgroundWorkerWaiter {
*/
handleChefMessage(e) {
const r = e.data;
- log.debug("Receiving '" + r.action + "' from ChefWorker in the background");
+ log.debug(`Receiving '${r.action}' from BGChefWorker`);
switch (r.action) {
case "bakeComplete":
@@ -152,6 +160,18 @@ class BackgroundWorkerWaiter {
this.manager.output.backgroundMagicResult(response.dish.value);
}
+
+ /**
+ * Sets the console log level in the workers.
+ */
+ setLogLevel() {
+ if (!this.chefWorker) return;
+ this.chefWorker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
+ }
+
}
diff --git a/src/web/waiters/BindingsWaiter.mjs b/src/web/waiters/BindingsWaiter.mjs
index 79c2903b..3766b8d5 100755
--- a/src/web/waiters/BindingsWaiter.mjs
+++ b/src/web/waiters/BindingsWaiter.mjs
@@ -40,11 +40,11 @@ class BindingsWaiter {
break;
case "KeyI": // Focus input
e.preventDefault();
- document.getElementById("input-text").focus();
+ this.manager.input.inputEditorView.focus();
break;
case "KeyO": // Focus output
e.preventDefault();
- document.getElementById("output-text").focus();
+ this.manager.output.outputEditorView.focus();
break;
case "Period": // Focus next operation
e.preventDefault();
@@ -126,7 +126,7 @@ class BindingsWaiter {
break;
case "KeyW": // Close tab
e.preventDefault();
- this.manager.input.removeInput(this.manager.tabs.getActiveInputTab());
+ this.manager.input.removeInput(this.manager.tabs.getActiveTab("input"));
break;
case "ArrowLeft": // Go to previous tab
e.preventDefault();
@@ -148,6 +148,13 @@ class BindingsWaiter {
}
break;
}
+ } else {
+ switch (e.code) {
+ case "F1":
+ e.preventDefault();
+ this.contextualHelp();
+ break;
+ }
}
}
@@ -164,9 +171,14 @@ class BindingsWaiter {
}
document.getElementById("keybList").innerHTML = `
- Command
- Shortcut (Win/Linux)
- Shortcut (Mac)
+ Command
+ Shortcut (Win/Linux)
+ Shortcut (Mac)
+
+
+ Activate contextual help
+ F1
+ F1
Place cursor in search field
@@ -255,6 +267,42 @@ class BindingsWaiter {
`;
}
+ /**
+ * Shows contextual help message based on where the mouse pointer is
+ */
+ contextualHelp() {
+ const hoveredHelpEls = document.querySelectorAll(":hover[data-help],:hover[data-help-proxy]");
+ if (!hoveredHelpEls.length) return;
+
+ let helpEl = hoveredHelpEls[hoveredHelpEls.length - 1];
+ const helpElSelector = helpEl.getAttribute("data-help-proxy");
+ if (helpElSelector) {
+ // A hovered element is directing us to another element for its help text
+ helpEl = document.querySelector(helpElSelector);
+ }
+ this.displayHelp(helpEl);
+ }
+
+ /**
+ * Displays the help pane populated with help text associated with the given element
+ *
+ * @param {Element} el
+ */
+ displayHelp(el) {
+ const helpText = el.getAttribute("data-help");
+ let helpTitle = el.getAttribute("data-help-title");
+
+ if (helpTitle)
+ helpTitle = "Help topic: " + helpTitle;
+ else
+ helpTitle = "Help topic ";
+
+ document.querySelector("#help-modal .modal-body").innerHTML = helpText;
+ document.querySelector("#help-modal #help-title").innerHTML = helpTitle;
+
+ $("#help-modal").modal();
+ }
+
}
export default BindingsWaiter;
diff --git a/src/web/waiters/ControlsWaiter.mjs b/src/web/waiters/ControlsWaiter.mjs
index 5a9533f5..6a0ef6f2 100755
--- a/src/web/waiters/ControlsWaiter.mjs
+++ b/src/web/waiters/ControlsWaiter.mjs
@@ -138,9 +138,18 @@ class ControlsWaiter {
}
}
+ const inputChrEnc = this.manager.input.getChrEnc();
+ const outputChrEnc = this.manager.output.getChrEnc();
+ const inputEOLSeq = this.manager.input.getEOLSeq();
+ const outputEOLSeq = this.manager.output.getEOLSeq();
+
const params = [
includeRecipe ? ["recipe", recipeStr] : undefined,
- includeInput ? ["input", Utils.escapeHtml(input)] : undefined,
+ includeInput && input.length ? ["input", Utils.escapeHtml(input)] : undefined,
+ inputChrEnc !== 0 ? ["ienc", inputChrEnc] : undefined,
+ outputChrEnc !== 0 ? ["oenc", outputChrEnc] : undefined,
+ inputEOLSeq !== "\n" ? ["ieol", inputEOLSeq] : undefined,
+ outputEOLSeq !== "\n" ? ["oeol", outputEOLSeq] : undefined
];
const hash = params
@@ -410,6 +419,17 @@ ${navigator.userAgent}
}
}
+ /**
+ * Calculates the height of the controls area and adjusts the recipe
+ * height accordingly.
+ */
+ calcControlsHeight() {
+ const controls = document.getElementById("controls"),
+ recList = document.getElementById("rec-list");
+
+ recList.style.bottom = controls.clientHeight + "px";
+ }
+
}
export default ControlsWaiter;
diff --git a/src/web/waiters/HighlighterWaiter.mjs b/src/web/waiters/HighlighterWaiter.mjs
index 664daef8..20ad0c6a 100755
--- a/src/web/waiters/HighlighterWaiter.mjs
+++ b/src/web/waiters/HighlighterWaiter.mjs
@@ -4,18 +4,8 @@
* @license Apache-2.0
*/
-/**
- * HighlighterWaiter data type enum for the input.
- * @enum
- */
-const INPUT = 0;
-
-/**
- * HighlighterWaiter data type enum for the output.
- * @enum
- */
-const OUTPUT = 1;
-
+import {EditorSelection} from "@codemirror/state";
+import {chrEncWidth} from "../../core/lib/ChrEnc.mjs";
/**
* Waiter to handle events related to highlighting in CyberChef.
@@ -32,436 +22,115 @@ class HighlighterWaiter {
this.app = app;
this.manager = manager;
- this.mouseButtonDown = false;
- this.mouseTarget = null;
+ this.currentSelectionRanges = [];
}
-
/**
- * Determines if the current text selection is running backwards or forwards.
- * StackOverflow answer id: 12652116
+ * Handler for selection change events in the input and output
*
- * @private
- * @returns {boolean}
- */
- _isSelectionBackwards() {
- let backwards = false;
- const sel = window.getSelection();
-
- if (!sel.isCollapsed) {
- const range = document.createRange();
- range.setStart(sel.anchorNode, sel.anchorOffset);
- range.setEnd(sel.focusNode, sel.focusOffset);
- backwards = range.collapsed;
- range.detach();
- }
- return backwards;
- }
-
-
- /**
- * Calculates the text offset of a position in an HTML element, ignoring HTML tags.
- *
- * @private
- * @param {element} node - The parent HTML node.
- * @param {number} offset - The offset since the last HTML element.
- * @returns {number}
- */
- _getOutputHtmlOffset(node, offset) {
- const sel = window.getSelection();
- const range = document.createRange();
-
- range.selectNodeContents(document.getElementById("output-html"));
- range.setEnd(node, offset);
- sel.removeAllRanges();
- sel.addRange(range);
-
- return sel.toString().length;
- }
-
-
- /**
- * Gets the current selection offsets in the output HTML, ignoring HTML tags.
- *
- * @private
- * @returns {Object} pos
- * @returns {number} pos.start
- * @returns {number} pos.end
- */
- _getOutputHtmlSelectionOffsets() {
- const sel = window.getSelection();
- let range,
- start = 0,
- end = 0,
- backwards = false;
-
- if (sel.rangeCount) {
- range = sel.getRangeAt(sel.rangeCount - 1);
- backwards = this._isSelectionBackwards();
- start = this._getOutputHtmlOffset(range.startContainer, range.startOffset);
- end = this._getOutputHtmlOffset(range.endContainer, range.endOffset);
- sel.removeAllRanges();
- sel.addRange(range);
-
- if (backwards) {
- // If selecting backwards, reverse the start and end offsets for the selection to
- // prevent deselecting as the drag continues.
- sel.collapseToEnd();
- sel.extend(sel.anchorNode, range.startOffset);
- }
- }
-
- return {
- start: start,
- end: end
- };
- }
-
-
- /**
- * Handler for input scroll events.
- * Scrolls the highlighter pane to match the input textarea position.
- *
- * @param {event} e
- */
- inputScroll(e) {
- const el = e.target;
- document.getElementById("input-highlighter").scrollTop = el.scrollTop;
- document.getElementById("input-highlighter").scrollLeft = el.scrollLeft;
- }
-
-
- /**
- * Handler for output scroll events.
- * Scrolls the highlighter pane to match the output textarea position.
- *
- * @param {event} e
- */
- outputScroll(e) {
- const el = e.target;
- document.getElementById("output-highlighter").scrollTop = el.scrollTop;
- document.getElementById("output-highlighter").scrollLeft = el.scrollLeft;
- }
-
-
- /**
- * Handler for input mousedown events.
- * Calculates the current selection info, and highlights the corresponding data in the output.
- *
- * @param {event} e
- */
- inputMousedown(e) {
- this.mouseButtonDown = true;
- this.mouseTarget = INPUT;
- this.removeHighlights();
-
- const el = e.target;
- const start = el.selectionStart;
- const end = el.selectionEnd;
-
- if (start !== 0 || end !== 0) {
- document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end);
- this.highlightOutput([{start: start, end: end}]);
- }
- }
-
-
- /**
- * Handler for output mousedown events.
- * Calculates the current selection info, and highlights the corresponding data in the input.
- *
- * @param {event} e
- */
- outputMousedown(e) {
- this.mouseButtonDown = true;
- this.mouseTarget = OUTPUT;
- this.removeHighlights();
-
- const el = e.target;
- const start = el.selectionStart;
- const end = el.selectionEnd;
-
- if (start !== 0 || end !== 0) {
- document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end);
- this.highlightInput([{start: start, end: end}]);
- }
- }
-
-
- /**
- * Handler for output HTML mousedown events.
- * Calculates the current selection info.
- *
- * @param {event} e
- */
- outputHtmlMousedown(e) {
- this.mouseButtonDown = true;
- this.mouseTarget = OUTPUT;
-
- const sel = this._getOutputHtmlSelectionOffsets();
- if (sel.start !== 0 || sel.end !== 0) {
- document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end);
- }
- }
-
-
- /**
- * Handler for input mouseup events.
- *
- * @param {event} e
- */
- inputMouseup(e) {
- this.mouseButtonDown = false;
- }
-
-
- /**
- * Handler for output mouseup events.
- *
- * @param {event} e
- */
- outputMouseup(e) {
- this.mouseButtonDown = false;
- }
-
-
- /**
- * Handler for output HTML mouseup events.
- *
- * @param {event} e
- */
- outputHtmlMouseup(e) {
- this.mouseButtonDown = false;
- }
-
-
- /**
- * Handler for input mousemove events.
- * Calculates the current selection info, and highlights the corresponding data in the output.
- *
- * @param {event} e
- */
- inputMousemove(e) {
- // Check that the left mouse button is pressed
- if (!this.mouseButtonDown ||
- e.which !== 1 ||
- this.mouseTarget !== INPUT)
- return;
-
- const el = e.target;
- const start = el.selectionStart;
- const end = el.selectionEnd;
-
- if (start !== 0 || end !== 0) {
- document.getElementById("input-selection-info").innerHTML = this.selectionInfo(start, end);
- this.highlightOutput([{start: start, end: end}]);
- }
- }
-
-
- /**
- * Handler for output mousemove events.
- * Calculates the current selection info, and highlights the corresponding data in the input.
- *
- * @param {event} e
- */
- outputMousemove(e) {
- // Check that the left mouse button is pressed
- if (!this.mouseButtonDown ||
- e.which !== 1 ||
- this.mouseTarget !== OUTPUT)
- return;
-
- const el = e.target;
- const start = el.selectionStart;
- const end = el.selectionEnd;
-
- if (start !== 0 || end !== 0) {
- document.getElementById("output-selection-info").innerHTML = this.selectionInfo(start, end);
- this.highlightInput([{start: start, end: end}]);
- }
- }
-
-
- /**
- * Handler for output HTML mousemove events.
- * Calculates the current selection info.
- *
- * @param {event} e
- */
- outputHtmlMousemove(e) {
- // Check that the left mouse button is pressed
- if (!this.mouseButtonDown ||
- e.which !== 1 ||
- this.mouseTarget !== OUTPUT)
- return;
-
- const sel = this._getOutputHtmlSelectionOffsets();
- if (sel.start !== 0 || sel.end !== 0) {
- document.getElementById("output-selection-info").innerHTML = this.selectionInfo(sel.start, sel.end);
- }
- }
-
-
- /**
- * Given start and end offsets, writes the HTML for the selection info element with the correct
- * padding.
- *
- * @param {number} start - The start offset.
- * @param {number} end - The end offset.
- * @returns {string}
- */
- selectionInfo(start, end) {
- const len = end.toString().length;
- const width = len < 2 ? 2 : len;
- const startStr = start.toString().padStart(width, " ").replace(/ /g, " ");
- const endStr = end.toString().padStart(width, " ").replace(/ /g, " ");
- const lenStr = (end-start).toString().padStart(width, " ").replace(/ /g, " ");
-
- return "start: " + startStr + " end: " + endStr + " length: " + lenStr;
- }
-
-
- /**
- * Removes highlighting and selection information.
- */
- removeHighlights() {
- document.getElementById("input-highlighter").innerHTML = "";
- document.getElementById("output-highlighter").innerHTML = "";
- document.getElementById("input-selection-info").innerHTML = "";
- document.getElementById("output-selection-info").innerHTML = "";
- }
-
-
- /**
- * Highlights the given offsets in the output.
+ * Highlights the given offsets in the input or output.
* We will only highlight if:
* - input hasn't changed since last bake
* - last bake was a full bake
* - all operations in the recipe support highlighting
*
- * @param {Object} pos - The position object for the highlight.
- * @param {number} pos.start - The start offset.
- * @param {number} pos.end - The end offset.
+ * @param {string} io
+ * @param {ViewUpdate} e
*/
- highlightOutput(pos) {
+ selectionChange(io, e) {
+ // Confirm we are not currently baking
if (!this.app.autoBake_ || this.app.baking) return false;
- this.manager.worker.highlight(this.app.getRecipeConfig(), "forward", pos);
+
+ // Confirm this was a user-generated event to prevent looping
+ // from setting the selection in this class
+ if (!e.transactions[0].isUserEvent("select")) return false;
+
+ this.currentSelectionRanges = [];
+
+ // Confirm some non-empty ranges are set
+ const selectionRanges = e.state.selection.ranges;
+
+ // Adjust offsets based on the width of the character set
+ const inputCharacterWidth = chrEncWidth(this.manager.input.getChrEnc());
+ const outputCharacterWidth = chrEncWidth(this.manager.output.getChrEnc());
+ let ratio = 1;
+ if (inputCharacterWidth !== outputCharacterWidth &&
+ inputCharacterWidth !== 0 && outputCharacterWidth !== 0) {
+ ratio = io === "input" ?
+ inputCharacterWidth / outputCharacterWidth :
+ outputCharacterWidth / inputCharacterWidth;
+ }
+
+ // Loop through ranges and send request for output offsets for each one
+ const direction = io === "input" ? "forward" : "reverse";
+ for (const range of selectionRanges) {
+ const pos = [{
+ start: Math.floor(range.from * ratio),
+ end: Math.floor(range.to * ratio)
+ }];
+ this.manager.worker.highlight(this.app.getRecipeConfig(), direction, pos);
+ }
}
-
- /**
- * Highlights the given offsets in the input.
- * We will only highlight if:
- * - input hasn't changed since last bake
- * - last bake was a full bake
- * - all operations in the recipe support highlighting
- *
- * @param {Object} pos - The position object for the highlight.
- * @param {number} pos.start - The start offset.
- * @param {number} pos.end - The end offset.
- */
- highlightInput(pos) {
- if (!this.app.autoBake_ || this.app.baking) return false;
- this.manager.worker.highlight(this.app.getRecipeConfig(), "reverse", pos);
- }
-
-
/**
* Displays highlight offsets sent back from the Chef.
*
- * @param {Object} pos - The position object for the highlight.
+ * @param {Object[]} pos - The position object for the highlight.
* @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset.
* @param {string} direction
*/
displayHighlights(pos, direction) {
if (!pos) return;
-
- if (this.manager.tabs.getActiveInputTab() !== this.manager.tabs.getActiveOutputTab()) return;
+ if (this.manager.tabs.getActiveTab("input") !== this.manager.tabs.getActiveTab("output")) return;
const io = direction === "forward" ? "output" : "input";
-
- document.getElementById(io + "-selection-info").innerHTML = this.selectionInfo(pos[0].start, pos[0].end);
- this.highlight(
- document.getElementById(io + "-text"),
- document.getElementById(io + "-highlighter"),
- pos);
+ this.highlight(io, pos);
}
-
/**
- * Adds the relevant HTML to the specified highlight element such that highlighting appears
- * underneath the correct offset.
+ * Sends selection updates to the relevant EditorView.
*
- * @param {element} textarea - The input or output textarea.
- * @param {element} highlighter - The input or output highlighter element.
- * @param {Object} pos - The position object for the highlight.
- * @param {number} pos.start - The start offset.
- * @param {number} pos.end - The end offset.
+ * @param {string} io - The input or output
+ * @param {Object[]} ranges - An array of position objects to highlight
+ * @param {number} ranges.start - The start offset
+ * @param {number} ranges.end - The end offset
*/
- async highlight(textarea, highlighter, pos) {
+ async highlight(io, ranges) {
if (!this.app.options.showHighlighter) return false;
if (!this.app.options.attemptHighlight) return false;
+ if (!ranges || !ranges.length) return false;
- // Check if there is a carriage return in the output dish as this will not
- // be displayed by the HTML textarea and will mess up highlighting offsets.
- if (await this.manager.output.containsCR()) return false;
+ const view = io === "input" ?
+ this.manager.input.inputEditorView :
+ this.manager.output.outputEditorView;
- const startPlaceholder = "[startHighlight]";
- const startPlaceholderRegex = /\[startHighlight\]/g;
- const endPlaceholder = "[endHighlight]";
- const endPlaceholderRegex = /\[endHighlight\]/g;
- let text = textarea.value;
+ // Add new SelectionRanges to existing ones
+ for (const range of ranges) {
+ if (typeof range.start !== "number" ||
+ typeof range.end !== "number")
+ continue;
+ const selection = range.end <= range.start ?
+ EditorSelection.cursor(range.start) :
+ EditorSelection.range(range.start, range.end);
- // Put placeholders in position
- // If there's only one value, select that
- // If there are multiple, ignore the first one and select all others
- if (pos.length === 1) {
- if (pos[0].end < pos[0].start) return;
- text = text.slice(0, pos[0].start) +
- startPlaceholder + text.slice(pos[0].start, pos[0].end) + endPlaceholder +
- text.slice(pos[0].end, text.length);
- } else {
- // O(n^2) - Can anyone improve this without overwriting placeholders?
- let result = "",
- endPlaced = true;
-
- for (let i = 0; i < text.length; i++) {
- for (let j = 1; j < pos.length; j++) {
- if (pos[j].end < pos[j].start) continue;
- if (pos[j].start === i) {
- result += startPlaceholder;
- endPlaced = false;
- }
- if (pos[j].end === i) {
- result += endPlaceholder;
- endPlaced = true;
- }
- }
- result += text[i];
- }
- if (!endPlaced) result += endPlaceholder;
- text = result;
+ this.currentSelectionRanges.push(selection);
}
- const cssClass = "hl1";
-
- // Remove HTML tags
- text = text
- .replace(/&/g, "&")
- .replace(//g, ">")
- .replace(/\n/g, "
")
- // Convert placeholders to tags
- .replace(startPlaceholderRegex, "")
- .replace(endPlaceholderRegex, " ") + " ";
-
- // Adjust width to allow for scrollbars
- highlighter.style.width = textarea.clientWidth + "px";
- highlighter.innerHTML = text;
- highlighter.scrollTop = textarea.scrollTop;
- highlighter.scrollLeft = textarea.scrollLeft;
+ // Set selection
+ if (this.currentSelectionRanges.length) {
+ try {
+ view.dispatch({
+ selection: EditorSelection.create(this.currentSelectionRanges),
+ scrollIntoView: true
+ });
+ } catch (err) {
+ // Ignore Range Errors
+ if (!err.toString().startsWith("RangeError")) {
+ log.error(err);
+ }
+ }
+ }
}
}
diff --git a/src/web/waiters/InputWaiter.mjs b/src/web/waiters/InputWaiter.mjs
index b421d8d8..25c1629d 100644
--- a/src/web/waiters/InputWaiter.mjs
+++ b/src/web/waiters/InputWaiter.mjs
@@ -7,9 +7,42 @@
import LoaderWorker from "worker-loader?inline=no-fallback!../workers/LoaderWorker.js";
import InputWorker from "worker-loader?inline=no-fallback!../workers/InputWorker.mjs";
-import Utils, { debounce } from "../../core/Utils.mjs";
-import { toBase64 } from "../../core/lib/Base64.mjs";
-import { isImage } from "../../core/lib/FileType.mjs";
+import Utils, {debounce} from "../../core/Utils.mjs";
+import {toBase64} from "../../core/lib/Base64.mjs";
+import cptable from "codepage";
+
+import {
+ EditorView,
+ keymap,
+ highlightSpecialChars,
+ drawSelection,
+ rectangularSelection,
+ crosshairCursor,
+ dropCursor
+} from "@codemirror/view";
+import {
+ EditorState,
+ Compartment
+} from "@codemirror/state";
+import {
+ defaultKeymap,
+ insertTab,
+ insertNewline,
+ history,
+ historyKeymap
+} from "@codemirror/commands";
+import {
+ bracketMatching
+} from "@codemirror/language";
+import {
+ search,
+ searchKeymap,
+ highlightSelectionMatches
+} from "@codemirror/search";
+
+import {statusBar} from "../utils/statusBar.mjs";
+import {fileDetailsPanel} from "../utils/fileDetails.mjs";
+import {renderSpecialChar} from "../utils/editorUtils.mjs";
/**
@@ -27,23 +60,9 @@ class InputWaiter {
this.app = app;
this.manager = manager;
- // Define keys that don't change the input so we don't have to autobake when they are pressed
- this.badKeys = [
- 16, // Shift
- 17, // Ctrl
- 18, // Alt
- 19, // Pause
- 20, // Caps
- 27, // Esc
- 33, 34, 35, 36, // PgUp, PgDn, End, Home
- 37, 38, 39, 40, // Directional
- 44, // PrntScrn
- 91, 92, // Win
- 93, // Context
- 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, // F1-12
- 144, // Num
- 145, // Scroll
- ];
+ this.inputTextEl = document.getElementById("input-text");
+ this.inputChrEnc = 0;
+ this.initEditor();
this.inputWorker = null;
this.loaderWorkers = [];
@@ -51,6 +70,7 @@ class InputWaiter {
this.maxTabs = this.manager.tabs.calcMaxTabs();
this.callbacks = {};
this.callbackID = 0;
+ this.fileDetails = {};
this.maxWorkers = 1;
if (navigator.hardwareConcurrency !== undefined &&
@@ -61,6 +81,187 @@ class InputWaiter {
}
}
+ /**
+ * Sets up the CodeMirror Editor
+ */
+ initEditor() {
+ // Mutable extensions
+ this.inputEditorConf = {
+ eol: new Compartment,
+ lineWrapping: new Compartment,
+ fileDetailsPanel: new Compartment
+ };
+
+ const initialState = EditorState.create({
+ doc: null,
+ extensions: [
+ // Editor extensions
+ history(),
+ highlightSpecialChars({
+ render: renderSpecialChar // Custom character renderer to handle special cases
+ }),
+ drawSelection(),
+ rectangularSelection(),
+ crosshairCursor(),
+ dropCursor(),
+ bracketMatching(),
+ highlightSelectionMatches(),
+ search({top: true}),
+ EditorState.allowMultipleSelections.of(true),
+
+ // Custom extensions
+ statusBar({
+ label: "Input",
+ eolHandler: this.eolChange.bind(this),
+ chrEncHandler: this.chrEncChange.bind(this),
+ chrEncGetter: this.getChrEnc.bind(this)
+ }),
+
+ // Mutable state
+ this.inputEditorConf.fileDetailsPanel.of([]),
+ this.inputEditorConf.lineWrapping.of(EditorView.lineWrapping),
+ this.inputEditorConf.eol.of(EditorState.lineSeparator.of("\n")),
+
+ // Keymap
+ keymap.of([
+ // Explicitly insert a tab rather than indenting the line
+ { key: "Tab", run: insertTab },
+ // Explicitly insert a new line (using the current EOL char) rather
+ // than messing around with indenting, which does not respect EOL chars
+ { key: "Enter", run: insertNewline },
+ ...historyKeymap,
+ ...defaultKeymap,
+ ...searchKeymap
+ ]),
+
+ // Event listeners
+ EditorView.updateListener.of(e => {
+ if (e.selectionSet)
+ this.manager.highlighter.selectionChange("input", e);
+ if (e.docChanged && !this.silentInputChange)
+ this.inputChange(e);
+ this.silentInputChange = false;
+ })
+ ]
+ });
+
+ this.inputEditorView = new EditorView({
+ state: initialState,
+ parent: this.inputTextEl
+ });
+ }
+
+ /**
+ * Handler for EOL change events
+ * Sets the line separator
+ * @param {string} eolVal
+ */
+ eolChange(eolVal) {
+ const oldInputVal = this.getInput();
+
+ // Update the EOL value
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.eol.reconfigure(EditorState.lineSeparator.of(eolVal))
+ });
+
+ // Reset the input so that lines are recalculated, preserving the old EOL values
+ this.setInput(oldInputVal);
+ }
+
+ /**
+ * Getter for the input EOL sequence
+ * @returns {string}
+ */
+ getEOLSeq() {
+ return this.inputEditorView.state.lineBreak;
+ }
+
+ /**
+ * Handler for Chr Enc change events
+ * Sets the input character encoding
+ * @param {number} chrEncVal
+ */
+ chrEncChange(chrEncVal) {
+ if (typeof chrEncVal !== "number") return;
+ this.inputChrEnc = chrEncVal;
+ this.inputChange();
+ }
+
+ /**
+ * Getter for the input character encoding
+ * @returns {number}
+ */
+ getChrEnc() {
+ return this.inputChrEnc;
+ }
+
+ /**
+ * Sets word wrap on the input editor
+ * @param {boolean} wrap
+ */
+ setWordWrap(wrap) {
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.lineWrapping.reconfigure(
+ wrap ? EditorView.lineWrapping : []
+ )
+ });
+ }
+
+ /**
+ * Gets the value of the current input
+ * @returns {string}
+ */
+ getInput() {
+ const doc = this.inputEditorView.state.doc;
+ const eol = this.getEOLSeq();
+ return doc.sliceString(0, doc.length, eol);
+ }
+
+ /**
+ * Sets the value of the current input
+ * @param {string} data
+ * @param {boolean} [silent=false]
+ */
+ setInput(data, silent=false) {
+ const lineLengthThreshold = 131072; // 128KB
+ let wrap = this.app.options.wordWrap;
+ if (data.length > lineLengthThreshold) {
+ const lines = data.split(this.getEOLSeq());
+ const longest = lines.reduce((a, b) =>
+ a > b.length ? a : b.length, 0
+ );
+ if (longest > lineLengthThreshold) {
+ // If we are exceeding the max line length, turn off word wrap
+ wrap = false;
+ this.app.alert("Maximum line length exceeded. Word wrap will be temporarily disabled to improve performance.", 20000);
+ }
+ }
+
+ // If turning word wrap off, do it before we populate the editor for performance reasons
+ if (!wrap) this.setWordWrap(wrap);
+
+ // We use setTimeout here to delay the editor dispatch until the next event cycle,
+ // ensuring all async actions have completed before attempting to set the contents
+ // of the editor. This is mainly with the above call to setWordWrap() in mind.
+ setTimeout(() => {
+ // Insert data into editor, overwriting any previous contents
+ this.silentInputChange = silent;
+ this.inputEditorView.dispatch({
+ changes: {
+ from: 0,
+ to: this.inputEditorView.state.doc.length,
+ insert: data
+ }
+ });
+
+ // If turning word wrap on, do it after we populate the editor
+ if (wrap)
+ setTimeout(() => {
+ this.setWordWrap(wrap);
+ });
+ });
+ }
+
/**
* Calculates the maximum number of tabs to display
*/
@@ -72,7 +273,7 @@ class InputWaiter {
action: "updateMaxTabs",
data: {
maxTabs: numTabs,
- activeTab: this.manager.tabs.getActiveInputTab()
+ activeTab: this.manager.tabs.getActiveTab("input")
}
});
}
@@ -93,6 +294,10 @@ class InputWaiter {
log.debug("Adding new InputWorker");
this.inputWorker = new InputWorker();
+ this.inputWorker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
this.inputWorker.postMessage({
action: "updateMaxWorkers",
data: this.maxWorkers
@@ -101,13 +306,10 @@ class InputWaiter {
action: "updateMaxTabs",
data: {
maxTabs: this.maxTabs,
- activeTab: this.manager.tabs.getActiveInputTab()
+ activeTab: this.manager.tabs.getActiveTab("input")
}
});
- this.inputWorker.postMessage({
- action: "setLogLevel",
- data: log.getLevel()
- });
+
this.inputWorker.addEventListener("message", this.handleInputWorkerMessage.bind(this));
}
@@ -136,11 +338,20 @@ class InputWaiter {
if (this.loaderWorkers.length === this.maxWorkers) {
return -1;
}
- log.debug("Adding new LoaderWorker.");
+ log.debug(`Adding new LoaderWorker (${this.loaderWorkers.length + 1}/${this.maxWorkers}).`);
const newWorker = new LoaderWorker();
const workerId = this.workerId++;
newWorker.addEventListener("message", this.handleLoaderMessage.bind(this));
- newWorker.postMessage({id: workerId});
+ newWorker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
+ newWorker.postMessage({
+ action: "setID",
+ data: {
+ id: workerId
+ }
+ });
const newWorkerObj = {
worker: newWorker,
id: workerId
@@ -205,8 +416,11 @@ class InputWaiter {
const idx = this.getLoaderWorkerIndex(inputData.workerId);
if (idx === -1) return;
this.loaderWorkers[idx].worker.postMessage({
- file: inputData.file,
- inputNum: inputData.inputNum
+ action: "loadFile",
+ data: {
+ file: inputData.file,
+ inputNum: inputData.inputNum
+ }
});
}
@@ -221,7 +435,7 @@ class InputWaiter {
if (Object.prototype.hasOwnProperty.call(r, "progress") &&
Object.prototype.hasOwnProperty.call(r, "inputNum")) {
- this.manager.tabs.updateInputTabProgress(r.inputNum, r.progress, 100);
+ this.manager.tabs.updateTabProgress(r.inputNum, r.progress, 100, "input");
}
const transferable = Object.prototype.hasOwnProperty.call(r, "fileBuffer") ? [r.fileBuffer] : undefined;
@@ -233,7 +447,7 @@ class InputWaiter {
/**
- * Handler for messages sent back by the inputWorker
+ * Handler for messages sent back by the InputWorker
*
* @param {MessageEvent} e
*/
@@ -245,7 +459,7 @@ class InputWaiter {
return;
}
- log.debug(`Receiving ${r.action} from InputWorker.`);
+ log.debug(`Receiving '${r.action}' from InputWorker.`);
switch (r.action) {
case "activateLoaderWorker":
@@ -264,13 +478,13 @@ class InputWaiter {
this.changeTab(r.data, this.app.options.syncTabs);
break;
case "updateTabHeader":
- this.manager.tabs.updateInputTabHeader(r.data.inputNum, r.data.input);
+ this.manager.tabs.updateTabHeader(r.data.inputNum, r.data.input, "input");
break;
case "loadingInfo":
this.showLoadingInfo(r.data, true);
break;
case "setInput":
- debounce(this.set, 50, "setInput", this, [r.data.inputObj, r.data.silent])();
+ this.set(r.data.inputNum, r.data.inputObj, r.data.silent);
break;
case "inputAdded":
this.inputAdded(r.data.changeTab, r.data.inputNum);
@@ -281,8 +495,8 @@ class InputWaiter {
case "queueInputError":
this.manager.worker.queueInputError(r.data);
break;
- case "bakeAllInputs":
- this.manager.worker.bakeAllInputs(r.data);
+ case "bakeInputs":
+ this.manager.worker.bakeInputs(r.data);
break;
case "displayTabSearchResults":
this.displayTabSearchResults(r.data);
@@ -291,10 +505,7 @@ class InputWaiter {
this.app.handleError(r.data);
break;
case "setUrl":
- this.setUrl(r.data);
- break;
- case "inputSwitch":
- this.manager.output.inputSwitch(r.data);
+ this.app.updateURL(r.data.includeInput, r.data.input);
break;
case "getInput":
case "getInputNums":
@@ -325,99 +536,134 @@ class InputWaiter {
/**
* Sets the input in the input area
*
- * @param {object} inputData - Object containing the input and its metadata
- * @param {number} inputData.inputNum - The unique inputNum for the selected input
- * @param {string | object} inputData.input - The actual input data
- * @param {string} inputData.name - The name of the input file
- * @param {number} inputData.size - The size in bytes of the input file
- * @param {string} inputData.type - The MIME type of the input file
- * @param {number} inputData.progress - The load progress of the input file
+ * @param {number} inputNum
+ * @param {Object} inputData - Object containing the input and its metadata
+ * @param {string} type
+ * @param {ArrayBuffer} buffer
+ * @param {string} stringSample
+ * @param {Object} file
+ * @param {string} file.name
+ * @param {number} file.size
+ * @param {string} file.type
+ * @param {string} status
+ * @param {number} progress
+ * @param {number} encoding
+ * @param {string} eolSequence
* @param {boolean} [silent=false] - If false, fires the manager statechange event
*/
- async set(inputData, silent=false) {
+ async set(inputNum, inputData, silent=false) {
return new Promise(function(resolve, reject) {
- const activeTab = this.manager.tabs.getActiveInputTab();
- if (inputData.inputNum !== activeTab) return;
-
- const inputText = document.getElementById("input-text");
-
- if (typeof inputData.input === "string") {
- inputText.value = inputData.input;
- const fileOverlay = document.getElementById("input-file"),
- fileName = document.getElementById("input-file-name"),
- fileSize = document.getElementById("input-file-size"),
- fileType = document.getElementById("input-file-type"),
- fileLoaded = document.getElementById("input-file-loaded");
-
- fileOverlay.style.display = "none";
- fileName.textContent = "";
- fileSize.textContent = "";
- fileType.textContent = "";
- fileLoaded.textContent = "";
-
- inputText.style.overflow = "auto";
- inputText.classList.remove("blur");
- inputText.scroll(0, 0);
-
- const lines = inputData.input.length < (this.app.options.ioDisplayThreshold * 1024) ?
- inputData.input.count("\n") + 1 : null;
- this.setInputInfo(inputData.input.length, lines);
-
- // Set URL to current input
- const inputStr = toBase64(inputData.input, "A-Za-z0-9+/");
- if (inputStr.length > 0 && inputStr.length <= 68267) {
- this.setUrl({
- includeInput: true,
- input: inputStr
- });
- }
-
- if (!silent) window.dispatchEvent(this.manager.statechange);
- } else {
- this.setFile(inputData, silent);
+ const activeTab = this.manager.tabs.getActiveTab("input");
+ if (inputNum !== activeTab) {
+ this.changeTab(inputNum, this.app.options.syncTabs);
+ return;
}
+ // Update current character encoding
+ this.inputChrEnc = inputData.encoding;
+
+ // Update current eol sequence
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.eol.reconfigure(
+ EditorState.lineSeparator.of(inputData.eolSequence)
+ )
+ });
+
+ // Handle file previews
+ if (inputData.file) {
+ this.setFile(inputNum, inputData);
+ } else {
+ this.clearFile(inputNum);
+ }
+
+ // Decode the data to a string
+ this.manager.timing.recordTime("inputEncodingStart", inputNum);
+ let inputVal;
+ if (this.getChrEnc() > 0) {
+ inputVal = cptable.utils.decode(this.inputChrEnc, new Uint8Array(inputData.buffer));
+ } else {
+ inputVal = Utils.arrayBufferToStr(inputData.buffer);
+ }
+ this.manager.timing.recordTime("inputEncodingEnd", inputNum);
+
+ // Populate the input editor
+ this.setInput(inputVal, silent);
+
+ // Set URL to current input
+ if (inputVal.length >= 0 && inputVal.length <= 51200) {
+ const inputStr = toBase64(inputVal, "A-Za-z0-9+/");
+ this.app.updateURL(true, inputStr);
+ }
+
+ // Trigger a state change
+ if (!silent) window.dispatchEvent(this.manager.statechange);
+
}.bind(this));
}
/**
* Displays file details
*
- * @param {object} inputData - Object containing the input and its metadata
- * @param {number} inputData.inputNum - The unique inputNum for the selected input
- * @param {string | object} inputData.input - The actual input data
- * @param {string} inputData.name - The name of the input file
- * @param {number} inputData.size - The size in bytes of the input file
- * @param {string} inputData.type - The MIME type of the input file
- * @param {number} inputData.progress - The load progress of the input file
- * @param {boolean} [silent=true] - If false, fires the manager statechange event
+ * @param {number} inputNum
+ * @param {Object} inputData - Object containing the input and its metadata
+ * @param {string} type
+ * @param {ArrayBuffer} buffer
+ * @param {string} stringSample
+ * @param {Object} file
+ * @param {string} file.name
+ * @param {number} file.size
+ * @param {string} file.type
+ * @param {string} status
+ * @param {number} progress
*/
- setFile(inputData, silent=true) {
- const activeTab = this.manager.tabs.getActiveInputTab();
- if (inputData.inputNum !== activeTab) return;
+ setFile(inputNum, inputData) {
+ const activeTab = this.manager.tabs.getActiveTab("input");
+ if (inputNum !== activeTab) return;
- const fileOverlay = document.getElementById("input-file"),
- fileName = document.getElementById("input-file-name"),
- fileSize = document.getElementById("input-file-size"),
- fileType = document.getElementById("input-file-type"),
- fileLoaded = document.getElementById("input-file-loaded");
+ // Create file details panel
+ this.fileDetails = {
+ fileDetails: inputData.file,
+ progress: inputData.progress,
+ status: inputData.status,
+ buffer: inputData.buffer,
+ renderPreview: this.app.options.imagePreview,
+ toggleHandler: this.toggleFileDetails.bind(this),
+ hidden: false
+ };
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.fileDetailsPanel.reconfigure(
+ fileDetailsPanel(this.fileDetails)
+ )
+ });
+ }
- fileOverlay.style.display = "block";
- fileName.textContent = inputData.name;
- fileSize.textContent = inputData.size + " bytes";
- fileType.textContent = inputData.type;
- if (inputData.status === "error") {
- fileLoaded.textContent = "Error";
- fileLoaded.style.color = "#FF0000";
- } else {
- fileLoaded.style.color = "";
- fileLoaded.textContent = inputData.progress + "%";
- }
+ /**
+ * Clears the file details panel
+ *
+ * @param {number} inputNum
+ */
+ clearFile(inputNum) {
+ const activeTab = this.manager.tabs.getActiveTab("input");
+ if (inputNum !== activeTab) return;
- this.setInputInfo(inputData.size, null);
- this.displayFilePreview(inputData);
+ // Clear file details panel
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.fileDetailsPanel.reconfigure([])
+ });
+ }
- if (!silent) window.dispatchEvent(this.manager.statechange);
+ /**
+ * Handler for file details toggle clicks
+ * @param {event} e
+ */
+ toggleFileDetails(e) {
+ $("[data-toggle='tooltip']").tooltip("hide");
+ this.fileDetails.hidden = !this.fileDetails.hidden;
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.fileDetailsPanel.reconfigure(
+ fileDetailsPanel(this.fileDetails)
+ )
+ });
}
/**
@@ -426,9 +672,9 @@ class InputWaiter {
* @param {number} inputNum - The inputNum of the input which has finished loading
*/
fileLoaded(inputNum) {
- this.manager.tabs.updateInputTabProgress(inputNum, 100, 100);
+ this.manager.tabs.updateTabProgress(inputNum, 100, 100, "input");
- const activeTab = this.manager.tabs.getActiveInputTab();
+ const activeTab = this.manager.tabs.getActiveTab("input");
if (activeTab !== inputNum) return;
this.inputWorker.postMessage({
@@ -442,63 +688,6 @@ class InputWaiter {
this.updateFileProgress(inputNum, 100);
}
- /**
- * Render the input thumbnail
- */
- async renderFileThumb() {
- const activeTab = this.manager.tabs.getActiveInputTab(),
- input = await this.getInputValue(activeTab),
- fileThumb = document.getElementById("input-file-thumbnail");
-
- if (typeof input === "string" ||
- !this.app.options.imagePreview) {
- this.resetFileThumb();
- return;
- }
-
- const inputArr = new Uint8Array(input),
- type = isImage(inputArr);
-
- if (type && type !== "image/tiff" && inputArr.byteLength <= 512000) {
- // Most browsers don't support displaying TIFFs, so ignore them
- // Don't render images over 512000 bytes
- const blob = new Blob([inputArr], {type: type}),
- url = URL.createObjectURL(blob);
- fileThumb.src = url;
- } else {
- this.resetFileThumb();
- }
-
- }
-
- /**
- * Reset the input thumbnail to the default icon
- */
- resetFileThumb() {
- const fileThumb = document.getElementById("input-file-thumbnail");
- fileThumb.src = require("../static/images/file-128x128.png").default;
- }
-
- /**
- * Shows a chunk of the file in the input behind the file overlay
- *
- * @param {Object} inputData - Object containing the input data
- * @param {number} inputData.inputNum - The inputNum of the file being displayed
- * @param {ArrayBuffer} inputData.input - The actual input to display
- */
- displayFilePreview(inputData) {
- const activeTab = this.manager.tabs.getActiveInputTab(),
- input = inputData.input,
- inputText = document.getElementById("input-text");
- if (inputData.inputNum !== activeTab) return;
- inputText.style.overflow = "hidden";
- inputText.classList.add("blur");
- inputText.value = Utils.printable(Utils.arrayBufferToStr(input.slice(0, 4096)));
-
- this.renderFileThumb();
-
- }
-
/**
* Updates the displayed load progress for a file
*
@@ -506,17 +695,16 @@ class InputWaiter {
* @param {number | string} progress - Either a number or "error"
*/
updateFileProgress(inputNum, progress) {
- const activeTab = this.manager.tabs.getActiveInputTab();
+ const activeTab = this.manager.tabs.getActiveTab("input");
if (inputNum !== activeTab) return;
- const fileLoaded = document.getElementById("input-file-loaded");
- if (progress === "error") {
- fileLoaded.textContent = "Error";
- fileLoaded.style.color = "#FF0000";
- } else {
- fileLoaded.textContent = progress + "%";
- fileLoaded.style.color = "";
- }
+ this.fileDetails.progress = progress;
+ if (progress === "error") this.fileDetails.status = "error";
+ this.inputEditorView.dispatch({
+ effects: this.inputEditorConf.fileDetailsPanel.reconfigure(
+ fileDetailsPanel(this.fileDetails)
+ )
+ });
}
/**
@@ -524,46 +712,44 @@ class InputWaiter {
*
* @param {number} inputNum
* @param {string | ArrayBuffer} value
- * @param {boolean} [force=false] - If true, forces the value to be updated even if the type is different to the currently stored type
*/
updateInputValue(inputNum, value, force=false) {
- let includeInput = false;
- const recipeStr = toBase64(value, "A-Za-z0-9+/"); // B64 alphabet with no padding
- if (recipeStr.length > 0 && recipeStr.length <= 68267) {
- includeInput = true;
- }
- this.setUrl({
- includeInput: includeInput,
- input: recipeStr
- });
+ // Prepare the value as a buffer (full value) and a string sample (up to 4096 bytes)
+ let buffer;
+ let stringSample = "";
- // Value is either a string set by the input or an ArrayBuffer from a LoaderWorker,
- // so is safe to use typeof === "string"
- const transferable = (typeof value !== "string") ? [value] : undefined;
+ // If value is a string, interpret it using the specified character encoding
+ const tabNum = this.manager.tabs.getActiveTab("input");
+ this.manager.timing.recordTime("inputEncodingStart", tabNum);
+ if (typeof value === "string") {
+ stringSample = value.slice(0, 4096);
+ if (this.getChrEnc() > 0) {
+ buffer = cptable.utils.encode(this.getChrEnc(), value);
+ buffer = new Uint8Array(buffer).buffer;
+ } else {
+ buffer = Utils.strToArrayBuffer(value);
+ }
+ } else {
+ buffer = value;
+ stringSample = Utils.arrayBufferToStr(value.slice(0, 4096));
+ }
+ this.manager.timing.recordTime("inputEncodingEnd", tabNum);
+
+ // Update the deep link
+ const recipeStr = buffer.byteLength < 51200 ? toBase64(buffer, "A-Za-z0-9+/") : ""; // B64 alphabet with no padding
+ const includeInput = recipeStr.length > 0 && buffer.byteLength < 51200;
+ this.app.updateURL(includeInput, recipeStr);
+
+ // Post new value to the InputWorker
+ const transferable = [buffer];
this.inputWorker.postMessage({
action: "updateInputValue",
data: {
inputNum: inputNum,
- value: value,
- force: force
- }
- }, transferable);
- }
-
- /**
- * Updates the .data property for the input of the specified inputNum.
- * Used for switching the output into the input
- *
- * @param {number} inputNum - The inputNum of the input we're changing
- * @param {object} inputData - The new data object
- */
- updateInputObj(inputNum, inputData) {
- const transferable = (typeof inputData !== "string") ? [inputData.fileBuffer] : undefined;
- this.inputWorker.postMessage({
- action: "updateInputObj",
- data: {
- inputNum: inputNum,
- data: inputData
+ buffer: buffer,
+ stringSample: stringSample,
+ encoding: this.getChrEnc(),
+ eolSequence: this.getEOLSeq()
}
}, transferable);
}
@@ -576,7 +762,7 @@ class InputWaiter {
*/
async getInputValue(inputNum) {
return await new Promise(resolve => {
- this.getInput(inputNum, false, r => {
+ this.getInputFromWorker(inputNum, false, r => {
resolve(r.data);
});
});
@@ -590,7 +776,7 @@ class InputWaiter {
*/
async getInputObj(inputNum) {
return await new Promise(resolve => {
- this.getInput(inputNum, true, r => {
+ this.getInputFromWorker(inputNum, true, r => {
resolve(r.data);
});
});
@@ -604,7 +790,7 @@ class InputWaiter {
* @param {Function} callback - The callback to execute when the input is returned
* @returns {ArrayBuffer | string | object}
*/
- getInput(inputNum, getObj, callback) {
+ getInputFromWorker(inputNum, getObj, callback) {
const id = this.callbackID++;
this.callbacks[id] = callback;
@@ -647,129 +833,39 @@ class InputWaiter {
});
}
-
- /**
- * Displays information about the input.
- *
- * @param {number} length - The length of the current input string
- * @param {number} lines - The number of the lines in the current input string
- */
- setInputInfo(length, lines) {
- let width = length.toString().length.toLocaleString();
- width = width < 2 ? 2 : width;
-
- const lengthStr = length.toString().padStart(width, " ").replace(/ /g, " ");
- let msg = "length: " + lengthStr;
-
- if (typeof lines === "number") {
- const linesStr = lines.toString().padStart(width, " ").replace(/ /g, " ");
- msg += " lines: " + linesStr;
- }
-
- document.getElementById("input-info").innerHTML = msg;
-
- }
-
- /**
- * Handler for input change events.
- * Debounces the input so we don't call autobake too often.
- *
- * @param {event} e
- */
- debounceInputChange(e) {
- debounce(this.inputChange, 50, "inputChange", this, [e])();
- }
-
/**
* Handler for input change events.
* Updates the value stored in the inputWorker
+ * Debounces the input so we don't call autobake too often.
*
* @param {event} e
*
* @fires Manager#statechange
*/
inputChange(e) {
- // Ignore this function if the input is a file
- const fileOverlay = document.getElementById("input-file");
- if (fileOverlay.style.display === "block") return;
+ // Change debounce delay based on input length
+ const inputLength = this.inputEditorView.state.doc.length;
+ let delay;
+ if (inputLength < 10000) delay = 20;
+ else if (inputLength < 100000) delay = 50;
+ else if (inputLength < 1000000) delay = 200;
+ else delay = 500;
- // Remove highlighting from input and output panes as the offsets might be different now
- this.manager.highlighter.removeHighlights();
+ debounce(function(e) {
+ const value = this.getInput();
+ const activeTab = this.manager.tabs.getActiveTab("input");
- const textArea = document.getElementById("input-text");
- const value = (textArea.value !== undefined) ? textArea.value : "";
- const activeTab = this.manager.tabs.getActiveInputTab();
-
- this.app.progress = 0;
-
- const lines = value.length < (this.app.options.ioDisplayThreshold * 1024) ?
- (value.count("\n") + 1) : null;
- this.setInputInfo(value.length, lines);
- this.updateInputValue(activeTab, value);
- this.manager.tabs.updateInputTabHeader(activeTab, value.replace(/[\n\r]/g, "").slice(0, 100));
-
- if (e && this.badKeys.indexOf(e.keyCode) < 0) {
- // Fire the statechange event as the input has been modified
- window.dispatchEvent(this.manager.statechange);
- }
- }
-
- /**
- * Handler for input paste events
- * Checks that the size of the input is below the display limit, otherwise treats it as a file/blob
- *
- * @param {event} e
- */
- async inputPaste(e) {
- e.preventDefault();
- e.stopPropagation();
-
- const self = this;
- /**
- * Triggers the input file/binary data overlay
- *
- * @param {string} pastedData
- */
- function triggerOverlay(pastedData) {
- const file = new File([pastedData], "PastedData", {
- type: "text/plain",
- lastModified: Date.now()
+ this.updateInputValue(activeTab, value);
+ this.inputWorker.postMessage({
+ action: "updateTabHeader",
+ data: activeTab
});
- self.loadUIFiles([file]);
- }
-
- const pastedData = e.clipboardData.getData("Text");
- const inputText = document.getElementById("input-text");
- const selStart = inputText.selectionStart;
- const selEnd = inputText.selectionEnd;
- const startVal = inputText.value.slice(0, selStart);
- const endVal = inputText.value.slice(selEnd);
- const val = startVal + pastedData + endVal;
-
- if (val.length >= (this.app.options.ioDisplayThreshold * 1024)) {
- // Data too large to display, use overlay
- triggerOverlay(val);
- return false;
- } else if (await this.preserveCarriageReturns(val)) {
- // Data contains a carriage return and the user doesn't wish to edit it, use overlay
- // We check this in a separate condition to make sure it is not run unless absolutely
- // necessary.
- triggerOverlay(val);
- return false;
- } else {
- // Pasting normally fires the inputChange() event before
- // changing the value, so instead change it here ourselves
- // and manually fire inputChange()
- inputText.value = val;
- inputText.setSelectionRange(selStart + pastedData.length, selStart + pastedData.length);
- // Don't debounce here otherwise the keyup event for the Ctrl key will cancel an autobake
- // (at least for large inputs)
- this.inputChange(e, true);
- }
+ // Fire the statechange event as the input has been modified
+ window.dispatchEvent(this.manager.statechange);
+ }, delay, "inputChange", this, [e])();
}
-
/**
* Handler for input dragover events.
* Gives the user a visual cue to show that items can be dropped here.
@@ -783,7 +879,7 @@ class InputWaiter {
e.stopPropagation();
e.preventDefault();
- e.target.closest("#input-text,#input-file").classList.add("dropping-file");
+ e.target.closest("#input-text").classList.add("dropping-file");
}
/**
@@ -795,7 +891,12 @@ class InputWaiter {
inputDragleave(e) {
e.stopPropagation();
e.preventDefault();
- e.target.closest("#input-text,#input-file").classList.remove("dropping-file");
+
+ // Dragleave often fires when moving between lines in the editor.
+ // If the from element is within the input-text element, we are still on target.
+ if (!this.inputTextEl.contains(e.fromElement)) {
+ e.target.closest("#input-text").classList.remove("dropping-file");
+ }
}
/**
@@ -804,27 +905,107 @@ class InputWaiter {
*
* @param {event} e
*/
- inputDrop(e) {
+ async inputDrop(e) {
// This will be set if we're dragging an operation
if (e.dataTransfer.effectAllowed === "move")
return false;
e.stopPropagation();
e.preventDefault();
+ e.target.closest("#input-text").classList.remove("dropping-file");
- const text = e.dataTransfer.getData("Text");
+ // Dropped text is handled by the editor itself
+ if (e.dataTransfer.getData("Text")) return;
- e.target.closest("#input-text,#input-file").classList.remove("dropping-file");
+ // Dropped files
+ if (e?.dataTransfer?.files?.length > 0) {
+ let files = [];
- if (text) {
- // Append the text to the current input and fire inputChange()
- document.getElementById("input-text").value += text;
- this.inputChange(e);
- return;
+ // Handling the files as FileSystemEntry objects allows us to open directories,
+ // but relies on a function that may be deprecated in future.
+ if (Object.prototype.hasOwnProperty.call(DataTransferItem.prototype, "webkitGetAsEntry")) {
+ const fileEntries = await this.getAllFileEntries(e.dataTransfer.items);
+ // Read all FileEntry objects into File objects
+ files = await Promise.all(fileEntries.map(async fe => await this.getFile(fe)));
+ } else {
+ files = e.dataTransfer.files;
+ }
+
+ this.loadUIFiles(files);
}
+ }
- if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {
- this.loadUIFiles(e.dataTransfer.files);
+ /**
+ *
+ * @param {DataTransferItemList} dataTransferItemList
+ * @returns {FileSystemEntry[]}
+ */
+ async getAllFileEntries(dataTransferItemList) {
+ const fileEntries = [];
+ // Use BFS to traverse entire directory/file structure
+ const queue = [];
+ // Unfortunately dataTransferItemList is not iterable i.e. no forEach
+ for (let i = 0; i < dataTransferItemList.length; i++) {
+ // Note webkitGetAsEntry a non-standard feature and may change
+ // Usage is necessary for handling directories
+ queue.push(dataTransferItemList[i].webkitGetAsEntry());
+ }
+ while (queue.length > 0) {
+ const entry = queue.shift();
+ if (entry.isFile) {
+ fileEntries.push(entry);
+ } else if (entry.isDirectory) {
+ queue.push(...await this.readAllDirectoryEntries(entry.createReader()));
+ }
+ }
+ return fileEntries;
+ }
+
+ /**
+ * Get all the entries (files or sub-directories) in a directory by calling
+ * readEntries until it returns empty array
+ *
+ * @param {FileSystemDirectoryReader} directoryReader
+ * @returns {FileSystemEntry[]}
+ */
+ async readAllDirectoryEntries(directoryReader) {
+ const entries = [];
+ let readEntries = await this.readEntriesPromise(directoryReader);
+ while (readEntries.length > 0) {
+ entries.push(...readEntries);
+ readEntries = await this.readEntriesPromise(directoryReader);
+ }
+ return entries;
+ }
+
+ /**
+ * Wrap readEntries in a promise to make working with readEntries easier.
+ * readEntries will return only some of the entries in a directory
+ * e.g. Chrome returns at most 100 entries at a time
+ *
+ * @param {FileSystemDirectoryReader} directoryReader
+ * @returns {Promise}
+ */
+ async readEntriesPromise(directoryReader) {
+ try {
+ return await new Promise((resolve, reject) => {
+ directoryReader.readEntries(resolve, reject);
+ });
+ } catch (err) {
+ log.error(err);
+ }
+ }
+
+ /**
+ * Reads a FileEntry and returns it as a File object
+ * @param {FileEntry} fileEntry
+ * @returns {File}
+ */
+ async getFile(fileEntry) {
+ try {
+ return new Promise((resolve, reject) => fileEntry.file(resolve, reject));
+ } catch (err) {
+ log.error(err);
}
}
@@ -844,41 +1025,19 @@ class InputWaiter {
}
/**
- * Checks if an input contains carriage returns.
- * If a CR is detected, checks if the preserve CR option has been set,
- * and if not, asks the user for their preference.
- *
- * @param {string} input - The input to be checked
- * @returns {boolean} - If true, the input contains a CR which should be
- * preserved, so display an overlay so it can't be edited
+ * Handler for open input button click.
+ * Opens the open file dialog.
*/
- async preserveCarriageReturns(input) {
- if (input.indexOf("\r") < 0) return false;
+ inputOpenClick() {
+ document.getElementById("open-file").click();
+ }
- const optionsStr = "This behaviour can be changed in the Options pane ";
- const preserveStr = `A carriage return (\\r, 0x0d) was detected in your input. To preserve it, editing has been disabled. ${optionsStr}`;
- const dontPreserveStr = `A carriage return (\\r, 0x0d) was detected in your input. It has not been preserved. ${optionsStr}`;
-
- switch (this.app.options.preserveCR) {
- case "always":
- this.app.alert(preserveStr, 6000);
- return true;
- case "never":
- this.app.alert(dontPreserveStr, 6000);
- return false;
- }
-
- // Only preserve for high-entropy inputs
- const data = Utils.strToArrayBuffer(input);
- const entropy = Utils.calculateShannonEntropy(data);
-
- if (entropy > 6) {
- this.app.alert(preserveStr, 6000);
- return true;
- }
-
- this.app.alert(dontPreserveStr, 6000);
- return false;
+ /**
+ * Handler for open folder button click
+ * Opens the open folder dialog.
+ */
+ folderOpenClick() {
+ document.getElementById("open-folder").click();
}
/**
@@ -888,7 +1047,7 @@ class InputWaiter {
*/
loadUIFiles(files) {
const numFiles = files.length;
- const activeTab = this.manager.tabs.getActiveInputTab();
+ const activeTab = this.manager.tabs.getActiveTab("input");
log.debug(`Loading ${numFiles} files.`);
// Display the number of files as pending so the user
@@ -913,22 +1072,6 @@ class InputWaiter {
});
}
- /**
- * Handler for open input button click.
- * Opens the open file dialog.
- */
- inputOpenClick() {
- document.getElementById("open-file").click();
- }
-
- /**
- * Handler for open folder button click
- * Opens the open folder dialog.
- */
- folderOpenClick() {
- document.getElementById("open-folder").click();
- }
-
/**
* Display the loaded files information in the input header.
* Also, sets the background of the Input header to be a progress bar
@@ -987,7 +1130,7 @@ class InputWaiter {
setTimeout(function() {
this.inputWorker.postMessage({
action: "getLoadProgress",
- data: this.manager.tabs.getActiveInputTab()
+ data: this.manager.tabs.getActiveTab("input")
});
}.bind(this), 100);
}
@@ -999,9 +1142,9 @@ class InputWaiter {
* @param {number} inputNum - The inputNum of the tab to change to
* @param {boolean} [changeOutput=false] - If true, also changes the output
*/
- changeTab(inputNum, changeOutput) {
- if (this.manager.tabs.getInputTabItem(inputNum) !== null) {
- this.manager.tabs.changeInputTab(inputNum);
+ changeTab(inputNum, changeOutput=false) {
+ if (this.manager.tabs.getTabItem(inputNum, "input") !== null) {
+ this.manager.tabs.changeTab(inputNum, "input");
this.inputWorker.postMessage({
action: "setInput",
data: {
@@ -1010,7 +1153,7 @@ class InputWaiter {
}
});
} else {
- const minNum = Math.min(...this.manager.tabs.getInputTabList());
+ const minNum = Math.min(...this.manager.tabs.getTabList("input"));
let direction = "right";
if (inputNum < minNum) {
direction = "left";
@@ -1027,6 +1170,9 @@ class InputWaiter {
if (changeOutput) {
this.manager.output.changeTab(inputNum, false);
}
+
+ // Set cursor focus to current tab
+ this.inputEditorView.focus();
}
/**
@@ -1053,9 +1199,6 @@ class InputWaiter {
this.manager.output.removeAllOutputs();
this.manager.output.terminateZipWorker();
- this.manager.highlighter.removeHighlights();
- getSelection().removeAllRanges();
-
const tabsList = document.getElementById("input-tabs");
const tabsListChildren = tabsList.children;
@@ -1079,36 +1222,19 @@ class InputWaiter {
this.setupInputWorker();
this.manager.worker.setupChefWorker();
this.addInput(true);
- this.bakeAll();
}
/**
- * Handler for clear IO click event.
- * Resets the input for the current tab
+ * Sets the console log level in the workers.
*/
- clearIoClick() {
- const inputNum = this.manager.tabs.getActiveInputTab();
- if (inputNum === -1) return;
-
- this.manager.highlighter.removeHighlights();
- getSelection().removeAllRanges();
-
- this.updateInputValue(inputNum, "", true);
-
- this.set({
- inputNum: inputNum,
- input: ""
+ setLogLevel() {
+ this.loaderWorkers.forEach(w => {
+ w.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
});
- this.manager.tabs.updateInputTabHeader(inputNum, "");
- }
-
- /**
- * Sets the console log level in the worker.
- *
- * @param {string} level
- */
- setLogLevel(level) {
if (!this.inputWorker) return;
this.inputWorker.postMessage({
action: "setLogLevel",
@@ -1163,12 +1289,12 @@ class InputWaiter {
* @param {number} inputNum - The inputNum of the new tab
* @param {boolean} [changeTab=true] - If true, changes to the new tab once it's been added
*/
- addTab(inputNum, changeTab = true) {
+ addTab(inputNum, changeTab=true) {
const tabsWrapper = document.getElementById("input-tabs"),
numTabs = tabsWrapper.children.length;
- if (!this.manager.tabs.getInputTabItem(inputNum) && numTabs < this.maxTabs) {
- const newTab = this.manager.tabs.createInputTabElement(inputNum, changeTab);
+ if (!this.manager.tabs.getTabItem(inputNum, "input") && numTabs < this.maxTabs) {
+ const newTab = this.manager.tabs.createTabElement(inputNum, changeTab, "input");
tabsWrapper.appendChild(newTab);
if (numTabs > 0) {
@@ -1198,7 +1324,7 @@ class InputWaiter {
* @param {boolean} tabsRight - True if there are input tabs to the right of the displayed tabs
*/
refreshTabs(nums, activeTab, tabsLeft, tabsRight) {
- this.manager.tabs.refreshInputTabs(nums, activeTab, tabsLeft, tabsRight);
+ this.manager.tabs.refreshTabs(nums, activeTab, tabsLeft, tabsRight, "input");
this.inputWorker.postMessage({
action: "setInput",
@@ -1217,7 +1343,7 @@ class InputWaiter {
*/
removeInput(inputNum) {
let refresh = false;
- if (this.manager.tabs.getInputTabItem(inputNum) !== null) {
+ if (this.manager.tabs.getTabItem(inputNum, "input") !== null) {
refresh = true;
}
this.inputWorker.postMessage({
@@ -1310,7 +1436,7 @@ class InputWaiter {
* Changes to the next (right) tab
*/
changeTabRight() {
- const activeTab = this.manager.tabs.getActiveInputTab();
+ const activeTab = this.manager.tabs.getActiveTab("input");
if (activeTab === -1) return;
this.inputWorker.postMessage({
action: "changeTabRight",
@@ -1324,7 +1450,7 @@ class InputWaiter {
* Changes to the previous (left) tab
*/
changeTabLeft() {
- const activeTab = this.manager.tabs.getActiveInputTab();
+ const activeTab = this.manager.tabs.getActiveTab("input");
if (activeTab === -1) return;
this.inputWorker.postMessage({
action: "changeTabLeft",
@@ -1339,7 +1465,7 @@ class InputWaiter {
*/
async goToTab() {
const inputNums = await this.getInputNums();
- let tabNum = window.prompt(`Enter tab number (${inputNums.min} - ${inputNums.max}):`, this.manager.tabs.getActiveInputTab().toString());
+ let tabNum = window.prompt(`Enter tab number (${inputNums.min} - ${inputNums.max}):`, this.manager.tabs.getActiveTab("input").toString());
if (tabNum === null) return;
tabNum = parseInt(tabNum, 10);
@@ -1427,18 +1553,6 @@ class InputWaiter {
this.changeTab(inputNum, this.app.options.syncTabs);
}
- /**
- * Update the input URL to the new value
- *
- * @param {object} urlData - Object containing the URL data
- * @param {boolean} urlData.includeInput - If true, the input is included in the title
- * @param {string} urlData.input - The input data to be included
- */
- setUrl(urlData) {
- this.app.updateTitle(urlData.includeInput, urlData.input, true);
- }
-
-
}
export default InputWaiter;
diff --git a/src/web/waiters/OptionsWaiter.mjs b/src/web/waiters/OptionsWaiter.mjs
index 5ef517d4..b09ddd87 100755
--- a/src/web/waiters/OptionsWaiter.mjs
+++ b/src/web/waiters/OptionsWaiter.mjs
@@ -26,33 +26,30 @@ class OptionsWaiter {
* @param {Object} options
*/
load(options) {
- for (const option in options) {
- this.app.options[option] = options[option];
- }
+ Object.assign(this.app.options, options);
// Set options to match object
- const cboxes = document.querySelectorAll("#options-body input[type=checkbox]");
- let i;
- for (i = 0; i < cboxes.length; i++) {
- cboxes[i].checked = this.app.options[cboxes[i].getAttribute("option")];
- }
+ document.querySelectorAll("#options-body input[type=checkbox]").forEach(cbox => {
+ cbox.checked = this.app.options[cbox.getAttribute("option")];
+ });
- const nboxes = document.querySelectorAll("#options-body input[type=number]");
- for (i = 0; i < nboxes.length; i++) {
- nboxes[i].value = this.app.options[nboxes[i].getAttribute("option")];
- nboxes[i].dispatchEvent(new CustomEvent("change", {bubbles: true}));
- }
+ document.querySelectorAll("#options-body input[type=number]").forEach(nbox => {
+ nbox.value = this.app.options[nbox.getAttribute("option")];
+ nbox.dispatchEvent(new CustomEvent("change", {bubbles: true}));
+ });
- const selects = document.querySelectorAll("#options-body select");
- for (i = 0; i < selects.length; i++) {
- const val = this.app.options[selects[i].getAttribute("option")];
+ document.querySelectorAll("#options-body select").forEach(select => {
+ const val = this.app.options[select.getAttribute("option")];
if (val) {
- selects[i].value = val;
- selects[i].dispatchEvent(new CustomEvent("change", {bubbles: true}));
+ select.value = val;
+ select.dispatchEvent(new CustomEvent("change", {bubbles: true}));
} else {
- selects[i].selectedIndex = 0;
+ select.selectedIndex = 0;
}
- }
+ });
+
+ // Initialise options
+ this.setWordWrap();
}
@@ -136,19 +133,8 @@ class OptionsWaiter {
* Sets or unsets word wrap on the input and output depending on the wordWrap option value.
*/
setWordWrap() {
- document.getElementById("input-text").classList.remove("word-wrap");
- document.getElementById("output-text").classList.remove("word-wrap");
- document.getElementById("output-html").classList.remove("word-wrap");
- document.getElementById("input-highlighter").classList.remove("word-wrap");
- document.getElementById("output-highlighter").classList.remove("word-wrap");
-
- if (!this.app.options.wordWrap) {
- document.getElementById("input-text").classList.add("word-wrap");
- document.getElementById("output-text").classList.add("word-wrap");
- document.getElementById("output-html").classList.add("word-wrap");
- document.getElementById("input-highlighter").classList.add("word-wrap");
- document.getElementById("output-highlighter").classList.add("word-wrap");
- }
+ this.manager.input.setWordWrap(this.app.options.wordWrap);
+ this.manager.output.setWordWrap(this.app.options.wordWrap);
}
@@ -159,7 +145,6 @@ class OptionsWaiter {
*/
themeChange(e) {
const themeClass = e.target.value;
-
this.changeTheme(themeClass);
}
@@ -188,6 +173,8 @@ class OptionsWaiter {
log.setLevel(level, false);
this.manager.worker.setLogLevel();
this.manager.input.setLogLevel();
+ this.manager.output.setLogLevel();
+ this.manager.background.setLogLevel();
}
}
diff --git a/src/web/waiters/OutputWaiter.mjs b/src/web/waiters/OutputWaiter.mjs
index 0eb6baec..dae27f3e 100755
--- a/src/web/waiters/OutputWaiter.mjs
+++ b/src/web/waiters/OutputWaiter.mjs
@@ -5,11 +5,42 @@
* @license Apache-2.0
*/
-import Utils, { debounce } from "../../core/Utils.mjs";
+import Utils, {debounce} from "../../core/Utils.mjs";
import Dish from "../../core/Dish.mjs";
+import {detectFileType} from "../../core/lib/FileType.mjs";
import FileSaver from "file-saver";
import ZipWorker from "worker-loader?inline=no-fallback!../workers/ZipWorker.mjs";
+import {
+ EditorView,
+ keymap,
+ highlightSpecialChars,
+ drawSelection,
+ rectangularSelection,
+ crosshairCursor
+} from "@codemirror/view";
+import {
+ EditorState,
+ Compartment
+} from "@codemirror/state";
+import {
+ defaultKeymap
+} from "@codemirror/commands";
+import {
+ bracketMatching
+} from "@codemirror/language";
+import {
+ search,
+ searchKeymap,
+ highlightSelectionMatches
+} from "@codemirror/search";
+
+import {statusBar} from "../utils/statusBar.mjs";
+import {htmlPlugin} from "../utils/htmlWidget.mjs";
+import {copyOverride} from "../utils/copyOverride.mjs";
+import {renderSpecialChar} from "../utils/editorUtils.mjs";
+
+
/**
* Waiter to handle events related to the output
*/
@@ -25,12 +56,295 @@ class OutputWaiter {
this.app = app;
this.manager = manager;
+ this.outputTextEl = document.getElementById("output-text");
+ // Object to handle output HTML state - used by htmlWidget extension
+ this.htmlOutput = {
+ html: "",
+ changed: false
+ };
+ // Hold a copy of the currently displayed output so that we don't have to update it unnecessarily
+ this.currentOutputCache = null;
+ this.initEditor();
+
this.outputs = {};
this.zipWorker = null;
this.maxTabs = this.manager.tabs.calcMaxTabs();
this.tabTimeout = null;
}
+ /**
+ * Sets up the CodeMirror Editor
+ */
+ initEditor() {
+ // Mutable extensions
+ this.outputEditorConf = {
+ eol: new Compartment,
+ lineWrapping: new Compartment,
+ drawSelection: new Compartment
+ };
+
+ const initialState = EditorState.create({
+ doc: null,
+ extensions: [
+ // Editor extensions
+ EditorState.readOnly.of(true),
+ highlightSpecialChars({
+ render: renderSpecialChar, // Custom character renderer to handle special cases
+ addSpecialChars: /[\ue000-\uf8ff]/g // Add the Unicode Private Use Area which we use for some whitespace chars
+ }),
+ rectangularSelection(),
+ crosshairCursor(),
+ bracketMatching(),
+ highlightSelectionMatches(),
+ search({top: true}),
+ EditorState.allowMultipleSelections.of(true),
+
+ // Custom extensions
+ statusBar({
+ label: "Output",
+ timing: this.manager.timing,
+ tabNumGetter: function() {
+ return this.manager.tabs.getActiveTab("output");
+ }.bind(this),
+ eolHandler: this.eolChange.bind(this),
+ chrEncHandler: this.chrEncChange.bind(this),
+ chrEncGetter: this.getChrEnc.bind(this),
+ htmlOutput: this.htmlOutput
+ }),
+ htmlPlugin(this.htmlOutput),
+ copyOverride(),
+
+ // Mutable state
+ this.outputEditorConf.lineWrapping.of(EditorView.lineWrapping),
+ this.outputEditorConf.eol.of(EditorState.lineSeparator.of("\n")),
+ this.outputEditorConf.drawSelection.of(drawSelection()),
+
+ // Keymap
+ keymap.of([
+ ...defaultKeymap,
+ ...searchKeymap
+ ]),
+
+ // Event listeners
+ EditorView.updateListener.of(e => {
+ if (e.selectionSet)
+ this.manager.highlighter.selectionChange("output", e);
+ if (e.docChanged || this.docChanging) {
+ this.docChanging = false;
+ this.toggleLoader(false);
+ }
+ })
+ ]
+ });
+
+ this.outputEditorView = new EditorView({
+ state: initialState,
+ parent: this.outputTextEl
+ });
+ }
+
+ /**
+ * Handler for EOL change events
+ * Sets the line separator
+ * @param {string} eolVal
+ */
+ async eolChange(eolVal) {
+ const currentTabNum = this.manager.tabs.getActiveTab("output");
+ if (currentTabNum >= 0) {
+ this.outputs[currentTabNum].eolSequence = eolVal;
+ } else {
+ throw new Error(`Cannot change output ${currentTabNum} EOL sequence to ${eolVal}`);
+ }
+
+ // Update the EOL value
+ this.outputEditorView.dispatch({
+ effects: this.outputEditorConf.eol.reconfigure(EditorState.lineSeparator.of(eolVal))
+ });
+
+ // Reset the output so that lines are recalculated, preserving the old EOL values
+ await this.setOutput(this.currentOutputCache, true);
+ // Update the URL manually since we aren't firing a statechange event
+ this.app.updateURL(true);
+ }
+
+ /**
+ * Getter for the output EOL sequence
+ * Prefer reading value from `this.outputs` since the editor may not have updated yet.
+ * @returns {string}
+ */
+ getEOLSeq() {
+ const currentTabNum = this.manager.tabs.getActiveTab("output");
+ if (currentTabNum < 0) {
+ return this.outputEditorConf.state?.lineBreak || "\n";
+ }
+ return this.outputs[currentTabNum].eolSequence;
+ }
+
+ /**
+ * Handler for Chr Enc change events
+ * Sets the output character encoding
+ * @param {number} chrEncVal
+ */
+ async chrEncChange(chrEncVal) {
+ if (typeof chrEncVal !== "number") return;
+
+ const currentTabNum = this.manager.tabs.getActiveTab("output");
+ if (currentTabNum >= 0) {
+ this.outputs[currentTabNum].encoding = chrEncVal;
+ } else {
+ throw new Error(`Cannot change output ${currentTabNum} chrEnc to ${chrEncVal}`);
+ }
+
+ // Reset the output, forcing it to re-decode the data with the new character encoding
+ await this.setOutput(this.currentOutputCache, true);
+ // Update the URL manually since we aren't firing a statechange event
+ this.app.updateURL(true);
+ }
+
+ /**
+ * Getter for the output character encoding
+ * @returns {number}
+ */
+ getChrEnc() {
+ const currentTabNum = this.manager.tabs.getActiveTab("output");
+ if (currentTabNum < 0) {
+ return 0;
+ }
+ return this.outputs[currentTabNum].encoding;
+ }
+
+ /**
+ * Sets word wrap on the output editor
+ * @param {boolean} wrap
+ */
+ setWordWrap(wrap) {
+ this.outputEditorView.dispatch({
+ effects: this.outputEditorConf.lineWrapping.reconfigure(
+ wrap ? EditorView.lineWrapping : []
+ )
+ });
+ }
+
+ /**
+ * Sets the value of the current output
+ * @param {string|ArrayBuffer} data
+ * @param {boolean} [force=false]
+ */
+ async setOutput(data, force=false) {
+ // Don't do anything if the output hasn't changed
+ if (!force && data === this.currentOutputCache) {
+ this.manager.controls.hideStaleIndicator();
+ this.toggleLoader(false);
+ return;
+ }
+
+ this.currentOutputCache = data;
+ this.toggleLoader(true);
+
+ // Remove class to #output-text to change display settings
+ this.outputTextEl.classList.remove("html-output");
+
+ // If data is an ArrayBuffer, convert to a string in the correct character encoding
+ const tabNum = this.manager.tabs.getActiveTab("output");
+ this.manager.timing.recordTime("outputDecodingStart", tabNum);
+ if (data instanceof ArrayBuffer) {
+ data = await this.bufferToStr(data);
+ }
+ this.manager.timing.recordTime("outputDecodingEnd", tabNum);
+
+ // Turn drawSelection back on
+ this.outputEditorView.dispatch({
+ effects: this.outputEditorConf.drawSelection.reconfigure(
+ drawSelection()
+ )
+ });
+
+ // Ensure we're not exceeding the maximum line length
+ let wrap = this.app.options.wordWrap;
+ const lineLengthThreshold = 131072; // 128KB
+ if (data.length > lineLengthThreshold) {
+ const lines = data.split(this.getEOLSeq());
+ const longest = lines.reduce((a, b) =>
+ a > b.length ? a : b.length, 0
+ );
+ if (longest > lineLengthThreshold) {
+ // If we are exceeding the max line length, turn off word wrap
+ wrap = false;
+ }
+ }
+
+ // If turning word wrap off, do it before we populate the editor for performance reasons
+ if (!wrap) this.setWordWrap(wrap);
+
+ // We use setTimeout here to delay the editor dispatch until the next event cycle,
+ // ensuring all async actions have completed before attempting to set the contents
+ // of the editor. This is mainly with the above call to setWordWrap() in mind.
+ setTimeout(() => {
+ this.docChanging = true;
+ // Insert data into editor, overwriting any previous contents
+ this.outputEditorView.dispatch({
+ changes: {
+ from: 0,
+ to: this.outputEditorView.state.doc.length,
+ insert: data
+ }
+ });
+
+ // If turning word wrap on, do it after we populate the editor
+ if (wrap)
+ setTimeout(() => {
+ this.setWordWrap(wrap);
+ });
+ });
+ }
+
+ /**
+ * Sets the value of the current output to a rendered HTML value
+ * @param {string} html
+ */
+ async setHTMLOutput(html) {
+ this.htmlOutput.html = html;
+ this.htmlOutput.changed = true;
+ // This clears the text output, but also fires a View update which
+ // triggers the htmlWidget to render the HTML. We set the force flag
+ // to ensure the loader gets removed and HTML is rendered.
+ await this.setOutput("", true);
+
+ // Turn off drawSelection
+ this.outputEditorView.dispatch({
+ effects: this.outputEditorConf.drawSelection.reconfigure([])
+ });
+
+ // Add class to #output-text to change display settings
+ this.outputTextEl.classList.add("html-output");
+
+ // Execute script sections
+ const outputHTML = document.getElementById("output-html");
+ const scriptElements = outputHTML ? outputHTML.querySelectorAll("script") : [];
+ for (let i = 0; i < scriptElements.length; i++) {
+ try {
+ eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval
+ } catch (err) {
+ log.error(err);
+ }
+ }
+ }
+
+ /**
+ * Clears the HTML output
+ */
+ clearHTMLOutput() {
+ this.htmlOutput.html = "";
+ this.htmlOutput.changed = true;
+ // Fire a blank change to force the htmlWidget to update and remove any HTML
+ this.outputEditorView.dispatch({
+ changes: {
+ from: 0,
+ insert: ""
+ }
+ });
+ }
+
/**
* Calculates the maximum number of tabs to display
*/
@@ -38,7 +352,7 @@ class OutputWaiter {
const numTabs = this.manager.tabs.calcMaxTabs();
if (numTabs !== this.maxTabs) {
this.maxTabs = numTabs;
- this.refreshTabs(this.manager.tabs.getActiveOutputTab(), "right");
+ this.refreshTabs(this.manager.tabs.getActiveTab("output"), "right");
}
}
@@ -89,7 +403,9 @@ class OutputWaiter {
error: null,
status: "inactive",
bakeId: -1,
- progress: false
+ progress: false,
+ encoding: 0,
+ eolSequence: "\u000a"
};
this.outputs[inputNum] = newOutput;
@@ -116,7 +432,7 @@ class OutputWaiter {
this.outputs[inputNum].data = data;
- const tabItem = this.manager.tabs.getOutputTabItem(inputNum);
+ const tabItem = this.manager.tabs.getTabItem(inputNum, "output");
if (tabItem) tabItem.style.background = "";
if (set) this.set(inputNum);
@@ -196,7 +512,7 @@ class OutputWaiter {
this.outputs[inputNum].progress = progress;
if (progress !== false) {
- this.manager.tabs.updateOutputTabProgress(inputNum, progress, total);
+ this.manager.tabs.updateTabProgress(inputNum, progress, total, "output");
}
}
@@ -209,7 +525,7 @@ class OutputWaiter {
removeOutput(inputNum) {
if (!this.outputExists(inputNum)) return;
- delete (this.outputs[inputNum]);
+ delete this.outputs[inputNum];
}
/**
@@ -218,8 +534,6 @@ class OutputWaiter {
removeAllOutputs() {
this.outputs = {};
- this.resetSwitch();
-
const tabsList = document.getElementById("output-tabs");
const tabsListChildren = tabsList.children;
@@ -231,25 +545,26 @@ class OutputWaiter {
}
/**
- * Sets the output in the output textarea.
+ * Sets the output in the output pane.
*
* @param {number} inputNum
*/
async set(inputNum) {
- if (inputNum !== this.manager.tabs.getActiveOutputTab() ||
+ inputNum = parseInt(inputNum, 10);
+ if (inputNum !== this.manager.tabs.getActiveTab("output") ||
!this.outputExists(inputNum)) return;
this.toggleLoader(true);
return new Promise(async function(resolve, reject) {
- const output = this.outputs[inputNum],
- activeTab = this.manager.tabs.getActiveOutputTab();
- if (typeof inputNum !== "number") inputNum = parseInt(inputNum, 10);
+ const output = this.outputs[inputNum];
+ this.manager.timing.recordTime("settingOutput", inputNum);
- const outputText = document.getElementById("output-text");
- const outputHtml = document.getElementById("output-html");
- const outputFile = document.getElementById("output-file");
- const outputHighlighter = document.getElementById("output-highlighter");
- const inputHighlighter = document.getElementById("input-highlighter");
+ // Update the EOL value
+ this.outputEditorView.dispatch({
+ effects: this.outputEditorConf.eol.reconfigure(
+ EditorState.lineSeparator.of(output.eolSequence)
+ )
+ });
// If pending or baking, show loader and status message
// If error, style the tab and handle the error
@@ -269,140 +584,55 @@ class OutputWaiter {
this.manager.recipe.updateBreakpointIndicator(false);
}
- document.getElementById("show-file-overlay").style.display = "none";
-
if (output.status === "pending" || output.status === "baking") {
// show the loader and the status message if it's being shown
// otherwise don't do anything
document.querySelector("#output-loader .loading-msg").textContent = output.statusMessage;
} else if (output.status === "error") {
- // style the tab if it's being shown
- this.toggleLoader(false);
- outputText.style.display = "block";
- outputText.classList.remove("blur");
- outputHtml.style.display = "none";
- outputFile.style.display = "none";
- outputHighlighter.display = "none";
- inputHighlighter.display = "none";
+ this.clearHTMLOutput();
if (output.error) {
- outputText.value = output.error;
+ await this.setOutput(output.error);
} else {
- outputText.value = output.data.result;
+ await this.setOutput(output.data.result);
}
- outputHtml.innerHTML = "";
} else if (output.status === "baked" || output.status === "inactive") {
document.querySelector("#output-loader .loading-msg").textContent = `Loading output ${inputNum}`;
- this.closeFile();
- let scriptElements, lines, length;
if (output.data === null) {
- outputText.style.display = "block";
- outputHtml.style.display = "none";
- outputFile.style.display = "none";
- outputHighlighter.display = "block";
- inputHighlighter.display = "block";
-
- outputText.value = "";
- outputHtml.innerHTML = "";
-
- this.toggleLoader(false);
+ this.clearHTMLOutput();
+ await this.setOutput("");
return;
}
switch (output.data.type) {
case "html":
- outputText.style.display = "none";
- outputHtml.style.display = "block";
- outputFile.style.display = "none";
- outputHighlighter.style.display = "none";
- inputHighlighter.style.display = "none";
-
- outputText.value = "";
- outputHtml.innerHTML = output.data.result;
-
- // Execute script sections
- scriptElements = outputHtml.querySelectorAll("script");
- for (let i = 0; i < scriptElements.length; i++) {
- try {
- eval(scriptElements[i].innerHTML); // eslint-disable-line no-eval
- } catch (err) {
- log.error(err);
- }
- }
+ await this.setHTMLOutput(output.data.result);
break;
case "ArrayBuffer":
- outputText.style.display = "block";
- outputHtml.style.display = "none";
- outputHighlighter.display = "none";
- inputHighlighter.display = "none";
-
- outputText.value = "";
- outputHtml.innerHTML = "";
-
- length = output.data.result.byteLength;
- this.setFile(await this.getDishBuffer(output.data.dish), activeTab);
- break;
case "string":
default:
- outputText.style.display = "block";
- outputHtml.style.display = "none";
- outputFile.style.display = "none";
- outputHighlighter.display = "block";
- inputHighlighter.display = "block";
-
- outputText.value = Utils.printable(output.data.result, true);
- outputHtml.innerHTML = "";
-
- lines = output.data.result.count("\n") + 1;
- length = output.data.result.length;
+ this.clearHTMLOutput();
+ await this.setOutput(output.data.result);
break;
}
- this.toggleLoader(false);
+ this.manager.timing.recordTime("complete", inputNum);
- if (output.data.type === "html") {
- const dishStr = await this.getDishStr(output.data.dish);
- length = dishStr.length;
- lines = dishStr.count("\n") + 1;
- }
+ // Trigger an update so that the status bar recalculates timings
+ this.outputEditorView.dispatch({
+ changes: {
+ from: 0,
+ to: 0
+ }
+ });
- this.setOutputInfo(length, lines, output.data.duration);
debounce(this.backgroundMagic, 50, "backgroundMagic", this, [])();
}
}.bind(this));
}
/**
- * Shows file details
- *
- * @param {ArrayBuffer} buf
- * @param {number} activeTab
- */
- setFile(buf, activeTab) {
- if (activeTab !== this.manager.tabs.getActiveOutputTab()) return;
- // Display file overlay in output area with details
- const fileOverlay = document.getElementById("output-file"),
- fileSize = document.getElementById("output-file-size"),
- outputText = document.getElementById("output-text"),
- fileSlice = buf.slice(0, 4096);
-
- fileOverlay.style.display = "block";
- fileSize.textContent = buf.byteLength.toLocaleString() + " bytes";
-
- outputText.classList.add("blur");
- outputText.value = Utils.printable(Utils.arrayBufferToStr(fileSlice));
- }
-
- /**
- * Clears output file details
- */
- closeFile() {
- document.getElementById("output-file").style.display = "none";
- document.getElementById("output-text").classList.remove("blur");
- }
-
- /**
- * Retrieves the dish as a string, returning the cached version if possible.
+ * Retrieves the dish as a string
*
* @param {Dish} dish
* @returns {string}
@@ -416,7 +646,7 @@ class OutputWaiter {
}
/**
- * Retrieves the dish as an ArrayBuffer, returning the cached version if possible.
+ * Retrieves the dish as an ArrayBuffer
*
* @param {Dish} dish
* @returns {ArrayBuffer}
@@ -444,6 +674,23 @@ class OutputWaiter {
});
}
+ /**
+ * Asks a worker to translate an ArrayBuffer into a certain character encoding
+ *
+ * @param {ArrrayBuffer} buffer
+ * @returns {string}
+ */
+ async bufferToStr(buffer) {
+ const encoding = this.getChrEnc();
+
+ if (buffer.byteLength === 0) return "";
+ return await new Promise(resolve => {
+ this.manager.worker.bufferToStr(buffer, encoding, r => {
+ resolve(r.value);
+ });
+ });
+ }
+
/**
* Save bombe object then remove it from the DOM so that it does not cause performance issues.
*/
@@ -462,39 +709,41 @@ class OutputWaiter {
* @param {boolean} value - If true, show the loader
*/
toggleLoader(value) {
- clearTimeout(this.appendBombeTimeout);
- clearTimeout(this.outputLoaderTimeout);
-
const outputLoader = document.getElementById("output-loader"),
- outputElement = document.getElementById("output-text"),
animation = document.getElementById("output-loader-animation");
if (value) {
this.manager.controls.hideStaleIndicator();
+ // Don't add the bombe if it's already there or scheduled to be loaded
+ if (animation.children.length === 0 && !this.appendBombeTimeout) {
+ // Start a timer to add the Bombe to the DOM just before we make it
+ // visible so that there is no stuttering
+ this.appendBombeTimeout = setTimeout(function() {
+ this.appendBombeTimeout = null;
+ animation.appendChild(this.bombeEl);
+ }.bind(this), 150);
+ }
- // Don't add the bombe if it's already there!
- if (animation.children.length > 0) return;
+ if (outputLoader.style.visibility !== "visible" && !this.outputLoaderTimeout) {
+ // Show the loading screen
+ this.outputLoaderTimeout = setTimeout(function() {
+ this.outputLoaderTimeout = null;
+ outputLoader.style.visibility = "visible";
+ outputLoader.style.opacity = 1;
+ }, 200);
+ }
+ } else if (outputLoader.style.visibility !== "hidden" || this.appendBombeTimeout || this.outputLoaderTimeout) {
+ clearTimeout(this.appendBombeTimeout);
+ clearTimeout(this.outputLoaderTimeout);
+ this.appendBombeTimeout = null;
+ this.outputLoaderTimeout = null;
- // Start a timer to add the Bombe to the DOM just before we make it
- // visible so that there is no stuttering
- this.appendBombeTimeout = setTimeout(function() {
- animation.appendChild(this.bombeEl);
- }.bind(this), 150);
-
- // Show the loading screen
- this.outputLoaderTimeout = setTimeout(function() {
- outputElement.disabled = true;
- outputLoader.style.visibility = "visible";
- outputLoader.style.opacity = 1;
- }, 200);
- } else {
// Remove the Bombe from the DOM to save resources
this.outputLoaderTimeout = setTimeout(function () {
- try {
+ this.outputLoaderTimeout = null;
+ if (animation.children.length > 0)
animation.removeChild(this.bombeEl);
- } catch (err) {}
}.bind(this), 500);
- outputElement.disabled = false;
outputLoader.style.opacity = 0;
outputLoader.style.visibility = "hidden";
}
@@ -512,24 +761,33 @@ class OutputWaiter {
* Handler for file download events.
*/
async downloadFile() {
- const dish = this.getOutputDish(this.manager.tabs.getActiveOutputTab());
+ const dish = this.getOutputDish(this.manager.tabs.getActiveTab("output"));
if (dish === null) {
this.app.alert("Could not find any output data to download. Has this output been baked?", 3000);
return;
}
- const fileName = window.prompt("Please enter a filename: ", "download.dat");
+
+ const data = await dish.get(Dish.ARRAY_BUFFER);
+ let ext = ".dat";
+
+ // Detect file type automatically
+ const types = detectFileType(data);
+ if (types.length) {
+ ext = `.${types[0].extension.split(",", 1)[0]}`;
+ }
+
+ const fileName = window.prompt("Please enter a filename: ", `download${ext}`);
// Assume if the user clicks cancel they don't want to download
if (fileName === null) return;
- const data = await dish.get(Dish.ARRAY_BUFFER),
- file = new File([data], fileName);
- FileSaver.saveAs(file, fileName, false);
+ const file = new File([data], fileName);
+ FileSaver.saveAs(file, fileName, {autoBom: false});
}
/**
* Handler for save all click event
- * Saves all outputs to a single archvie file
+ * Saves all outputs to a single archive file
*/
async saveAllClick() {
const downloadButton = document.getElementById("save-all-to-file");
@@ -550,7 +808,6 @@ class OutputWaiter {
}
}
-
/**
* Spawns a new ZipWorker and sends it the outputs so that they can
* be zipped for download
@@ -606,9 +863,16 @@ class OutputWaiter {
log.debug("Creating ZipWorker");
this.zipWorker = new ZipWorker();
this.zipWorker.postMessage({
- outputs: this.outputs,
- filename: fileName,
- fileExtension: fileExt
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
+ this.zipWorker.postMessage({
+ action: "zipFiles",
+ data: {
+ outputs: this.outputs,
+ filename: fileName,
+ fileExtension: fileExt
+ }
});
this.zipWorker.addEventListener("message", this.handleZipWorkerMessage.bind(this));
}
@@ -625,16 +889,12 @@ class OutputWaiter {
this.zipWorker = null;
const downloadButton = document.getElementById("save-all-to-file");
-
downloadButton.classList.remove("spin");
downloadButton.title = "Save all outputs to a zip file";
downloadButton.setAttribute("data-original-title", "Save all outputs to a zip file");
-
downloadButton.firstElementChild.innerHTML = "archive";
-
}
-
/**
* Handle messages sent back by the ZipWorker
*/
@@ -652,7 +912,7 @@ class OutputWaiter {
}
const file = new File([r.zippedFile], r.filename);
- FileSaver.saveAs(file, r.filename, false);
+ FileSaver.saveAs(file, r.filename, {autoBom: false});
this.terminateZipWorker();
}
@@ -667,9 +927,9 @@ class OutputWaiter {
const tabsWrapper = document.getElementById("output-tabs");
const numTabs = tabsWrapper.children.length;
- if (!this.manager.tabs.getOutputTabItem(inputNum) && numTabs < this.maxTabs) {
+ if (!this.manager.tabs.getTabItem(inputNum, "output") && numTabs < this.maxTabs) {
// Create a new tab element
- const newTab = this.manager.tabs.createOutputTabElement(inputNum, changeTab);
+ const newTab = this.manager.tabs.createTabElement(inputNum, changeTab, "output");
tabsWrapper.appendChild(newTab);
} else if (numTabs === this.maxTabs) {
// Can't create a new tab
@@ -691,14 +951,11 @@ class OutputWaiter {
*/
changeTab(inputNum, changeInput = false) {
if (!this.outputExists(inputNum)) return;
- const currentNum = this.manager.tabs.getActiveOutputTab();
+ const currentNum = this.manager.tabs.getActiveTab("output");
this.hideMagicButton();
- this.manager.highlighter.removeHighlights();
- getSelection().removeAllRanges();
-
- if (!this.manager.tabs.changeOutputTab(inputNum)) {
+ if (!this.manager.tabs.changeTab(inputNum, "output")) {
let direction = "right";
if (currentNum > inputNum) {
direction = "left";
@@ -708,17 +965,14 @@ class OutputWaiter {
const tabsLeft = (newOutputs[0] !== this.getSmallestInputNum());
const tabsRight = (newOutputs[newOutputs.length - 1] !== this.getLargestInputNum());
- this.manager.tabs.refreshOutputTabs(newOutputs, inputNum, tabsLeft, tabsRight);
+ this.manager.tabs.refreshTabs(newOutputs, inputNum, tabsLeft, tabsRight, "output");
for (let i = 0; i < newOutputs.length; i++) {
this.displayTabInfo(newOutputs[i]);
}
}
- debounce(this.set, 50, "setOutput", this, [inputNum])();
-
- document.getElementById("output-html").scroll(0, 0);
- document.getElementById("output-text").scroll(0, 0);
+ this.set(inputNum);
if (changeInput) {
this.manager.input.changeTab(inputNum, false);
@@ -732,6 +986,7 @@ class OutputWaiter {
*/
changeTabClick(mouseEvent) {
if (!mouseEvent.target) return;
+
const tabNum = mouseEvent.target.parentElement.getAttribute("inputNum");
if (tabNum) {
this.changeTab(parseInt(tabNum, 10), this.app.options.syncTabs);
@@ -801,7 +1056,7 @@ class OutputWaiter {
* Handler for changing to the left tab
*/
changeTabLeft() {
- const currentTab = this.manager.tabs.getActiveOutputTab();
+ const currentTab = this.manager.tabs.getActiveTab("output");
this.changeTab(this.getPreviousInputNum(currentTab), this.app.options.syncTabs);
}
@@ -809,7 +1064,7 @@ class OutputWaiter {
* Handler for changing to the right tab
*/
changeTabRight() {
- const currentTab = this.manager.tabs.getActiveOutputTab();
+ const currentTab = this.manager.tabs.getActiveTab("output");
this.changeTab(this.getNextInputNum(currentTab), this.app.options.syncTabs);
}
@@ -820,7 +1075,7 @@ class OutputWaiter {
const min = this.getSmallestInputNum(),
max = this.getLargestInputNum();
- let tabNum = window.prompt(`Enter tab number (${min} - ${max}):`, this.manager.tabs.getActiveOutputTab().toString());
+ let tabNum = window.prompt(`Enter tab number (${min} - ${max}):`, this.manager.tabs.getActiveTab("output").toString());
if (tabNum === null) return;
tabNum = parseInt(tabNum, 10);
@@ -861,9 +1116,7 @@ class OutputWaiter {
nums.push(newNum);
}
}
- nums.sort(function(a, b) {
- return a - b;
- });
+ nums.sort((a, b) => a - b); // Forces the sort function to treat a and b as numbers
return nums;
}
@@ -939,7 +1192,7 @@ class OutputWaiter {
removeTab(inputNum) {
if (!this.outputExists(inputNum)) return;
- const tabElement = this.manager.tabs.getOutputTabItem(inputNum);
+ const tabElement = this.manager.tabs.getTabItem(inputNum, "output");
this.removeOutput(inputNum);
@@ -950,6 +1203,7 @@ class OutputWaiter {
/**
* Redraw the entire tab bar to remove any outdated tabs
+ *
* @param {number} activeTab
* @param {string} direction - Either "left" or "right"
*/
@@ -958,12 +1212,11 @@ class OutputWaiter {
tabsLeft = (newNums[0] !== this.getSmallestInputNum() && newNums.length > 0),
tabsRight = (newNums[newNums.length - 1] !== this.getLargestInputNum() && newNums.length > 0);
- this.manager.tabs.refreshOutputTabs(newNums, activeTab, tabsLeft, tabsRight);
+ this.manager.tabs.refreshTabs(newNums, activeTab, tabsLeft, tabsRight, "output");
for (let i = 0; i < newNums.length; i++) {
this.displayTabInfo(newNums[i]);
}
-
}
/**
@@ -972,7 +1225,8 @@ class OutputWaiter {
* @param {number} inputNum
*/
async displayTabInfo(inputNum) {
- if (!this.outputExists(inputNum)) return;
+ // Don't display anything if there are no, or only one, tabs
+ if (!this.outputExists(inputNum) || Object.keys(this.outputs).length <= 1) return;
const dish = this.getOutputDish(inputNum);
let tabStr = "";
@@ -981,12 +1235,12 @@ class OutputWaiter {
tabStr = await this.getDishTitle(this.getOutputDish(inputNum), 100);
tabStr = tabStr.replace(/[\n\r]/g, "");
}
- this.manager.tabs.updateOutputTabHeader(inputNum, tabStr);
+ this.manager.tabs.updateTabHeader(inputNum, tabStr, "output");
if (this.manager.worker.recipeConfig !== undefined) {
- this.manager.tabs.updateOutputTabProgress(inputNum, this.outputs[inputNum].progress, this.manager.worker.recipeConfig.length);
+ this.manager.tabs.updateTabProgress(inputNum, this.outputs[inputNum]?.progress, this.manager.worker.recipeConfig.length, "output");
}
- const tabItem = this.manager.tabs.getOutputTabItem(inputNum);
+ const tabItem = this.manager.tabs.getTabItem(inputNum, "output");
if (tabItem) {
if (this.outputs[inputNum].status === "error") {
tabItem.style.color = "#FF0000";
@@ -996,39 +1250,12 @@ class OutputWaiter {
}
}
- /**
- * Displays information about the output.
- *
- * @param {number} length - The length of the current output string
- * @param {number} lines - The number of the lines in the current output string
- * @param {number} duration - The length of time (ms) it took to generate the output
- */
- setOutputInfo(length, lines, duration) {
- if (!length) return;
- let width = length.toString().length;
- width = width < 4 ? 4 : width;
-
- const lengthStr = length.toString().padStart(width, " ").replace(/ /g, " ");
- const timeStr = (duration.toString() + "ms").padStart(width, " ").replace(/ /g, " ");
-
- let msg = "time: " + timeStr + " length: " + lengthStr;
-
- if (typeof lines === "number") {
- const linesStr = lines.toString().padStart(width, " ").replace(/ /g, " ");
- msg += " lines: " + linesStr;
- }
-
- document.getElementById("output-info").innerHTML = msg;
- document.getElementById("input-selection-info").innerHTML = "";
- document.getElementById("output-selection-info").innerHTML = "";
- }
-
/**
* Triggers the BackgroundWorker to attempt Magic on the current output.
*/
async backgroundMagic() {
this.hideMagicButton();
- const dish = this.getOutputDish(this.manager.tabs.getActiveOutputTab());
+ const dish = this.getOutputDish(this.manager.tabs.getActiveTab("output"));
if (!this.app.options.autoMagic || dish === null) return;
const buffer = await this.getDishBuffer(dish);
const sample = buffer.slice(0, 1000) || "";
@@ -1105,92 +1332,6 @@ class OutputWaiter {
magicButton.setAttribute("data-original-title", "Magic!");
}
-
- /**
- * Handler for file slice display events.
- */
- async displayFileSlice() {
- document.querySelector("#output-loader .loading-msg").textContent = "Loading file slice...";
- this.toggleLoader(true);
- const outputText = document.getElementById("output-text"),
- outputHtml = document.getElementById("output-html"),
- outputFile = document.getElementById("output-file"),
- outputHighlighter = document.getElementById("output-highlighter"),
- inputHighlighter = document.getElementById("input-highlighter"),
- showFileOverlay = document.getElementById("show-file-overlay"),
- sliceFromEl = document.getElementById("output-file-slice-from"),
- sliceToEl = document.getElementById("output-file-slice-to"),
- sliceFrom = parseInt(sliceFromEl.value, 10) * 1024,
- sliceTo = parseInt(sliceToEl.value, 10) * 1024,
- output = this.outputs[this.manager.tabs.getActiveOutputTab()].data;
-
- let str;
- if (output.type === "ArrayBuffer") {
- str = Utils.arrayBufferToStr(output.result.slice(sliceFrom, sliceTo));
- } else {
- str = Utils.arrayBufferToStr(await this.getDishBuffer(output.dish).slice(sliceFrom, sliceTo));
- }
-
- outputText.classList.remove("blur");
- showFileOverlay.style.display = "block";
- outputText.value = Utils.printable(str, true);
-
- outputText.style.display = "block";
- outputHtml.style.display = "none";
- outputFile.style.display = "none";
- outputHighlighter.display = "block";
- inputHighlighter.display = "block";
-
- this.toggleLoader(false);
- }
-
- /**
- * Handler for showing an entire file at user's discretion (even if it's way too big)
- */
- async showAllFile() {
- document.querySelector("#output-loader .loading-msg").textContent = "Loading entire file at user instruction. This may cause a crash...";
- this.toggleLoader(true);
- const outputText = document.getElementById("output-text"),
- outputHtml = document.getElementById("output-html"),
- outputFile = document.getElementById("output-file"),
- outputHighlighter = document.getElementById("output-highlighter"),
- inputHighlighter = document.getElementById("input-highlighter"),
- showFileOverlay = document.getElementById("show-file-overlay"),
- output = this.outputs[this.manager.tabs.getActiveOutputTab()].data;
-
- let str;
- if (output.type === "ArrayBuffer") {
- str = Utils.arrayBufferToStr(output.result);
- } else {
- str = Utils.arrayBufferToStr(await this.getDishBuffer(output.dish));
- }
-
- outputText.classList.remove("blur");
- showFileOverlay.style.display = "none";
- outputText.value = Utils.printable(str, true);
-
- outputText.style.display = "block";
- outputHtml.style.display = "none";
- outputFile.style.display = "none";
- outputHighlighter.display = "block";
- inputHighlighter.display = "block";
-
- this.toggleLoader(false);
- }
-
- /**
- * Handler for show file overlay events
- *
- * @param {Event} e
- */
- showFileOverlayClick(e) {
- const showFileOverlay = e.target;
-
- document.getElementById("output-text").classList.add("blur");
- showFileOverlay.style.display = "none";
- this.set(this.manager.tabs.getActiveOutputTab());
- }
-
/**
* Handler for extract file events.
*
@@ -1214,58 +1355,20 @@ class OutputWaiter {
* Copies the output to the clipboard
*/
async copyClick() {
- const dish = this.getOutputDish(this.manager.tabs.getActiveOutputTab());
+ const dish = this.getOutputDish(this.manager.tabs.getActiveTab("output"));
if (dish === null) {
this.app.alert("Could not find data to copy. Has this output been baked yet?", 3000);
return;
}
- const output = await dish.get(Dish.STRING);
+ const output = await this.getDishStr(dish);
+ const self = this;
- // Create invisible textarea to populate with the raw dish string (not the printable version that
- // contains dots instead of the actual bytes)
- const textarea = document.createElement("textarea");
- textarea.style.position = "fixed";
- textarea.style.top = 0;
- textarea.style.left = 0;
- textarea.style.width = 0;
- textarea.style.height = 0;
- textarea.style.border = "none";
-
- textarea.value = output;
- document.body.appendChild(textarea);
-
- let success = false;
- try {
- textarea.select();
- success = output && document.execCommand("copy");
- } catch (err) {
- success = false;
- }
-
- if (success) {
- this.app.alert("Copied raw output successfully.", 2000);
- } else {
- this.app.alert("Sorry, the output could not be copied.", 3000);
- }
-
- // Clean up
- document.body.removeChild(textarea);
- }
-
- /**
- * Returns true if the output contains carriage returns
- *
- * @returns {boolean}
- */
- async containsCR() {
- const dish = this.getOutputDish(this.manager.tabs.getActiveOutputTab());
- if (dish === null) return;
-
- if (dish.type === Dish.STRING) {
- const data = await dish.get(Dish.STRING);
- return data.indexOf("\r") >= 0;
- }
+ navigator.clipboard.writeText(output).then(function() {
+ self.app.alert("Copied raw output successfully.", 2000);
+ }, function(err) {
+ self.app.alert("Sorry, the output could not be copied.", 3000);
+ });
}
/**
@@ -1273,93 +1376,25 @@ class OutputWaiter {
* Moves the current output into the input textarea.
*/
async switchClick() {
- const activeTab = this.manager.tabs.getActiveOutputTab();
- const transferable = [];
-
+ const activeTab = this.manager.tabs.getActiveTab("output");
const switchButton = document.getElementById("switch");
+
switchButton.classList.add("spin");
switchButton.disabled = true;
switchButton.firstElementChild.innerHTML = "autorenew";
$(switchButton).tooltip("hide");
- let active = await this.getDishBuffer(this.getOutputDish(activeTab));
+ const activeData = await this.getDishBuffer(this.getOutputDish(activeTab));
- if (!this.outputExists(activeTab)) {
- this.resetSwitchButton();
- return;
+ if (this.outputExists(activeTab)) {
+ this.manager.input.set(activeTab, {
+ type: "userinput",
+ buffer: activeData,
+ encoding: this.outputs[activeTab].encoding,
+ eolSequence: this.outputs[activeTab].eolSequence
+ });
}
- if (this.outputs[activeTab].data.type === "string" &&
- active.byteLength <= this.app.options.ioDisplayThreshold * 1024) {
- const dishString = await this.getDishStr(this.getOutputDish(activeTab));
- if (!await this.manager.input.preserveCarriageReturns(dishString)) {
- active = dishString;
- }
- } else {
- transferable.push(active);
- }
-
- this.manager.input.inputWorker.postMessage({
- action: "inputSwitch",
- data: {
- inputNum: activeTab,
- outputData: active
- }
- }, transferable);
- }
-
- /**
- * Handler for when the inputWorker has switched the inputs.
- * Stores the old input
- *
- * @param {object} switchData
- * @param {number} switchData.inputNum
- * @param {string | object} switchData.data
- * @param {ArrayBuffer} switchData.data.fileBuffer
- * @param {number} switchData.data.size
- * @param {string} switchData.data.type
- * @param {string} switchData.data.name
- */
- inputSwitch(switchData) {
- this.switchOrigData = switchData;
- document.getElementById("undo-switch").disabled = false;
-
- this.resetSwitchButton();
-
- }
-
- /**
- * Handler for undo switch click events.
- * Removes the output from the input and replaces the input that was removed.
- */
- undoSwitchClick() {
- this.manager.input.updateInputObj(this.switchOrigData.inputNum, this.switchOrigData.data);
-
- this.manager.input.fileLoaded(this.switchOrigData.inputNum);
-
- this.resetSwitch();
- }
-
- /**
- * Removes the switch data and resets the switch buttons
- */
- resetSwitch() {
- if (this.switchOrigData !== undefined) {
- delete this.switchOrigData;
- }
-
- const undoSwitch = document.getElementById("undo-switch");
- undoSwitch.disabled = true;
- $(undoSwitch).tooltip("hide");
-
- this.resetSwitchButton();
- }
-
- /**
- * Resets the switch button to its usual state
- */
- resetSwitchButton() {
- const switchButton = document.getElementById("switch");
switchButton.classList.remove("spin");
switchButton.disabled = false;
switchButton.firstElementChild.innerHTML = "open_in_browser";
@@ -1509,6 +1544,18 @@ class OutputWaiter {
$("#output-tab-modal").modal("hide");
this.changeTab(inputNum, this.app.options.syncTabs);
}
+
+
+ /**
+ * Sets the console log level in the workers.
+ */
+ setLogLevel() {
+ if (!this.zipWorker) return;
+ this.zipWorker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
+ }
}
export default OutputWaiter;
diff --git a/src/web/waiters/RecipeWaiter.mjs b/src/web/waiters/RecipeWaiter.mjs
index f4107e66..42e763b0 100755
--- a/src/web/waiters/RecipeWaiter.mjs
+++ b/src/web/waiters/RecipeWaiter.mjs
@@ -7,6 +7,7 @@
import HTMLOperation from "../HTMLOperation.mjs";
import Sortable from "sortablejs";
import Utils from "../../core/Utils.mjs";
+import {escapeControlChars} from "../utils/editorUtils.mjs";
/**
@@ -132,7 +133,7 @@ class RecipeWaiter {
// Reinitialise the popover on the original element in the ops list because for some reason it
// gets destroyed and recreated. If the clone isn't in the ops list, we use the original item instead.
let enableOpsElement;
- if (evt.clone.parentNode && evt.clone.parentNode.classList.contains("op-list")) {
+ if (evt.clone?.parentNode?.classList?.contains("op-list")) {
enableOpsElement = evt.clone;
} else {
enableOpsElement = evt.item;
@@ -162,13 +163,13 @@ class RecipeWaiter {
e.stopPropagation();
e.preventDefault();
- if (e.target.className && e.target.className.indexOf("category-title") > -1) {
+ if (e.target?.className?.indexOf("category-title") > -1) {
// Hovering over the a
e.target.classList.add("favourites-hover");
- } else if (e.target.parentNode.className && e.target.parentNode.className.indexOf("category-title") > -1) {
+ } else if (e.target?.parentNode?.className?.indexOf("category-title") > -1) {
// Hovering over the Edit button
e.target.parentNode.classList.add("favourites-hover");
- } else if (e.target.parentNode.parentNode.className && e.target.parentNode.parentNode.className.indexOf("category-title") > -1) {
+ } else if (e.target?.parentNode?.parentNode?.className?.indexOf("category-title") > -1) {
// Hovering over the image on the Edit button
e.target.parentNode.parentNode.classList.add("favourites-hover");
}
@@ -210,7 +211,7 @@ class RecipeWaiter {
* @fires Manager#statechange
*/
ingChange(e) {
- if (e && e.target && e.target.classList.contains("no-state-change")) return;
+ if (e && e?.target?.classList?.contains("no-state-change")) return;
window.dispatchEvent(this.manager.statechange);
}
@@ -568,7 +569,7 @@ class RecipeWaiter {
const registerList = [];
for (let i = 0; i < registers.length; i++) {
- registerList.push(`$R${numPrevRegisters + i} = ${Utils.escapeHtml(Utils.truncate(Utils.printable(registers[i]), 100))}`);
+ registerList.push(`$R${numPrevRegisters + i} = ${escapeControlChars(Utils.escapeHtml(Utils.truncate(registers[i], 100)))}`);
}
const registerListEl = `
${registerList.join("
")}
@@ -584,42 +585,6 @@ class RecipeWaiter {
adjustWidth() {
const recList = document.getElementById("rec-list");
- if (!this.ingredientRuleID) {
- this.ingredientRuleID = null;
- this.ingredientChildRuleID = null;
-
- // Find relevant rules in the stylesheet
- // try/catch for chrome 64+ CORS error on cssRules.
- try {
- for (const i in document.styleSheets[0].cssRules) {
- if (document.styleSheets[0].cssRules[i].selectorText === ".ingredients") {
- this.ingredientRuleID = i;
- }
- if (document.styleSheets[0].cssRules[i].selectorText === ".ingredients > div") {
- this.ingredientChildRuleID = i;
- }
- }
- } catch (e) {
- // Do nothing.
- }
- }
-
- if (!this.ingredientRuleID || !this.ingredientChildRuleID) return;
-
- const ingredientRule = document.styleSheets[0].cssRules[this.ingredientRuleID];
- const ingredientChildRule = document.styleSheets[0].cssRules[this.ingredientChildRuleID];
-
- if (recList.clientWidth < 450) {
- ingredientRule.style.gridTemplateColumns = "auto auto";
- ingredientChildRule.style.gridColumn = "1 / span 2";
- } else if (recList.clientWidth < 620) {
- ingredientRule.style.gridTemplateColumns = "auto auto auto";
- ingredientChildRule.style.gridColumn = "1 / span 3";
- } else {
- ingredientRule.style.gridTemplateColumns = "auto auto auto auto";
- ingredientChildRule.style.gridColumn = "1 / span 4";
- }
-
// Hide Chef icon on Bake button if the page is compressed
const bakeIcon = document.querySelector("#bake img");
@@ -635,7 +600,7 @@ class RecipeWaiter {
const controlsContent = document.getElementById("controls-content");
const scale = (controls.clientWidth - 1) / controlsContent.scrollWidth;
- controlsContent.style.transform = `translate(-50%, -50%) scale(${scale})`;
+ controlsContent.style.transform = `scale(${scale})`;
}
}
diff --git a/src/web/waiters/SeasonalWaiter.mjs b/src/web/waiters/SeasonalWaiter.mjs
index 8ad93452..c754dc8f 100755
--- a/src/web/waiters/SeasonalWaiter.mjs
+++ b/src/web/waiters/SeasonalWaiter.mjs
@@ -30,8 +30,7 @@ class SeasonalWaiter {
window.addEventListener("keydown", this.konamiCodeListener.bind(this));
// CyberChef Challenge
- // eslint-disable-next-line no-console
- console.log("43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e 73 2c 20 79 6f 75 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 43 79 62 65 72 43 68 65 66 20 63 68 61 6c 6c 65 6e 67 65 20 23 31 21 0a 0a 54 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 65 78 70 6c 6f 72 65 64 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 2e 20 54 6f 20 6c 65 61 72 6e 20 6d 6f 72 65 2c 20 76 69 73 69 74 20 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 48 65 78 61 64 65 63 69 6d 61 6c 2e 0a 0a 54 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 69 73 20 39 64 34 63 62 63 65 66 2d 62 65 35 32 2d 34 37 35 31 2d 61 32 62 32 2d 38 33 33 38 65 36 34 30 39 34 31 36 20 28 6b 65 65 70 20 74 68 69 73 20 70 72 69 76 61 74 65 29 2e 0a 0a 54 68 65 20 6e 65 78 74 20 63 68 61 6c 6c 65 6e 67 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61 74 20 68 74 74 70 73 3a 2f 2f 70 61 73 74 65 62 69 6e 2e 63 6f 6d 2f 47 53 6e 54 41 6d 6b 56 2e");
+ log.info("43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e 73 2c 20 79 6f 75 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 43 79 62 65 72 43 68 65 66 20 63 68 61 6c 6c 65 6e 67 65 20 23 31 21 0a 0a 54 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 65 78 70 6c 6f 72 65 64 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 2e 20 54 6f 20 6c 65 61 72 6e 20 6d 6f 72 65 2c 20 76 69 73 69 74 20 77 69 6b 69 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 48 65 78 61 64 65 63 69 6d 61 6c 2e 0a 0a 54 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 63 68 61 6c 6c 65 6e 67 65 20 69 73 20 39 64 34 63 62 63 65 66 2d 62 65 35 32 2d 34 37 35 31 2d 61 32 62 32 2d 38 33 33 38 65 36 34 30 39 34 31 36 20 28 6b 65 65 70 20 74 68 69 73 20 70 72 69 76 61 74 65 29 2e 0a 0a 54 68 65 20 6e 65 78 74 20 63 68 61 6c 6c 65 6e 67 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61 74 20 68 74 74 70 73 3a 2f 2f 70 61 73 74 65 62 69 6e 2e 63 6f 6d 2f 47 53 6e 54 41 6d 6b 56 2e");
}
diff --git a/src/web/waiters/TabWaiter.mjs b/src/web/waiters/TabWaiter.mjs
index 384b1ab7..a3361837 100644
--- a/src/web/waiters/TabWaiter.mjs
+++ b/src/web/waiters/TabWaiter.mjs
@@ -48,24 +48,6 @@ class TabWaiter {
return -1;
}
- /**
- * Gets the currently active input tab number
- *
- * @returns {number}
- */
- getActiveInputTab() {
- return this.getActiveTab("input");
- }
-
- /**
- * Gets the currently active output tab number
- *
- * @returns {number}
- */
- getActiveOutputTab() {
- return this.getActiveTab("output");
- }
-
/**
* Gets the li element for the tab of a given input number
*
@@ -83,26 +65,6 @@ class TabWaiter {
return null;
}
- /**
- * Gets the li element for an input tab of the given input number
- *
- * @param {inputNum} - The inputNum of the tab we're trying to get
- * @returns {Element}
- */
- getInputTabItem(inputNum) {
- return this.getTabItem(inputNum, "input");
- }
-
- /**
- * Gets the li element for an output tab of the given input number
- *
- * @param {number} inputNum
- * @returns {Element}
- */
- getOutputTabItem(inputNum) {
- return this.getTabItem(inputNum, "output");
- }
-
/**
* Gets a list of tab numbers for the currently displayed tabs
*
@@ -120,24 +82,6 @@ class TabWaiter {
return nums;
}
- /**
- * Gets a list of tab numbers for the currently displayed input tabs
- *
- * @returns {number[]}
- */
- getInputTabList() {
- return this.getTabList("input");
- }
-
- /**
- * Gets a list of tab numbers for the currently displayed output tabs
- *
- * @returns {number[]}
- */
- getOutputTabList() {
- return this.getTabList("output");
- }
-
/**
* Creates a new tab element for the tab bar
*
@@ -154,11 +98,8 @@ class TabWaiter {
const newTabContent = document.createElement("div");
newTabContent.classList.add(`${io}-tab-content`);
-
newTabContent.innerText = `Tab ${inputNum.toString()}`;
-
newTabContent.addEventListener("wheel", this.manager[io].scrollTab.bind(this.manager[io]), {passive: false});
-
newTab.appendChild(newTabContent);
if (io === "input") {
@@ -166,52 +107,24 @@ class TabWaiter {
newTabButtonIcon = document.createElement("i");
newTabButton.type = "button";
newTabButton.className = "btn btn-primary bmd-btn-icon btn-close-tab";
-
newTabButtonIcon.classList.add("material-icons");
newTabButtonIcon.innerText = "clear";
-
newTabButton.appendChild(newTabButtonIcon);
-
newTabButton.addEventListener("click", this.manager.input.removeTabClick.bind(this.manager.input));
-
newTab.appendChild(newTabButton);
}
return newTab;
}
- /**
- * Creates a new tab element for the input tab bar
- *
- * @param {number} inputNum - The inputNum of the new input tab
- * @param {boolean} [active=false] - If true, sets the tab to active
- * @returns {Element}
- */
- createInputTabElement(inputNum, active=false) {
- return this.createTabElement(inputNum, active, "input");
- }
-
- /**
- * Creates a new tab element for the output tab bar
- *
- * @param {number} inputNum - The inputNum of the new output tab
- * @param {boolean} [active=false] - If true, sets the tab to active
- * @returns {Element}
- */
- createOutputTabElement(inputNum, active=false) {
- return this.createTabElement(inputNum, active, "output");
- }
-
/**
* Displays the tab bar for both the input and output
*/
showTabBar() {
document.getElementById("input-tabs-wrapper").style.display = "block";
document.getElementById("output-tabs-wrapper").style.display = "block";
-
document.getElementById("input-wrapper").classList.add("show-tabs");
document.getElementById("output-wrapper").classList.add("show-tabs");
-
document.getElementById("save-all-to-file").style.display = "inline-block";
}
@@ -221,10 +134,8 @@ class TabWaiter {
hideTabBar() {
document.getElementById("input-tabs-wrapper").style.display = "none";
document.getElementById("output-tabs-wrapper").style.display = "none";
-
document.getElementById("input-wrapper").classList.remove("show-tabs");
document.getElementById("output-wrapper").classList.remove("show-tabs");
-
document.getElementById("save-all-to-file").style.display = "none";
}
@@ -271,30 +182,6 @@ class TabWaiter {
}
}
- /**
- * Refreshes the input tabs, and changes to activeTab
- *
- * @param {number[]} nums - The inputNums to be displayed as tabs
- * @param {number} activeTab - The tab to change to
- * @param {boolean} tabsLeft - True if there are input tabs to the left of the displayed tabs
- * @param {boolean} tabsRight - True if there are input tabs to the right of the displayed tabs
- */
- refreshInputTabs(nums, activeTab, tabsLeft, tabsRight) {
- this.refreshTabs(nums, activeTab, tabsLeft, tabsRight, "input");
- }
-
- /**
- * Refreshes the output tabs, and changes to activeTab
- *
- * @param {number[]} nums - The inputNums to be displayed as tabs
- * @param {number} activeTab - The tab to change to
- * @param {boolean} tabsLeft - True if there are output tabs to the left of the displayed tabs
- * @param {boolean} tabsRight - True if there are output tabs to the right of the displayed tabs
- */
- refreshOutputTabs(nums, activeTab, tabsLeft, tabsRight) {
- this.refreshTabs(nums, activeTab, tabsLeft, tabsRight, "output");
- }
-
/**
* Changes the active tab to a different tab
*
@@ -305,9 +192,6 @@ class TabWaiter {
changeTab(inputNum, io) {
const tabsList = document.getElementById(`${io}-tabs`);
- this.manager.highlighter.removeHighlights();
- getSelection().removeAllRanges();
-
let found = false;
for (let i = 0; i < tabsList.children.length; i++) {
const tabNum = parseInt(tabsList.children.item(i).getAttribute("inputNum"), 10);
@@ -322,26 +206,6 @@ class TabWaiter {
return found;
}
- /**
- * Changes the active input tab to a different tab
- *
- * @param {number} inputNum
- * @returns {boolean} - False if the tab is not currently being displayed
- */
- changeInputTab(inputNum) {
- return this.changeTab(inputNum, "input");
- }
-
- /**
- * Changes the active output tab to a different tab
- *
- * @param {number} inputNum
- * @returns {boolean} - False if the tab is not currently being displayed
- */
- changeOutputTab(inputNum) {
- return this.changeTab(inputNum, "output");
- }
-
/**
* Updates the tab header to display a preview of the tab contents
*
@@ -361,26 +225,6 @@ class TabWaiter {
tab.firstElementChild.innerText = headerData;
}
- /**
- * Updates the input tab header to display a preview of the tab contents
- *
- * @param {number} inputNum - The inputNum of the tab to update the header of
- * @param {string} data - The data to display in the tab header
- */
- updateInputTabHeader(inputNum, data) {
- this.updateTabHeader(inputNum, data, "input");
- }
-
- /**
- * Updates the output tab header to display a preview of the tab contents
- *
- * @param {number} inputNum - The inputNum of the tab to update the header of
- * @param {string} data - The data to display in the tab header
- */
- updateOutputTabHeader(inputNum, data) {
- this.updateTabHeader(inputNum, data, "output");
- }
-
/**
* Updates the tab background to display the progress of the current tab
*
@@ -401,28 +245,6 @@ class TabWaiter {
}
}
- /**
- * Updates the input tab background to display its progress
- *
- * @param {number} inputNum
- * @param {number} progress
- * @param {number} total
- */
- updateInputTabProgress(inputNum, progress, total) {
- this.updateTabProgress(inputNum, progress, total, "input");
- }
-
- /**
- * Updates the output tab background to display its progress
- *
- * @param {number} inputNum
- * @param {number} progress
- * @param {number} total
- */
- updateOutputTabProgress(inputNum, progress, total) {
- this.updateTabProgress(inputNum, progress, total, "output");
- }
-
}
export default TabWaiter;
diff --git a/src/web/waiters/TimingWaiter.mjs b/src/web/waiters/TimingWaiter.mjs
new file mode 100644
index 00000000..88f281bb
--- /dev/null
+++ b/src/web/waiters/TimingWaiter.mjs
@@ -0,0 +1,182 @@
+/**
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2023
+ * @license Apache-2.0
+ */
+
+/**
+ * Waiter to handle timing of the baking process.
+ */
+class TimingWaiter {
+
+ /**
+ * TimingWaiter constructor.
+ *
+ * @param {App} app - The main view object for CyberChef.
+ * @param {Manager} manager - The CyberChef event manager.
+ */
+ constructor(app, manager) {
+ this.app = app;
+ this.manager = manager;
+
+ this.inputs = {};
+ /*
+ Inputs example:
+ "1": {
+ "inputEncodingStart": 0,
+ "inputEncodingEnd": 0,
+ "trigger": 0
+ "chefWorkerTasked": 0,
+ "bakeComplete": 0,
+ "bakeDuration": 0,
+ "settingOutput": 0,
+ "outputDecodingStart": 0,
+ "outputDecodingEnd": 0,
+ "complete": 0
+ }
+ */
+ }
+
+
+ /**
+ * Record the time for an input
+ *
+ * @param {string} event
+ * @param {number} inputNum
+ * @param {number} value
+ */
+ recordTime(event, inputNum, value=Date.now()) {
+ inputNum = inputNum.toString();
+ if (!Object.keys(this.inputs).includes(inputNum)) {
+ this.inputs[inputNum] = {};
+ }
+ log.debug(`Recording ${event} for input ${inputNum}`);
+ this.inputs[inputNum][event] = value;
+ }
+
+ /**
+ * The duration of the main stages of a bake
+ *
+ * @param {number} inputNum
+ * @returns {number}
+ */
+ duration(inputNum) {
+ const input = this.inputs[inputNum.toString()];
+
+ // If this input has not been encoded yet, we cannot calculate a time
+ if (!input ||
+ !input.trigger ||
+ !input.inputEncodingEnd ||
+ !input.inputEncodingStart)
+ return 0;
+
+ // input encoding can happen before a bake is triggered, so it is calculated separately
+ const inputEncodingTotal = input.inputEncodingEnd - input.inputEncodingStart;
+
+ let total = 0, outputDecodingTotal = 0;
+
+ if (input.bakeComplete && input.bakeComplete > input.trigger)
+ total = input.bakeComplete - input.trigger;
+
+ if (input.settingOutput && input.settingOutput > input.trigger)
+ total = input.settingOutput - input.trigger;
+
+ if (input.outputDecodingStart && (input.outputDecodingStart > input.trigger) &&
+ input.outputDecodingEnd && (input.outputDecodingEnd > input.trigger)) {
+ total = input.outputDecodingEnd - input.trigger;
+ outputDecodingTotal = input.outputDecodingEnd - input.outputDecodingStart;
+ }
+
+ if (input.complete && input.complete > input.trigger)
+ total = inputEncodingTotal + input.bakeDuration + outputDecodingTotal;
+
+ return total;
+ }
+
+ /**
+ * The total time for a completed bake
+ *
+ * @param {number} inputNum
+ * @returns {number}
+ */
+ overallDuration(inputNum) {
+ const input = this.inputs[inputNum.toString()];
+
+ // If this input has not been encoded yet, we cannot calculate a time
+ if (!input ||
+ !input.trigger ||
+ !input.inputEncodingEnd ||
+ !input.inputEncodingStart)
+ return 0;
+
+ // input encoding can happen before a bake is triggered, so it is calculated separately
+ const inputEncodingTotal = input.inputEncodingEnd - input.inputEncodingStart;
+
+ let total = 0;
+ if (input.bakeComplete && input.bakeComplete > input.trigger)
+ total = input.bakeComplete - input.trigger;
+
+ if (input.settingOutput && input.settingOutput > input.trigger)
+ total = input.settingOutput - input.trigger;
+
+ if (input.outputDecodingStart && input.outputDecodingStart > input.trigger)
+ total = input.outputDecodingStart - input.trigger;
+
+ if (input.outputDecodingEnd && input.outputDecodingEnd > input.trigger)
+ total = input.outputDecodingEnd - input.trigger;
+
+ if (input.complete && input.complete > input.trigger)
+ total = input.complete - input.trigger;
+
+ return total + inputEncodingTotal;
+ }
+
+ /**
+ * Prints out the time between stages
+ *
+ * @param {number} inputNum
+ * @returns {string}
+ */
+ printStages(inputNum) {
+ const input = this.inputs[inputNum.toString()];
+ if (!input || !input.trigger) return "";
+
+ const total = this.overallDuration(inputNum),
+ inputEncoding = input.inputEncodingEnd - input.inputEncodingStart,
+ outputDecoding = input.outputDecodingEnd - input.outputDecodingStart,
+ overhead = total - inputEncoding - outputDecoding - input.bakeDuration;
+
+ return `Input encoding: ${inputEncoding}ms
+Recipe duration: ${input.bakeDuration}ms
+Output decoding: ${outputDecoding}ms
+
Threading overhead: ${overhead}ms `;
+ }
+
+ /**
+ * Logs every interval
+ *
+ * @param {number} inputNum
+ */
+ logAllTimes(inputNum) {
+ const input = this.inputs[inputNum.toString()];
+ if (!input || !input.trigger) return;
+
+ try {
+ log.debug(`Trigger: ${input.trigger}
+inputEncodingStart: ${input.inputEncodingStart} | ${input.inputEncodingStart - input.trigger}ms since trigger
+inputEncodingEnd: ${input.inputEncodingEnd} | ${input.inputEncodingEnd - input.inputEncodingStart}ms input encoding time
+chefWorkerTasked: ${input.chefWorkerTasked} | ${input.chefWorkerTasked - input.trigger}ms since trigger
+bakeDuration: | ${input.bakeDuration}ms duration in worker
+bakeComplete: ${input.bakeComplete} | ${input.bakeComplete - input.chefWorkerTasked}ms since worker tasked
+settingOutput: ${input.settingOutput} | ${input.settingOutput - input.bakeComplete}ms since worker finished
+outputDecodingStart: ${input.outputDecodingStart} | ${input.outputDecodingStart - input.settingOutput}ms since output set
+outputDecodingEnd: ${input.outputDecodingEnd} | ${input.outputDecodingEnd - input.outputDecodingStart}ms output encoding time
+complete: ${input.complete} | ${input.complete - input.outputDecodingEnd}ms since output decoded
+Total: | ${input.complete - input.trigger}ms since trigger`);
+ } catch (err) {}
+
+ }
+
+}
+
+export default TimingWaiter;
diff --git a/src/web/waiters/WorkerWaiter.mjs b/src/web/waiters/WorkerWaiter.mjs
index 7fcaa509..3ad9695e 100644
--- a/src/web/waiters/WorkerWaiter.mjs
+++ b/src/web/waiters/WorkerWaiter.mjs
@@ -72,6 +72,10 @@ class WorkerWaiter {
this.dishWorker.worker = new DishWorker();
this.dishWorker.worker.addEventListener("message", this.handleDishMessage.bind(this));
+ this.dishWorker.worker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
if (this.dishWorkerQueue.length > 0) {
this.postDishMessage(this.dishWorkerQueue.splice(0, 1)[0]);
@@ -89,22 +93,27 @@ class WorkerWaiter {
return -1;
}
- log.debug("Adding new ChefWorker");
+ log.debug(`Adding new ChefWorker (${this.chefWorkers.length + 1}/${this.maxWorkers})`);
// Create a new ChefWorker and send it the docURL
const newWorker = new ChefWorker();
newWorker.addEventListener("message", this.handleChefMessage.bind(this));
+ newWorker.postMessage({
+ action: "setLogPrefix",
+ data: "ChefWorker"
+ });
+ newWorker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
+
let docURL = document.location.href.split(/[#?]/)[0];
const index = docURL.lastIndexOf("/");
if (index > 0) {
docURL = docURL.substring(0, index);
}
-
newWorker.postMessage({"action": "docURL", "data": docURL});
- newWorker.postMessage({
- action: "setLogLevel",
- data: log.getLevel()
- });
+
// Store the worker, whether or not it's active, and the inputNum as an object
const newWorkerObj = {
@@ -177,7 +186,7 @@ class WorkerWaiter {
handleChefMessage(e) {
const r = e.data;
let inputNum = 0;
- log.debug(`Receiving ${r.action} from ChefWorker.`);
+ log.debug(`Receiving '${r.action}' from ChefWorker.`);
if (Object.prototype.hasOwnProperty.call(r.data, "inputNum")) {
inputNum = r.data.inputNum;
@@ -188,6 +197,8 @@ class WorkerWaiter {
switch (r.action) {
case "bakeComplete":
log.debug(`Bake ${inputNum} complete.`);
+ this.manager.timing.recordTime("bakeComplete", inputNum);
+ this.manager.timing.recordTime("bakeDuration", inputNum, r.data.duration);
if (r.data.error) {
this.app.handleError(r.data.error);
@@ -217,7 +228,7 @@ class WorkerWaiter {
break;
case "workerLoaded":
this.app.workerLoaded = true;
- log.debug("ChefWorker loaded.");
+ log.debug("ChefWorker loaded");
if (!this.loaded) {
this.app.loaded();
this.loaded = true;
@@ -266,7 +277,7 @@ class WorkerWaiter {
if (progress !== false) {
this.manager.output.updateOutputStatus("error", inputNum);
- if (inputNum === this.manager.tabs.getActiveInputTab()) {
+ if (inputNum === this.manager.tabs.getActiveTab("input")) {
this.manager.recipe.updateBreakpointIndicator(progress);
}
@@ -315,36 +326,42 @@ class WorkerWaiter {
* Cancels the current bake by terminating and removing all ChefWorkers
*
* @param {boolean} [silent=false] - If true, don't set the output
- * @param {boolean} killAll - If true, kills all chefWorkers regardless of status
+ * @param {boolean} [killAll=false] - If true, kills all chefWorkers regardless of status
*/
- cancelBake(silent, killAll) {
+ cancelBake(silent=false, killAll=false) {
+ const deactiveOutputs = new Set();
+
for (let i = this.chefWorkers.length - 1; i >= 0; i--) {
if (this.chefWorkers[i].active || killAll) {
const inputNum = this.chefWorkers[i].inputNum;
this.removeChefWorker(this.chefWorkers[i]);
- this.manager.output.updateOutputStatus("inactive", inputNum);
+ deactiveOutputs.add(inputNum);
}
}
this.setBakingStatus(false);
- for (let i = 0; i < this.inputs.length; i++) {
- this.manager.output.updateOutputStatus("inactive", this.inputs[i].inputNum);
- }
+ this.inputs.forEach(input => {
+ deactiveOutputs.add(input.inputNum);
+ });
- for (let i = 0; i < this.inputNums.length; i++) {
- this.manager.output.updateOutputStatus("inactive", this.inputNums[i]);
- }
+ this.inputNums.forEach(inputNum => {
+ deactiveOutputs.add(inputNum);
+ });
- const tabList = this.manager.tabs.getOutputTabList();
- for (let i = 0; i < tabList.length; i++) {
- this.manager.tabs.getOutputTabItem(tabList[i]).style.background = "";
- }
+ deactiveOutputs.forEach(num => {
+ this.manager.output.updateOutputStatus("inactive", num);
+ });
+
+ const tabList = this.manager.tabs.getTabList("output");
+ tabList.forEach(tab => {
+ this.manager.tabs.getTabItem(tab, "output").style.background = "";
+ });
this.inputs = [];
this.inputNums = [];
this.totalOutputs = 0;
this.loadingOutputs = 0;
- if (!silent) this.manager.output.set(this.manager.tabs.getActiveOutputTab());
+ if (!silent) this.manager.output.set(this.manager.tabs.getActiveTab("output"));
}
/**
@@ -455,6 +472,7 @@ class WorkerWaiter {
if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {
transferable = [input];
}
+ this.manager.timing.recordTime("chefWorkerTasked", nextInput.inputNum);
this.chefWorkers[workerIdx].worker.postMessage({
action: "bake",
data: {
@@ -550,10 +568,12 @@ class WorkerWaiter {
* @param {boolean} inputData.step - If true, only execute the next operation in the recipe
* @param {number} inputData.progress - The current progress through the recipe. Used when stepping
*/
- async bakeAllInputs(inputData) {
+ async bakeInputs(inputData) {
+ log.debug(`Baking input list [${inputData.nums.join(",")}]`);
+
return await new Promise(resolve => {
if (this.app.baking) return;
- const inputNums = inputData.nums;
+ const inputNums = inputData.nums.filter(n => n > 0);
const step = inputData.step;
// Use cancelBake to clear out the inputs
@@ -586,6 +606,7 @@ class WorkerWaiter {
numBakes = this.inputNums.length;
}
for (let i = 0; i < numBakes; i++) {
+ this.manager.timing.recordTime("trigger", this.inputNums[0]);
this.manager.input.inputWorker.postMessage({
action: "bakeNext",
data: {
@@ -595,6 +616,7 @@ class WorkerWaiter {
});
this.loadingOutputs++;
}
+ if (numBakes === 0) this.bakingComplete();
});
}
@@ -626,7 +648,7 @@ class WorkerWaiter {
*/
handleDishMessage(e) {
const r = e.data;
- log.debug(`Receiving ${r.action} from DishWorker`);
+ log.debug(`Receiving '${r.action}' from DishWorker`);
switch (r.action) {
case "dishReturned":
@@ -645,7 +667,7 @@ class WorkerWaiter {
}
/**
- * Asks the ChefWorker to return the dish as the specified type
+ * Asks the DishWorker to return the dish as the specified type
*
* @param {Dish} dish
* @param {string} type
@@ -653,10 +675,9 @@ class WorkerWaiter {
*/
getDishAs(dish, type, callback) {
const id = this.callbackID++;
-
this.callbacks[id] = callback;
-
if (this.dishWorker.worker === null) this.setupDishWorker();
+
this.postDishMessage({
action: "getDishAs",
data: {
@@ -668,7 +689,7 @@ class WorkerWaiter {
}
/**
- * Asks the ChefWorker to get the title of the dish
+ * Asks the DishWorker to get the title of the dish
*
* @param {Dish} dish
* @param {number} maxLength
@@ -677,9 +698,7 @@ class WorkerWaiter {
*/
getDishTitle(dish, maxLength, callback) {
const id = this.callbackID++;
-
this.callbacks[id] = callback;
-
if (this.dishWorker.worker === null) this.setupDishWorker();
this.postDishMessage({
@@ -692,6 +711,29 @@ class WorkerWaiter {
});
}
+ /**
+ * Asks the DishWorker to translate a buffer into a specific character encoding
+ *
+ * @param {ArrayBuffer} buffer
+ * @param {number} encoding
+ * @param {Function} callback
+ * @returns {string}
+ */
+ bufferToStr(buffer, encoding, callback) {
+ const id = this.callbackID++;
+ this.callbacks[id] = callback;
+ if (this.dishWorker.worker === null) this.setupDishWorker();
+
+ this.postDishMessage({
+ action: "bufferToStr",
+ data: {
+ buffer: buffer,
+ encoding: encoding,
+ id: id
+ }
+ });
+ }
+
/**
* Queues a message to be sent to the dishWorker
*
@@ -729,12 +771,18 @@ class WorkerWaiter {
* Sets the console log level in the workers.
*/
setLogLevel() {
- for (let i = 0; i < this.chefWorkers.length; i++) {
- this.chefWorkers[i].worker.postMessage({
+ this.chefWorkers.forEach(cw => {
+ cw.worker.postMessage({
action: "setLogLevel",
data: log.getLevel()
});
- }
+ });
+
+ if (!this.dishWorker.worker) return;
+ this.dishWorker.worker.postMessage({
+ action: "setLogLevel",
+ data: log.getLevel()
+ });
}
/**
@@ -794,7 +842,7 @@ class WorkerWaiter {
*
* @param {Object[]} recipeConfig
* @param {string} direction
- * @param {Object} pos - The position object for the highlight.
+ * @param {Object[]} pos - The position object for the highlight.
* @param {number} pos.start - The start offset.
* @param {number} pos.end - The end offset.
*/
diff --git a/src/web/workers/DishWorker.mjs b/src/web/workers/DishWorker.mjs
index a171fdad..4bfb701f 100644
--- a/src/web/workers/DishWorker.mjs
+++ b/src/web/workers/DishWorker.mjs
@@ -7,11 +7,19 @@
*/
import Dish from "../../core/Dish.mjs";
+import Utils from "../../core/Utils.mjs";
+import cptable from "codepage";
+import loglevelMessagePrefix from "loglevel-message-prefix";
+
+loglevelMessagePrefix(log, {
+ prefixes: [],
+ staticPrefixes: ["DishWorker"]
+});
self.addEventListener("message", function(e) {
// Handle message from the main thread
const r = e.data;
- log.debug(`DishWorker receiving command '${r.action}'`);
+ log.debug(`Receiving command '${r.action}'`);
switch (r.action) {
case "getDishAs":
@@ -20,8 +28,14 @@ self.addEventListener("message", function(e) {
case "getDishTitle":
getDishTitle(r.data);
break;
+ case "bufferToStr":
+ bufferToStr(r.data);
+ break;
+ case "setLogLevel":
+ log.setLevel(r.data, false);
+ break;
default:
- log.error(`DishWorker sent invalid action: '${r.action}'`);
+ log.error(`Unknown action: '${r.action}'`);
}
});
@@ -67,3 +81,32 @@ async function getDishTitle(data) {
}
});
}
+
+/**
+ * Translates a buffer to a string using a specified encoding
+ *
+ * @param {object} data
+ * @param {ArrayBuffer} data.buffer
+ * @param {number} data.id
+ * @param {number} data.encoding
+ */
+async function bufferToStr(data) {
+ let str;
+ if (data.encoding === 0) {
+ str = Utils.arrayBufferToStr(data.buffer);
+ } else {
+ try {
+ str = cptable.utils.decode(data.encoding, new Uint8Array(data.buffer));
+ } catch (err) {
+ str = err;
+ }
+ }
+
+ self.postMessage({
+ action: "dishReturned",
+ data: {
+ value: str,
+ id: data.id
+ }
+ });
+}
diff --git a/src/web/workers/InputWorker.mjs b/src/web/workers/InputWorker.mjs
index 9912995b..d687fc9f 100644
--- a/src/web/workers/InputWorker.mjs
+++ b/src/web/workers/InputWorker.mjs
@@ -3,21 +3,43 @@
* Handles storage, modification and retrieval of the inputs.
*
* @author j433866 [j433866@gmail.com]
+ * @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2019
* @license Apache-2.0
*/
import Utils from "../../core/Utils.mjs";
-import {detectFileType} from "../../core/lib/FileType.mjs";
+import loglevelMessagePrefix from "loglevel-message-prefix";
+
+loglevelMessagePrefix(log, {
+ prefixes: [],
+ staticPrefixes: ["InputWorker"]
+});
// Default max values
// These will be correctly calculated automatically
self.maxWorkers = 4;
self.maxTabs = 1;
-self.pendingFiles = [];
+/**
+ * Dictionary of inputs keyed on the inputNum
+ * Each entry is an object with the following type:
+ * @typedef {Object} Input
+ * @property {string} type
+ * @property {ArrayBuffer} buffer
+ * @property {string} stringSample
+ * @property {Object} file
+ * @property {string} file.name
+ * @property {number} file.size
+ * @property {string} file.type
+ * @property {string} status
+ * @property {number} progress
+ * @property {number} encoding
+ * @property {string} eolSequence
+ */
self.inputs = {};
self.loaderWorkers = [];
+self.pendingFiles = [];
self.currentInputNum = 1;
self.numInputs = 0;
self.pendingInputs = 0;
@@ -35,7 +57,7 @@ self.addEventListener("message", function(e) {
return;
}
- log.debug(`Receiving ${r.action} from InputWaiter.`);
+ log.debug(`Receiving command '${r.action}'`);
switch (r.action) {
case "loadUIFiles":
@@ -53,9 +75,6 @@ self.addEventListener("message", function(e) {
case "updateInputValue":
self.updateInputValue(r.data);
break;
- case "updateInputObj":
- self.updateInputObj(r.data);
- break;
case "updateInputProgress":
self.updateInputProgress(r.data);
break;
@@ -75,7 +94,7 @@ self.addEventListener("message", function(e) {
log.setLevel(r.data, false);
break;
case "addInput":
- self.addInput(r.data, "string");
+ self.addInput(r.data, "userinput");
break;
case "refreshTabs":
self.refreshTabs(r.data.inputNum, r.data.direction);
@@ -98,9 +117,6 @@ self.addEventListener("message", function(e) {
case "loaderWorkerMessage":
self.handleLoaderMessage(r.data);
break;
- case "inputSwitch":
- self.inputSwitch(r.data);
- break;
case "updateTabHeader":
self.updateTabHeader(r.data);
break;
@@ -155,10 +171,10 @@ self.getLoadProgress = function(inputNum) {
* whole recipe
*/
self.autoBake = function(inputNum, progress, step=false) {
- const input = self.getInputObj(inputNum);
+ const input = self.inputs[inputNum];
if (input) {
self.postMessage({
- action: "bakeAllInputs",
+ action: "bakeInputs",
data: {
nums: [parseInt(inputNum, 10)],
step: step,
@@ -173,16 +189,14 @@ self.autoBake = function(inputNum, progress, step=false) {
* Sends a list of inputNums to the workerwaiter
*/
self.bakeAllInputs = function() {
- const inputNums = Object.keys(self.inputs),
- nums = [];
+ const inputNums = Object.keys(self.inputs);
+
+ const nums = inputNums
+ .filter(n => self.inputs[n].status === "loaded")
+ .map(n => parseInt(n, 10));
- for (let i = 0; i < inputNums.length; i++) {
- if (self.inputs[inputNums[i]].status === "loaded") {
- nums.push(parseInt(inputNums[i], 10));
- }
- }
self.postMessage({
- action: "bakeAllInputs",
+ action: "bakeInputs",
data: {
nums: nums,
step: false,
@@ -198,7 +212,7 @@ self.bakeAllInputs = function() {
* @param {number} bakeId
*/
self.bakeInput = function(inputNum, bakeId) {
- const inputObj = self.getInputObj(inputNum);
+ const inputObj = self.inputs[inputNum];
if (inputObj === null ||
inputObj === undefined ||
inputObj.status !== "loaded") {
@@ -213,46 +227,16 @@ self.bakeInput = function(inputNum, bakeId) {
return;
}
- let inputData = inputObj.data;
- if (typeof inputData !== "string") inputData = inputData.fileBuffer;
-
self.postMessage({
action: "queueInput",
data: {
- input: inputData,
+ input: inputObj.buffer,
inputNum: inputNum,
bakeId: bakeId
}
});
};
-/**
- * Gets the stored object for a specific inputNum
- *
- * @param {number} inputNum - The input we want to get the object for
- * @returns {object}
- */
-self.getInputObj = function(inputNum) {
- return self.inputs[inputNum];
-};
-
-/**
- * Gets the stored value for a specific inputNum.
- *
- * @param {number} inputNum - The input we want to get the value of
- * @returns {string | ArrayBuffer}
- */
-self.getInputValue = function(inputNum) {
- if (self.inputs[inputNum]) {
- if (typeof self.inputs[inputNum].data === "string") {
- return self.inputs[inputNum].data;
- } else {
- return self.inputs[inputNum].data.fileBuffer;
- }
- }
- return "";
-};
-
/**
* Gets the stored value or object for a specific inputNum and sends it to the inputWaiter.
*
@@ -262,12 +246,11 @@ self.getInputValue = function(inputNum) {
* @param {number} inputData.id - The callback ID for the callback to run when returned to the inputWaiter
*/
self.getInput = function(inputData) {
- const inputNum = inputData.inputNum,
- data = (inputData.getObj) ? self.getInputObj(inputNum) : self.getInputValue(inputNum);
+ const input = self.inputs[inputData.inputNum];
self.postMessage({
action: "getInput",
data: {
- data: data,
+ data: inputData.getObj ? input : input.buffer,
id: inputData.id
}
});
@@ -301,8 +284,8 @@ self.getInputNums = function(id) {
* @returns {number | string} - Returns "error" if there was a load error
*/
self.getInputProgress = function(inputNum) {
- const inputObj = self.getInputObj(inputNum);
- if (inputObj === undefined || inputObj === null) return;
+ const inputObj = self.inputs[inputNum];
+ if (!inputObj) return;
if (inputObj.status === "error") {
return "error";
}
@@ -419,19 +402,17 @@ self.getNearbyNums = function(inputNum, direction) {
* @param {number} inputNum - The inputNum of the tab header
*/
self.updateTabHeader = function(inputNum) {
- const input = self.getInputObj(inputNum);
- if (input === null || input === undefined) return;
- let inputData = input.data;
- if (typeof inputData !== "string") {
- inputData = input.data.name;
- }
- inputData = inputData.replace(/[\n\r]/g, "");
+ const input = self.inputs[inputNum];
+ if (!input) return;
+
+ let header = input.type === "file" ? input.file.name : input.stringSample;
+ header = header.slice(0, 100).replace(/[\n\r\u2028\u2029]/g, "");
self.postMessage({
action: "updateTabHeader",
data: {
inputNum: inputNum,
- input: inputData.slice(0, 100)
+ input: header
}
});
};
@@ -445,42 +426,19 @@ self.updateTabHeader = function(inputNum) {
* @param {boolean} inputData.silent - If false, the manager statechange event will be fired
*/
self.setInput = function(inputData) {
- const inputNum = inputData.inputNum;
- const silent = inputData.silent;
- const input = self.getInputObj(inputNum);
- if (input === undefined || input === null) return;
+ const {inputNum, silent} = inputData;
+ const input = self.inputs[inputNum];
+ if (!input) return;
- let inputVal = input.data;
- const inputObj = {
- inputNum: inputNum,
- input: inputVal
- };
- if (typeof inputVal !== "string") {
- inputObj.name = inputVal.name;
- inputObj.size = inputVal.size;
- inputObj.type = inputVal.type;
- inputObj.progress = input.progress;
- inputObj.status = input.status;
- inputVal = inputVal.fileBuffer;
- const fileSlice = inputVal.slice(0, 512001);
- inputObj.input = fileSlice;
+ self.postMessage({
+ action: "setInput",
+ data: {
+ inputNum: inputNum,
+ inputObj: input,
+ silent: silent
+ }
+ });
- self.postMessage({
- action: "setInput",
- data: {
- inputObj: inputObj,
- silent: silent
- }
- }, [fileSlice]);
- } else {
- self.postMessage({
- action: "setInput",
- data: {
- inputObj: inputObj,
- silent: silent
- }
- });
- }
self.updateTabHeader(inputNum);
};
@@ -533,8 +491,7 @@ self.updateInputStatus = function(inputNum, status) {
* @param {number} inputData.progress - The load progress of the input
*/
self.updateInputProgress = function(inputData) {
- const inputNum = inputData.inputNum;
- const progress = inputData.progress;
+ const {inputNum, progress} = inputData;
if (self.inputs[inputNum] !== undefined) {
self.inputs[inputNum].progress = progress;
@@ -546,54 +503,31 @@ self.updateInputProgress = function(inputData) {
*
* @param {object} inputData
* @param {number} inputData.inputNum - The input that's having its value updated
- * @param {string | ArrayBuffer} inputData.value - The new value of the input
- * @param {boolean} inputData.force - If true, still updates the input value if the input type is different to the stored value
+ * @param {ArrayBuffer} inputData.buffer - The new value of the input as a buffer
+ * @param {number} [inputData.encoding] - The character encoding of the input data
+ * @param {string} [inputData.eolSequence] - The end of line sequence of the input data
+ * @param {string} [inputData.stringSample] - A sample of the value as a string (truncated to 4096 chars)
*/
self.updateInputValue = function(inputData) {
- const inputNum = inputData.inputNum;
+ const inputNum = parseInt(inputData.inputNum, 10);
if (inputNum < 1) return;
- if (Object.prototype.hasOwnProperty.call(self.inputs[inputNum].data, "fileBuffer") &&
- typeof inputData.value === "string" && !inputData.force) return;
- const value = inputData.value;
- if (self.inputs[inputNum] !== undefined) {
- if (typeof value === "string") {
- self.inputs[inputNum].data = value;
- } else {
- self.inputs[inputNum].data.fileBuffer = value;
- }
- self.inputs[inputNum].status = "loaded";
- self.inputs[inputNum].progress = 100;
- return;
+
+ if (!Object.prototype.hasOwnProperty.call(self.inputs, inputNum))
+ throw new Error(`No input with ID ${inputNum} exists`);
+
+ self.inputs[inputNum].buffer = inputData.buffer;
+ if ("encoding" in inputData) {
+ self.inputs[inputNum].encoding = inputData.encoding;
}
-
- // If we get to here, an input for inputNum could not be found,
- // so create a new one. Only do this if the value is a string, as
- // loadFiles will create the input object for files
- if (typeof value === "string") {
- self.inputs.push({
- inputNum: inputNum,
- data: value,
- status: "loaded",
- progress: 100
- });
+ if ("eolSequence" in inputData) {
+ self.inputs[inputNum].eolSequence = inputData.eolSequence;
}
-};
-
-/**
- * Update the stored data object for an input.
- * Used if we need to change a string to an ArrayBuffer
- *
- * @param {object} inputData
- * @param {number} inputData.inputNum - The number of the input we're updating
- * @param {object} inputData.data - The new data object for the input
- */
-self.updateInputObj = function(inputData) {
- const inputNum = inputData.inputNum;
- const data = inputData.data;
-
- if (self.getInputObj(inputNum) === undefined) return;
-
- self.inputs[inputNum].data = data;
+ if (!("stringSample" in inputData)) {
+ inputData.stringSample = Utils.arrayBufferToStr(inputData.buffer.slice(0, 4096));
+ }
+ self.inputs[inputNum].stringSample = inputData.stringSample;
+ self.inputs[inputNum].status = "loaded";
+ self.inputs[inputNum].progress = 100;
};
/**
@@ -632,8 +566,7 @@ self.loaderWorkerReady = function(workerData) {
/**
* Handler for messages sent by loaderWorkers.
- * (Messages are sent between the inputWorker and
- * loaderWorkers via the main thread)
+ * (Messages are sent between the inputWorker and loaderWorkers via the main thread)
*
* @param {object} r - The data sent by the loaderWorker
* @param {number} r.inputNum - The inputNum which the message corresponds to
@@ -667,7 +600,7 @@ self.handleLoaderMessage = function(r) {
self.updateInputValue({
inputNum: inputNum,
- value: r.fileBuffer
+ buffer: r.fileBuffer
});
self.postMessage({
@@ -752,12 +685,12 @@ self.terminateLoaderWorker = function(id) {
* @param {number} filesData.activeTab - The active tab in the UI
*/
self.loadFiles = function(filesData) {
- const files = filesData.files;
- const activeTab = filesData.activeTab;
+ const {files, activeTab} = filesData;
let lastInputNum = -1;
const inputNums = [];
for (let i = 0; i < files.length; i++) {
- if (i === 0 && self.getInputValue(activeTab) === "") {
+ // If the first input is empty, replace it rather than adding a new one
+ if (i === 0 && (!self.inputs[activeTab].buffer || self.inputs[activeTab].buffer.byteLength === 0)) {
self.removeInput({
inputNum: activeTab,
refreshTabs: false,
@@ -791,14 +724,14 @@ self.loadFiles = function(filesData) {
}
self.getLoadProgress();
- self.setInput({inputNum: activeTab, silent: true});
+ self.setInput({inputNum: lastInputNum, silent: true});
};
/**
* Adds an input to the input dictionary
*
* @param {boolean} [changetab=false] - Whether or not to change to the new input
- * @param {string} type - Either "string" or "file"
+ * @param {string} type - Either "userinput" or "file"
* @param {Object} fileData - Contains information about the file to be added to the input (only used when type is "file")
* @param {string} fileData.name - The filename of the input being added
* @param {number} fileData.size - The file size (in bytes) of the input being added
@@ -810,25 +743,32 @@ self.addInput = function(
type,
fileData = {
name: "unknown",
- size: "unknown",
+ size: 0,
type: "unknown"
},
inputNum = self.currentInputNum++
) {
self.numInputs++;
const newInputObj = {
- inputNum: inputNum
+ type: null,
+ buffer: new ArrayBuffer(),
+ stringSample: "",
+ file: null,
+ status: "pending",
+ progress: 0,
+ encoding: 0,
+ eolSequence: "\u000a"
};
switch (type) {
- case "string":
- newInputObj.data = "";
+ case "userinput":
+ newInputObj.type = "userinput";
newInputObj.status = "loaded";
newInputObj.progress = 100;
break;
case "file":
- newInputObj.data = {
- fileBuffer: new ArrayBuffer(),
+ newInputObj.type = "file";
+ newInputObj.file = {
name: fileData.name,
size: fileData.size,
type: fileData.type
@@ -837,7 +777,7 @@ self.addInput = function(
newInputObj.progress = 0;
break;
default:
- log.error(`Invalid type '${type}'.`);
+ log.error(`Invalid input type '${type}'.`);
return -1;
}
self.inputs[inputNum] = newInputObj;
@@ -976,18 +916,18 @@ self.filterTabs = function(searchData) {
self.inputs[iNum].status === "loading" && showLoading ||
self.inputs[iNum].status === "loaded" && showLoaded) {
try {
- if (typeof self.inputs[iNum].data === "string") {
+ if (self.inputs[iNum].type === "userinput") {
if (filterType.toLowerCase() === "content" &&
- filterExp.test(self.inputs[iNum].data.slice(0, 4096))) {
- textDisplay = self.inputs[iNum].data.slice(0, 4096);
+ filterExp.test(self.inputs[iNum].stringSample)) {
+ textDisplay = self.inputs[iNum].stringSample;
addInput = true;
}
} else {
if ((filterType.toLowerCase() === "filename" &&
- filterExp.test(self.inputs[iNum].data.name)) ||
- filterType.toLowerCase() === "content" &&
- filterExp.test(Utils.arrayBufferToStr(self.inputs[iNum].data.fileBuffer.slice(0, 4096)))) {
- textDisplay = self.inputs[iNum].data.name;
+ filterExp.test(self.inputs[iNum].file.name)) ||
+ (filterType.toLowerCase() === "content" &&
+ filterExp.test(self.inputs[iNum].stringSample))) {
+ textDisplay = self.inputs[iNum].file.name;
addInput = true;
}
}
@@ -1021,61 +961,3 @@ self.filterTabs = function(searchData) {
data: inputs
});
};
-
-/**
- * Swaps the input and outputs, and sends the old input back to the main thread.
- *
- * @param {object} switchData
- * @param {number} switchData.inputNum - The inputNum of the input to be switched to
- * @param {string | ArrayBuffer} switchData.outputData - The data to switch to
- */
-self.inputSwitch = function(switchData) {
- const currentInput = self.getInputObj(switchData.inputNum);
- const currentData = currentInput.data;
- if (currentInput === undefined || currentInput === null) return;
-
- if (typeof switchData.outputData !== "string") {
- const output = new Uint8Array(switchData.outputData),
- types = detectFileType(output);
- let type = "unknown",
- ext = "dat";
- if (types.length) {
- type = types[0].mime;
- ext = types[0].extension.split(",", 1)[0];
- }
-
- // ArrayBuffer
- self.updateInputObj({
- inputNum: switchData.inputNum,
- data: {
- fileBuffer: switchData.outputData,
- name: `output.${ext}`,
- size: switchData.outputData.byteLength.toLocaleString(),
- type: type
- }
- });
- } else {
- // String
- self.updateInputValue({
- inputNum: switchData.inputNum,
- value: switchData.outputData,
- force: true
- });
- }
-
- self.postMessage({
- action: "inputSwitch",
- data: {
- data: currentData,
- inputNum: switchData.inputNum
- }
- });
-
- self.postMessage({
- action: "fileLoaded",
- data: {
- inputNum: switchData.inputNum
- }
- });
-
-};
diff --git a/src/web/workers/LoaderWorker.js b/src/web/workers/LoaderWorker.js
index 4c38998e..ef6280f0 100755
--- a/src/web/workers/LoaderWorker.js
+++ b/src/web/workers/LoaderWorker.js
@@ -6,32 +6,36 @@
* @license Apache-2.0
*/
+import loglevelMessagePrefix from "loglevel-message-prefix";
+
+loglevelMessagePrefix(log, {
+ prefixes: [],
+ staticPrefixes: ["LoaderWorker"]
+});
+
self.id = null;
-self.handleMessage = function(e) {
- const r = e.data;
- log.debug(`LoaderWorker receiving command '${r.action}'`);
-
- switch (r.action) {
- case "loadInput":
- self.loadFile(r.data.file, r.data.inputNum);
- break;
- }
-};
-
-
/**
* Respond to message from parent thread.
*/
self.addEventListener("message", function(e) {
+ // Handle message
const r = e.data;
- if (Object.prototype.hasOwnProperty.call(r, "file") && Object.prototype.hasOwnProperty.call(r, "inputNum")) {
- self.loadFile(r.file, r.inputNum);
- } else if (Object.prototype.hasOwnProperty.call(r, "file")) {
- self.loadFile(r.file, "");
- } else if (Object.prototype.hasOwnProperty.call(r, "id")) {
- self.id = r.id;
+ log.debug(`Receiving command '${r.action}'`);
+
+ switch (r.action) {
+ case "setID":
+ self.id = r.data.id;
+ break;
+ case "loadFile":
+ self.loadFile(r.data.file, r.data?.inputNum ?? "");
+ break;
+ case "setLogLevel":
+ log.setLevel(r.data, false);
+ break;
+ default:
+ log.error(`Unknown action '${r.action}'.`);
}
});
diff --git a/src/web/workers/ZipWorker.mjs b/src/web/workers/ZipWorker.mjs
index 85a8cb4c..f81e2b2c 100644
--- a/src/web/workers/ZipWorker.mjs
+++ b/src/web/workers/ZipWorker.mjs
@@ -10,6 +10,12 @@ import zip from "zlibjs/bin/zip.min.js";
import Utils from "../../core/Utils.mjs";
import Dish from "../../core/Dish.mjs";
import {detectFileType} from "../../core/lib/FileType.mjs";
+import loglevelMessagePrefix from "loglevel-message-prefix";
+
+loglevelMessagePrefix(log, {
+ prefixes: [],
+ staticPrefixes: ["ZipWorker"],
+});
const Zlib = zip.Zlib;
@@ -17,17 +23,20 @@ const Zlib = zip.Zlib;
* Respond to message from parent thread.
*/
self.addEventListener("message", function(e) {
+ // Handle message from the main thread
const r = e.data;
- if (!("outputs" in r)) {
- log.error("No files were passed to the ZipWorker.");
- return;
- }
- if (!("filename" in r)) {
- log.error("No filename was passed to the ZipWorker");
- return;
- }
+ log.debug(`Receiving command '${r.action}'`);
- self.zipFiles(r.outputs, r.filename, r.fileExtension);
+ switch (r.action) {
+ case "zipFiles":
+ self.zipFiles(r.data.outputs, r.data.filename, r.data.fileExtension);
+ break;
+ case "setLogLevel":
+ log.setLevel(r.data, false);
+ break;
+ default:
+ log.error(`Unknown action: '${r.action}'`);
+ }
});
self.setOption = function(...args) {};
diff --git a/tests/browser/nightwatch.js b/tests/browser/00_nightwatch.js
similarity index 88%
rename from tests/browser/nightwatch.js
rename to tests/browser/00_nightwatch.js
index 41aff9b2..3ba2a865 100644
--- a/tests/browser/nightwatch.js
+++ b/tests/browser/00_nightwatch.js
@@ -6,6 +6,8 @@
* @license Apache-2.0
*/
+const utils = require("./browserUtils.js");
+
module.exports = {
before: browser => {
browser
@@ -82,7 +84,7 @@ module.exports = {
// Enter input
browser
.useCss()
- .setValue("#input-text", "Don't Panic.")
+ .sendKeys("#input-text .cm-content", "Don't Panic.")
.pause(1000)
.click("#bake");
@@ -90,7 +92,7 @@ module.exports = {
browser
.useCss()
.waitForElementNotVisible("#stale-indicator", 1000)
- .expect.element("#output-text").to.have.property("value").that.equals("44 6f 6e 27 74 20 50 61 6e 69 63 2e");
+ .expect.element("#output-text .cm-content").text.that.equals("44 6f 6e 27 74 20 50 61 6e 69 63 2e");
// Clear recipe
browser
@@ -206,7 +208,7 @@ module.exports = {
.useCss()
.waitForElementVisible(".operation .op-title", 1000)
.waitForElementNotVisible("#stale-indicator", 1000)
- .expect.element("#output-text").to.have.property("value").which.matches(/[\da-f-]{36}/);
+ .expect.element("#output-text .cm-content").text.which.matches(/[\da-f-]{36}/);
browser.click("#clr-recipe");
},
@@ -221,6 +223,25 @@ module.exports = {
.waitForElementVisible("//ul[@id='search-results']//b[text()='MD5']", 1000);
},
+ "Alert bar": browser => {
+ // Bake nothing to create an empty output which can be copied
+ utils.clear(browser);
+ utils.bake(browser);
+
+ // Alert bar shows and contains correct content
+ browser
+ .click("#copy-output")
+ .waitForElementVisible("#snackbar-container")
+ .waitForElementVisible("#snackbar-container .snackbar-content")
+ .expect.element("#snackbar-container .snackbar-content").text.to.equal("Copied raw output successfully.");
+
+ // Alert bar disappears after the correct amount of time
+ // Should disappear after 2000ms
+ browser
+ .waitForElementNotPresent("#snackbar-container .snackbar-content", 2500)
+ .waitForElementNotVisible("#snackbar-container");
+ },
+
after: browser => {
browser.end();
}
diff --git a/tests/browser/01_io.js b/tests/browser/01_io.js
new file mode 100644
index 00000000..67d1fdff
--- /dev/null
+++ b/tests/browser/01_io.js
@@ -0,0 +1,704 @@
+/**
+ * Tests for input and output of various types to ensure the editors work as expected
+ * and retain data integrity, especially when it comes to special characters.
+ *
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2023
+ * @license Apache-2.0
+ */
+
+// import {
+// clear,
+// utils.setInput,
+// bake,
+// setChrEnc,
+// setEOLSeq,
+// copy,
+// paste,
+// loadRecipe,
+// expectOutput,
+// uploadFile,
+// uploadFolder
+// } from "./browserUtils.js";
+
+const utils = require("./browserUtils.js");
+
+const SPECIAL_CHARS = [
+ "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f",
+ "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f",
+ "\u007f",
+ "\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f",
+ "\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f",
+ "\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9\ufffa\ufffb\ufffc"
+].join("");
+
+const ALL_BYTES = [
+ "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
+ "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
+ "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f",
+ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f",
+ "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f",
+ "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f",
+ "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f",
+ "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f",
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f",
+ "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f",
+ "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
+ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf",
+ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
+ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf",
+ "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef",
+ "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
+].join("");
+
+const PUA_CHARS = "\ue000\ue001\uf8fe\uf8ff";
+
+const MULTI_LINE_STRING =`"You know," said Arthur, "it's at times like this, when I'm trapped in a Vogon airlock with a man from Betelgeuse, and about to die of asphyxiation in deep space that I really wish I'd listened to what my mother told me when I was young."
+"Why, what did she tell you?"
+"I don't know, I didn't listen."`;
+
+const SELECTABLE_STRING = `ONE
+two
+ONE
+three
+ONE
+four
+ONE`;
+
+// Descriptions for named control characters
+const CONTROL_CHAR_NAMES = {
+ 0: "null",
+ 7: "bell",
+ 8: "backspace",
+ 10: "line feed",
+ 11: "vertical tab",
+ 13: "carriage return",
+ 27: "escape",
+ 8203: "zero width space",
+ 8204: "zero width non-joiner",
+ 8205: "zero width joiner",
+ 8206: "left-to-right mark",
+ 8207: "right-to-left mark",
+ 8232: "line separator",
+ 8237: "left-to-right override",
+ 8238: "right-to-left override",
+ 8294: "left-to-right isolate",
+ 8295: "right-to-left isolate",
+ 8297: "pop directional isolate",
+ 8233: "paragraph separator",
+ 65279: "zero width no-break space",
+ 65532: "object replacement"
+};
+
+module.exports = {
+ before: browser => {
+ browser
+ .resizeWindow(1280, 800)
+ .url(browser.launchUrl)
+ .useCss()
+ .waitForElementNotPresent("#preloader", 10000)
+ .click("#auto-bake-label");
+ },
+
+ "CodeMirror has loaded correctly": browser => {
+ /* Editor has initialised */
+ browser
+ .useCss()
+ // Input
+ .waitForElementVisible("#input-text")
+ .waitForElementVisible("#input-text .cm-editor")
+ .waitForElementVisible("#input-text .cm-editor .cm-scroller")
+ .waitForElementVisible("#input-text .cm-editor .cm-scroller .cm-content")
+ .waitForElementVisible("#input-text .cm-editor .cm-scroller .cm-content .cm-line")
+ // Output
+ .waitForElementVisible("#output-text")
+ .waitForElementVisible("#output-text .cm-editor")
+ .waitForElementVisible("#output-text .cm-editor .cm-scroller")
+ .waitForElementVisible("#output-text .cm-editor .cm-scroller .cm-content")
+ .waitForElementVisible("#output-text .cm-editor .cm-scroller .cm-content .cm-line");
+
+ /* Status bar is showing and has correct values */
+ browser // Input
+ .waitForElementVisible("#input-text .cm-status-bar")
+ .waitForElementVisible("#input-text .cm-status-bar .stats-length-value")
+ .expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("0");
+ browser.waitForElementVisible("#input-text .cm-status-bar .stats-lines-value")
+ .expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+ browser.waitForElementVisible("#input-text .cm-status-bar .chr-enc-value")
+ .expect.element("#input-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
+ browser.waitForElementVisible("#input-text .cm-status-bar .eol-value")
+ .expect.element("#input-text .cm-status-bar .eol-value").text.to.equal("LF");
+
+ browser // Output
+ .waitForElementVisible("#output-text .cm-status-bar")
+ .waitForElementVisible("#output-text .cm-status-bar .stats-length-value")
+ .expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("0");
+ browser.waitForElementVisible("#output-text .cm-status-bar .stats-lines-value")
+ .expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+ browser.waitForElementVisible("#output-text .cm-status-bar .baking-time-info")
+ .expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms");
+ browser.waitForElementVisible("#output-text .cm-status-bar .chr-enc-value")
+ .expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
+ browser.waitForElementVisible("#output-text .cm-status-bar .eol-value")
+ .expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF");
+ },
+
+ "Adding content": browser => {
+ /* Status bar updates correctly */
+ utils.setInput(browser, MULTI_LINE_STRING);
+
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("3");
+ browser.expect.element("#input-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
+ browser.expect.element("#input-text .cm-status-bar .eol-value").text.to.equal("LF");
+
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("0");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+ browser.expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms");
+ browser.expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
+ browser.expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF");
+
+ /* Output updates correctly */
+ utils.bake(browser);
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("3");
+ browser.expect.element("#output-text .cm-status-bar .baking-time-info").text.to.contain("ms");
+ browser.expect.element("#output-text .cm-status-bar .chr-enc-value").text.to.equal("Raw Bytes");
+ browser.expect.element("#output-text .cm-status-bar .eol-value").text.to.equal("LF");
+ },
+
+ "Special content": browser => {
+ /* Special characters are rendered correctly */
+ utils.setInput(browser, SPECIAL_CHARS, false);
+
+ // First line
+ for (let i = 0x0; i <= 0x8; i++) {
+ browser.expect.element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
+ .to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`);
+ browser.expect.element(`#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
+ .text.to.equal(String.fromCharCode(0x2400 + i));
+ }
+
+ // Tab \u0009
+ browser.expect.element(`#input-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/\u0009$/);
+
+ // Line feed \u000a
+ browser.expect.element(`#input-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/^.{10}$/);
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ // Second line
+ for (let i = 0x0b; i < SPECIAL_CHARS.length; i++) {
+ const index = SPECIAL_CHARS.charCodeAt(i);
+ const name = CONTROL_CHAR_NAMES[index] || "0x" + index.toString(16);
+ const value = index >= 32 ? "\u2022" : String.fromCharCode(0x2400 + index);
+
+ browser.expect.element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
+ .to.have.property("title").equals(`Control character ${name}`);
+ browser.expect.element(`#input-text .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
+ .text.to.equal(value);
+ }
+
+ /* Output renders correctly */
+ utils.setChrEnc(browser, "output", "UTF-8");
+ utils.bake(browser);
+
+ // First line
+ for (let i = 0x0; i <= 0x8; i++) {
+ browser.expect.element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
+ .to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`);
+ browser.expect.element(`#output-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(${i+1})`)
+ .text.to.equal(String.fromCharCode(0x2400 + i));
+ }
+
+ // Tab \u0009
+ browser.expect.element(`#output-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/\u0009$/);
+
+ // Line feed \u000a
+ browser.expect.element(`#output-text .cm-line:nth-of-type(1)`).to.have.property("textContent").match(/^.{10}$/);
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ // Second line
+ for (let i = 0x0b; i < SPECIAL_CHARS.length; i++) {
+ const index = SPECIAL_CHARS.charCodeAt(i);
+ const name = CONTROL_CHAR_NAMES[index] || "0x" + index.toString(16);
+ const value = index >= 32 ? "\u2022" : String.fromCharCode(0x2400 + index);
+
+ browser.expect.element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
+ .to.have.property("title").equals(`Control character ${name}`);
+ browser.expect.element(`#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar:nth-of-type(${i-10})`)
+ .text.to.equal(value);
+ }
+
+ /* Bytes are rendered correctly */
+ utils.setInput(browser, ALL_BYTES, false);
+ // Expect length to be 255, since one character is creating a newline
+ browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{255}$/);
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("256");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+
+ /* PUA \ue000-\uf8ff */
+ utils.setInput(browser, PUA_CHARS, false);
+ utils.setChrEnc(browser, "output", "UTF-8");
+ utils.bake(browser);
+
+ // Confirm input and output as expected
+ /* In order to render whitespace characters as control character pictures in the output, even
+ when they are the designated line separator, CyberChef sometimes chooses to represent them
+ internally using the Unicode Private Use Area (https://en.wikipedia.org/wiki/Private_Use_Areas).
+ See `Utils.escapeWhitespace()` for an example of this.
+ Therefore, PUA characters should be rendered normally in the Input but as control character
+ pictures in the output.
+ */
+ browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^\ue000\ue001\uf8fe\uf8ff$/);
+ browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^\u2400\u2401\u3cfe\u3cff$/);
+
+ /* Can be copied */
+ utils.setInput(browser, SPECIAL_CHARS, false);
+ utils.setChrEnc(browser, "output", "UTF-8");
+ utils.bake(browser);
+
+ // Manual copy
+ browser
+ .doubleClick("#output-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(1)")
+ .waitForElementVisible("#output-text .cm-selectionBackground");
+ utils.copy(browser);
+ utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values
+
+ // Ensure that the values are as expected
+ browser.expect.element("#search").to.have.value.that.equals("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008");
+ browser.clearValue("#search");
+
+ // Raw copy
+ browser
+ .click("#copy-output")
+ .pause(100);
+ utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values
+
+ // Ensure that the values are as expected
+ browser.expect.element("#search").to.have.value.that.matches(/^\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009/);
+ browser.clearValue("#search");
+ },
+
+ "HTML output": browser => {
+ /* Displays correctly */
+ utils.loadRecipe(browser, "Entropy", ALL_BYTES);
+ utils.bake(browser);
+
+ browser
+ .waitForElementVisible("#output-html")
+ .waitForElementVisible("#output-html #chart-area");
+
+ /* Status bar widgets are disabled */
+ browser.expect.element("#output-text .cm-status-bar .disabled .stats-length-value").to.be.visible;
+ browser.expect.element("#output-text .cm-status-bar .disabled .stats-lines-value").to.be.visible;
+ browser.expect.element("#output-text .cm-status-bar .disabled .chr-enc-value").to.be.visible;
+ browser.expect.element("#output-text .cm-status-bar .disabled .eol-value").to.be.visible;
+
+ /* Displays special chars correctly */
+ utils.loadRecipe(browser, "To Table", ",\u0000\u0001\u0002\u0003\u0004", [",", "\\r\\n", false, "HTML"]);
+ utils.bake(browser);
+
+ for (let i = 0x0; i <= 0x4; i++) {
+ browser.expect.element(`#output-html .cm-specialChar:nth-of-type(${i+1})`)
+ .to.have.property("title").equals(`Control character ${CONTROL_CHAR_NAMES[i] || "0x" + i.toString(16)}`);
+ browser.expect.element(`#output-html .cm-specialChar:nth-of-type(${i+1})`)
+ .text.to.equal(String.fromCharCode(0x2400 + i));
+ }
+
+ /* Can be copied */
+ // Raw copy
+ browser
+ .click("#copy-output")
+ .pause(100);
+ utils.paste(browser, "#search"); // Paste into search box as this won't mess with the values
+
+ // Ensure that the values are as expected
+ browser.expect.element("#search").to.have.value.that.matches(/\u0000\u0001\u0002\u0003\u0004/);
+ browser.clearValue("#search");
+ },
+
+ "Highlighting": browser => {
+ utils.setInput(browser, SELECTABLE_STRING);
+ utils.bake(browser);
+
+ /* Selecting input text also selects other instances in input and output */
+ browser // Input
+ .click("#auto-bake-label")
+ .doubleClick("#input-text .cm-content .cm-line:nth-of-type(1)")
+ .waitForElementVisible("#input-text .cm-selectionLayer .cm-selectionBackground")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
+ .waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
+ .waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
+ .waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
+
+ browser // Output
+ .waitForElementVisible("#output-text .cm-selectionLayer .cm-selectionBackground")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
+ .waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
+ .waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
+ .waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
+
+ /* Selecting output text highlights in input */
+ browser // Output
+ .click("#output-text")
+ .waitForElementNotPresent("#input-text .cm-selectionLayer .cm-selectionBackground")
+ .waitForElementNotPresent("#output-text .cm-selectionLayer .cm-selectionBackground")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line .cm-selectionMatch")
+ .doubleClick("#output-text .cm-content .cm-line:nth-of-type(7)")
+ .waitForElementVisible("#output-text .cm-selectionLayer .cm-selectionBackground")
+ .waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
+ .waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
+ .waitForElementVisible("#output-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
+
+ browser // Input
+ .waitForElementVisible("#input-text .cm-selectionLayer .cm-selectionBackground")
+ .waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(1) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2) .cm-selectionMatch")
+ .waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(3) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(4) .cm-selectionMatch")
+ .waitForElementVisible("#input-text .cm-content .cm-line:nth-of-type(5) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(6) .cm-selectionMatch")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(7) .cm-selectionMatch");
+
+ // Turn autobake off again
+ browser.click("#auto-bake-label");
+ },
+
+ "Character encoding": browser => {
+ const CHINESE_CHARS = "不要恐慌。";
+ /* Dropup works */
+ /* Selecting changes output correctly */
+ utils.setInput(browser, CHINESE_CHARS, false);
+ utils.setChrEnc(browser, "input", "UTF-8");
+ utils.bake(browser);
+ utils.expectOutput(browser, "\u00E4\u00B8\u008D\u00E8\u00A6\u0081\u00E6\u0081\u0090\u00E6\u0085\u008C\u00E3\u0080\u0082");
+
+ /* Changing output to match input works as expected */
+ utils.setChrEnc(browser, "output", "UTF-8");
+ utils.bake(browser);
+ utils.expectOutput(browser, CHINESE_CHARS);
+
+ /* Encodings appear in the URL */
+ browser.assert.urlContains("ienc=65001");
+ browser.assert.urlContains("oenc=65001");
+
+ /* Preserved when changing tabs */
+ browser
+ .click("#btn-new-tab")
+ .waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab");
+ browser.expect.element("#input-text .chr-enc-value").text.that.equals("Raw Bytes");
+ browser.expect.element("#output-text .chr-enc-value").text.that.equals("Raw Bytes");
+
+ utils.setChrEnc(browser, "input", "UTF-7");
+ utils.setChrEnc(browser, "output", "UTF-7");
+
+ browser
+ .click("#input-tabs li:nth-of-type(1)")
+ .waitForElementVisible("#input-tabs li:nth-of-type(1).active-input-tab");
+ browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-8");
+ browser.expect.element("#output-text .chr-enc-value").text.that.equals("UTF-8");
+
+ /* Try various encodings */
+ // These are not meant to be realistic encodings for this data
+ utils.setInput(browser, CHINESE_CHARS, false);
+ utils.setChrEnc(browser, "input", "UTF-8");
+ utils.setChrEnc(browser, "output", "UTF-16LE");
+ utils.bake(browser);
+ utils.expectOutput(browser, "\uB8E4\uE88D\u81A6\u81E6\uE690\u8C85\u80E3");
+
+ utils.setChrEnc(browser, "output", "Simplified Chinese GBK");
+ utils.bake(browser);
+ utils.expectOutput(browser, "\u6D93\u5D88\uFDFF\u93AD\u612D\u53A1\u9286\u0000");
+
+ utils.setChrEnc(browser, "input", "UTF-7");
+ utils.bake(browser);
+ utils.expectOutput(browser, "+Tg0-+iYE-+YFA-+YUw-");
+
+ utils.setChrEnc(browser, "input", "Traditional Chinese Big5");
+ utils.bake(browser);
+ utils.expectOutput(browser, "\u3043\u74B6\uFDFF\u7A3A\uFDFF");
+
+ utils.setChrEnc(browser, "output", "Windows-1251 Cyrillic");
+ utils.bake(browser);
+ utils.expectOutput(browser, "\u00A4\u0408\u00ADn\u00AE\u0408\u00B7W\u040EC");
+ },
+
+ "Line endings": browser => {
+ /* Dropup works */
+ /* Selecting changes view in input */
+ utils.setInput(browser, MULTI_LINE_STRING);
+
+ // Line endings: LF
+
+ // Input
+ browser
+ .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(3)")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(4)")
+ .waitForElementNotPresent("#input-text .cm-content .cm-specialChar");
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("3");
+
+ // Output
+ utils.bake(browser);
+ browser
+ .waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(3)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-specialChar");
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("3");
+
+ // Input EOL: VT
+ utils.setEOLSeq(browser, "input", "VT");
+
+ // Input
+ browser
+ .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1)")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementPresent("#input-text .cm-content .cm-specialChar");
+ browser.expect.element("#input-text .cm-content .cm-specialChar").text.to.equal("␊");
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+
+ // Output
+ utils.bake(browser);
+ browser
+ .waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(3)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(4)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-specialChar");
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("3");
+
+ // Output EOL: VT
+ utils.setEOLSeq(browser, "output", "VT");
+
+ // Input
+ browser
+ .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1)")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementPresent("#input-text .cm-content .cm-specialChar");
+ browser.expect.element("#input-text .cm-content .cm-specialChar").text.to.equal("␊");
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+
+ // Output
+ browser
+ .waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(1)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementPresent("#output-text .cm-content .cm-specialChar");
+ browser.expect.element("#output-text .cm-content .cm-specialChar").text.to.equal("␊");
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("301");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+
+ /* Adding new line ending changes output correctly */
+ browser.sendKeys("#input-text .cm-content", browser.Keys.RETURN);
+
+ // Input
+ browser
+ .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(3)");
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("302");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ // Output
+ utils.bake(browser);
+ browser
+ .waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(3)");
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("302");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ // Input EOL: CRLF
+ utils.setEOLSeq(browser, "input", "CRLF");
+ // Output EOL: CR
+ utils.setEOLSeq(browser, "output", "CR");
+ browser.sendKeys("#input-text .cm-content", browser.Keys.RETURN);
+
+ // Input
+ browser
+ .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementNotPresent("#input-text .cm-content .cm-line:nth-of-type(3)")
+ .waitForElementPresent("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)");
+ browser.expect.element("#input-text .cm-content .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(3)").text.to.equal("␋");
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("304");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ // Output
+ utils.bake(browser);
+ browser
+ .waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(2)")
+ .waitForElementNotPresent("#output-text .cm-content .cm-line:nth-of-type(3)")
+ .waitForElementPresent("#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar");
+ browser.expect.element("#output-text .cm-content .cm-line:nth-of-type(2) .cm-specialChar").text.to.equal("␊");
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("304");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ /* Line endings appear in the URL */
+ browser.assert.urlContains("ieol=%0D%0A");
+ browser.assert.urlContains("oeol=%0D");
+
+ /* Preserved when changing tabs */
+ browser
+ .click("#btn-new-tab")
+ .waitForElementVisible("#input-tabs li:nth-of-type(2).active-input-tab");
+ browser.expect.element("#input-text .eol-value").text.that.equals("LF");
+ browser.expect.element("#output-text .eol-value").text.that.equals("LF");
+
+ utils.setEOLSeq(browser, "input", "FF");
+ utils.setEOLSeq(browser, "output", "LS");
+
+ browser
+ .click("#input-tabs li:nth-of-type(1)")
+ .waitForElementVisible("#input-tabs li:nth-of-type(1).active-input-tab");
+ browser.expect.element("#input-text .eol-value").text.that.equals("CRLF");
+ browser.expect.element("#output-text .eol-value").text.that.equals("CR");
+ },
+
+ "File inputs": browser => {
+ utils.clear(browser);
+
+ /* Side panel displays correct info */
+ utils.uploadFile(browser, "files/TowelDay.jpeg");
+
+ browser
+ .waitForElementVisible("#input-text .cm-file-details")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-name")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-size")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-type")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
+ browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("TowelDay.jpeg");
+ browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("61,379 bytes");
+ browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg");
+ browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%");
+
+ /* Side panel can be hidden */
+ browser
+ .click("#input-text .cm-file-details .file-details-toggle-shown")
+ .waitForElementNotPresent("#input-text .cm-file-details .file-details-toggle-shown")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-hidden")
+ .expect.element("#input-text .cm-file-details").to.have.css("width").which.equals("1px");
+
+ browser
+ .click("#input-text .cm-file-details .file-details-toggle-hidden")
+ .waitForElementNotPresent("#input-text .cm-file-details .file-details-toggle-hidden")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
+ .expect.element("#input-text .cm-file-details").to.have.css("width").which.equals("200px");
+ },
+
+ "Folder inputs": browser => {
+ utils.clear(browser);
+
+ /* Side panel displays correct info */
+ utils.uploadFolder(browser, "files");
+
+ // Loop through tabs
+ for (let i = 1; i < 3; i++) {
+ browser
+ .click(`#input-tabs li:nth-of-type(${i})`)
+ .waitForElementVisible(`#input-tabs li:nth-of-type(${i}).active-input-tab`);
+
+ browser
+ .waitForElementVisible("#input-text .cm-file-details")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-toggle-shown")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-thumbnail")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-name")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-size")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-type")
+ .waitForElementVisible("#input-text .cm-file-details .file-details-loaded");
+
+ browser.getText("#input-text .cm-file-details .file-details-name", function(result) {
+ switch (result.value) {
+ case "TowelDay.jpeg":
+ browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("TowelDay.jpeg");
+ browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("61,379 bytes");
+ browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg");
+ browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%");
+ break;
+ case "Hitchhikers_Guide.jpeg":
+ browser.expect.element("#input-text .cm-file-details .file-details-name").text.that.equals("Hitchhikers_Guide.jpeg");
+ browser.expect.element("#input-text .cm-file-details .file-details-size").text.that.equals("36,595 bytes");
+ browser.expect.element("#input-text .cm-file-details .file-details-type").text.that.equals("image/jpeg");
+ browser.expect.element("#input-text .cm-file-details .file-details-loaded").text.that.equals("100%");
+ break;
+ default:
+ break;
+ }
+ });
+ }
+ },
+
+ "Loading from URL": browser => {
+ /* Complex deep link populates the input correctly (encoding, eol, input) */
+ browser
+ .urlHash("recipe=To_Base64('A-Za-z0-9%2B/%3D')&input=VGhlIHNoaXBzIGh1bmcgaW4gdGhlIHNreSBpbiBtdWNoIHRoZSBzYW1lIHdheSB0aGF0IGJyaWNrcyBkb24ndC4M&ienc=21866&oenc=1201&ieol=%0C&oeol=%E2%80%A9")
+ .waitForElementVisible("#rec-list li.operation");
+
+ browser.expect.element(`#input-text .cm-content`).to.have.property("textContent").match(/^.{65}$/);
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("66");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+
+ browser.expect.element("#input-text .chr-enc-value").text.that.equals("KOI8-U Ukrainian Cyrillic");
+ browser.expect.element("#output-text .chr-enc-value").text.that.equals("UTF-16BE");
+
+ browser.expect.element("#input-text .eol-value").text.that.equals("FF");
+ browser.expect.element("#output-text .eol-value").text.that.equals("PS");
+
+ utils.bake(browser);
+
+ browser.expect.element(`#output-text .cm-content`).to.have.property("textContent").match(/^.{44}$/);
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("44");
+ browser.expect.element("#output-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+ },
+
+ "Replace input with output": browser => {
+ /* Input is correctly populated */
+ utils.loadRecipe(browser, "XOR", "The ships hung in the sky in much the same way that bricks don't.", [{ "option": "Hex", "string": "65" }, "Standard", false]);
+ utils.setChrEnc(browser, "input", "UTF-32LE");
+ utils.setChrEnc(browser, "output", "UTF-7");
+ utils.setEOLSeq(browser, "input", "CRLF");
+ utils.setEOLSeq(browser, "output", "LS");
+
+ browser
+ .sendKeys("#input-text .cm-content", browser.Keys.RETURN)
+ .expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+ utils.bake(browser);
+
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("67");
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("2");
+ browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-32LE");
+ browser.expect.element("#input-text .eol-value").text.that.equals("CRLF");
+ browser.expect.element("#output-text .cm-status-bar .stats-length-value").text.to.equal("268");
+
+ browser
+ .click("#switch")
+ .waitForElementVisible("#stale-indicator");
+
+ browser.expect.element("#input-text .cm-status-bar .stats-length-value").text.to.equal("268");
+
+ /* Special characters, encodings and line endings all as expected */
+ browser.expect.element("#input-text .cm-status-bar .stats-lines-value").text.to.equal("1");
+ browser.expect.element("#input-text .chr-enc-value").text.that.equals("UTF-7");
+ browser.expect.element("#input-text .eol-value").text.that.equals("LS");
+ browser.expect.element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(1)").text.to.equal("␍");
+ browser.expect.element("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(49)").text.to.equal("␑");
+ browser.waitForElementNotPresent("#input-text .cm-line:nth-of-type(1) .cm-specialChar:nth-of-type(50)");
+ },
+
+
+ after: browser => {
+ browser.end();
+ }
+};
diff --git a/tests/browser/ops.js b/tests/browser/02_ops.js
similarity index 57%
rename from tests/browser/ops.js
rename to tests/browser/02_ops.js
index 73777c0b..e2c8a219 100644
--- a/tests/browser/ops.js
+++ b/tests/browser/02_ops.js
@@ -1,11 +1,20 @@
/**
- * Tests for operations to ensure they output something sensible where expected
+ * Tests for operations.
+ * The primary purpose for these test is to ensure that the operations
+ * output something vaguely expected (i.e. they aren't completely broken
+ * after a dependency update or changes to the UI), rather than to confirm
+ * that this output is actually accurate. Accuracy of output and testing
+ * of edge cases should be carried out in the operations test suite found
+ * in /tests/operations as this is much faster and easier to configure
+ * than the UI tests found here.
*
* @author n1474335 [n1474335@gmail.com]
* @copyright Crown Copyright 2021
* @license Apache-2.0
*/
+const utils = require("./browserUtils.js");
+
module.exports = {
before: browser => {
browser
@@ -29,36 +38,40 @@ module.exports = {
testOp(browser, "Adler-32 Checksum", "test input", "16160411");
testOp(browser, "Affine Cipher Decode", "test input", "rcqr glnsr", [1, 2]);
testOp(browser, "Affine Cipher Encode", "test input", "njln rbfpn", [2, 1]);
+ testOp(browser, "AMF Decode", "\u000A\u0013\u0001\u0003a\u0006\u0009test", /"\$value": "test"/);
+ testOp(browser, "AMF Encode", '{"a": "test"}', "\u000A\u0013\u0001\u0003a\u0006\u0009test");
testOp(browser, "Analyse hash", "0123456789abcdef", /CRC-64/);
testOp(browser, "Atbash Cipher", "test input", "gvhg rmkfg");
// testOp(browser, "Avro to JSON", "test input", "test_output");
- // testOp(browser, "BLAKE2b", "test input", "test_output");
- // testOp(browser, "BLAKE2s", "test input", "test_output");
- // testOp(browser, "BSON deserialise", "test input", "test_output");
- // testOp(browser, "BSON serialise", "test input", "test_output");
+ testOp(browser, "BLAKE2b", "test input", "33ebdc8f38177f3f3f334eeb117a84e11f061bbca4db6b8923e5cec85103f59f415551a5d5a933fdb6305dc7bf84671c2540b463dbfa08ee1895cfaa5bd780b5", ["512", "Hex", { "option": "UTF8", "string": "pass" }]);
+ testOp(browser, "BLAKE2s", "test input", "defe73d61dfa6e5807e4f9643e159a09ccda6be3c26dcd65f8a9bb38bfc973a7", ["256", "Hex", { "option": "UTF8", "string": "pass" }]);
+ testOp(browser, "BSON deserialise", "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000", '{\u000A "a": "test"\u000A}');
+ testOp(browser, "BSON serialise", '{"a":"test"}', "\u0011\u0000\u0000\u0000\u0002a\u0000\u0005\u0000\u0000\u0000test\u0000\u0000");
// testOp(browser, "Bacon Cipher Decode", "test input", "test_output");
// testOp(browser, "Bacon Cipher Encode", "test input", "test_output");
- // testOp(browser, "Bcrypt", "test input", "test_output");
- // testOp(browser, "Bcrypt compare", "test input", "test_output");
- // testOp(browser, "Bcrypt parse", "test input", "test_output");
- // testOp(browser, "Bifid Cipher Decode", "test input", "test_output");
- // testOp(browser, "Bifid Cipher Encode", "test input", "test_output");
- // testOp(browser, "Bit shift left", "test input", "test_output");
- // testOp(browser, "Bit shift right", "test input", "test_output");
+ testOp(browser, "Bcrypt", "test input", /^\$2a\$06\$.{53}$/, [6]);
+ testOp(browser, "Bcrypt compare", "test input", "Match: test input", ["$2a$05$FCfBSVX7OeRkK.9kQVFCiOYu9XtwtIbePqUiroD1lkASW9q5QClzG"]);
+ testOp(browser, "Bcrypt parse", "$2a$05$kXWtAIGB/R8VEzInoM5ocOTBtyc0m2YTIwFiBU/0XoW032f9QrkWW", /Rounds: 5/);
+ testOp(browser, "Bifid Cipher Decode", "qblb tfovy", "test input", ["pass"]);
+ testOp(browser, "Bifid Cipher Encode", "test input", "qblb tfovy", ["pass"]);
+ testOp(browser, "Bit shift left", "test input", "\u00E8\u00CA\u00E6\u00E8@\u00D2\u00DC\u00E0\u00EA\u00E8");
+ testOp(browser, "Bit shift right", "test input", ":29:\u0010478::");
testOp(browser, "Blowfish Decrypt", "10884e15427dd84ec35204e9c8e921ae", "test_output", [{"option": "Hex", "string": "1234567801234567"}, {"option": "Hex", "string": "0011223344556677"}, "CBC", "Hex", "Raw"]);
testOp(browser, "Blowfish Encrypt", "test input", "f0fadbd1d90d774f714248cf26b96410", [{"option": "Hex", "string": "1234567801234567"}, {"option": "Hex", "string": "0011223344556677"}, "CBC", "Raw", "Hex"]);
testOp(browser, ["From Hex", "Blur Image", "To Base64"], Images.PNG_HEX, Images.PNG_BLUR_B64);
- // testOp(browser, "Bombe", "test input", "test_output");
+ testOpHtml(browser, "Bombe", "XTSYN WAEUG EZALY NRQIM AMLZX MFUOD AWXLY LZCUZ QOQBQ JLCPK NDDRW F", "table tr:last-child td:first-child", "ECG", ["3-rotor", "LEYJVCNIXWPBQMDRTAKZGFUHOS", "BDFHJLCPRTXVZNYEIWGAKMUSQO
} opName - name of operation to be tested, array for multiple ops
* @param {string} input - input text for test
- * @param {Array|Array>} args - aarguments, nested if multiple ops
+ * @param {Array|Array>} args - arguments, nested if multiple ops
*/
function bakeOp(browser, opName, input, args=[]) {
- let recipeConfig;
-
- if (typeof(opName) === "string") {
- recipeConfig = JSON.stringify([{
- "op": opName,
- "args": args
- }]);
- } else if (opName instanceof Array) {
- recipeConfig = JSON.stringify(
- opName.map((op, i) => {
- return {
- op: op,
- args: args.length ? args[i] : []
- };
- })
- );
- } else {
- throw new Error("Invalid operation type. Must be string or array of strings. Received: " + typeof(opName));
- }
-
- browser
- .useCss()
- .click("#clr-recipe")
- .click("#clr-io")
- .waitForElementNotPresent("#rec-list li.operation")
- .expect.element("#input-text").to.have.property("value").that.equals("");
-
- browser
- .perform(function() {
- console.log(`Current test: ${opName}`);
- })
- .urlHash("recipe=" + recipeConfig)
- .setValue("#input-text", input)
- .waitForElementPresent("#rec-list li.operation")
- .expect.element("#input-text").to.have.property("value").that.equals(input);
-
- browser
- .waitForElementVisible("#stale-indicator", 5000)
- .pause(100)
- .click("#bake")
- .pause(100)
- .waitForElementPresent("#stale-indicator.hidden", 5000)
- .waitForElementNotVisible("#output-loader", 5000);
+ browser.perform(function() {
+ console.log(`Current test: ${opName}`);
+ });
+ utils.loadRecipe(browser, opName, input, args);
+ browser.waitForElementVisible("#stale-indicator", 5000);
+ utils.bake(browser);
}
/** @function
@@ -440,18 +429,12 @@ function bakeOp(browser, opName, input, args=[]) {
* @param {Array|Array>} args - arguments, nested if multiple ops
*/
function testOp(browser, opName, input, output, args=[]) {
-
bakeOp(browser, opName, input, args);
-
- if (typeof output === "string") {
- browser.expect.element("#output-text").to.have.property("value").that.equals(output);
- } else if (output instanceof RegExp) {
- browser.expect.element("#output-text").to.have.property("value").that.matches(output);
- }
+ utils.expectOutput(browser, output);
}
/** @function
- * Clears the current recipe and tests a new operation.
+ * Clears the current recipe and tests a new operation with HTML output.
*
* @param {Browser} browser - Nightwatch client
* @param {string|Array} opName - name of operation to be tested array for multiple ops
@@ -469,3 +452,51 @@ function testOpHtml(browser, opName, input, cssSelector, output, args=[]) {
browser.expect.element("#output-html " + cssSelector).text.that.matches(output);
}
}
+
+/** @function
+ * Clears the current recipe and tests a new Image-based operation.
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string|Array} opName - name of operation to be tested array for multiple ops
+ * @param {string} filename - filename of image file from samples directory
+ * @param {Array|Array>} args - arguments, nested if multiple ops
+ */
+function testOpImage(browser, opName, filename, args) {
+ browser.perform(function() {
+ console.log(`Current test: ${opName}`);
+ });
+ utils.loadRecipe(browser, opName, "", args);
+ utils.uploadFile(browser, filename);
+ browser.waitForElementVisible("#stale-indicator", 5000);
+ utils.bake(browser);
+
+ browser
+ .waitForElementVisible("#output-html img")
+ .expect.element("#output-html img").to.have.css("width").which.matches(/^[^0]\d*px/);
+}
+
+/** @function
+ * Clears the current recipe and tests a new File-based operation.
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string|Array} opName - name of operation to be tested array for multiple ops
+ * @param {string} filename - filename of file from samples directory
+ * @param {string} cssSelector - CSS selector for HTML output
+ * @param {string} output - expected output
+ * @param {Array|Array>} args - arguments, nested if multiple ops
+ */
+function testOpFile(browser, opName, filename, cssSelector, output, args) {
+ browser.perform(function() {
+ console.log(`Current test: ${opName}`);
+ });
+ utils.loadRecipe(browser, opName, "", args);
+ utils.uploadFile(browser, filename);
+ browser.pause(100).waitForElementVisible("#stale-indicator", 5000);
+ utils.bake(browser);
+
+ if (typeof output === "string") {
+ browser.expect.element("#output-html " + cssSelector).text.that.equals(output);
+ } else if (output instanceof RegExp) {
+ browser.expect.element("#output-html " + cssSelector).text.that.matches(output);
+ }
+}
diff --git a/tests/browser/browserUtils.js b/tests/browser/browserUtils.js
new file mode 100644
index 00000000..b73dca91
--- /dev/null
+++ b/tests/browser/browserUtils.js
@@ -0,0 +1,247 @@
+/**
+ * Utility functions for browser tests.
+ *
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2023
+ * @license Apache-2.0
+ */
+
+/** @function
+ * Clears the recipe and input
+ *
+ * @param {Browser} browser - Nightwatch client
+ */
+function clear(browser) {
+ browser
+ .useCss()
+ .click("#clr-recipe")
+ .click("#clr-io")
+ .waitForElementNotPresent("#rec-list li.operation")
+ .expect.element("#input-text .cm-content").text.that.equals("");
+}
+
+/** @function
+ * Sets the input to the desired string
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string} input - The text to populate the input with
+ * @param {boolean} [type=true] - Whether to type the characters in by using sendKeys,
+ * or to set the value of the editor directly (useful for special characters)
+ */
+function setInput(browser, input, type=true) {
+ clear(browser);
+ if (type) {
+ browser
+ .useCss()
+ .sendKeys("#input-text .cm-content", input)
+ .pause(100);
+ } else {
+ browser.execute(text => {
+ window.app.setInput(text);
+ }, [input]);
+ }
+}
+
+/** @function
+ * Triggers a bake
+ *
+ * @param {Browser} browser - Nightwatch client
+ */
+function bake(browser) {
+ browser
+ .click("#bake")
+ .waitForElementNotVisible("#stale-indicator", 5000)
+ .waitForElementNotVisible("#output-loader", 5000);
+}
+
+/** @function
+ * Sets the character encoding in the input or output
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string} io - Either "input" or "output"
+ * @param {string} enc - The encoding to be set
+ */
+function setChrEnc(browser, io, enc) {
+ io = `#${io}-text`;
+ browser
+ .useCss()
+ .click(io + " .chr-enc-value")
+ .waitForElementVisible(io + " .chr-enc-select .cm-status-bar-select-scroll")
+ .click("link text", enc)
+ .waitForElementNotVisible(io + " .chr-enc-select .cm-status-bar-select-scroll")
+ .expect.element(io + " .chr-enc-value").text.that.equals(enc);
+}
+
+/** @function
+ * Sets the end of line sequence in the input or output
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string} io - Either "input" or "output"
+ * @param {string} eol - The sequence to set
+ */
+function setEOLSeq(browser, io, eol) {
+ io = `#${io}-text`;
+ browser
+ .useCss()
+ .click(io + " .eol-value")
+ .waitForElementVisible(io + " .eol-select .cm-status-bar-select-content")
+ .click(`${io} .cm-status-bar-select-content a[data-val=${eol}]`)
+ .waitForElementNotVisible(io + " .eol-select .cm-status-bar-select-content")
+ .expect.element(io + " .eol-value").text.that.equals(eol);
+}
+
+/** @function
+ * Copies whatever is currently selected
+ *
+ * @param {Browser} browser - Nightwatch client
+ */
+function copy(browser) {
+ browser.perform(function() {
+ const actions = this.actions({async: true});
+
+ // Ctrl + Ins used as this works on Windows, Linux and Mac
+ return actions
+ .keyDown(browser.Keys.CONTROL)
+ .keyDown(browser.Keys.INSERT)
+ .keyUp(browser.Keys.INSERT)
+ .keyUp(browser.Keys.CONTROL);
+ });
+}
+
+/** @function
+ * Pastes into the target element
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string} el - Target element selector
+ */
+function paste(browser, el) {
+ browser
+ .click(el)
+ .perform(function() {
+ const actions = this.actions({async: true});
+
+ // Shift + Ins used as this works on Windows, Linux and Mac
+ return actions
+ .keyDown(browser.Keys.SHIFT)
+ .keyDown(browser.Keys.INSERT)
+ .keyUp(browser.Keys.INSERT)
+ .keyUp(browser.Keys.SHIFT);
+ })
+ .pause(100);
+}
+
+/** @function
+ * Loads a recipe and input
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string|Array} opName - name of operation to be loaded, array for multiple ops
+ * @param {string} input - input text for test
+ * @param {Array|Array>} args - arguments, nested if multiple ops
+ */
+function loadRecipe(browser, opName, input, args) {
+ let recipeConfig;
+
+ if (typeof(opName) === "string") {
+ recipeConfig = JSON.stringify([{
+ "op": opName,
+ "args": args
+ }]);
+ } else if (opName instanceof Array) {
+ recipeConfig = JSON.stringify(
+ opName.map((op, i) => {
+ return {
+ op: op,
+ args: args.length ? args[i] : []
+ };
+ })
+ );
+ } else {
+ throw new Error("Invalid operation type. Must be string or array of strings. Received: " + typeof(opName));
+ }
+
+ clear(browser);
+ setInput(browser, input, false);
+ browser
+ .urlHash("recipe=" + recipeConfig)
+ .waitForElementPresent("#rec-list li.operation");
+}
+
+/** @function
+ * Tests whether the output matches a given value
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string|RegExp} expected - The expected output value
+ */
+function expectOutput(browser, expected) {
+ browser.execute(expected => {
+ const output = window.app.manager.output.outputEditorView.state.doc.toString();
+ if (expected instanceof RegExp) {
+ return expected.test(output);
+ } else {
+ return expected === output;
+ }
+ }, [expected]);
+}
+
+/** @function
+ * Uploads a file using the #open-file input
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string} filename - A path to a file in the samples directory
+ */
+function uploadFile(browser, filename) {
+ const filepath = require("path").resolve(__dirname + "/../samples/" + filename);
+
+ // The file input cannot be interacted with by nightwatch while it is hidden,
+ // so we temporarily expose it for the purposes of this test.
+ browser.execute(() => {
+ document.getElementById("open-file").style.display = "block";
+ });
+ browser
+ .pause(100)
+ .setValue("#open-file", filepath)
+ .pause(100);
+ browser.execute(() => {
+ document.getElementById("open-file").style.display = "none";
+ });
+ browser.waitForElementVisible("#input-text .cm-file-details");
+}
+
+/** @function
+ * Uploads a folder using the #open-folder input
+ *
+ * @param {Browser} browser - Nightwatch client
+ * @param {string} foldername - A path to a folder in the samples directory
+ */
+function uploadFolder(browser, foldername) {
+ const folderpath = require("path").resolve(__dirname + "/../samples/" + foldername);
+
+ // The folder input cannot be interacted with by nightwatch while it is hidden,
+ // so we temporarily expose it for the purposes of this test.
+ browser.execute(() => {
+ document.getElementById("open-folder").style.display = "block";
+ });
+ browser
+ .pause(100)
+ .setValue("#open-folder", folderpath)
+ .pause(500);
+ browser.execute(() => {
+ document.getElementById("open-folder").style.display = "none";
+ });
+ browser.waitForElementVisible("#input-text .cm-file-details");
+}
+
+
+module.exports = {
+ clear: clear,
+ setInput: setInput,
+ bake: bake,
+ setChrEnc: setChrEnc,
+ setEOLSeq: setEOLSeq,
+ copy: copy,
+ paste: paste,
+ loadRecipe: loadRecipe,
+ expectOutput: expectOutput,
+ uploadFile: uploadFile,
+ uploadFolder: uploadFolder
+};
diff --git a/tests/lib/TestRegister.mjs b/tests/lib/TestRegister.mjs
index 8b687fcc..ea7b934d 100644
--- a/tests/lib/TestRegister.mjs
+++ b/tests/lib/TestRegister.mjs
@@ -74,9 +74,7 @@ class TestRegister {
const result = await chef.bake(
test.input,
test.recipeConfig,
- {},
- 0,
- false
+ { returnType: "string" }
);
const ret = {
diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs
index 7a3361f2..1aa12d19 100644
--- a/tests/operations/index.mjs
+++ b/tests/operations/index.mjs
@@ -130,6 +130,9 @@ import "./tests/FletcherChecksum.mjs";
import "./tests/CMAC.mjs";
import "./tests/AESKeyWrap.mjs";
import "./tests/Rabbit.mjs";
+import "./tests/LevenshteinDistance.mjs";
+import "./tests/SwapCase.mjs";
+import "./tests/HKDF.mjs";
// Cannot test operations that use the File type yet
// import "./tests/SplitColourChannels.mjs";
diff --git a/tests/operations/tests/HKDF.mjs b/tests/operations/tests/HKDF.mjs
new file mode 100644
index 00000000..6fca5891
--- /dev/null
+++ b/tests/operations/tests/HKDF.mjs
@@ -0,0 +1,180 @@
+/**
+ * @author mikecat
+ * @copyright Crown Copyright 2023
+ * @license Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+ {
+ "name": "HKDF: RFC5869 Test Case 1",
+ "input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+ "expectedOutput": "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": "000102030405060708090a0b0c"},
+ {"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
+ "SHA256", "with salt", 42,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 2",
+ "input": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
+ "expectedOutput": "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf"},
+ {"option": "Hex", "string": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"},
+ "SHA256", "with salt", 82,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 3",
+ "input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+ "expectedOutput": "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": ""},
+ {"option": "Hex", "string": ""},
+ "SHA256", "with salt", 42,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 4",
+ "input": "0b0b0b0b0b0b0b0b0b0b0b",
+ "expectedOutput": "085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": "000102030405060708090a0b0c"},
+ {"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
+ "SHA1", "with salt", 42,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 5",
+ "input": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
+ "expectedOutput": "0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf"},
+ {"option": "Hex", "string": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"},
+ "SHA1", "with salt", 82,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 6",
+ "input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+ "expectedOutput": "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": ""},
+ {"option": "Hex", "string": ""},
+ "SHA1", "with salt", 42,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 7",
+ "input": "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
+ "expectedOutput": "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": ""},
+ {"option": "Hex", "string": ""},
+ "SHA1", "no salt", 42,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: RFC5869 Test Case 1 with skip extract",
+ "input": "077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5",
+ "expectedOutput": "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": ""},
+ {"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
+ "SHA256", "skip", 42,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "HKDF: too large L",
+ "input": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
+ "expectedOutput": "L too large (maximum length for SHA256 is 8160)",
+ "recipeConfig": [
+ {
+ "op": "From Hex",
+ "args": ["None"],
+ },
+ {
+ "op": "Derive HKDF key",
+ "args": [
+ {"option": "Hex", "string": "000102030405060708090a0b0c"},
+ {"option": "Hex", "string": "f0f1f2f3f4f5f6f7f8f9"},
+ "SHA256", "with salt", 8161,
+ ],
+ },
+ ],
+ },
+]);
diff --git a/tests/operations/tests/LevenshteinDistance.mjs b/tests/operations/tests/LevenshteinDistance.mjs
new file mode 100644
index 00000000..e304165b
--- /dev/null
+++ b/tests/operations/tests/LevenshteinDistance.mjs
@@ -0,0 +1,165 @@
+/**
+ * @author mikecat
+ * @copyright Crown Copyright 2023
+ * @license Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+ {
+ "name": "Levenshtein Distance: Wikipedia example 1",
+ "input": "kitten\nsitting",
+ "expectedOutput": "3",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, 1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: Wikipedia example 2",
+ "input": "saturday\nsunday",
+ "expectedOutput": "3",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, 1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: Wikipedia example 1 with substitution cost 2",
+ "input": "kitten\nsitting",
+ "expectedOutput": "5",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, 1, 2,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: varied costs 1",
+ "input": "kitten\nsitting",
+ "expectedOutput": "230",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 10, 100, 1000,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: varied costs 2",
+ "input": "kitten\nsitting",
+ "expectedOutput": "1020",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1000, 100, 10,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: another delimiter",
+ "input": "kitten sitting",
+ "expectedOutput": "3",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ " ", 1, 1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: too few samples",
+ "input": "kitten",
+ "expectedOutput": "Incorrect number of samples. Check your input and/or delimiter.",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, 1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: too many samples",
+ "input": "kitten\nsitting\nkitchen",
+ "expectedOutput": "Incorrect number of samples. Check your input and/or delimiter.",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, 1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: negative insertion cost",
+ "input": "kitten\nsitting",
+ "expectedOutput": "Negative costs are not allowed.",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", -1, 1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: negative deletion cost",
+ "input": "kitten\nsitting",
+ "expectedOutput": "Negative costs are not allowed.",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, -1, 1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: negative substitution cost",
+ "input": "kitten\nsitting",
+ "expectedOutput": "Negative costs are not allowed.",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 1, 1, -1,
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Levenshtein Distance: cost zero",
+ "input": "kitten\nsitting",
+ "expectedOutput": "0",
+ "recipeConfig": [
+ {
+ "op": "Levenshtein Distance",
+ "args": [
+ "\\n", 0, 0, 0,
+ ],
+ },
+ ],
+ },
+]);
diff --git a/tests/operations/tests/SwapCase.mjs b/tests/operations/tests/SwapCase.mjs
new file mode 100644
index 00000000..2506fc44
--- /dev/null
+++ b/tests/operations/tests/SwapCase.mjs
@@ -0,0 +1,33 @@
+/**
+ * @author mikecat
+ * @copyright Crown Copyright 2023
+ * @license Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+ {
+ "name": "Swap Case: basic example",
+ "input": "Hello, World!",
+ "expectedOutput": "hELLO, wORLD!",
+ "recipeConfig": [
+ {
+ "op": "Swap case",
+ "args": [
+ ],
+ },
+ ],
+ },
+ {
+ "name": "Swap Case: empty input",
+ "input": "",
+ "expectedOutput": "",
+ "recipeConfig": [
+ {
+ "op": "Swap case",
+ "args": [
+ ],
+ },
+ ],
+ },
+]);
diff --git a/tests/samples/files/Hitchhikers_Guide.jpeg b/tests/samples/files/Hitchhikers_Guide.jpeg
new file mode 100644
index 00000000..206f7754
Binary files /dev/null and b/tests/samples/files/Hitchhikers_Guide.jpeg differ
diff --git a/tests/samples/files/TowelDay.jpeg b/tests/samples/files/TowelDay.jpeg
new file mode 100644
index 00000000..52f03997
Binary files /dev/null and b/tests/samples/files/TowelDay.jpeg differ
diff --git a/tests/samples/files/mp3example.mp3 b/tests/samples/files/mp3example.mp3
new file mode 100644
index 00000000..0379b4d7
Binary files /dev/null and b/tests/samples/files/mp3example.mp3 differ