From 509c3ef81aef94b17c01e631f4525bda085beeb5 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Tue, 19 Jul 2022 14:14:52 +0200 Subject: [PATCH 01/27] Update dependencies to jupyterlab>=4, fix menu entries and fix mathjax error --- .yarnrc.yml | 2 + .../server_extensions/formgrader/handlers.py | 1 - .../templates/formgrade/index.html.j2 | 2 +- .../tests/test_formgrader.spec.ts | 2 +- package.json | 24 +- src/assignment_list/index.ts | 2 +- src/course_list/index.ts | 2 +- src/create_assignment/index.ts | 2 +- src/formgrader/index.ts | 3 +- src/validate_assignment/index.ts | 2 +- yarn.lock | 16086 ++++++++-------- 11 files changed, 8113 insertions(+), 8015 deletions(-) create mode 100644 .yarnrc.yml diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 000000000..216c4e5c2 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,2 @@ +nodeLinker: pnpm + diff --git a/nbgrader/server_extensions/formgrader/handlers.py b/nbgrader/server_extensions/formgrader/handlers.py index 0fa8a9404..e8e6f5f41 100644 --- a/nbgrader/server_extensions/formgrader/handlers.py +++ b/nbgrader/server_extensions/formgrader/handlers.py @@ -108,7 +108,6 @@ def get(self, submission_id): 'index': ix, 'total': len(indices), 'base_url': self.base_url, - 'my_mathjax_url': self.mathjax_url if self.settings['is_jlab'] else self.base_url + '/' + self.mathjax_url, 'student': student_id, 'last_name': submission.student.last_name, 'last_name': submission.student.last_name, diff --git a/nbgrader/server_extensions/formgrader/templates/formgrade/index.html.j2 b/nbgrader/server_extensions/formgrader/templates/formgrade/index.html.j2 index 131ce2706..ec52a596a 100644 --- a/nbgrader/server_extensions/formgrader/templates/formgrade/index.html.j2 +++ b/nbgrader/server_extensions/formgrader/templates/formgrade/index.html.j2 @@ -15,7 +15,7 @@ {% endfor %} -{{ mathjax( resources.my_mathjax_url + '?config=TeX-AMS-MML_HTMLorMML-full') }} +{{ mathjax() }} diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts index 8c12951ee..badb4bb45 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts +++ b/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts @@ -193,7 +193,7 @@ const click_link = async (iframe:Frame, text:string) => { /* * Test opening formgrader tab from menu */ -test('Open assignment list tab from menu', async({ +test('Open formgrader tab from menu', async({ page }) => { diff --git a/package.json b/package.json index 86b452105..d905c68c1 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,21 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyterlab/application": "^3.1.0", - "@jupyterlab/apputils": "^3.1.0", - "@jupyterlab/cells": "^3.3.3", - "@jupyterlab/coreutils": "^5.1.0", - "@jupyterlab/launcher": "^3.4.2", - "@jupyterlab/notebook": "^3.3.3", - "@jupyterlab/services": "^6.1.0", - "@jupyterlab/settingregistry": "^3.1.0" + "@jupyter-notebook/application": "^7.0.0-alpha.5", + "@jupyterlab/application": "^4.0.0-alpha.11", + "@jupyterlab/apputils": "^4.0.0-alpha.11", + "@jupyterlab/cells": "^4.0.0-alpha.11", + "@jupyterlab/coreutils": "^6.0.0-alpha.11", + "@jupyterlab/launcher": "^4.0.0-alpha.11", + "@jupyterlab/notebook": "^4.0.0-alpha.11", + "@jupyterlab/services": "^7.0.0-alpha.11", + "@jupyterlab/settingregistry": "^4.0.0-alpha.11" }, "devDependencies": { - "@jupyterlab/builder": "^3.3.3", - "@jupyterlab/galata": "^4.2.4", + "@jupyterlab/builder": "^4.0.0-alpha.11", + "@jupyterlab/galata": "^5.0.0-alpha.11", "@playwright/test": "^1.21.1", + "@types/codemirror": "^5.60.5", "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", "bower": "*", @@ -95,4 +97,4 @@ "outputDir": "nbgrader/labextension", "schemaDir": "schema" } -} \ No newline at end of file +} diff --git a/src/assignment_list/index.ts b/src/assignment_list/index.ts index 1a8ff4268..e36fa63cd 100644 --- a/src/assignment_list/index.ts +++ b/src/assignment_list/index.ts @@ -25,7 +25,7 @@ import { } from './assignmentlist'; -const PLUGIN_ID = 'nbgrader/assignment-list'; +const PLUGIN_ID = 'nbgrader:assignment-list'; const COMMAND_NAME = "nbgrader:open-assignment-list"; diff --git a/src/course_list/index.ts b/src/course_list/index.ts index b1b3006db..f554a3c45 100644 --- a/src/course_list/index.ts +++ b/src/course_list/index.ts @@ -11,7 +11,7 @@ import { Widget } from '@lumino/widgets'; import { requestAPI, CourseList } from './courselist'; -const PLUGIN_ID = "nbgrader/course-list"; +const PLUGIN_ID = "nbgrader:course-list"; const COMMAND_NAME = "nbgrader:open-course-list"; class CourseListWidget extends Widget { diff --git a/src/create_assignment/index.ts b/src/create_assignment/index.ts index 245b44bc1..ac70e7e04 100644 --- a/src/create_assignment/index.ts +++ b/src/create_assignment/index.ts @@ -16,7 +16,7 @@ import { CreateAssignmentWidget } from './create_assignment_extension'; -const PLUGIN_ID = "nbgrader/create-assignment" +const PLUGIN_ID = "nbgrader:create-assignment" /** * Initialization data for the create_assignment extension. diff --git a/src/formgrader/index.ts b/src/formgrader/index.ts index a21994584..b5efbf04a 100644 --- a/src/formgrader/index.ts +++ b/src/formgrader/index.ts @@ -15,7 +15,8 @@ import { IFrame } from '@jupyterlab/apputils'; -const PLUGIN_ID = "nbgrader/formgrader" + +const PLUGIN_ID = "nbgrader:formgrader" const COMMAND_NAME = "nbgrader:open-formgrader" class FormgraderWidget extends IFrame { diff --git a/src/validate_assignment/index.ts b/src/validate_assignment/index.ts index 51afa656a..5032d1339 100644 --- a/src/validate_assignment/index.ts +++ b/src/validate_assignment/index.ts @@ -25,7 +25,7 @@ import { showNbGraderDialog, validate } from '../common/validate'; var nbgrader_version = "0.8.4"; // TODO: hardcoded value -const PLUGIN_ID = "nbgrader/validate-assignment" +const PLUGIN_ID = "nbgrader:validate-assignment" class ValidateButton extends ToolbarButton { private _buttonCallback = this.newButtonCallback(); diff --git a/yarn.lock b/yarn.lock index 95809c055..b79c70f0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,7996 +1,8090 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@^7.1.2": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" - integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== - dependencies: - regenerator-runtime "^0.13.4" - -"@blueprintjs/colors@^4.0.0-alpha.3": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@blueprintjs/colors/-/colors-4.1.3.tgz#7e0a32a086bdc68ea51df0dda1f94913dbd874c1" - integrity sha512-ANRQZT5h9+zC8B/y0S9B+SqEpicL0XRT4drAhiPFHBrOStRZWzOh3bPrwNSPqr7tdShxYtMyxbH+fkHMetZaxg== - -"@blueprintjs/core@^3.36.0", "@blueprintjs/core@^3.54.0": - version "3.54.0" - resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.54.0.tgz#7269f34eccdf0d2874377c5ad973ca2a31562221" - integrity sha512-u2c1s6MNn0ocxhnC6CuiG5g3KV6b4cKUvSobznepA9SC3/AL1s3XOvT7DLWoHRv2B/vBOHFYEDzLw2/vlcGGZg== - dependencies: - "@blueprintjs/colors" "^4.0.0-alpha.3" - "@blueprintjs/icons" "^3.33.0" - "@juggle/resize-observer" "^3.3.1" - "@types/dom4" "^2.0.1" - classnames "^2.2" - dom4 "^2.1.5" - normalize.css "^8.0.1" - popper.js "^1.16.1" - react-lifecycles-compat "^3.0.4" - react-popper "^1.3.7" - react-transition-group "^2.9.0" - tslib "~2.3.1" - -"@blueprintjs/icons@^3.33.0": - version "3.33.0" - resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.33.0.tgz#4dacdb7731abdf08d1ab240f3a23a185df60918b" - integrity sha512-Q6qoSDIm0kRYQZISm59UUcDCpV3oeHulkLuh3bSlw0HhcSjvEQh2PSYbtaifM60Q4aK4PCd6bwJHg7lvF1x5fQ== - dependencies: - classnames "^2.2" - tslib "~2.3.1" - -"@blueprintjs/select@^3.15.0": - version "3.19.1" - resolved "https://registry.yarnpkg.com/@blueprintjs/select/-/select-3.19.1.tgz#b5e8baa6f182a0647651a57fde8d1d97eaa1e997" - integrity sha512-8UJIZMaWXRMQHr14wbmzJc/CklcSKxOU5JUux0xXKQz/hDW/g1a650tlwJmnxufvRdShbGinlVfHupCs0EL6sw== - dependencies: - "@blueprintjs/core" "^3.54.0" - classnames "^2.2" - tslib "~2.3.1" - -"@csstools/selector-specificity@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz#b6b8d81780b9a9f6459f4bfe9226ac6aefaefe87" - integrity sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@fortawesome/fontawesome-free@^5.12.0": - version "5.15.4" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" - integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== - -"@gar/promisify@^1.0.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@hypnosphi/create-react-context@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@hypnosphi/create-react-context/-/create-react-context-0.3.1.tgz#f8bfebdc7665f5d426cba3753e0e9c7d3154d7c6" - integrity sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A== - dependencies: - gud "^1.0.0" - warning "^4.0.3" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.7": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@juggle/resize-observer@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0" - integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw== - -"@jupyterlab/application@^3.1.0", "@jupyterlab/application@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/application/-/application-3.4.3.tgz#acaecafbce1be71776ceee11203b9fb0a02e27d8" - integrity sha512-JZy/4yB23N9o0gJFL8L219N7cWhUgulBECa+esN8K/i3TVoG0m/obacLBJrmwdgmQKAgyJ2Vfo1tyhW3UHvlFw== - dependencies: - "@fortawesome/fontawesome-free" "^5.12.0" - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/docregistry" "^3.4.3" - "@jupyterlab/rendermime" "^3.4.3" - "@jupyterlab/rendermime-interfaces" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/statedb" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/application" "^1.27.0" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/messaging" "^1.10.0" - "@lumino/polling" "^1.9.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - -"@jupyterlab/apputils@^3.1.0", "@jupyterlab/apputils@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/apputils/-/apputils-3.4.3.tgz#ad69a437c4b07a5df62e9f7f33075850f5a2ca46" - integrity sha512-zpMnYVxXiOJSYHrrpfptmlmIzMXB/slmLh5Fv5gG6QAaBoMBHq11cVZWUiWoXt5r6hYEco8jIG7iMN8/MCsWYQ== - dependencies: - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/settingregistry" "^3.4.3" - "@jupyterlab/statedb" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/domutils" "^1.8.0" - "@lumino/messaging" "^1.10.0" - "@lumino/polling" "^1.9.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.30.0" - "@types/react" "^17.0.0" - react "^17.0.1" - react-dom "^17.0.1" - sanitize-html "~2.5.3" - url "^0.11.0" - -"@jupyterlab/attachments@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/attachments/-/attachments-3.4.3.tgz#a958bb529c3f606694d0b60211b7b8b882a1ebf7" - integrity sha512-/Gwi00nwC294iUUM5yFu3RkN0Ds5aJV0w2j0b+FLZsJONy2BYfRSgYYAnm67483vuVu7zZU5umPS1UWLPXIMbg== - dependencies: - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/rendermime" "^3.4.3" - "@jupyterlab/rendermime-interfaces" "^3.4.3" - "@lumino/disposable" "^1.10.0" - "@lumino/signaling" "^1.10.0" - -"@jupyterlab/builder@^3.3.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/builder/-/builder-3.4.3.tgz#060596148fb248e27526a7f7519836229b2010db" - integrity sha512-g6aSUyUOunN9vS5+eS1p+9w5gcmKqDy3mvchMQSrMqyhmt0cHQHO+eMQNbCs51IG1jTYl1e4+vGau8ce+JtLZg== - dependencies: - "@jupyterlab/buildutils" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/application" "^1.27.0" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/domutils" "^1.8.0" - "@lumino/dragdrop" "^1.13.0" - "@lumino/messaging" "^1.10.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.30.0" - ajv "^6.12.3" - commander "~6.0.0" - css-loader "^5.0.1" - duplicate-package-checker-webpack-plugin "^3.0.0" - file-loader "~6.0.0" - fs-extra "^9.0.1" - glob "~7.1.6" - license-webpack-plugin "^2.3.14" - mini-css-extract-plugin "~1.3.2" - path-browserify "^1.0.0" - process "^0.11.10" - raw-loader "~4.0.0" - style-loader "~2.0.0" - supports-color "^7.2.0" - svg-url-loader "~6.0.0" - terser-webpack-plugin "^4.1.0" - to-string-loader "^1.1.6" - url-loader "~4.1.0" - webpack "^5.41.1" - webpack-cli "^4.1.0" - webpack-merge "^5.1.2" - worker-loader "^3.0.2" - -"@jupyterlab/buildutils@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/buildutils/-/buildutils-3.4.3.tgz#6057532c6bba5590abb203c51a6a29b1a6a08063" - integrity sha512-M09nIGIAevtQ2VkQiHqU7uvRd8AEHP7G5unLwsDyJvO0WON3oQPApPH1hJn/GwjkuxXQvB8MSx7LDmMKewNrEg== - dependencies: - "@lumino/coreutils" "^1.11.0" - "@yarnpkg/lockfile" "^1.1.0" - child_process "~1.0.2" - commander "~6.0.0" - crypto "~1.0.1" - dependency-graph "^0.9.0" - fs-extra "^9.0.1" - glob "~7.1.6" - inquirer "^7.1.0" - minimatch "~3.0.4" - os "~0.1.1" - package-json "^6.5.0" - prettier "~2.1.1" - process "^0.11.10" - semver "^7.3.2" - sort-package-json "~1.44.0" - typescript "~4.1.3" - verdaccio "^5.1.1" - -"@jupyterlab/cells@^3.3.3", "@jupyterlab/cells@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/cells/-/cells-3.4.3.tgz#67f318d0d142716653fc5fda01b16dae99c89e80" - integrity sha512-ablkAPBd6w0Wxo1gi3VYEKX9HxexGHb7X2xbiglosuiBrng6a/4Ozata9vPiZbjNCmvFmstQF3HcVr5lg/Hv6A== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/attachments" "^3.4.3" - "@jupyterlab/codeeditor" "^3.4.3" - "@jupyterlab/codemirror" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/filebrowser" "^3.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/outputarea" "^3.4.3" - "@jupyterlab/rendermime" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/shared-models" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/domutils" "^1.8.0" - "@lumino/dragdrop" "^1.13.0" - "@lumino/messaging" "^1.10.0" - "@lumino/polling" "^1.9.0" - "@lumino/signaling" "^1.10.0" - "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.30.0" - marked "^4.0.10" - react "^17.0.1" - -"@jupyterlab/codeeditor@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/codeeditor/-/codeeditor-3.4.3.tgz#f69dbd1f25307382b863ecbe9b4f0a5037e264c0" - integrity sha512-xnEMGS6Y6UlPQi+suFCrf7rPPnNbC6hRI+yBgsK82O7MiMjHIti/V1dcjP93xjvTuCZexO8qCtRRLoMtTSELWA== - dependencies: - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/shared-models" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/dragdrop" "^1.13.0" - "@lumino/messaging" "^1.10.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - -"@jupyterlab/codemirror@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/codemirror/-/codemirror-3.4.3.tgz#349421866176143d2503dd600d2a55e77a1ab63a" - integrity sha512-Fe2yP/d6bUFAz4dNILwst4AsWZP0/cZOt+vnqu5VF/f2F/u3XTaaYNMQKnESRnm/eV+ZwkE+tKE7jF9begshuQ== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/codeeditor" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/shared-models" "^3.4.3" - "@jupyterlab/statusbar" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/polling" "^1.9.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - codemirror "~5.61.0" - react "^17.0.1" - y-codemirror "^3.0.1" - -"@jupyterlab/coreutils@^5.1.0", "@jupyterlab/coreutils@^5.4.3": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/coreutils/-/coreutils-5.4.3.tgz#9a9ed66b045a9f7cee2064cb8b29e0bcc759f8c1" - integrity sha512-9X021xXTDVnCSYGXsRsMsxCaoHk28oHC/fUTytc5DRgTcpzOGPBO/mVpgJfyejOdy4HxBbAovJSnkBlPwjm1yA== - dependencies: - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/signaling" "^1.10.0" - minimist "~1.2.0" - moment "^2.24.0" - path-browserify "^1.0.0" - url-parse "~1.5.1" - -"@jupyterlab/docmanager@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/docmanager/-/docmanager-3.4.3.tgz#26e9571a93f1a6a6d7b59f9296499fdcabd998b7" - integrity sha512-l1rVpdbT2Y9KciNy+HN5Ef4YZsbYbWDVwPJhG7kkHDlwY0KXv7fk4NYccK0Q3LhwrJUh/iU3nJUVs2u2jJeIBg== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/docprovider" "^3.4.3" - "@jupyterlab/docregistry" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/statusbar" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/messaging" "^1.10.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - react "^17.0.1" - -"@jupyterlab/docprovider@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/docprovider/-/docprovider-3.4.3.tgz#2e041230424b2dc4dea5b72d90461cea8c4f5687" - integrity sha512-BnBkbFESEBGB9Df60hxtC5MAhHi1suReC4eN2Y1OsVXCbq2OTeTAP5DHeJjFDxBZDY1UQlss1li6+/IPbeXgVw== - dependencies: - "@jupyterlab/shared-models" "^3.4.3" - "@lumino/coreutils" "^1.11.0" - lib0 "^0.2.42" - y-websocket "^1.3.15" - yjs "^13.5.17" - -"@jupyterlab/docregistry@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/docregistry/-/docregistry-3.4.3.tgz#ad24b5312797a2b53ba0d0975123e75c4eb37696" - integrity sha512-A+WXGj9HosbSh/I0XQbXN1Sxt4GbjUDXntQ5DGoeOoLfwLHBTkvgg7lZ+AJJyXTDz4jxCWe5jNWnwPkk5mp90Q== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/codeeditor" "^3.4.3" - "@jupyterlab/codemirror" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/docprovider" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/rendermime" "^3.4.3" - "@jupyterlab/rendermime-interfaces" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/shared-models" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/messaging" "^1.10.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - yjs "^13.5.17" - -"@jupyterlab/filebrowser@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/filebrowser/-/filebrowser-3.4.3.tgz#73d288a3a103d13c83734bd23647d1479bd297ec" - integrity sha512-VlUcEvRAG/eAkxgk90MKKbAYUv3BORxfp9VXUdRm/YOW66ZborF6TNbzjYh9C7L7psXAcpzQ+85p73o25iMDoA== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/docmanager" "^3.4.3" - "@jupyterlab/docregistry" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/statedb" "^3.4.3" - "@jupyterlab/statusbar" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/domutils" "^1.8.0" - "@lumino/dragdrop" "^1.13.0" - "@lumino/messaging" "^1.10.0" - "@lumino/polling" "^1.9.0" - "@lumino/signaling" "^1.10.0" - "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.30.0" - react "^17.0.1" - -"@jupyterlab/galata@^4.2.4": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/galata/-/galata-4.3.3.tgz#46229726c0abeb53ca25a63253ac1d45beec29e8" - integrity sha512-xsBlB1gXuInp+HLvxZRDl2A4BiUGJWtax37jKYoI55Y/tBxJSYatrSgunc1QGUU8q1Zy2clnZRnRUYDN9kAQfA== - dependencies: - "@jupyterlab/application" "^3.4.3" - "@jupyterlab/cells" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/docmanager" "^3.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/notebook" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/settingregistry" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@playwright/test" "^1.16.2" - "@stdlib/stats" "^0.0.13" - canvas "^2.6.1" - fs-extra "^9.0.1" - http-server "^13.0.0" - json5 "^2.1.1" - node-fetch "^2.6.0" - path "~0.12.7" - systeminformation "^5.8.6" - vega "^5.20.0" - vega-lite "^5.1.0" - vega-statistics "^1.7.9" - -"@jupyterlab/launcher@^3.4.2": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/launcher/-/launcher-3.4.3.tgz#3370cc6d5a4b85b6ef18ac4c8f18b69a9dae6541" - integrity sha512-f+N8tdrvt9zUkGg0dOlJGQVsjZDXlsMm57c5A5uEk7vujieuLbs6Mo1bJu9Cth3qZ5+GWx+axp5X8p/dHayPmQ== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/properties" "^1.8.0" - "@lumino/widgets" "^1.30.0" - react "^17.0.1" - -"@jupyterlab/nbformat@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/nbformat/-/nbformat-3.4.3.tgz#cbab1bf507677b7f0f309d8353fc83fe5a973c82" - integrity sha512-i/yADrwhhAJJCUOTa+fEBMyJO7fvX9Y73I0B7V6dQhGcrmrEKLC3wk4yOo63+jRntd5+dupbiOtz3w1ncIXwIA== - dependencies: - "@lumino/coreutils" "^1.11.0" - -"@jupyterlab/notebook@^3.3.3", "@jupyterlab/notebook@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/notebook/-/notebook-3.4.3.tgz#81cdbf6c918aa7fc10309dcc267dcf786b4f9f2e" - integrity sha512-gssdX3pgt9kPqlNkQhmMhHatmWDgYW+Q/2MXTwATR2p//ODAtsrSpA4Che88HSP9H5mDY9xy1vUr1aZcW0Tnzg== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/cells" "^3.4.3" - "@jupyterlab/codeeditor" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/docregistry" "^3.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/rendermime" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/settingregistry" "^3.4.3" - "@jupyterlab/shared-models" "^3.4.3" - "@jupyterlab/statusbar" "^3.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/domutils" "^1.8.0" - "@lumino/dragdrop" "^1.13.0" - "@lumino/messaging" "^1.10.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.30.0" - react "^17.0.1" - -"@jupyterlab/observables@^4.4.3": - version "4.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/observables/-/observables-4.4.3.tgz#41d07af0987dc37953214e20ee1dfc0b15669ef0" - integrity sha512-AUuNoBIcctmJip4pZEYfmw14/FjTeyO3lVgp0pgZWTowzI6ihJP8pWaxc5GtfHOPGTn+S81r1FSPSiLLFqFyZg== - dependencies: - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/messaging" "^1.10.0" - "@lumino/signaling" "^1.10.0" - -"@jupyterlab/outputarea@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/outputarea/-/outputarea-3.4.3.tgz#285bb767334d82bbbb3b94f80cefeee746972c3d" - integrity sha512-acckQMJZOR9D1gcKhaBtP6seopjDpZXYChF9ZeuwgnJJNc+ct3V3iL5lAn+Y2l9BslGP5ogbhT7DDNVsXU8eoQ== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/rendermime" "^3.4.3" - "@jupyterlab/rendermime-interfaces" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/messaging" "^1.10.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - resize-observer-polyfill "^1.5.1" - -"@jupyterlab/rendermime-interfaces@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/rendermime-interfaces/-/rendermime-interfaces-3.4.3.tgz#c563a9f1927ad2ab7dbc7fcd73db1ca9039583e7" - integrity sha512-DPAUHiNpGJBPV45yabEajQrV3wt9/YyFrPjLJpKxFolNmQcbSvNWCetKqq698DvNCa2Ng5U+j8ivJZA7Iyfbjg== - dependencies: - "@jupyterlab/translation" "^3.4.3" - "@lumino/coreutils" "^1.11.0" - "@lumino/widgets" "^1.30.0" - -"@jupyterlab/rendermime@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/rendermime/-/rendermime-3.4.3.tgz#f3e0ba202965ed2d1bf113a4f9caa944b0f06d48" - integrity sha512-2EaevAXBopW7yZWX/Nmh9bBRLuvBLcg4okyLQfMKM+rOtR5mS+/4QRXqqp7Nk3R9ofuWUBw6tQEKk8nhiFJS9w== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/codemirror" "^3.4.3" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/rendermime-interfaces" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/translation" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/messaging" "^1.10.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - lodash.escape "^4.0.1" - marked "^4.0.10" - -"@jupyterlab/services@^6.1.0", "@jupyterlab/services@^6.4.3": - version "6.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/services/-/services-6.4.3.tgz#4c01dba29dfe4b85342479338f52068545bcb64c" - integrity sha512-h0z+qlK3aMGwC/b1GJXscrLp6KH6xTygu8SRkey81hBkOVitE6We32b7VZD3iVPjZN7EdD4/EcjAjtl1EgsQlQ== - dependencies: - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/nbformat" "^3.4.3" - "@jupyterlab/observables" "^4.4.3" - "@jupyterlab/settingregistry" "^3.4.3" - "@jupyterlab/statedb" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/polling" "^1.9.0" - "@lumino/signaling" "^1.10.0" - node-fetch "^2.6.0" - ws "^7.4.6" - -"@jupyterlab/settingregistry@^3.1.0", "@jupyterlab/settingregistry@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/settingregistry/-/settingregistry-3.4.3.tgz#531cb702a7eefdd12cce541893152056f66841d2" - integrity sha512-DYrlQz4FIhx9JP3lmevGY1MWgvDN/2ujpQxBZeuz3TPEoSwMpLNwXcI7U69XSm/CF99IN2W3V8LGOKx0M+T9Ug== - dependencies: - "@jupyterlab/statedb" "^3.4.3" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/signaling" "^1.10.0" - ajv "^6.12.3" - json5 "^2.1.1" - -"@jupyterlab/shared-models@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/shared-models/-/shared-models-3.4.3.tgz#656b7108f16f78e092b11b6bf7ddaec59d518099" - integrity sha512-l59ufJoLifv7i7Dlg5112FBLGhA9gTmcFbqniGwmPjnrd5rbS5l+pNJoeMGVID+rWUyI1C0eE0K3V9Vz9Ub+4w== - dependencies: - "@jupyterlab/nbformat" "^3.4.3" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/signaling" "^1.10.0" - y-protocols "^1.0.5" - yjs "^13.5.17" - -"@jupyterlab/statedb@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/statedb/-/statedb-3.4.3.tgz#30b8801d0cfdb60f0a790d309bbd968dc4185a01" - integrity sha512-Gr96oF20qEVv7jFDgDvi6GciLoGp+qo3lElqQdJhgqmLrQI9oTqtYOwkxLYjOzY8uhXI+Z4X1tZ7cRkNdoUCVw== - dependencies: - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/properties" "^1.8.0" - "@lumino/signaling" "^1.10.0" - -"@jupyterlab/statusbar@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/statusbar/-/statusbar-3.4.3.tgz#d9a35b79bb5c61b3215b778ff563fcf260c60070" - integrity sha512-cNx0EPedajqA9HCY/Yc34wh6ouZRUkdlVNaahVAhhj+qTs3HfGHFZagkjgPAg36cSPYrHyq1speRh0UGyqqyTw== - dependencies: - "@jupyterlab/apputils" "^3.4.3" - "@jupyterlab/codeeditor" "^3.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/translation" "^3.4.3" - "@jupyterlab/ui-components" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/messaging" "^1.10.0" - "@lumino/signaling" "^1.10.0" - "@lumino/widgets" "^1.30.0" - csstype "~3.0.3" - react "^17.0.1" - typestyle "^2.0.4" - -"@jupyterlab/translation@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/translation/-/translation-3.4.3.tgz#a8aebfd74ae0da073a349072f4db3186fe65f437" - integrity sha512-NNpSqdFxxmx/miCTbTk/8fZapMArM8YJ2Q4WCzYcEiRVYfJbzozrSqIu8X0gNcIbV3IGD+GXueqWQb7xr637bQ== - dependencies: - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/services" "^6.4.3" - "@jupyterlab/statedb" "^3.4.3" - "@lumino/coreutils" "^1.11.0" - -"@jupyterlab/ui-components@^3.4.3": - version "3.4.3" - resolved "https://registry.yarnpkg.com/@jupyterlab/ui-components/-/ui-components-3.4.3.tgz#180ba2e0a273fce78ec9cf38782060a12064f02c" - integrity sha512-oFl3QXiQDjDEte5emdNpdnjAptbGt+pm+TieUmx/+/SpYGsgGV5F1lRHw7kOdyUAB8CIRayqlGZ5BpWGNLFT7g== - dependencies: - "@blueprintjs/core" "^3.36.0" - "@blueprintjs/select" "^3.15.0" - "@jupyterlab/coreutils" "^5.4.3" - "@jupyterlab/translation" "^3.4.3" - "@lumino/algorithm" "^1.9.0" - "@lumino/commands" "^1.19.0" - "@lumino/coreutils" "^1.11.0" - "@lumino/disposable" "^1.10.0" - "@lumino/signaling" "^1.10.0" - "@lumino/virtualdom" "^1.14.0" - "@lumino/widgets" "^1.30.0" - "@rjsf/core" "^3.1.0" - react "^17.0.1" - react-dom "^17.0.1" - typestyle "^2.0.4" - -"@lumino/algorithm@^1.9.0", "@lumino/algorithm@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@lumino/algorithm/-/algorithm-1.9.1.tgz#a870598e031f5ee85e20e77ce7bfffbb0dffd7f5" - integrity sha512-d0rj7IYRzYj6WbWSrbJbKvrfO4H0NUnXT2yjSWS/sCklpTpSp0IGmndK/X4r6gG+ev5lb5+wBg9ofUDBvoAlAw== - -"@lumino/application@^1.27.0": - version "1.29.1" - resolved "https://registry.yarnpkg.com/@lumino/application/-/application-1.29.1.tgz#aa37f51af00f70bcd2bd18d9ebc464ad6bcbb651" - integrity sha512-71ScZSOvHTBIwwL9S+CAAivNhDGEP+RZKUIyWlQOxtgETf88CO8FCUbLqhUUHw6nnzyVXjOORCgiOQEnLMvN9w== - dependencies: - "@lumino/commands" "^1.20.0" - "@lumino/coreutils" "^1.12.0" - "@lumino/widgets" "^1.32.1" - -"@lumino/collections@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@lumino/collections/-/collections-1.9.1.tgz#268f1ec6850d5e131cfc8db232c7e1e106144aa0" - integrity sha512-5RaRGUY7BJ/1j173sc9DCfiVf70Z0hopRnBV8/AeAaK9bJJRAYjDhlZ9O8xTyouegh6krkOfiDyjl3pwogLrQw== - dependencies: - "@lumino/algorithm" "^1.9.1" - -"@lumino/commands@^1.19.0", "@lumino/commands@^1.20.0": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@lumino/commands/-/commands-1.20.0.tgz#44c797134bb33946141a490c506420bd5f12ce0f" - integrity sha512-xyrzDIJ9QEbcbRAwmXrjb7A7/E5MDNbnLANKwqmFVNF+4LSnF62obdvY4On3Rify3HmfX0u16Xr9gfoWPX9wLQ== - dependencies: - "@lumino/algorithm" "^1.9.1" - "@lumino/coreutils" "^1.12.0" - "@lumino/disposable" "^1.10.1" - "@lumino/domutils" "^1.8.1" - "@lumino/keyboard" "^1.8.1" - "@lumino/signaling" "^1.10.1" - "@lumino/virtualdom" "^1.14.1" - -"@lumino/coreutils@^1.11.0", "@lumino/coreutils@^1.12.0": - version "1.12.0" - resolved "https://registry.yarnpkg.com/@lumino/coreutils/-/coreutils-1.12.0.tgz#fbdef760f736eaf2bd396a5c6fc3a68a4b449b15" - integrity sha512-DSglh4ylmLi820CNx9soJmDJCpUgymckdWeGWuN0Ash5g60oQvrQDfosVxEhzmNvtvXv45WZEqSBzDP6E5SEmQ== - -"@lumino/disposable@^1.10.0", "@lumino/disposable@^1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@lumino/disposable/-/disposable-1.10.1.tgz#58fddc619cf89335802d168564b76ff5315d5a84" - integrity sha512-mZQILc8sVGZC7mJNOGVmehDRO9/u3sIRdjZ+pCYjDgXKcINLd6HoPhZDquKCWiRBfHTL1B3tOHjnBhahBc2N/Q== - dependencies: - "@lumino/algorithm" "^1.9.1" - "@lumino/signaling" "^1.10.1" - -"@lumino/domutils@^1.8.0", "@lumino/domutils@^1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@lumino/domutils/-/domutils-1.8.1.tgz#cf118e4eba90c3bf1e3edf7f19cce8846ec7875c" - integrity sha512-QUVXwmDMIfcHC3yslhmyGK4HYBKaJ3xX5MTwDrjsSX7J7AZ4jwL4zfsxyF9ntdqEKraoJhLQ6BaUBY+Ur1cnYw== - -"@lumino/dragdrop@^1.13.0", "@lumino/dragdrop@^1.14.0": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@lumino/dragdrop/-/dragdrop-1.14.0.tgz#48baacc190518d0cb563698daa0d5b976d6fe5c3" - integrity sha512-hO8sgF0BkpihKIP6UZgVJgiOEhz89i7Oxtp9FR9Jqw5alGocxSXt7q3cteMvqpcL6o2/s3CafZNRkVLRXmepNw== - dependencies: - "@lumino/coreutils" "^1.12.0" - "@lumino/disposable" "^1.10.1" - -"@lumino/keyboard@^1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@lumino/keyboard/-/keyboard-1.8.1.tgz#e7850e2fb973fbb4c6e737ca8d9307f2dc3eb74b" - integrity sha512-8x0y2ZQtEvOsblpI2gfTgf+gboftusP+5aukKEsgNQtzFl28RezQXEOSVd8iD3K6+Q1MaPQF0OALYP0ASqBjBg== - -"@lumino/messaging@^1.10.0", "@lumino/messaging@^1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@lumino/messaging/-/messaging-1.10.1.tgz#b29575cca46e2f23b84626b793ec8e2be46a53ba" - integrity sha512-XZSdt9ih94rdeeLL0cryUw6HHD51D7TP8c+MFf+YRF6VKwOFB9RoajfQWadeqpmH+schTs3EsrFfA9KHduzC7w== - dependencies: - "@lumino/algorithm" "^1.9.1" - "@lumino/collections" "^1.9.1" - -"@lumino/polling@^1.9.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@lumino/polling/-/polling-1.10.0.tgz#94a92811edf4c2534c741510b30f500d8c16a395" - integrity sha512-ZNXObJQfugnS41Yrlr7yWcFiRK+xAGGOXO08JJ0Mctsg5mT30UEGFVWJY2AjZ6N5aQuLyGed/pMkBzLzrzt8OA== - dependencies: - "@lumino/coreutils" "^1.12.0" - "@lumino/disposable" "^1.10.1" - "@lumino/signaling" "^1.10.1" - -"@lumino/properties@^1.8.0", "@lumino/properties@^1.8.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@lumino/properties/-/properties-1.8.1.tgz#47eb8516e92c987dcb2c404db83a258159efec3d" - integrity sha512-O+CCcAqP64Di32DUZ4Jqq0DtUyE5RJREN5vbkgGZGu+WauJ/RYoiLDe1ubbAeSaHk71OrS60ZBV7QyC8ZaBVsA== - -"@lumino/signaling@^1.10.0", "@lumino/signaling@^1.10.1": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@lumino/signaling/-/signaling-1.10.1.tgz#c8a1cb5b661b6744ea817c99c758fdc897847c26" - integrity sha512-GZVbX4cfk/ZqLwkemPD/NwqToaTL/6q7qdLpEhgkiPlaH1S5/V7fDpP7N1uFy4n3BDITId8cpYgH/Ds32Mdp3A== - dependencies: - "@lumino/algorithm" "^1.9.1" - -"@lumino/virtualdom@^1.14.0", "@lumino/virtualdom@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@lumino/virtualdom/-/virtualdom-1.14.1.tgz#2551b146cbe87c48d23754f370c1331a60c9fe62" - integrity sha512-imIJd/wtRkoR1onEiG5nxPEaIrf70nn4PgD/56ri3/Lo6AJEX2CusF6iIA27GVB8yl/7CxgTHUnzzCwTFPypcA== - dependencies: - "@lumino/algorithm" "^1.9.1" - -"@lumino/widgets@^1.30.0", "@lumino/widgets@^1.32.1": - version "1.32.1" - resolved "https://registry.yarnpkg.com/@lumino/widgets/-/widgets-1.32.1.tgz#77b085518b3c5e530008f0ec4840e4c39b905ac2" - integrity sha512-IA4BuoiiL9NB48HrM/6R7WM4mKy4O7JVVJgz9zJOu84lhyBJehTLdS34rQLV9YuRHTj3jyrWPdNsgkQ26u1ugA== - dependencies: - "@lumino/algorithm" "^1.9.1" - "@lumino/commands" "^1.20.0" - "@lumino/coreutils" "^1.12.0" - "@lumino/disposable" "^1.10.1" - "@lumino/domutils" "^1.8.1" - "@lumino/dragdrop" "^1.14.0" - "@lumino/keyboard" "^1.8.1" - "@lumino/messaging" "^1.10.1" - "@lumino/properties" "^1.8.1" - "@lumino/signaling" "^1.10.1" - "@lumino/virtualdom" "^1.14.1" - -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc" - integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@playwright/test@^1.16.2", "@playwright/test@^1.21.1": - version "1.22.2" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.22.2.tgz#b848f25f8918140c2d0bae8e9227a40198f2dd4a" - integrity sha512-cCl96BEBGPtptFz7C2FOSN3PrTnJ3rPpENe+gYCMx4GNNDlN4tmo2D89y13feGKTMMAIVrXfSQ/UmaQKLy1XLA== - dependencies: - "@types/node" "*" - playwright-core "1.22.2" - -"@rjsf/core@^3.1.0": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@rjsf/core/-/core-3.2.1.tgz#8a7b24c9a6f01f0ecb093fdfc777172c12b1b009" - integrity sha512-dk8ihvxFbcuIwU7G+HiJbFgwyIvaumPt5g5zfnuC26mwTUPlaDGFXKK2yITp8tJ3+hcwS5zEXtAN9wUkfuM4jA== - dependencies: - "@types/json-schema" "^7.0.7" - ajv "^6.7.0" - core-js-pure "^3.6.5" - json-schema-merge-allof "^0.6.0" - jsonpointer "^5.0.0" - lodash "^4.17.15" - nanoid "^3.1.23" - prop-types "^15.7.2" - react-is "^16.9.0" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@stdlib/array@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/array/-/array-0.0.12.tgz#12f40ab95bb36d424cdad991f29fc3cb491ee29e" - integrity sha512-nDksiuvRC1dSTHrf5yOGQmlRwAzSKV8MdFQwFSvLbZGGhi5Y4hExqea5HloLgNVouVs8lnAFi2oubSM4Mc7YAg== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/blas" "^0.0.x" - "@stdlib/complex" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/symbol" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/assert@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/assert/-/assert-0.0.12.tgz#1648c9016e5041291f55a6464abcc4069c5103ce" - integrity sha512-38FxFf+ZoQZbdc+m09UsWtaCmzd/2e7im0JOaaFYE7icmRfm+4KiE9BRvBT4tIn7ioLB2f9PsBicKjIsf+tY1w== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/complex" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/ndarray" "^0.0.x" - "@stdlib/number" "^0.0.x" - "@stdlib/os" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/regexp" "^0.0.x" - "@stdlib/streams" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/symbol" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/bigint@^0.0.x": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@stdlib/bigint/-/bigint-0.0.11.tgz#c416a1d727001c55f4897e6424124199d638f2fd" - integrity sha512-uz0aYDLABAYyqxaCSHYbUt0yPkXYUCR7TrVvHN+UUD3i8FZ02ZKcLO+faKisDyxKEoSFTNtn3Ro8Ir5ebOlVXQ== - dependencies: - "@stdlib/utils" "^0.0.x" - -"@stdlib/blas@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/blas/-/blas-0.0.12.tgz#7e93e42b4621fc6903bf63264f045047333536c2" - integrity sha512-nWY749bWceuoWQ7gz977blCwR7lyQ/rsIXVO4b600h+NFpeA2i/ea7MYC680utIbeu2cnDWHdglBPoK535VAzA== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/number" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/buffer@^0.0.x": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@stdlib/buffer/-/buffer-0.0.11.tgz#6137b00845e6c905181cc7ebfae9f7e47c01b0ce" - integrity sha512-Jeie5eDDa1tVuRcuU+cBXI/oOXSmMxUUccZpqXzgYe0IO8QSNtNxv9mUTzJk/m5wH+lmLoDvNxzPpOH9TODjJg== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/cli@^0.0.x": - version "0.0.10" - resolved "https://registry.yarnpkg.com/@stdlib/cli/-/cli-0.0.10.tgz#28e2fbe6865d7f5cd15b7dc5846c99bd3b91674f" - integrity sha512-OITGaxG46kwK799+NuOd/+ccosJ9koVuQBC610DDJv0ZJf8mD7sbjGXrmue9C4EOh8MP7Vm/6HN14BojX8oTCg== - dependencies: - "@stdlib/utils" "^0.0.x" - minimist "^1.2.0" - -"@stdlib/complex@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/complex/-/complex-0.0.12.tgz#3afbc190cd0a9b37fc7c6e508c3aa9fda9106944" - integrity sha512-UbZBdaUxT2G+lsTIrVlRZwx2IRY6GXnVILggeejsIVxHSuK+oTyapfetcAv0FJFLP+Rrr+ZzrN4b9G3hBw6NHA== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/constants@^0.0.x": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@stdlib/constants/-/constants-0.0.11.tgz#78cd56d6c2982b30264843c3d75bde7125e90cd2" - integrity sha512-cWKy0L9hXHUQTvFzdPkTvZnn/5Pjv7H4UwY0WC1rLt+A5CxFDJKjvnIi9ypSzJS3CAiGl1ZaHCdadoqXhNdkUg== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/number" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/fs@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/fs/-/fs-0.0.12.tgz#662365fd5846a51f075724b4f2888ae88441b70d" - integrity sha512-zcDLbt39EEM3M3wJW6luChS53B8T+TMJkjs2526UpKJ71O0/0adR57cI7PfCpkMd33d05uM7GM+leEj4eks4Cw== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/utils" "^0.0.x" - debug "^2.6.9" - -"@stdlib/math@^0.0.x": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@stdlib/math/-/math-0.0.11.tgz#eb6638bc03a20fbd6727dd5b977ee0170bda4649" - integrity sha512-qI78sR1QqGjHj8k/aAqkZ51Su2fyBvaR/jMKQqcB/ML8bpYpf+QGlGvTty5Qdru/wpqds4kVFOVbWGcNFIV2+Q== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/ndarray" "^0.0.x" - "@stdlib/number" "^0.0.x" - "@stdlib/strided" "^0.0.x" - "@stdlib/symbol" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - debug "^2.6.9" - -"@stdlib/ndarray@^0.0.x": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@stdlib/ndarray/-/ndarray-0.0.13.tgz#2e8fc645e10f56a645a0ab81598808c0e8f43b82" - integrity sha512-Z+U9KJP4U2HWrLtuAXSPvhNetAdqaNLMcliR6S/fz+VPlFDeymRK7omRFMgVQ+1zcAvIgKZGJxpLC3vjiPUYEw== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/bigint" "^0.0.x" - "@stdlib/buffer" "^0.0.x" - "@stdlib/complex" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/number" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/nlp@^0.0.x": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@stdlib/nlp/-/nlp-0.0.11.tgz#532ec0f7267b8d639e4c20c6de864e8de8a09054" - integrity sha512-D9avYWANm0Db2W7RpzdSdi5GxRYALGAqUrNnRnnKIO6sMEfr/DvONoAbWruda4QyvSC+0MJNwcEn7+PHhRwYhw== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/random" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/number@^0.0.x": - version "0.0.10" - resolved "https://registry.yarnpkg.com/@stdlib/number/-/number-0.0.10.tgz#4030ad8fc3fac19a9afb415c443cee6deea0e65c" - integrity sha512-RyfoP9MlnX4kccvg8qv7vYQPbLdzfS1Mnp/prGOoWhvMG3pyBwFAan34kwFb5IS/zHC3W5EmrgXCV2QWyLg/Kg== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/os" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/os@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/os/-/os-0.0.12.tgz#08bbf013c62a7153099fa9cbac086ca1349a4677" - integrity sha512-O7lklZ/9XEzoCmYvzjPh7jrFWkbpOSHGI71ve3dkSvBy5tyiSL3TtivfKsIC+9ZxuEJZ3d3lIjc9e+yz4HVbqQ== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/process@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/process/-/process-0.0.12.tgz#123325079d89a32f4212f72fb694f8fe3614cf18" - integrity sha512-P0X0TMvkissBE1Wr877Avi2/AxmP7X5Toa6GatHbpJdDg6jQmN4SgPd+NZNp98YtZUyk478c8XSIzMr1krQ20g== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/buffer" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/streams" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/random@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/random/-/random-0.0.12.tgz#e819c3abd602ed5559ba800dba751e49c633ff85" - integrity sha512-c5yND4Ahnm9Jx0I+jsKhn4Yrz10D53ALSrIe3PG1qIz3kNFcIPnmvCuNGd+3V4ch4Mbrez55Y8z/ZC5RJh4vJQ== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/blas" "^0.0.x" - "@stdlib/buffer" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/stats" "^0.0.x" - "@stdlib/streams" "^0.0.x" - "@stdlib/symbol" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - debug "^2.6.9" - readable-stream "^2.1.4" - -"@stdlib/regexp@^0.0.x": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@stdlib/regexp/-/regexp-0.0.13.tgz#80b98361dc7a441b47bc3fa964bb0c826759e971" - integrity sha512-3JT5ZIoq/1nXY+dY+QtkU8/m7oWDeekyItEEXMx9c/AOf0ph8fmvTUGMDNfUq0RetcznFe3b66kFz6Zt4XHviA== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/stats@^0.0.13", "@stdlib/stats@^0.0.x": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@stdlib/stats/-/stats-0.0.13.tgz#87c973f385379d794707c7b5196a173dba8b07e1" - integrity sha512-hm+t32dKbx/L7+7WlQ1o4NDEzV0J4QSnwFBCsIMIAO8+VPxTZ4FxyNERl4oKlS3hZZe4AVKjoOVhBDtgEWrS4g== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/blas" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/ndarray" "^0.0.x" - "@stdlib/random" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/symbol" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/streams@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/streams/-/streams-0.0.12.tgz#07f5ceae5852590afad8e1cb7ce94174becc8739" - integrity sha512-YLUlXwjJNknHp92IkJUdvn5jEQjDckpawKhDLLCoxyh3h5V+w/8+61SH7TMTfKx5lBxKJ8vvtchZh90mIJOAjQ== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/buffer" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - debug "^2.6.9" - readable-stream "^2.1.4" - -"@stdlib/strided@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/strided/-/strided-0.0.12.tgz#86ac48e660cb7f64a45cf07e80cbbfe58be21ae1" - integrity sha512-1NINP+Y7IJht34iri/bYLY7TVxrip51f6Z3qWxGHUCH33kvk5H5QqV+RsmFEGbbyoGtdeHrT2O+xA+7R2e3SNg== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/ndarray" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/string@^0.0.x": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@stdlib/string/-/string-0.0.13.tgz#37457ca49e8d1dff0e523c68f5673c655c79eb2d" - integrity sha512-nGMHi7Qk9LBW0+Y+e3pSePQEBqyWH7+7DjFR1APcbsYccJE0p4aCaQdhPhx9Tp7j3uRGBmqPFek8wpcvIuC+CQ== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/nlp" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/regexp" "^0.0.x" - "@stdlib/streams" "^0.0.x" - "@stdlib/types" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/symbol@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/symbol/-/symbol-0.0.12.tgz#b9f396b0bf269c2985bb7fe99810a8e26d7288c3" - integrity sha512-2IDhpzWVGeLHgsvIsX12RXvf78r7xBkc4QLoRUv3k7Cp61BisR1Ym1p0Tq9PbxT8fknlvLToh9n5RpmESi2d4w== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/time@^0.0.x": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@stdlib/time/-/time-0.0.14.tgz#ea6daa438b1d3b019b99f5091117ee4bcef55d60" - integrity sha512-1gMFCQTabMVIgww+k4g8HHHIhyy1tIlvwT8mC0BHW7Q7TzDAgobwL0bvor+lwvCb5LlDAvNQEpaRgVT99QWGeQ== - dependencies: - "@stdlib/assert" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/utils" "^0.0.x" - -"@stdlib/types@^0.0.x": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@stdlib/types/-/types-0.0.14.tgz#02d3aab7a9bfaeb86e34ab749772ea22f7b2f7e0" - integrity sha512-AP3EI9/il/xkwUazcoY+SbjtxHRrheXgSbWZdEGD+rWpEgj6n2i63hp6hTOpAB5NipE0tJwinQlDGOuQ1lCaCw== - -"@stdlib/utils@^0.0.x": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@stdlib/utils/-/utils-0.0.12.tgz#670de5a7b253f04f11a4cba38f790e82393bcb46" - integrity sha512-+JhFpl6l7RSq/xGnbWRQ5dAL90h9ONj8MViqlb7teBZFtePZLMwoRA1wssypFcJ8SFMRWQn7lPmpYVUkGwRSOg== - dependencies: - "@stdlib/array" "^0.0.x" - "@stdlib/assert" "^0.0.x" - "@stdlib/blas" "^0.0.x" - "@stdlib/buffer" "^0.0.x" - "@stdlib/cli" "^0.0.x" - "@stdlib/constants" "^0.0.x" - "@stdlib/fs" "^0.0.x" - "@stdlib/math" "^0.0.x" - "@stdlib/os" "^0.0.x" - "@stdlib/process" "^0.0.x" - "@stdlib/random" "^0.0.x" - "@stdlib/regexp" "^0.0.x" - "@stdlib/streams" "^0.0.x" - "@stdlib/string" "^0.0.x" - "@stdlib/symbol" "^0.0.x" - "@stdlib/time" "^0.0.x" - "@stdlib/types" "^0.0.x" - debug "^2.6.9" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@types/clone@~2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/clone/-/clone-2.1.1.tgz#9b880d0ce9b1f209b5e0bd6d9caa38209db34024" - integrity sha512-BZIU34bSYye0j/BFcPraiDZ5ka6MJADjcDVELGf7glr9K+iE8NYVjFslJFVWzskSxkLLyCrSPScE82/UUoBSvg== - -"@types/dom4@^2.0.1": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.2.tgz#6495303f049689ce936ed328a3e5ede9c51408ee" - integrity sha512-Rt4IC1T7xkCWa0OG1oSsPa0iqnxlDeQqKXZAHrQGLb7wFGncWm85MaxKUjAGejOrUynOgWlFi4c6S6IyJwoK4g== - -"@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.3" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" - integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/estree@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/geojson@^7946.0.10": - version "7946.0.10" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" - integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/node@*": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" - integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react@^17.0.0": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.45.tgz#9b3d5b661fd26365fefef0e766a1c6c30ccf7b3f" - integrity sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/webpack-sources@^0.1.5": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.9.tgz#da69b06eb34f6432e6658acb5a6893c55d983920" - integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" - -"@typescript-eslint/eslint-plugin@^4.8.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== - dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@^4.8.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== - dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" - -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== - -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== - dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" - -"@verdaccio/commons-api@10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@verdaccio/commons-api/-/commons-api-10.2.0.tgz#3b684c31749837b0574375bb2e10644ecea9fcca" - integrity sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ== - dependencies: - http-errors "2.0.0" - http-status-codes "2.2.0" - -"@verdaccio/file-locking@10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@verdaccio/file-locking/-/file-locking-10.3.0.tgz#a4342665c549163817c267bfa451e32ed3009767" - integrity sha512-FE5D5H4wy/nhgR/d2J5e1Na9kScj2wMjlLPBHz7XF4XZAVSRdm45+kL3ZmrfA6b2HTADP/uH7H05/cnAYW8bhw== - dependencies: - lockfile "1.0.4" - -"@verdaccio/local-storage@10.3.0": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@verdaccio/local-storage/-/local-storage-10.3.0.tgz#37ad9c200d7672c698de9872a0ff7a7c43c83f30" - integrity sha512-qpzYVqJ4NN9gYGkpuQ8N2IRRg6m8+dTvSZ69H/41rHEfeeC0LW3cZjQV7hZ8RfNNvY7hLtf1E+n6DKCGx/bSLg== - dependencies: - "@verdaccio/commons-api" "10.2.0" - "@verdaccio/file-locking" "10.3.0" - "@verdaccio/streams" "10.2.0" - async "3.2.3" - debug "4.3.4" - lodash "4.17.21" - lowdb "1.0.0" - mkdirp "1.0.4" - -"@verdaccio/readme@10.3.4": - version "10.3.4" - resolved "https://registry.yarnpkg.com/@verdaccio/readme/-/readme-10.3.4.tgz#35594d30cebb9624f29c51f0ddc380f301d6c5a4" - integrity sha512-E4SHDjVt7eJ3CwNNvkB3N0zV3Zza8i6yQf6+qE4AZsy1L18OaxXBFmp4O4HxxIahB3npVhip230FVVAWUZjK+w== - dependencies: - dompurify "2.3.8" - jsdom "15.2.1" - marked "4.0.16" - -"@verdaccio/streams@10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@verdaccio/streams/-/streams-10.2.0.tgz#e01d2bfdcfe8aa2389f31bc6b72a602628bd025b" - integrity sha512-FaIzCnDg0x0Js5kSQn1Le3YzDHl7XxrJ0QdIw5LrDUmLsH3VXNi4/NMlSHnw5RiTTMs4UbEf98V3RJRB8exqJA== - -"@verdaccio/ui-theme@6.0.0-6-next.24": - version "6.0.0-6-next.24" - resolved "https://registry.yarnpkg.com/@verdaccio/ui-theme/-/ui-theme-6.0.0-6-next.24.tgz#77e5405f2c7ee60153845deebca80347a771e8ef" - integrity sha512-tchic00TMWV9qm3EG1GmU7WLnzb29fGT51NJF8rmmNGc7V7tlpXSOE+WQ/dP99jaViIrZzh73Z03TpjQ3ZFd/A== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" - integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== - -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -JSONStream@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abab@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^6.0.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.0, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.5.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== - -acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.7.0: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -apache-md5@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/apache-md5/-/apache-md5-1.1.7.tgz#dcef1802700cc231d60c5e08fd088f2f9b36375a" - integrity sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw== - -"aproba@^1.0.3 || ^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA== - -array-flat-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz#1e3a4255be619dfbffbfd1d635c1cf357cd034e7" - integrity sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== - -async@3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -async@^2.6.2: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -balanced-match@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" - integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -basic-auth@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" - integrity sha512-CtGuTyWf3ig+sgRyC7uP6DM3N+5ur/p8L+FPfsd+BbIfIs74TFfCajZTHnCw6K5dqM0bZEbRIqRy1fAdiUJhTA== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bcryptjs@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -body-parser@1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bower@*: - version "1.8.14" - resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.14.tgz#985722a3c1fcd35c93d4136ecbeafbeaaea74e86" - integrity sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.14.5: - version "4.20.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" - integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== - dependencies: - caniuse-lite "^1.0.30001349" - electron-to-chromium "^1.4.147" - escalade "^3.1.1" - node-releases "^2.0.5" - picocolors "^1.0.0" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001349: - version "1.0.30001355" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001355.tgz#e240b7177443ed0198c737a7f609536976701c77" - integrity sha512-Sd6pjJHF27LzCB7pT7qs+kuX2ndurzCzkpJl6Qct7LPSZ9jn0bkOA8mdgMgmqnQAWLVOOGjLpc+66V57eLtb1g== - -canvas@^2.6.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.0.tgz#7f0c3e9ae94cf469269b5d3a7963a7f3a9936434" - integrity sha512-bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g== - dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - nan "^2.17.0" - simple-get "^3.0.3" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -child_process@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a" - integrity sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -classnames@^2.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -clipanion@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-3.1.0.tgz#3e217dd6476bb9236638b07eb4673f7309839819" - integrity sha512-v025Hz+IDQ15FpOyK8p02h5bFznMu6rLFsJSyOPR+7WrbSnZ1Ek6pblPukV7K5tC/dsWfncQPIrJ4iUy2PXkbw== - dependencies: - typanion "^3.3.1" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-regexp@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" - integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== - dependencies: - is-regexp "^2.0.0" - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== - dependencies: - mimic-response "^1.0.0" - -clone@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -codemirror@~5.61.0: - version "5.61.1" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.61.1.tgz#ccfc8a43b8fcfb8b12e8e75b5ffde48d541406e0" - integrity sha512-+D1NZjAucuzE93vJGbAaXzvoBHwp9nJZWWWF9utjv25+5AZUiah6CIlfb4ikG4MoDsFsCG8niiJH5++OO2LgIQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-support@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colord@^2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" - integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== - -colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@2, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@7, commander@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.0.0.tgz#2b270da94f8fb9014455312f829a1129dbf8887e" - integrity sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -compute-gcd@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" - integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== - dependencies: - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - validate.io-integer-array "^1.0.0" - -compute-lcm@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" - integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== - dependencies: - compute-gcd "^1.2.1" - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - validate.io-integer-array "^1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -console-control-strings@^1.0.0, console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookies@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" - integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -core-js-pure@^3.6.5: - version "3.23.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.1.tgz#0b27e4c3ad46178b84e790dbbb81987218ab82ad" - integrity sha512-3qNgf6TqI3U1uhuSYRzJZGfFd4T+YlbyVPl+jgRiKjdZopvG4keZQwWZDAWpu1UH9nCgTpUzIV3GFawC7cJsqg== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -corser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" - integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== - -cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - -css-functions-list@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b" - integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== - -css-loader@^5.0.1: - version "5.2.7" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" - integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== - dependencies: - icss-utils "^5.1.0" - loader-utils "^2.0.0" - postcss "^8.2.15" - 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.1.0" - schema-utils "^3.0.0" - semver "^7.3.5" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssom@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@3.0.10: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== - -csstype@~3.0.3: - version "3.0.11" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" - integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== - -"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@^3.1.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.1.6.tgz#0342c835925826f49b4d16eb7027aec334ffc97d" - integrity sha512-DCbBBNuKOeiR9h04ySRBMW52TFVc91O9wJziuyXw6Ztmy8D3oZbmCkOO3UHKC7ceNJsN2Mavo9+vwV8EAEUXzA== - dependencies: - internmap "1 - 2" - -d3-array@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.2.tgz#f8ac4705c5b06914a7e0025bbf8d5f1513f6a86e" - integrity sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ== - dependencies: - internmap "1 - 2" - -d3-array@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" - integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== - dependencies: - internmap "1 - 2" - -"d3-color@1 - 3", d3-color@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-delaunay@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" - integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== - dependencies: - delaunator "5" - -"d3-dispatch@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -d3-dsv@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -d3-force@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-format@1 - 3", d3-format@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo-projection@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz#dc229e5ead78d31869a4e87cf1f45bd2716c48ca" - integrity sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg== - dependencies: - commander "7" - d3-array "1 - 3" - d3-geo "1.12.0 - 3" - -"d3-geo@1.12.0 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" - integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== - dependencies: - d3-array "2.5.0 - 3" - -d3-geo@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.0.tgz#74fd54e1f4cebd5185ac2039217a98d39b0a4c0e" - integrity sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -"d3-path@1 - 3", d3-path@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" - integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== - -d3-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" - integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== - -"d3-quadtree@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-scale@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -d3-shape@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" - integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== - dependencies: - d3-path "1 - 3" - -d3-shape@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" - integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== - dependencies: - d3-path "^3.1.0" - -"d3-time-format@2 - 4", d3-time-format@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" - integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== - dependencies: - d3-array "2 - 3" - -d3-time@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" - integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== - dependencies: - d3-array "2 - 3" - -"d3-timer@1 - 3", d3-timer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -dayjs@1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.3.tgz#4754eb694a624057b9ad2224b67b15d552589258" - integrity sha512-xxwlswWOlGhzgQ4TKzASQkUhqERI3egRNqgV4ScR8wlANA/A9tZ7miXa44vTTKEq5l7vWoL5G57bG3zA+Kow0A== - -debug@2.6.9, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.1.1, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== - dependencies: - mimic-response "^2.0.0" - -deep-equal@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -dependency-graph@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318" - integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-libc@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -detect-newline@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-helpers@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom4@^2.1.5: - version "2.1.6" - resolved "https://registry.yarnpkg.com/dom4/-/dom4-2.1.6.tgz#c90df07134aa0dbd81ed4d6ba1237b36fc164770" - integrity sha512-JkCVGnN4ofKGbjf5Uvc8mmxaATIErKQKSgACdBXpsQ3fY6DlIpAyWfiBSrGkttATssbDCp3psiAKWXk5gmjycA== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -dompurify@2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f" - integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw== - -domutils@^2.5.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA== - -duplicate-package-checker-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz#78bb89e625fa7cf8c2a59c53f62b495fda9ba287" - integrity sha512-aO50/qPC7X2ChjRFniRiscxBLT/K01bALqfcDaf8Ih5OqQ1N4iT/Abx9Ofu3/ms446vHTm46FACIuJUmgUQcDQ== - dependencies: - chalk "^2.3.0" - find-root "^1.0.0" - lodash "^4.17.4" - semver "^5.4.1" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.147: - version "1.4.158" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.158.tgz#abbdaaf64676bfa4bc0307522125db34424a0ada" - integrity sha512-gppO3/+Y6sP432HtvwvuU8S+YYYLH4PmAYvQwqUtt9HDOmEsBwQfLnK9T8+1NIKwAS1BEygIjTaATC4H5EzvxQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -envinfo@7.8.1, envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.61" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.61.tgz#311de37949ef86b6b0dcea894d1ffedb909d3269" - integrity sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -es6-weak-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^1.11.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@^6.15.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" - integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== - dependencies: - get-stdin "^6.0.0" - -eslint-import-resolver-node@0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-plugin-prettier@^3.1.4: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^7.14.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - 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 "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== - dependencies: - d "1" - es5-ext "~0.10.14" - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execall@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" - integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== - dependencies: - clone-regexp "^2.1.0" - -express-rate-limit@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" - integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== - -express@4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.0" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - 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.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.10.3" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3, fast-deep-equal@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-redact@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.1.1.tgz#790fcff8f808c2e12fabbfb2be5cb2deda448fa0" - integrity sha512-odVmjC8x8jNeMZ3C+rPMESzXVSEU8tSWSHv9HFxP2mm89G/1WwqhrerJDQm9Zus8X6aoRgQDThKqptdNA6bt+A== - -fast-safe-stringify@2.1.1, fast-safe-stringify@^2.0.8: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-loader@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.5" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - 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" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-root@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatstr@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" - integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== - -flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -follow-redirects@^1.0.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -free-style@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/free-style/-/free-style-3.1.0.tgz#4e2996029534e6b1731611d843437b9e2f473f08" - integrity sha512-vJujYSIyT30iDoaoeigNAxX4yB1RUrh+N2ZMhIElMr3BvCuGXOw7XNJMEEJkDUeamK2Rnb/IKFGKRKlTWIGRWA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -git-hooks-list@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" - integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~7.1.6: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^13.6.0, globals@^13.9.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== - dependencies: - type-fest "^0.20.2" - -globby@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.0.tgz#abfcd0630037ae174a88590132c2f6804e291072" - integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.0.3, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - 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" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" - integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== - -handlebars@4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.0, har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -html-tags@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" - integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== - -htmlparser2@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy@^1.18.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-server@^13.0.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/http-server/-/http-server-13.1.0.tgz#ef2ceb4efd08da87e93ac0f33727ecb9f3f4d629" - integrity sha512-MLqBMXeY/YN0FYMz4ifeOQCcg8pKj8YdmzX1pr/Vb2VrNnbxHN1s4K9BuZRVSyK/j3DQ8UVrrABb8m6EmFjWog== - dependencies: - basic-auth "^1.0.3" - chalk "^4.1.2" - corser "^2.0.1" - he "^1.1.0" - http-proxy "^1.18.0" - mime "^1.6.0" - minimist "^1.2.5" - opener "^1.5.1" - portfinder "^1.0.25" - secure-compare "3.0.1" - union "~0.5.0" - url-join "^2.0.5" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http-status-codes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be" - integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng== - -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^7.1.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-promise@^2.1.0, is-promise@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== - -is-regex@^1.0.4, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-regexp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" - integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic.js@^0.2.4: - version "0.2.5" - resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" - integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -jest-worker@^26.5.0: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsdom@15.2.1: - version "15.2.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5" - integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g== - dependencies: - abab "^2.0.0" - acorn "^7.1.0" - acorn-globals "^4.3.2" - array-equal "^1.0.0" - cssom "^0.4.1" - cssstyle "^2.0.0" - data-urls "^1.1.0" - domexception "^1.0.1" - escodegen "^1.11.1" - html-encoding-sniffer "^1.0.2" - nwsapi "^2.2.0" - parse5 "5.1.0" - pn "^1.1.0" - request "^2.88.0" - request-promise-native "^1.0.7" - saxes "^3.1.9" - symbol-tree "^3.2.2" - tough-cookie "^3.0.1" - w3c-hr-time "^1.0.1" - w3c-xmlserializer "^1.1.2" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^7.0.0" - ws "^7.0.0" - xml-name-validator "^3.0.0" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-compare@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" - integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== - dependencies: - lodash "^4.17.4" - -json-schema-merge-allof@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz#64d48820fec26b228db837475ce3338936bf59a5" - integrity sha512-LEw4VMQVRceOPLuGRWcxW5orTTiR9ZAtqTAe4rQUjNADTeR81bezBVFa0MqIwp0YmHIM1KkhSjZM7o+IQhaPbQ== - dependencies: - compute-lcm "^1.1.0" - json-schema-compare "^0.2.2" - lodash "^4.17.4" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-pretty-compact@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz#f71ef9d82ef16483a407869556588e91b681d9ab" - integrity sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA== - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.1, json5@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsonpointer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" - integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== - -jsonwebtoken@8.5.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^5.6.0" - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d" - integrity sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA== - -known-css-properties@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776" - integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA== - -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-js@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55" - integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg== - dependencies: - abstract-leveldown "~6.2.3" - buffer "^5.5.0" - inherits "^2.0.3" - ltgt "^2.1.2" - -level-packager@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - -level@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6" - integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw== - dependencies: - level-js "^5.0.0" - level-packager "^5.1.0" - leveldown "^5.4.0" - -leveldown@^5.4.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98" - integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ== - dependencies: - abstract-leveldown "~6.2.1" - napi-macros "~2.0.0" - node-gyp-build "~4.1.0" - -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lib0@^0.2.31, lib0@^0.2.42, lib0@^0.2.49: - version "0.2.51" - resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.51.tgz#23b1271a26f39120a4d0f86b9dfb44577f5ce98c" - integrity sha512-05Erb3465CxJa38LQlMz4EbetNvRna1S3BzqEjC0/pmp5cQuQSfNNmeS0722Wev1dRlMUp2Cql0gQ55krSXf2Q== - dependencies: - isomorphic.js "^0.2.4" - -license-webpack-plugin@^2.3.14: - version "2.3.21" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz#152f5e82d5f51f8bab78905731f2b8042aa5691b" - integrity sha512-rVaYU9TddZN3ao8M/0PrRSCdTp2EW6VQymlgsuScld1vef0Ou7fALx3ePe83KLP3xAEDcPK5fkqUVqGBnbz1zQ== - dependencies: - "@types/webpack-sources" "^0.1.5" - webpack-sources "^1.2.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^1.0.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0, loader-utils@~2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lockfile@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - integrity sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA== - dependencies: - signal-exit "^3.0.2" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.escape@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" - integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@4, lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowdb@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064" - integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ== - dependencies: - graceful-fs "^4.1.3" - is-promise "^2.1.0" - lodash "4" - pify "^3.0.0" - steno "^0.4.1" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@7.10.1: - version "7.10.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" - integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== - dependencies: - es5-ext "~0.10.2" - -ltgt@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - -lunr-mutable-indexes@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/lunr-mutable-indexes/-/lunr-mutable-indexes-2.3.2.tgz#864253489735d598c5140f3fb75c0a5c8be2e98c" - integrity sha512-Han6cdWAPPFM7C2AigS2Ofl3XjAT0yVMrUixodJEpyg71zCtZ2yzXc3s+suc/OaNt4ca6WJBEzVnEIjxCTwFMw== - dependencies: - lunr ">= 2.3.0 < 2.4.0" - -"lunr@>= 2.3.0 < 2.4.0": - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -marked@4.0.16: - version "4.0.16" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.16.tgz#9ec18fc1a723032eb28666100344d9428cf7a264" - integrity sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA== - -marked@4.0.17, marked@^4.0.10: - version "4.0.17" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.17.tgz#1186193d85bb7882159cdcfc57d1dfccaffb3fe9" - integrity sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA== - -mathml-tag-names@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" - integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memoizee@0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" - integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ== - dependencies: - d "^1.0.1" - es5-ext "^0.10.53" - es6-weak-map "^2.0.3" - event-emitter "^0.3.5" - is-promise "^2.2.2" - lru-queue "^0.1.0" - next-tick "^1.1.0" - timers-ext "^0.1.7" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0, mime@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@~1.3.2: - version "1.3.9" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz#47a32132b0fd97a119acd530e8421e8f6ab16d5e" - integrity sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - webpack-sources "^1.1.0" - -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@~3.0.4: - version "3.0.8" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" - integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@1.0.4, mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -moment@^2.24.0: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mv@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== - dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" - -nan@^2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== - -nanoid@^3.1.23, nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@1, next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@2.6.7, node-fetch@^2.6.0, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb" - integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== - -node-releases@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" - integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize.css@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" - integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== - -npm-run-all@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" - integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== - dependencies: - ansi-styles "^3.2.1" - chalk "^2.4.1" - cross-spawn "^6.0.5" - memorystream "^0.3.1" - minimatch "^3.0.4" - pidtree "^0.3.0" - read-pkg "^3.0.0" - shell-quote "^1.6.1" - string.prototype.padend "^3.0.0" - -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.0, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -opener@^1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -os@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/os/-/os-0.1.2.tgz#f29a50c62908516ba42652de42f7038600cadbc2" - integrity sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" - integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== - -parse-srcset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" - integrity sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q== - -parse5@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" - integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-browserify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -path@~0.12.7: - version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== - dependencies: - process "^0.11.1" - util "^0.10.3" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" - integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pino-std-serializers@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz#b56487c402d882eb96cd67c257868016b61ad671" - integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== - -pino@6.14.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.14.0.tgz#b745ea87a99a6c4c9b374e4f29ca7910d4c69f78" - integrity sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg== - dependencies: - fast-redact "^3.0.0" - fast-safe-stringify "^2.0.8" - flatstr "^1.0.12" - pino-std-serializers "^3.1.0" - process-warning "^1.0.0" - quick-format-unescaped "^4.0.3" - sonic-boom "^1.0.2" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkginfo@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== - -playwright-core@1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.22.2.tgz#ed2963d79d71c2a18d5a6fd25b60b9f0a344661a" - integrity sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q== - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -popper.js@^1.14.4, popper.js@^1.16.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.25: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" - integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-resolve-nested-selector@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" - integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== - -postcss-safe-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" - integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== - -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.2.15, postcss@^8.3.11, postcss@^8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier-bytes@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prettier-bytes/-/prettier-bytes-1.0.4.tgz#994b02aa46f699c50b6257b5faaa7fe2557e62d6" - integrity sha512-dLbWOa4xBn+qeWeIF60qRoB6Pk2jX5P3DIVgOQyMyvBpu931Q+8dXz8X0snJiFkQdohDDLnZQECjzsAj75hgZQ== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.1.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -prettier@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" - integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== - -pretty-ms@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" - integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== - dependencies: - parse-ms "^2.1.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process-warning@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-1.0.0.tgz#980a0b25dc38cd6034181be4b7726d89066b4616" - integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== - -process@^0.11.1, process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - -prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -psl@^1.1.24, psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" - -qs@^6.4.0: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-loader@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" - integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-is@^16.13.1, react-is@^16.9.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-popper@^1.3.7: - version "1.3.11" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.11.tgz#a2cc3f0a67b75b66cfa62d2c409f9dd1fcc71ffd" - integrity sha512-VSA/bS+pSndSF2fiasHK/PTEEAyOpX60+H5EPAjoArr8JGm+oihu4UbrqcEBpQibJxBVCpYyjAX7abJ+7DoYVg== - dependencies: - "@babel/runtime" "^7.1.2" - "@hypnosphi/create-react-context" "^0.3.1" - deep-equal "^1.1.1" - popper.js "^1.14.4" - prop-types "^15.6.1" - typed-styles "^0.0.7" - warning "^4.0.2" - -react-transition-group@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== - dependencies: - dom-helpers "^3.4.0" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" - -react@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.1.4: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.10.0, resolve@^1.20.0, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== - dependencies: - glob "^6.0.1" - -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" - integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sanitize-html@~2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.5.3.tgz#91aa3dc760b072cdf92f9c6973747569b1ba1cd8" - integrity sha512-DGATXd1fs/Rm287/i5FBKVYSBBUL0iAaztOA1/RFhEs4yqo39/X52i/q/CwsfCUG5cilmXSBmnQmyWfnKhBlOg== - dependencies: - deepmerge "^4.2.2" - escape-string-regexp "^4.0.0" - htmlparser2 "^6.0.0" - is-plain-object "^5.0.0" - parse-srcset "^1.0.2" - postcss "^8.3.11" - -saxes@^3.1.9: - version "3.1.11" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" - integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g== - dependencies: - xmlchars "^2.1.1" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -secure-compare@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" - integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.7, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" - integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -sonic-boom@^1.0.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" - integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== - dependencies: - atomic-sleep "^1.0.0" - flatstr "^1.0.12" - -sort-object-keys@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" - integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== - -sort-package-json@~1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.44.0.tgz#470330be868f8a524a4607b26f2a0233e93d8b6d" - integrity sha512-u9GUZvpavUCXV5SbEqXu9FRbsJrYU6WM10r3zA0gymGPufK5X82MblCLh9GW9l46pXKEZvK+FA3eVTqC4oMp4A== - dependencies: - detect-indent "^6.0.0" - detect-newline "3.1.0" - git-hooks-list "1.0.3" - globby "10.0.0" - is-plain-obj "2.1.0" - sort-object-keys "^1.1.3" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - -steno@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" - integrity sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w== - dependencies: - graceful-fs "^4.1.3" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.padend@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1" - integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-loader@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" - integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" - integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== - -stylelint-config-prettier@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.3.tgz#0dccebeff359dcc393c9229184408b08964d561c" - integrity sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg== - -stylelint-config-recommended@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz#fd2523a322836005ad9bf473d3e5534719c09f9d" - integrity sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw== - -stylelint-config-standard@~24.0.0: - version "24.0.0" - resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-24.0.0.tgz#6823f207ab997ae0b641f9a636d007cc44d77541" - integrity sha512-+RtU7fbNT+VlNbdXJvnjc3USNPZRiRVp/d2DxOF/vBDDTi0kH5RX2Ny6errdtZJH3boO+bmqIYEllEmok4jiuw== - dependencies: - stylelint-config-recommended "^6.0.0" - -stylelint-prettier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/stylelint-prettier/-/stylelint-prettier-2.0.0.tgz#ead781aea522379f2ffa2d136bafdfc451d699a5" - integrity sha512-jvT3G+9lopkeB0ARmDPszyfaOnvnIF+30QCjZxyt7E6fynI1T9mOKgYDNb9bXX17M7PXMZaX3j/26wqakjp1tw== - dependencies: - prettier-linter-helpers "^1.0.0" - -stylelint@^14.3.0: - version "14.9.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.9.1.tgz#6494ed38f148b1e75b402d678a3b6a8aae86dfda" - integrity sha512-RdAkJdPiLqHawCSnu21nE27MjNXaVd4WcOHA4vK5GtIGjScfhNnaOuWR2wWdfKFAvcWQPOYe311iveiVKSmwsA== - dependencies: - "@csstools/selector-specificity" "^2.0.1" - balanced-match "^2.0.0" - colord "^2.9.2" - cosmiconfig "^7.0.1" - css-functions-list "^3.1.0" - debug "^4.3.4" - execall "^2.0.0" - fast-glob "^3.2.11" - fastest-levenshtein "^1.0.12" - file-entry-cache "^6.0.1" - get-stdin "^8.0.0" - global-modules "^2.0.0" - globby "^11.1.0" - globjoin "^0.1.4" - html-tags "^3.2.0" - ignore "^5.2.0" - import-lazy "^4.0.0" - imurmurhash "^0.1.4" - is-plain-object "^5.0.0" - known-css-properties "^0.25.0" - mathml-tag-names "^2.1.3" - meow "^9.0.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.14" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.0.10" - postcss-value-parser "^4.2.0" - resolve-from "^5.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - style-search "^0.1.0" - supports-hyperlinks "^2.2.0" - svg-tags "^1.0.0" - table "^6.8.0" - v8-compile-cache "^2.3.0" - write-file-atomic "^4.0.1" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== - -svg-url-loader@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/svg-url-loader/-/svg-url-loader-6.0.0.tgz#b94861d9f6badfb8ca3e7d3ec4655c1bf732ac5d" - integrity sha512-Qr5SCKxyxKcRnvnVrO3iQj9EX/v40UiGEMshgegzV7vpo3yc+HexELOdtWcA3MKjL8IyZZ1zOdcILmDEa/8JJQ== - dependencies: - file-loader "~6.0.0" - loader-utils "~2.0.0" - -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -systeminformation@^5.8.6: - version "5.11.20" - resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.11.20.tgz#a0e1dcfc80c0dac12f1475d9a97e564ba8fa58a2" - integrity sha512-7PTbNtcTBKIdUJ8zY7KeHH0lUArh5IgkJhunWYtaVPQXU1N+9Pk4Ko2Adb3w4qgB6Zmm70SvX6zxnnzca+0j4A== - -table@^6.0.9, table@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar@^6.0.2, tar@^6.1.11: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -terser-webpack-plugin@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^5.1.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" - integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.7" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.7.2" - -terser@^5.3.4, terser@^5.7.2: - version "5.14.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" - integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -"through@>=2.2.7 <3", through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timers-ext@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-string-loader@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/to-string-loader/-/to-string-loader-1.2.0.tgz#4364aa044b9aa876473f4d7a36ef7d216a276e9c" - integrity sha512-KsWUL8FccgBW9FPFm4vYoQbOOcO5m6hKOGYoXjbseD9/4Ft+ravXN5jolQ9kTKYcK4zPt1j+khx97GPGnVoi6A== - dependencies: - loader-utils "^1.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -topojson-client@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/topojson-client/-/topojson-client-3.1.0.tgz#22e8b1ed08a2b922feeb4af6f53b6ef09a467b99" - integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== - dependencies: - commander "2" - -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" - integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== - dependencies: - ip-regex "^2.1.0" - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== - dependencies: - punycode "^2.1.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -typanion@^3.3.1: - version "3.9.0" - resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.9.0.tgz#071a31a0f81c3c31226e190d0a6513ff1c8ae1a3" - integrity sha512-7yPk67IIquhKQcUXOBM27vDuGmZf6oJbEmzgVfDniHCkT6+z4JnKY85nKqbstoec8Kp7hD06TP3Kc98ij43PIg== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== - -typed-styles@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" - integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== - -typescript@~4.1.3: - version "4.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.6.tgz#1becd85d77567c3c741172339e93ce2e69932138" - integrity sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow== - -typestyle@^2.0.4: - version "2.3.0" - resolved "https://registry.yarnpkg.com/typestyle/-/typestyle-2.3.0.tgz#eff768918d5799d12009ec1543369b76b7e5c3ce" - integrity sha512-JZd1R5cWxRvwXzPAKVFsbxO/QjDkFeQlqGF6ZxR7IREEXyFQrf1f1mmlx5EynOTItLLx4aBbcVpCH+CDsl5ZTw== - dependencies: - csstype "3.0.10" - free-style "3.1.0" - -uglify-js@^3.1.4: - version "3.16.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.0.tgz#b778ba0831ca102c1d8ecbdec2d2bdfcc7353190" - integrity sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -union@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" - integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== - dependencies: - qs "^6.4.0" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unix-crypt-td-js@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz#4912dfad1c8aeb7d20fa0a39e4c31918c1d5d5dd" - integrity sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-join@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" - integrity sha512-c2H1fIgpUdwFRIru9HFno5DT73Ok8hg5oOb5AT3ayIgvCRfxgs2jyt5Slw8kEB7j3QUr6yJmMPDT/odjk7jXow== - -url-loader@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-parse@~1.5.1: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate.io-array@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" - integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== - -validate.io-function@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" - integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== - -validate.io-integer-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" - integrity sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA== - dependencies: - validate.io-array "^1.0.3" - validate.io-integer "^1.0.4" - -validate.io-integer@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" - integrity sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ== - dependencies: - validate.io-number "^1.0.3" - -validate.io-number@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" - integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== - -validator@13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vega-canvas@^1.2.5, vega-canvas@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.6.tgz#55e032ce9a62acd17229f6bac66d99db3d6879cd" - integrity sha512-rgeYUpslYn/amIfnuv3Sw6n4BGns94OjjZNtUc9IDji6b+K8LGS/kW+Lvay8JX/oFqtulBp8RLcHN6QjqPLA9Q== - -vega-canvas@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/vega-canvas/-/vega-canvas-1.2.7.tgz#cf62169518f5dcd91d24ad352998c2248f8974fb" - integrity sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q== - -vega-crossfilter@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/vega-crossfilter/-/vega-crossfilter-4.1.1.tgz#3ff3ca0574883706f7a399dc6d60f4a0f065ece4" - integrity sha512-yesvlMcwRwxrtAd9IYjuxWJJuAMI0sl7JvAFfYtuDkkGDtqfLXUcCzHIATqW6igVIE7tWwGxnbfvQLhLNgK44Q== - dependencies: - d3-array "^3.2.2" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" - -vega-dataflow@^5.7.3: - version "5.7.4" - resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.7.4.tgz#7cafc0a41b9d0b11dd2e34a513f8b7ca345dfd74" - integrity sha512-JGHTpUo8XGETH3b1V892we6hdjzCWB977ybycIu8DPqRoyrZuj6t1fCVImazfMgQD1LAfJlQybWP+alwKDpKig== - dependencies: - vega-format "^1.0.4" - vega-loader "^4.3.2" - vega-util "^1.16.1" - -vega-dataflow@^5.7.5, vega-dataflow@~5.7.5: - version "5.7.5" - resolved "https://registry.yarnpkg.com/vega-dataflow/-/vega-dataflow-5.7.5.tgz#0d559f3c3a968831f2995e099a2e270993ddfed9" - integrity sha512-EdsIl6gouH67+8B0f22Owr2tKDiMPNNR8lEvJDcxmFw02nXd8juimclpLvjPQriqn6ta+3Dn5txqfD117H04YA== - dependencies: - vega-format "^1.1.1" - vega-loader "^4.5.1" - vega-util "^1.17.1" - -vega-encode@~4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/vega-encode/-/vega-encode-4.9.1.tgz#bad0e99bebec86d42184bcb898576c8accd91e89" - integrity sha512-05JB47UZaqIBS9t6rtHI/aKjEuH4EsSIH+wJWItht4BFj33eIl4XRNtlXdE31uuQT2pXWz5ZWW3KboMuaFzKLw== - dependencies: - d3-array "^3.2.2" - d3-interpolate "^3.0.1" - vega-dataflow "^5.7.5" - vega-scale "^7.3.0" - vega-util "^1.17.1" - -vega-event-selector@^3.0.1, vega-event-selector@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/vega-event-selector/-/vega-event-selector-3.0.1.tgz#b99e92147b338158f8079d81b28b2e7199c2e259" - integrity sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A== - -vega-event-selector@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/vega-event-selector/-/vega-event-selector-3.0.0.tgz#7b855ac0c3ddb59bc5b5caa0d96dbbc9fbd33a4c" - integrity sha512-Gls93/+7tEJGE3kUuUnxrBIxtvaNeF01VIFB2Q2Of2hBIBvtHX74jcAdDtkh5UhhoYGD8Q1J30P5cqEBEwtPoQ== - -vega-expression@^5.0.1, vega-expression@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-5.0.1.tgz#e6a6eff564d2a93496a9bf34cbc78d8942f236a8" - integrity sha512-atfzrMekrcsuyUgZCMklI5ki8cV763aeo1Y6YrfYU7FBwcQEoFhIV/KAJ1vae51aPDGtfzvwbtVIo3WShFCP2Q== - dependencies: - "@types/estree" "^1.0.0" - vega-util "^1.17.1" - -vega-expression@~5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/vega-expression/-/vega-expression-5.0.0.tgz#938f26689693a1e0d26716030cdaed43ca7abdfb" - integrity sha512-y5+c2frq0tGwJ7vYXzZcfVcIRF/QGfhf2e+bV1Z0iQs+M2lI1II1GPDdmOcMKimpoCVp/D61KUJDIGE1DSmk2w== - dependencies: - "@types/estree" "^0.0.50" - vega-util "^1.16.0" - -vega-force@~4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vega-force/-/vega-force-4.2.0.tgz#5374d0dbac674c92620a9801e12b650b0966336a" - integrity sha512-aE2TlP264HXM1r3fl58AvZdKUWBNOGkIvn4EWyqeJdgO2vz46zSU7x7TzPG4ZLuo44cDRU5Ng3I1eQk23Asz6A== - dependencies: - d3-force "^3.0.0" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" - -vega-format@^1.0.4, vega-format@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vega-format/-/vega-format-1.1.0.tgz#b9d81cf1bcf222ae5cbd94357ae70245d2c7b18d" - integrity sha512-6mgpeWw8yGdG0Zdi8aVkx5oUrpJGOpNxqazC2858RSDPvChM/jDFlgRMTYw52qk7cxU0L08ARp4BwmXaI75j0w== - dependencies: - d3-array "^3.1.1" - d3-format "^3.1.0" - d3-time-format "^4.1.0" - vega-time "^2.0.3" - vega-util "^1.15.2" - -vega-format@^1.1.1, vega-format@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vega-format/-/vega-format-1.1.1.tgz#92e4876e18064e7ad54f39045f7b24dede0030b8" - integrity sha512-Rll7YgpYbsgaAa54AmtEWrxaJqgOh5fXlvM2wewO4trb9vwM53KBv4Q/uBWCLK3LLGeBXIF6gjDt2LFuJAUtkQ== - dependencies: - d3-array "^3.2.2" - d3-format "^3.1.0" - d3-time-format "^4.1.0" - vega-time "^2.1.1" - vega-util "^1.17.1" - -vega-functions@^5.13.1, vega-functions@~5.13.1: - version "5.13.1" - resolved "https://registry.yarnpkg.com/vega-functions/-/vega-functions-5.13.1.tgz#504d672924495fe3ea844e6940c7f6e151cde151" - integrity sha512-0LhntimnvBl4VzRO/nkCwCTbtaP8bE552galKQbCg88GDxdmcmlsoTCwUzG0vZ/qmNM3IbqnP5k5/um3zwFqLw== - dependencies: - d3-array "^3.2.2" - d3-color "^3.1.0" - d3-geo "^3.1.0" - vega-dataflow "^5.7.5" - vega-expression "^5.0.1" - vega-scale "^7.3.0" - vega-scenegraph "^4.10.2" - vega-selections "^5.4.1" - vega-statistics "^1.8.1" - vega-time "^2.1.1" - vega-util "^1.17.1" - -vega-geo@~4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/vega-geo/-/vega-geo-4.4.1.tgz#3850232bf28c98fab5e26c5fb401acb6fb37b5e5" - integrity sha512-s4WeZAL5M3ZUV27/eqSD3v0FyJz3PlP31XNSLFy4AJXHxHUeXT3qLiDHoVQnW5Om+uBCPDtTT1ROx1smGIf2aA== - dependencies: - d3-array "^3.2.2" - d3-color "^3.1.0" - d3-geo "^3.1.0" - vega-canvas "^1.2.7" - vega-dataflow "^5.7.5" - vega-projection "^1.6.0" - vega-statistics "^1.8.1" - vega-util "^1.17.1" - -vega-hierarchy@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/vega-hierarchy/-/vega-hierarchy-4.1.1.tgz#897974a477dfa70cc0d4efab9465b6cc79a9071f" - integrity sha512-h5mbrDtPKHBBQ9TYbvEb/bCqmGTlUX97+4CENkyH21tJs7naza319B15KRK0NWOHuhbGhFmF8T0696tg+2c8XQ== - dependencies: - d3-hierarchy "^3.1.2" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" - -vega-label@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vega-label/-/vega-label-1.2.1.tgz#ea45fa5a407991c44edfea9c4ca40874d544a3db" - integrity sha512-n/ackJ5lc0Xs9PInCaGumYn2awomPjJ87EMVT47xNgk2bHmJoZV1Ve/1PUM6Eh/KauY211wPMrNp/9Im+7Ripg== - dependencies: - vega-canvas "^1.2.6" - vega-dataflow "^5.7.3" - vega-scenegraph "^4.9.2" - vega-util "^1.15.2" - -vega-lite@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vega-lite/-/vega-lite-5.2.0.tgz#bc3c5c70a38d9de8f3fb9644c7dd52f3b9f47a1b" - integrity sha512-Yxcg8MvYfxHcG6BbkaKT0oVCIMIcE19UvqIsEwBmyd/7h2nzW7oRnID81T8UrY7hpDrIr6wa2JADOT2dhGNErw== - dependencies: - "@types/clone" "~2.1.1" - array-flat-polyfill "^1.0.1" - clone "~2.1.2" - fast-deep-equal "~3.1.3" - fast-json-stable-stringify "~2.1.0" - json-stringify-pretty-compact "~3.0.0" - tslib "~2.3.1" - vega-event-selector "~3.0.0" - vega-expression "~5.0.0" - vega-util "~1.17.0" - yargs "~17.2.1" - -vega-loader@^4.3.2, vega-loader@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.5.0.tgz#b15acc4c8f84191f500e94d35ddfb9721ac943ad" - integrity sha512-EkAyzbx0pCYxH3v3wghGVCaKINWxHfgbQ2pYDiYv0yo8e04S8Mv/IlRGTt6BAe7cLhrk1WZ4zh20QOppnGG05w== - dependencies: - d3-dsv "^3.0.1" - node-fetch "^2.6.7" - topojson-client "^3.1.0" - vega-format "^1.1.0" - vega-util "^1.16.0" - -vega-loader@^4.5.1, vega-loader@~4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/vega-loader/-/vega-loader-4.5.1.tgz#b85262b3cb8376487db0c014a8a13c3a5e6d52ad" - integrity sha512-qy5x32SaT0YkEujQM2yKqvLGV9XWQ2aEDSugBFTdYzu/1u4bxdUSRDREOlrJ9Km3RWIOgFiCkobPmFxo47SKuA== - dependencies: - d3-dsv "^3.0.1" - node-fetch "^2.6.7" - topojson-client "^3.1.0" - vega-format "^1.1.1" - vega-util "^1.17.1" - -vega-parser@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/vega-parser/-/vega-parser-6.2.0.tgz#c982aff0a6409486cbbe743a5799412b8b897654" - integrity sha512-as+QnX8Qxe9q51L1C2sVBd+YYYctP848+zEvkBT2jlI2g30aZ6Uv7sKsq7QTL6DUbhXQKR0XQtzlanckSFdaOQ== - dependencies: - vega-dataflow "^5.7.5" - vega-event-selector "^3.0.1" - vega-functions "^5.13.1" - vega-scale "^7.3.0" - vega-util "^1.17.1" - -vega-projection@^1.6.0, vega-projection@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/vega-projection/-/vega-projection-1.6.0.tgz#921acd3220e7d9d04ccd5ce0109433afb3236966" - integrity sha512-LGUaO/kpOEYuTlul+x+lBzyuL9qmMwP1yShdUWYLW+zXoeyGbs5OZW+NbPPwLYqJr5lpXDr/vGztFuA/6g2xvQ== - dependencies: - d3-geo "^3.1.0" - d3-geo-projection "^4.0.0" - vega-scale "^7.3.0" - -vega-regression@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vega-regression/-/vega-regression-1.1.1.tgz#b53a964152a2fec4847e31571f522bfda23089af" - integrity sha512-98i/z0vdDhOIEhJUdYoJ2nlfVdaHVp2CKB39Qa7G/XyRw0+QwDFFrp8ZRec2xHjHfb6bYLGNeh1pOsC13FelJg== - dependencies: - d3-array "^3.2.2" - vega-dataflow "^5.7.3" - vega-statistics "^1.7.9" - vega-util "^1.15.2" - -vega-runtime@^6.1.4, vega-runtime@~6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/vega-runtime/-/vega-runtime-6.1.4.tgz#98b67160cea9554e690bfd44719f9d17f90c4220" - integrity sha512-0dDYXyFLQcxPQ2OQU0WuBVYLRZnm+/CwVu6i6N4idS7R9VXIX5581EkCh3pZ20pQ/+oaA7oJ0pR9rJgJ6rukRQ== - dependencies: - vega-dataflow "^5.7.5" - vega-util "^1.17.1" - -vega-scale@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-7.2.0.tgz#9e298cc02ad340498cb56847436b19439911f0fc" - integrity sha512-QYltO/otrZHLrCGGf06Y99XtPtqWXITr6rw7rO9oL+l3d9o5RFl9sjHrVxiM7v+vGoZVWbBd5IPbFhPsXZ6+TA== - dependencies: - d3-array "^3.1.1" - d3-interpolate "^3.0.1" - d3-scale "^4.0.2" - vega-time "^2.1.0" - vega-util "^1.17.0" - -vega-scale@^7.3.0, vega-scale@~7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/vega-scale/-/vega-scale-7.3.0.tgz#02b83435a892c6d91a87ee7d3d350fac987f464b" - integrity sha512-pMOAI2h+e1z7lsqKG+gMfR6NKN2sTcyjZbdJwntooW0uFHwjLGjMSY7kSd3nSEquF0HQ8qF7zR6gs1eRwlGimw== - dependencies: - d3-array "^3.2.2" - d3-interpolate "^3.0.1" - d3-scale "^4.0.2" - vega-time "^2.1.1" - vega-util "^1.17.1" - -vega-scenegraph@^4.10.2, vega-scenegraph@~4.10.2: - version "4.10.2" - resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz#3ae9ad8e99bbf75e2a4f3ebf2c1f9dee7562d245" - integrity sha512-R8m6voDZO5+etwNMcXf45afVM3XAtokMqxuDyddRl9l1YqSJfS+3u8hpolJ50c2q6ZN20BQiJwKT1o0bB7vKkA== - dependencies: - d3-path "^3.1.0" - d3-shape "^3.2.0" - vega-canvas "^1.2.7" - vega-loader "^4.5.1" - vega-scale "^7.3.0" - vega-util "^1.17.1" - -vega-scenegraph@^4.9.2: - version "4.10.1" - resolved "https://registry.yarnpkg.com/vega-scenegraph/-/vega-scenegraph-4.10.1.tgz#944da67b8a28758fab2e1306259fb7ff6be89f6b" - integrity sha512-takIpkmNxYHhJYALOYzhTin3EDzbys6U4g+l1yJZVlXG9YTdiCMuEVAdtaQOCqF9/7qytD6pCrMxJY2HaoN0qQ== - dependencies: - d3-path "^3.0.1" - d3-shape "^3.1.0" - vega-canvas "^1.2.5" - vega-loader "^4.4.0" - vega-scale "^7.2.0" - vega-util "^1.15.2" - -vega-selections@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/vega-selections/-/vega-selections-5.4.1.tgz#3233acb920703bfc323df8b960aa52e55ac08c70" - integrity sha512-EtYc4DvA+wXqBg9tq+kDomSoVUPCmQfS7hUxy2qskXEed79YTimt3Hcl1e1fW226I4AVDBEqTTKebmKMzbSgAA== - dependencies: - d3-array "3.2.2" - vega-expression "^5.0.1" - vega-util "^1.17.1" - -vega-statistics@^1.7.9: - version "1.8.0" - resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.8.0.tgz#ad66f7461473d58bc96671588981a059ffd60b59" - integrity sha512-dl+LCRS6qS4jWDme/NEdPVt5r649uB4IK6Kyr2/czmGA5JqjuFmtQ9lHQOnRu8945XLkqLf+JIQQo7vnw+nslA== - dependencies: - d3-array "^3.1.1" - -vega-statistics@^1.8.1, vega-statistics@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/vega-statistics/-/vega-statistics-1.8.1.tgz#596fc3713ac68cc649bf28d0faf7def5ef34fef6" - integrity sha512-eRR3LZBusnTXUkc/uunAvWi1PjCJK+Ba4vFvEISc5Iv5xF4Aw2cBhEz1obEt6ID5fGVCTAl0E1LOSFxubS89hQ== - dependencies: - d3-array "^3.2.2" - -vega-time@^2.0.3, vega-time@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/vega-time/-/vega-time-2.1.0.tgz#acfbab88d7798b87ff63913b0dce2ca5eb0d46ca" - integrity sha512-Q9/l3S6Br1RPX5HZvyLD/cQ4K6K8DtpR09/1y7D66gxNorg2+HGzYZINH9nUvN3mxoXcBWg4cCUh3+JvmkDaEg== - dependencies: - d3-array "^3.1.1" - d3-time "^3.0.0" - vega-util "^1.15.2" - -vega-time@^2.1.1, vega-time@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/vega-time/-/vega-time-2.1.1.tgz#0f1fb4e220dd5ed57401b58fb2293241f049ada0" - integrity sha512-z1qbgyX0Af2kQSGFbApwBbX2meenGvsoX8Nga8uyWN8VIbiySo/xqizz1KrP6NbB6R+x5egKmkjdnyNThPeEWA== - dependencies: - d3-array "^3.2.2" - d3-time "^3.1.0" - vega-util "^1.17.1" - -vega-transforms@~4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/vega-transforms/-/vega-transforms-4.10.1.tgz#5e51f4f3a745d43609e0d8ba1d74a7e53014030a" - integrity sha512-0uWrUZaYl8kjWrGbvPOQSKk6kcNXQFY9moME+bUmkADAvFptphCGbaEIn/nSsG6uCxj8E3rqKmKfjSWdU5yOqA== - dependencies: - d3-array "^3.2.2" - vega-dataflow "^5.7.5" - vega-statistics "^1.8.1" - vega-time "^2.1.1" - vega-util "^1.17.1" - -vega-typings@~0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/vega-typings/-/vega-typings-0.24.0.tgz#e659286c43c63b68cf29a3131360829d129eeb84" - integrity sha512-FFYf67Dn5VNPbYoYHgO2T9Z1I81qcwrXjwKEe0rlJk0MX7CNWPJr9Y3VZEWfxyEx7J9anAm69hGIv0Ehb2G85A== - dependencies: - "@types/geojson" "^7946.0.10" - vega-event-selector "^3.0.1" - vega-expression "^5.0.1" - vega-util "^1.17.1" - -vega-util@^1.15.2, vega-util@^1.16.0, vega-util@^1.16.1, vega-util@^1.17.0, vega-util@~1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.17.0.tgz#b72ae0baa97f943bf591f8f5bb27ceadf06834ac" - integrity sha512-HTaydZd9De3yf+8jH66zL4dXJ1d1p5OIFyoBzFiOli4IJbwkL1jrefCKz6AHDm1kYBzDJ0X4bN+CzZSCTvNk1w== - -vega-util@^1.17.1, vega-util@~1.17.1: - version "1.17.1" - resolved "https://registry.yarnpkg.com/vega-util/-/vega-util-1.17.1.tgz#717865fc6b660ceb3ae16273d21166ed471c2db4" - integrity sha512-ToPkWoBdP6awoK+bnYaFhgdqZhsNwKxWbuMnFell+4K/Cb6Q1st5Pi9I7iI5Y6n5ZICDDsd6eL7/IhBjEg1NUQ== - -vega-view-transforms@~4.5.9: - version "4.5.9" - resolved "https://registry.yarnpkg.com/vega-view-transforms/-/vega-view-transforms-4.5.9.tgz#5f109555c08ee9ac23ff9183d578eb9cbac6fe61" - integrity sha512-NxEq4ZD4QwWGRrl2yDLnBRXM9FgCI+vvYb3ZC2+nVDtkUxOlEIKZsMMw31op5GZpfClWLbjCT3mVvzO2xaTF+g== - dependencies: - vega-dataflow "^5.7.5" - vega-scenegraph "^4.10.2" - vega-util "^1.17.1" - -vega-view@~5.11.1: - version "5.11.1" - resolved "https://registry.yarnpkg.com/vega-view/-/vega-view-5.11.1.tgz#a703d7d6344489c6a6e9e9d9c7a732519bf4432c" - integrity sha512-RoWxuoEMI7xVQJhPqNeLEHCezudsf3QkVMhH5tCovBqwBADQGqq9iWyax3ZzdyX1+P3eBgm7cnLvpqtN2hU8kA== - dependencies: - d3-array "^3.2.2" - d3-timer "^3.0.1" - vega-dataflow "^5.7.5" - vega-format "^1.1.1" - vega-functions "^5.13.1" - vega-runtime "^6.1.4" - vega-scenegraph "^4.10.2" - vega-util "^1.17.1" - -vega-voronoi@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vega-voronoi/-/vega-voronoi-4.2.1.tgz#521a22d3d4c545fe1d5eea19eac0fd3ac5e58b1b" - integrity sha512-zzi+fxU/SBad4irdLLsG3yhZgXWZezraGYVQfZFWe8kl7W/EHUk+Eqk/eetn4bDeJ6ltQskX+UXH3OP5Vh0Q0Q== - dependencies: - d3-delaunay "^6.0.2" - vega-dataflow "^5.7.5" - vega-util "^1.17.1" - -vega-wordcloud@~4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/vega-wordcloud/-/vega-wordcloud-4.1.4.tgz#38584cf47ef52325d6a8dc38908b5d2378cc6e62" - integrity sha512-oeZLlnjiusLAU5vhk0IIdT5QEiJE0x6cYoGNq1th+EbwgQp153t4r026fcib9oq15glHFOzf81a8hHXHSJm1Jw== - dependencies: - vega-canvas "^1.2.7" - vega-dataflow "^5.7.5" - vega-scale "^7.3.0" - vega-statistics "^1.8.1" - vega-util "^1.17.1" - -vega@^5.20.0: - version "5.24.0" - resolved "https://registry.yarnpkg.com/vega/-/vega-5.24.0.tgz#47ccf9288d06cf0be6f1e83bf38647de2bda3ca8" - integrity sha512-eahZ+4eryPywLuq9BpgcwWMyqiuVD3FAh7eMB3koOp7peQ4scPxAZxWdLwnh0t0kah+oE2QcXi2EHS4BabsMPg== - dependencies: - vega-crossfilter "~4.1.1" - vega-dataflow "~5.7.5" - vega-encode "~4.9.1" - vega-event-selector "~3.0.1" - vega-expression "~5.0.1" - vega-force "~4.2.0" - vega-format "~1.1.1" - vega-functions "~5.13.1" - vega-geo "~4.4.1" - vega-hierarchy "~4.1.1" - vega-label "~1.2.1" - vega-loader "~4.5.1" - vega-parser "~6.2.0" - vega-projection "~1.6.0" - vega-regression "~1.1.1" - vega-runtime "~6.1.4" - vega-scale "~7.3.0" - vega-scenegraph "~4.10.2" - vega-statistics "~1.8.1" - vega-time "~2.1.1" - vega-transforms "~4.10.1" - vega-typings "~0.24.0" - vega-util "~1.17.1" - vega-view "~5.11.1" - vega-view-transforms "~4.5.9" - vega-voronoi "~4.2.1" - vega-wordcloud "~4.1.4" - -verdaccio-audit@10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/verdaccio-audit/-/verdaccio-audit-10.2.2.tgz#254380e57932fda64b45cb739e9c42cc9fb2dfdf" - integrity sha512-f2uZlKD7vi0yEB0wN8WOf+eA/3SCyKD9cvK17Hh7Wm8f/bl7k1B3hHOTtUCn/yu85DGsj2pcNzrAfp2wMVgz9Q== - dependencies: - body-parser "1.20.0" - express "4.18.1" - https-proxy-agent "5.0.1" - node-fetch "2.6.7" - -verdaccio-htpasswd@10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/verdaccio-htpasswd/-/verdaccio-htpasswd-10.3.1.tgz#bda843dde3752e0ae2d4d2a5ba03fe922eef219a" - integrity sha512-FakeVHTyunBGurCTvkZgm89EkA9bxmcbUWrJ1rlUCFg48XpUtgHnemfH3pXRgItTX+cgLWENzK0jIpzkf7qUPw== - dependencies: - "@verdaccio/file-locking" "10.3.0" - apache-md5 "1.1.7" - bcryptjs "2.4.3" - http-errors "2.0.0" - unix-crypt-td-js "1.1.4" - -verdaccio@^5.1.1: - version "5.12.0" - resolved "https://registry.yarnpkg.com/verdaccio/-/verdaccio-5.12.0.tgz#dca3e44247b40e82db0f31a95ebbd9fd1720f2c0" - integrity sha512-2G/HcN21pVyyNtv4LyWYcGyScRwLZsC/b+MCG7AUinfG7aWbJmnNjj7grrCxnfDK1I9CVL3OnTVfveN9xsNFFg== - dependencies: - "@verdaccio/commons-api" "10.2.0" - "@verdaccio/local-storage" "10.3.0" - "@verdaccio/readme" "10.3.4" - "@verdaccio/streams" "10.2.0" - "@verdaccio/ui-theme" "6.0.0-6-next.24" - JSONStream "1.3.5" - async "3.2.4" - body-parser "1.20.0" - clipanion "3.1.0" - compression "1.7.4" - cookies "0.8.0" - cors "2.8.5" - dayjs "1.11.3" - debug "^4.3.3" - envinfo "7.8.1" - eslint-import-resolver-node "0.3.6" - express "4.18.1" - express-rate-limit "5.5.1" - fast-safe-stringify "2.1.1" - handlebars "4.7.7" - http-errors "2.0.0" - js-yaml "4.1.0" - jsonwebtoken "8.5.1" - kleur "4.1.4" - lodash "4.17.21" - lru-cache "7.10.1" - lunr-mutable-indexes "2.3.2" - marked "4.0.17" - memoizee "0.4.15" - mime "3.0.0" - minimatch "5.1.0" - mkdirp "1.0.4" - mv "2.1.1" - pino "6.14.0" - pkginfo "0.4.1" - prettier-bytes "^1.0.4" - pretty-ms "^7.0.1" - request "2.88.0" - semver "7.3.7" - validator "13.7.0" - verdaccio-audit "10.2.2" - verdaccio-htpasswd "10.3.1" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -w3c-hr-time@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" - integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg== - dependencies: - domexception "^1.0.1" - webidl-conversions "^4.0.2" - xml-name-validator "^3.0.0" - -warning@^4.0.2, warning@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webpack-cli@^4.1.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" - integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.2.0" - "@webpack-cli/info" "^1.5.0" - "@webpack-cli/serve" "^1.7.0" - colorette "^2.0.14" - commander "^7.0.0" - cross-spawn "^7.0.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-merge@^5.1.2, webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.41.1: - version "5.76.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" - integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -worker-loader@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-3.0.8.tgz#5fc5cda4a3d3163d9c274a4e3a811ce8b60dbb37" - integrity sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^7.0.0, ws@^7.4.6: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@^4.0.2, xtend@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y-codemirror@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/y-codemirror/-/y-codemirror-3.0.1.tgz#d8a4e43cf46b5b557e0f03b7bbb65773ff436278" - integrity sha512-TsLSoouAZxkxOKbmTj7qdwZNS0lZMVqIdp7/j9EgUUqYj0remZYDGl6VBABrmp9UX1QvX6RoXXqzbNhftgfCbA== - dependencies: - lib0 "^0.2.42" - -y-leveldb@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/y-leveldb/-/y-leveldb-0.1.1.tgz#c2c35bc2b12a6c195b807a127c56c7c5a50cc610" - integrity sha512-L8Q0MQmxCQ0qWIOuPzLbWn95TNhrCI7M6LaHnilU4I2IX08e4Dmfg5Tgy4JZ3tnl2aiuZyDOJplHl/msIB/IsA== - dependencies: - level "^6.0.1" - lib0 "^0.2.31" - -y-protocols@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.5.tgz#91d574250060b29fcac8f8eb5e276fbad594245e" - integrity sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A== - dependencies: - lib0 "^0.2.42" - -y-websocket@^1.3.15: - version "1.4.3" - resolved "https://registry.yarnpkg.com/y-websocket/-/y-websocket-1.4.3.tgz#4d4ca00832f0ab813e44a952f3088bd1eb5058f6" - integrity sha512-VobyJaAoyWIETETNZragnTpL7kcJr8a/CIUQP6DfXcQ4v0UmZUuANdsPsbmMjDsEeUECVFRhHauxpDtRhYqkaQ== - dependencies: - lib0 "^0.2.42" - lodash.debounce "^4.0.8" - y-protocols "^1.0.5" - optionalDependencies: - ws "^6.2.1" - y-leveldb "^0.1.0" - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@~17.2.1: - version "17.2.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea" - integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yjs@^13.5.17: - version "13.5.39" - resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.5.39.tgz#656763e61bfa0e50162657a8372ac2a50d955c6a" - integrity sha512-EoVT856l301lomtjjVspgTdSRiFqZ7gNKnmVPX4/V8NHI5EYS39/MdjB9iNv0Mw1weKDZRU8NgxgerqwJ3y2xA== - dependencies: - lib0 "^0.2.49" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@babel/code-frame@npm:7.12.11": + version: 7.12.11 + resolution: "@babel/code-frame@npm:7.12.11" + dependencies: + "@babel/highlight": ^7.10.4 + checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3 + languageName: node + linkType: hard + +"@babel/code-frame@npm:^7.0.0": + version: 7.22.5 + resolution: "@babel/code-frame@npm:7.22.5" + dependencies: + "@babel/highlight": ^7.22.5 + checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-validator-identifier@npm:7.22.5" + checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/highlight@npm:7.22.5" + dependencies: + "@babel/helper-validator-identifier": ^7.22.5 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + languageName: node + linkType: hard + +"@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.3.2, @codemirror/autocomplete@npm:^6.5.1": + version: 6.8.0 + resolution: "@codemirror/autocomplete@npm:6.8.0" + dependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.6.0 + "@lezer/common": ^1.0.0 + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: b251a21065a954be7a4a9cf6fd1dce6027bd79ac7006728c0fde364b50c75ee4079bd53acf9890fdfdca78453c863f0c010010c26010cd9acdede3480273ad23 + languageName: node + linkType: hard + +"@codemirror/commands@npm:^6.2.3": + version: 6.2.4 + resolution: "@codemirror/commands@npm:6.2.4" + dependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + checksum: 468895fa19ff0554181b698c81f850820de5c0289cab92c44392fb127286f09ca72b921d6ea4353b70b616a4fd0c3667d86b6f917202a3ad2e196eb7b581f7b6 + languageName: node + linkType: hard + +"@codemirror/lang-cpp@npm:^6.0.2": + version: 6.0.2 + resolution: "@codemirror/lang-cpp@npm:6.0.2" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/cpp": ^1.0.0 + checksum: bb9eba482cca80037ce30c7b193cf45eff19ccbb773764fddf2071756468ecc25aa53c777c943635054f89095b0247b9b50c339e107e41e68d34d12a7295f9a9 + languageName: node + linkType: hard + +"@codemirror/lang-css@npm:^6.0.0, @codemirror/lang-css@npm:^6.1.1": + version: 6.2.0 + resolution: "@codemirror/lang-css@npm:6.2.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.2 + "@lezer/css": ^1.0.0 + checksum: d824f169083613b63f04992c24d3fecd45c718cd3deb9da3f332dd3a889a762d05ea812e31ddf7ee4b661722f8c8b49676515cb98609067c53e25ac8b469a5e4 + languageName: node + linkType: hard + +"@codemirror/lang-html@npm:^6.0.0, @codemirror/lang-html@npm:^6.4.3": + version: 6.4.4 + resolution: "@codemirror/lang-html@npm:6.4.4" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/lang-css": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/language": ^6.4.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.2.2 + "@lezer/common": ^1.0.0 + "@lezer/css": ^1.1.0 + "@lezer/html": ^1.3.0 + checksum: 99693fee5392c85b0974c4cfd015aa9ba6e015baf8abbddfbb1f5f8c4801e78c3d053d8b19e1dafe3d913b2902e97ed6c95d8a237cd496e8fbcc1548cebe6485 + languageName: node + linkType: hard + +"@codemirror/lang-java@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-java@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/java": ^1.0.0 + checksum: 4679104683cbffcd224ac04c7e5d144b787494697b26470b07017259035b7bb3fa62609d9a61bfbc566f1756d9f972f9f26d96a3c1362dd48881c1172f9a914d + languageName: node + linkType: hard + +"@codemirror/lang-javascript@npm:^6.0.0, @codemirror/lang-javascript@npm:^6.1.7": + version: 6.1.9 + resolution: "@codemirror/lang-javascript@npm:6.1.9" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.6.0 + "@codemirror/lint": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/javascript": ^1.0.0 + checksum: 6c79b51c61d37b3f4dde6312df02183045c31f055e5cf8550b497f39798b823b4e380a641a2cfc97f3f26fd4e89194258d8ef741c42acd72b3f2e18257b427a5 + languageName: node + linkType: hard + +"@codemirror/lang-json@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-json@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/json": ^1.0.0 + checksum: e9e87d50ff7b81bd56a6ab50740b1dd54e9a93f1be585e1d59d0642e2148842ea1528ac7b7221eb4ddc7fe84bbc28065144cc3ab86f6e06c6aeb2d4b4e62acf1 + languageName: node + linkType: hard + +"@codemirror/lang-markdown@npm:^6.1.1": + version: 6.1.1 + resolution: "@codemirror/lang-markdown@npm:6.1.1" + dependencies: + "@codemirror/lang-html": ^6.0.0 + "@codemirror/language": ^6.3.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/markdown": ^1.0.0 + checksum: db891dad10a8ea8db17d0a9222774389794cb0957b784e3f154bf27ab4a9be89a28ad4c2f6abf7d829115c3ce46694a2816b61723a5d5776c1d75d566ce016c8 + languageName: node + linkType: hard + +"@codemirror/lang-php@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-php@npm:6.0.1" + dependencies: + "@codemirror/lang-html": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/php": ^1.0.0 + checksum: c003a29a426486453fdfddbf7302982fa2aa7f059bf6f1ce4cbf08341b0162eee5e2f50e0d71c418dcd358491631780156d846fe352754d042576172c5d86721 + languageName: node + linkType: hard + +"@codemirror/lang-python@npm:^6.1.2": + version: 6.1.3 + resolution: "@codemirror/lang-python@npm:6.1.3" + dependencies: + "@codemirror/autocomplete": ^6.3.2 + "@codemirror/language": ^6.8.0 + "@lezer/python": ^1.1.4 + checksum: 65a0276a4503e4e3b70dd28d1c93ef472632b6d2c4bf3ae92d305d14ee8cf60b0bbbf62d5ceb51294de9598d9e2d42eafcde26f317ee7b90d0a11dfa863c1d1a + languageName: node + linkType: hard + +"@codemirror/lang-rust@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-rust@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/rust": ^1.0.0 + checksum: 8a439944cb22159b0b3465ca4fa4294c69843219d5d30e278ae6df8e48f30a7a9256129723c025ec9b5e694d31a3560fb004300b125ffcd81c22d13825845170 + languageName: node + linkType: hard + +"@codemirror/lang-sql@npm:^6.4.1": + version: 6.5.0 + resolution: "@codemirror/lang-sql@npm:6.5.0" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 5bc73293d85f3892633703f277787336c00135011b14ca34a3590975a02c5ec1d6826d201d827e3dfc1d3427e28d23f36b1ef4fd69fc5d79c98290030c11dad5 + languageName: node + linkType: hard + +"@codemirror/lang-wast@npm:^6.0.1": + version: 6.0.1 + resolution: "@codemirror/lang-wast@npm:6.0.1" + dependencies: + "@codemirror/language": ^6.0.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 600d98d3ea6a4e99292244ed707e39a2abd9f3abf62cfeff5c819a0cc0c7e86b8c5b91e91c1b7ea21233d9ea09c41abe61d8a40b2547bb5db74239c6df857934 + languageName: node + linkType: hard + +"@codemirror/lang-xml@npm:^6.0.2": + version: 6.0.2 + resolution: "@codemirror/lang-xml@npm:6.0.2" + dependencies: + "@codemirror/autocomplete": ^6.0.0 + "@codemirror/language": ^6.4.0 + "@codemirror/state": ^6.0.0 + "@lezer/common": ^1.0.0 + "@lezer/xml": ^1.0.0 + checksum: e156ecafaa87e9b6ef4ab6812ccd00d8f3c6cb81f232837636b36336d80513b61936dfee6f4f6800574f236208b61e95a2abcb997cdcd7366585a6b796e0e13b + languageName: node + linkType: hard + +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.3.0, @codemirror/language@npm:^6.4.0, @codemirror/language@npm:^6.6.0, @codemirror/language@npm:^6.8.0": + version: 6.8.0 + resolution: "@codemirror/language@npm:6.8.0" + dependencies: + "@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 + checksum: 64408d996641931fa4c6b892e17ee1fdaee0f63d3d84c019a6ea7b1e6d1c774f92357b95c2ebaed60545062b795b72d0a058c03578b2bf4023c87726e97b5d2f + languageName: node + linkType: hard + +"@codemirror/legacy-modes@npm:^6.3.2": + version: 6.3.2 + resolution: "@codemirror/legacy-modes@npm:6.3.2" + dependencies: + "@codemirror/language": ^6.0.0 + checksum: fa5f5477fb9e19267251e2ecd3de8c1a4c2512813555bb60111dce3951f2c3f6080a2985a573b7542534ba1d2c34115f7e39ee23fdf8f6f81db6f8ce447c1efc + languageName: node + linkType: hard + +"@codemirror/lint@npm:^6.0.0": + version: 6.2.2 + resolution: "@codemirror/lint@npm:6.2.2" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: f37dea6f84b5ee74e4e77c0ad244a3e0c10beb26542c5e10b2d5655f1fab3a9e580da2d772f2a6e3b09eb944ef8a52ff4e1b61cb8a02ee78e97f2ae8ae13842a + languageName: node + linkType: hard + +"@codemirror/search@npm:^6.3.0": + version: 6.5.0 + resolution: "@codemirror/search@npm:6.5.0" + dependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + crelt: ^1.0.5 + checksum: 2e9f2344b7dbd4bad79058c105d8cbd02b2bf94c27495310f0e3b6e999010aa080dceea47ef46e35439cc9e131b47c46f7d2eda700ef491b5f2f34bbc8e145ab + languageName: node + linkType: hard + +"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.4, @codemirror/state@npm:^6.2.0": + version: 6.2.1 + resolution: "@codemirror/state@npm:6.2.1" + checksum: d12a321d0471b264b9d3259042bff913a8b939e8d28d408ff452004538a71ca9d5329df3f8a1d8a9183f5b42a7ef5b200737bcab1065714f5ae8e0a5ba9d59d3 + languageName: node + linkType: hard + +"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.2.2, @codemirror/view@npm:^6.6.0, @codemirror/view@npm:^6.9.6": + version: 6.13.2 + resolution: "@codemirror/view@npm:6.13.2" + dependencies: + "@codemirror/state": ^6.1.4 + style-mod: ^4.0.0 + w3c-keyname: ^2.2.4 + checksum: db0d638fbbe2f9a832674f06512ca55cdb7576a265c01ab8a7b6715d2a50ddf53200f597637b146adebe1df51255fe5bd2d2c74cf1fa539b0434764c0550d3a5 + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^2.0.2": + version: 2.2.0 + resolution: "@csstools/selector-specificity@npm:2.2.0" + peerDependencies: + postcss-selector-parser: ^6.0.10 + checksum: 97c89f23b3b527d7bd51ed299969ed2b9fbb219a367948b44aefec228b8eda6ae0ad74fe8a82f9aac8ff32cfd00bb6d0c98d1daeab2e8fc6d5c4af25e5be5673 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:^0.5.0": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^0.4.3": + version: 0.4.3 + resolution: "@eslint/eslintrc@npm:0.4.3" + dependencies: + ajv: ^6.12.4 + debug: ^4.1.1 + espree: ^7.3.0 + globals: ^13.9.0 + ignore: ^4.0.6 + import-fresh: ^3.2.1 + js-yaml: ^3.13.1 + minimatch: ^3.0.4 + strip-json-comments: ^3.1.1 + checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3 + languageName: node + linkType: hard + +"@fortawesome/fontawesome-free@npm:^5.12.0": + version: 5.15.4 + resolution: "@fortawesome/fontawesome-free@npm:5.15.4" + checksum: 32281c3df4075290d9a96dfc22f72fadb3da7055d4117e48d34046b8c98032a55fa260ae351b0af5d6f6fb57a2f5d79a4abe52af456da35195f7cb7dda27b4a2 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.5.0": + version: 0.5.0 + resolution: "@humanwhocodes/config-array@npm:0.5.0" + dependencies: + "@humanwhocodes/object-schema": ^1.2.0 + debug: ^4.1.1 + minimatch: ^3.0.4 + checksum: 44ee6a9f05d93dd9d5935a006b17572328ba9caff8002442f601736cbda79c580cc0f5a49ce9eb88fbacc5c3a6b62098357c2e95326cd17bb9f1a6c61d6e95e7 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.0": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.0": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.3 + resolution: "@jridgewell/source-map@npm:0.3.3" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: ae1302146339667da5cd6541260ecbef46ae06819a60f88da8f58b3e64682f787c09359933d050dea5d2173ea7fa40f40dd4d4e7a8d325c5892cccd99aaf8959 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.18 + resolution: "@jridgewell/trace-mapping@npm:0.3.18" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + languageName: node + linkType: hard + +"@jupyter-notebook/application@npm:^7.0.0-alpha.5": + version: 7.0.0-beta.4 + resolution: "@jupyter-notebook/application@npm:7.0.0-beta.4" + dependencies: + "@jupyterlab/application": ^4.0.1 + "@jupyterlab/coreutils": ^6.0.1 + "@jupyterlab/docregistry": ^4.0.1 + "@jupyterlab/rendermime-interfaces": ^3.8.1 + "@jupyterlab/ui-components": ^4.0.1 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 0156f9107042a591d9e5807fea5a3e1f7effc9f07bb46a9d3a5f0af01a9f49b104f608df9d261cebfe5345ece0998c62b6c715f999601cb990537f772ed1f46c + languageName: node + linkType: hard + +"@jupyter/ydoc@npm:^1.0.2": + version: 1.0.2 + resolution: "@jupyter/ydoc@npm:1.0.2" + dependencies: + "@jupyterlab/nbformat": ^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0 + "@lumino/coreutils": ^1.11.0 || ^2.0.0 + "@lumino/disposable": ^1.10.0 || ^2.0.0 + "@lumino/signaling": ^1.10.0 || ^2.0.0 + y-protocols: ^1.0.5 + yjs: ^13.5.40 + checksum: 739f9630940466b3cfcd7b742dd06479f81772ca13f863d057af0bbb5e318829506969066ab72977e7c721644982b5c8f88cf44e1ae81955ed1c27e87632d1f2 + languageName: node + linkType: hard + +"@jupyterlab/application@npm:^4.0.0-alpha.11, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/application@npm:4.0.2" + dependencies: + "@fortawesome/fontawesome-free": ^5.12.0 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/statedb": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/application": ^2.1.1 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 5709b59c794e481d6e9b6c5575042c569f38058b6fc2a2c1d2831bdd0d1b0ff4df60c17132753ed8d9be1e2a28e4a0a18310d2b80e8ff5812fdaccbb1ee18bce + languageName: node + linkType: hard + +"@jupyterlab/apputils@npm:^4.0.0-alpha.11, @jupyterlab/apputils@npm:^4.1.2": + version: 4.1.2 + resolution: "@jupyterlab/apputils@npm:4.1.2" + dependencies: + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/settingregistry": ^4.0.2 + "@jupyterlab/statedb": ^4.0.2 + "@jupyterlab/statusbar": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + "@lumino/widgets": ^2.1.1 + "@types/react": ^18.0.26 + react: ^18.2.0 + sanitize-html: ~2.7.3 + checksum: 89a445478b54d1132e753022a81393dd3e53f7f36de2d9e905ece3bae911382ddff6afc16c4b649646b1a125c774ccc83fa4d92e29a48a423d4410a4a5554bb4 + languageName: node + linkType: hard + +"@jupyterlab/attachments@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/attachments@npm:4.0.2" + dependencies: + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@lumino/disposable": ^2.1.1 + "@lumino/signaling": ^2.1.1 + checksum: 178d6abf3ff0767d87f78a79470760cf0025c3171e65dfd9a07916f3f6322f1080a21985ccdfdfeeec6fb73fb9aac9179cc413c43e4e33a45bcbcefa6cb97714 + languageName: node + linkType: hard + +"@jupyterlab/builder@npm:^4.0.0-alpha.11": + version: 4.0.2 + resolution: "@jupyterlab/builder@npm:4.0.2" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/application": ^2.1.1 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/dragdrop": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + "@lumino/widgets": ^2.1.1 + ajv: ^8.12.0 + commander: ^9.4.1 + css-loader: ^6.7.1 + duplicate-package-checker-webpack-plugin: ^3.0.0 + fs-extra: ^10.1.0 + glob: ~7.1.6 + license-webpack-plugin: ^2.3.14 + mini-css-extract-plugin: ^2.7.0 + mini-svg-data-uri: ^1.4.4 + path-browserify: ^1.0.0 + process: ^0.11.10 + source-map-loader: ~1.0.2 + style-loader: ~3.3.1 + supports-color: ^7.2.0 + terser-webpack-plugin: ^5.3.7 + webpack: ^5.76.1 + webpack-cli: ^5.0.1 + webpack-merge: ^5.8.0 + worker-loader: ^3.0.2 + bin: + build-labextension: lib/build-labextension.js + checksum: bb3ecbde5b2207d38577ad4f49af3b92a68b093d56b9eb1611fa967e553aab3e899a6e651edf90834e1b2d9ced57078e976ac03791178104962325423da25e7e + languageName: node + linkType: hard + +"@jupyterlab/cells@npm:^4.0.0-alpha.11, @jupyterlab/cells@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/cells@npm:4.0.2" + dependencies: + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.6 + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/attachments": ^4.0.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/codemirror": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/documentsearch": ^4.0.2 + "@jupyterlab/filebrowser": ^4.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/outputarea": ^4.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/toc": ^6.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/dragdrop": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: 92aa9ced743b41fbe5c0d3700762e3f825c9b01fb9b5684c909de330a62561a7b05af27390ca5993f905ec7141fa01072446b51232a8616181dd4eaed178b77f + languageName: node + linkType: hard + +"@jupyterlab/codeeditor@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/codeeditor@npm:4.0.2" + dependencies: + "@codemirror/state": ^6.2.0 + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/statusbar": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/dragdrop": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: 61b638011acd21195fcd53b3b1f1df54abef0e0db85937f41f3a323cc6df75bcd63261739518bfd82b6bf45f638a090687cb43c2b66880546cff3e962d2e5994 + languageName: node + linkType: hard + +"@jupyterlab/codemirror@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/codemirror@npm:4.0.2" + dependencies: + "@codemirror/autocomplete": ^6.5.1 + "@codemirror/commands": ^6.2.3 + "@codemirror/lang-cpp": ^6.0.2 + "@codemirror/lang-css": ^6.1.1 + "@codemirror/lang-html": ^6.4.3 + "@codemirror/lang-java": ^6.0.1 + "@codemirror/lang-javascript": ^6.1.7 + "@codemirror/lang-json": ^6.0.1 + "@codemirror/lang-markdown": ^6.1.1 + "@codemirror/lang-php": ^6.0.1 + "@codemirror/lang-python": ^6.1.2 + "@codemirror/lang-rust": ^6.0.1 + "@codemirror/lang-sql": ^6.4.1 + "@codemirror/lang-wast": ^6.0.1 + "@codemirror/lang-xml": ^6.0.2 + "@codemirror/language": ^6.6.0 + "@codemirror/legacy-modes": ^6.3.2 + "@codemirror/search": ^6.3.0 + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.6 + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/documentsearch": ^4.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@lezer/common": ^1.0.2 + "@lezer/generator": ^1.2.2 + "@lezer/highlight": ^1.1.4 + "@lezer/markdown": ^1.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/signaling": ^2.1.1 + yjs: ^13.5.40 + checksum: 1ddf08979874fc522eb88de6a743129640c5721410a8c6feb58d2e37b35ebcdeee5c217890e7f9561a595ca8b1c9b4a222b07da5e2e95c1e2dcd8c467378c50d + languageName: node + linkType: hard + +"@jupyterlab/console@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/console@npm:4.0.2" + dependencies: + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.6 + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/cells": ^4.0.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/dragdrop": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 4a7a4a8a06663902840c4216b257e380105366c7808f5f4ba891d45fb60b4f7605c455d2d0290dcc576dcc4c833a00d140c71604ecbeab3f2054c460fd6bbc79 + languageName: node + linkType: hard + +"@jupyterlab/coreutils@npm:^6.0.0-alpha.11, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": + version: 6.0.2 + resolution: "@jupyterlab/coreutils@npm:6.0.2" + dependencies: + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/signaling": ^2.1.1 + minimist: ~1.2.0 + path-browserify: ^1.0.0 + url-parse: ~1.5.4 + checksum: c2e9b9bf7227f68bb6b91044d2ac3808a872ac967e22f6aee10241d5dbc78a19deee65f91dd87c080f63170a760c96c99cb31e0e0b6f32c6341e432d781355ce + languageName: node + linkType: hard + +"@jupyterlab/debugger@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/debugger@npm:4.0.2" + dependencies: + "@codemirror/state": ^6.2.0 + "@codemirror/view": ^6.9.6 + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/application": ^4.0.2 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/cells": ^4.0.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/codemirror": ^4.0.2 + "@jupyterlab/console": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/fileeditor": ^4.0.2 + "@jupyterlab/notebook": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/datagrid": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + "@vscode/debugprotocol": ^1.51.0 + react: ^18.2.0 + checksum: 5217fdca41a58397d97c6ca634f0e51f1f102e713c685748aaf04ab01b3e386d26d03881e27c5df66b422d7288a3b276008c59e056c1c068bf2629395887c251 + languageName: node + linkType: hard + +"@jupyterlab/docmanager@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/docmanager@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/statusbar": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: dca1f56209608a82eebb0a365657f955bc8c546d66e00ec7747e753e3c76c8c0a5ed24b51736d157d2ed9d8264dc69545221e8fc2aa6af3eb6ec7eb4fd537a69 + languageName: node + linkType: hard + +"@jupyterlab/docregistry@npm:^4.0.1, @jupyterlab/docregistry@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/docregistry@npm:4.0.2" + dependencies: + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: b88c6a6ab7825aff95541c8a9f4381ccee4533e8c5bda588538c8a110dd8c6cb413e73345bc8fbf74aebe9fed4f9d298de6efa08378212869510e81ccb9f10ca + languageName: node + linkType: hard + +"@jupyterlab/documentsearch@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/documentsearch@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: d621722648f8d0e9c17c4df093bf02de0b3c5c1e8cb4b4b46482114700c4ca47dbb35831d2f046b0a28c950c6cd7442cdd791357af87d6e4df5da3b347d463e0 + languageName: node + linkType: hard + +"@jupyterlab/filebrowser@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/filebrowser@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docmanager": ^4.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/statedb": ^4.0.2 + "@jupyterlab/statusbar": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/dragdrop": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: ae5426f6811488cb90538f8ec74fa87d4ead847a2727ba64d35b4b2d81e6058bc6340853affedb2e4e7362627453b8dd1e108142a425bc039745714058ce5d73 + languageName: node + linkType: hard + +"@jupyterlab/fileeditor@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/fileeditor@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/codemirror": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/documentsearch": ^4.0.2 + "@jupyterlab/lsp": ^4.0.2 + "@jupyterlab/statusbar": ^4.0.2 + "@jupyterlab/toc": ^6.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + regexp-match-indices: ^1.0.2 + checksum: a83615c1094a143eb58701ba1f90f180d0e373d36db6d4aabebb73b26da7efaa47fd1946541cc529672b9042c66df1b2f23894267fe4afb5712a97cad42e471e + languageName: node + linkType: hard + +"@jupyterlab/galata@npm:^5.0.0-alpha.11": + version: 5.0.2 + resolution: "@jupyterlab/galata@npm:5.0.2" + dependencies: + "@jupyterlab/application": ^4.0.2 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/debugger": ^4.0.2 + "@jupyterlab/docmanager": ^4.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/notebook": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/settingregistry": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@playwright/test": ^1.32.2 + "@stdlib/stats": ~0.0.13 + fs-extra: ^10.1.0 + json5: ^2.2.3 + path: ~0.12.7 + systeminformation: ^5.8.6 + vega: ^5.20.0 + vega-lite: ^5.6.1 + vega-statistics: ^1.7.9 + checksum: 175538962b02780fb3ce9ac0dc8ccb3f977f936ad18af1129272ddab0594eac0e8b1d911b3b902f18b0ab832dae689dea0eda51a202403507fef72df4d6fdaa8 + languageName: node + linkType: hard + +"@jupyterlab/launcher@npm:^4.0.0-alpha.11": + version: 4.0.2 + resolution: "@jupyterlab/launcher@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/properties": ^2.0.0 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: 4415fb8d2db8701857f21c515a8d4680133ffb5023b005681abd5f2df353a6cbb0e16099e35f363df44f015d4784a267c355c807ab840a15f63f1f3c219c7d11 + languageName: node + linkType: hard + +"@jupyterlab/lsp@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/lsp@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/translation": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/signaling": ^2.1.1 + lodash.mergewith: ^4.6.1 + vscode-jsonrpc: ^6.0.0 + vscode-languageserver-protocol: ^3.17.0 + vscode-ws-jsonrpc: ~1.0.2 + checksum: 476517f4cd9ce7758638f96c1037f26d758ec8e102d87b9472cbaa6208d94bcfc1da0ec853202761f6542404a034932657b14f82e2355d312b3f0c5c140cfbfd + languageName: node + linkType: hard + +"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/nbformat@npm:4.0.2" + dependencies: + "@lumino/coreutils": ^2.1.1 + checksum: cccd1c7fd8717ccece1f7642f3f7218103c3baa479fce85666770719b3359116e5279cdd97e2b584122a793b437fc9ece7055d1da27ad35a090f90398a76d59f + languageName: node + linkType: hard + +"@jupyterlab/notebook@npm:^4.0.0-alpha.11, @jupyterlab/notebook@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/notebook@npm:4.0.2" + dependencies: + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/cells": ^4.0.2 + "@jupyterlab/codeeditor": ^4.0.2 + "@jupyterlab/codemirror": ^4.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/documentsearch": ^4.0.2 + "@jupyterlab/lsp": ^4.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/settingregistry": ^4.0.2 + "@jupyterlab/statusbar": ^4.0.2 + "@jupyterlab/toc": ^6.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/dragdrop": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: 053cde5377aceac7ff6fe30e734354df1839cbf84bfd19f7d3992a1aaddcd66f5c8470bb2537c94b28dfdb194dfdacfaa38207fd2d4989b0575b27c20396bbfe + languageName: node + linkType: hard + +"@jupyterlab/observables@npm:^5.0.2": + version: 5.0.2 + resolution: "@jupyterlab/observables@npm:5.0.2" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + checksum: 6d206873f3e2bfd95267fde6fae565eef5c1f7df93dc0a27091ea3eceea5cbded6c8b90eb5d4311e3b6158385455ed358602cb4b3daee717f6cc195b259cfb24 + languageName: node + linkType: hard + +"@jupyterlab/outputarea@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/outputarea@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/translation": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 8387b93e7b6bf1a63495eef8a7746870e4210818ff26af5c8ecdf4b9e78433ec47b58ddaa5ab11fbf5cf143802b23a186c90589974cd408cae95330fa3960f32 + languageName: node + linkType: hard + +"@jupyterlab/rendermime-interfaces@npm:^3.8.1, @jupyterlab/rendermime-interfaces@npm:^3.8.2": + version: 3.8.2 + resolution: "@jupyterlab/rendermime-interfaces@npm:3.8.2" + dependencies: + "@lumino/coreutils": ^1.11.0 || ^2.1.1 + "@lumino/widgets": ^1.37.2 || ^2.1.1 + checksum: e1164a4ad7654e5e8af0c1c2f1c8938f01a4bd07e04ff788e8b3adfaa9cb7ef07118c44513648c69263929e1658f02dcbab7aac776c6071228b0b80c8ca4e65a + languageName: node + linkType: hard + +"@jupyterlab/rendermime@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/rendermime@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/translation": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + lodash.escape: ^4.0.1 + checksum: 6118adf39cfe3c5918c9b677ff5d8dbe97ce469427f9969e1d16fba944b53d6e6c9d2c1e2deaaf928cdb94222a8941c7bb7cfc81693683fd07c08e92bc3d6cea + languageName: node + linkType: hard + +"@jupyterlab/services@npm:^7.0.0-alpha.11, @jupyterlab/services@npm:^7.0.2": + version: 7.0.2 + resolution: "@jupyterlab/services@npm:7.0.2" + dependencies: + "@jupyter/ydoc": ^1.0.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/settingregistry": ^4.0.2 + "@jupyterlab/statedb": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/polling": ^2.1.1 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + ws: ^8.11.0 + checksum: 4a4b5328f2f50ec1d501f67d63fbfb329f37a6c090227e0aecdbbb7316d9df0e5891af47cb948958e9307a0afc52f0ddf05c2be7acb9e2f44e54cf568dc3b90c + languageName: node + linkType: hard + +"@jupyterlab/settingregistry@npm:^4.0.0-alpha.11, @jupyterlab/settingregistry@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/settingregistry@npm:4.0.2" + dependencies: + "@jupyterlab/nbformat": ^4.0.2 + "@jupyterlab/statedb": ^4.0.2 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/signaling": ^2.1.1 + "@rjsf/utils": ^5.1.0 + ajv: ^8.12.0 + json5: ^2.2.3 + peerDependencies: + react: ">=16" + checksum: c2e019f70a4f19cf99bc2029c136197f2a750f319e16f8605a6f8d690b6930ac32e24678b090a09f9e949e540cf6b4214d3d3597ec119bd6896db3b456ac6299 + languageName: node + linkType: hard + +"@jupyterlab/statedb@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/statedb@npm:4.0.2" + dependencies: + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + checksum: 88fc80914f4c128ae6b0630ffe97111cc95a8edc4f34e749615aa8396262d74efcc82e02d0c7c2dcd0268b7cc35a0bfbd7455a4b6cb9203bcad488e1cbad5c25 + languageName: node + linkType: hard + +"@jupyterlab/statusbar@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/statusbar@npm:4.0.2" + dependencies: + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: d792eb8fca00ac5ec7d5abcb3694db5c80706ec468aa4a9bef543f02a788d80ca2a9b81def0a846da14aed22dbd4ceffe0c95c0047c5025c2e5d69fc55f739b9 + languageName: node + linkType: hard + +"@jupyterlab/toc@npm:^6.0.2": + version: 6.0.2 + resolution: "@jupyterlab/toc@npm:6.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/docregistry": ^4.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime": ^4.0.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + react: ^18.2.0 + checksum: de36885b17d7fa067a89f84cbdeb48ecc7c90acd6b7596745c8c96b652f6853e5d744d04dab82746f94eeea65b090c32a6153191d182c2b4d969a4834c6ec8c3 + languageName: node + linkType: hard + +"@jupyterlab/translation@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/translation@npm:4.0.2" + dependencies: + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/services": ^7.0.2 + "@jupyterlab/statedb": ^4.0.2 + "@lumino/coreutils": ^2.1.1 + checksum: 8f229be773607988509d059097c30bf8fbc8191d5b027221658436b2f539f6904ea48e7998276da7c52cdacd0821ea4cbdfd12ad0650ce0213525217d8735bf4 + languageName: node + linkType: hard + +"@jupyterlab/ui-components@npm:^4.0.1, @jupyterlab/ui-components@npm:^4.0.2": + version: 4.0.2 + resolution: "@jupyterlab/ui-components@npm:4.0.2" + dependencies: + "@jupyterlab/coreutils": ^6.0.2 + "@jupyterlab/observables": ^5.0.2 + "@jupyterlab/rendermime-interfaces": ^3.8.2 + "@jupyterlab/translation": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/messaging": ^2.0.0 + "@lumino/polling": ^2.1.1 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + "@lumino/widgets": ^2.1.1 + "@rjsf/core": ^5.1.0 + "@rjsf/utils": ^5.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + typestyle: ^2.0.4 + peerDependencies: + react: ^18.2.0 + checksum: 5e941c557609e2cec3df3cb42de358c13f73f3cd0a3b0ce6c5d473dc8d7d09772d8dc35f843f9ef1b6619700fa4a403979a93aae047517efa5d9385a8f90eac7 + languageName: node + linkType: hard + +"@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.0.2": + version: 1.0.3 + resolution: "@lezer/common@npm:1.0.3" + checksum: cc90dc2f0aeaebeb3fe886cbd27f8b1e8bee817d8c2efff178604807debd68c5db820fd23afb830962780063d21891afbdf564420221faca2822e77bc6327184 + languageName: node + linkType: hard + +"@lezer/cpp@npm:^1.0.0": + version: 1.1.0 + resolution: "@lezer/cpp@npm:1.1.0" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 9b25c881fc9b64fd2b019a077a85b0ba7cfda0bbdd92dbb0ff43300c9ba1ec4360128fe912bfe0f06a1c1bb5a564c5ace375c8aad254d07a717768a8f268695d + languageName: node + linkType: hard + +"@lezer/css@npm:^1.0.0, @lezer/css@npm:^1.1.0": + version: 1.1.2 + resolution: "@lezer/css@npm:1.1.2" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 02218fe6901428e191a91a1f1a3728a051af982bafaf37144884c9261a7e24b2ad1dfdaa6e7feeb160e5bc34157ce92213cd92ae244cdf0b8485b8b8113850f8 + languageName: node + linkType: hard + +"@lezer/generator@npm:^1.2.2": + version: 1.2.4 + resolution: "@lezer/generator@npm:1.2.4" + dependencies: + "@lezer/common": ^1.0.2 + "@lezer/lr": ^1.3.0 + bin: + lezer-generator: dist/lezer-generator.cjs + checksum: 270e13bbae199abf2fcd2466206ba510e9d29f51873e6a926ea18a263ce94f5c916aa3e58f55c82c784686e69fda906454f63d2eeaa34a7810d687af7fb9210e + languageName: node + linkType: hard + +"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3, @lezer/highlight@npm:^1.1.4": + version: 1.1.6 + resolution: "@lezer/highlight@npm:1.1.6" + dependencies: + "@lezer/common": ^1.0.0 + checksum: 411a702394c4c996b7d7f145a38f3a85a8cc698b3918acc7121c629255bb76d4ab383753f69009e011dc415210c6acbbb5b27bde613259ab67e600b29397b03b + languageName: node + linkType: hard + +"@lezer/html@npm:^1.3.0": + version: 1.3.4 + resolution: "@lezer/html@npm:1.3.4" + dependencies: + "@lezer/common": ^1.0.0 + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 81dd134ac094edf7c40bae4c3b7126d336ce4c3c87756344bf604eff64d89b06fcb55f91618a4622eb0dae6d6015722f5bab58e2252d86e81fca8c3ced1a0c4d + languageName: node + linkType: hard + +"@lezer/java@npm:^1.0.0": + version: 1.0.3 + resolution: "@lezer/java@npm:1.0.3" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 2fffea6627d130413ffad4e61040267974cca3167d98881b9e5b5e2455530de74a82c234d93603e92a4972fad314671453c49c0a76b0f4547c4617d671fd7b99 + languageName: node + linkType: hard + +"@lezer/javascript@npm:^1.0.0": + version: 1.4.3 + resolution: "@lezer/javascript@npm:1.4.3" + dependencies: + "@lezer/highlight": ^1.1.3 + "@lezer/lr": ^1.3.0 + checksum: 520dc2d84c84841ef554993c1c0dfe503487aa9be398ebcf617b51d06f99121841d4ca1cf25f3f53d00efa820ea778cc2271da425a606ac66e9f09a4c8cc6677 + languageName: node + linkType: hard + +"@lezer/json@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/json@npm:1.0.0" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: c1ca0cdf681415b58a383a669944bed66da3aa830870d32d1e471d545cff0fe43d9ac8a0d2a318a96daa99cd5a645b1d58ba8fbdd2e8d7ca4d33a62c7582cbab + languageName: node + linkType: hard + +"@lezer/lr@npm:^1.0.0, @lezer/lr@npm:^1.1.0, @lezer/lr@npm:^1.3.0": + version: 1.3.6 + resolution: "@lezer/lr@npm:1.3.6" + dependencies: + "@lezer/common": ^1.0.0 + checksum: b2bbcfecc01bd9c801f3ee636ceda333adbbea1f274017cec6f315a23346e7a035a984f325d4f1cd14b157d74d28badda6f794514c29a0b078f7fb3357cdfc32 + languageName: node + linkType: hard + +"@lezer/markdown@npm:^1.0.0, @lezer/markdown@npm:^1.0.2": + version: 1.0.2 + resolution: "@lezer/markdown@npm:1.0.2" + dependencies: + "@lezer/common": ^1.0.0 + "@lezer/highlight": ^1.0.0 + checksum: c4bbfcd8a5a9d924a7cf2b5e5e99c78e7705473cc59804070278b5cfcf478af9dd567025d0926cbf03e3ea6abb8f173425220d3107c05a2d7e0ca3fe3d5c92ef + languageName: node + linkType: hard + +"@lezer/php@npm:^1.0.0": + version: 1.0.1 + resolution: "@lezer/php@npm:1.0.1" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.1.0 + checksum: a847c255c030b4d38913ddf1d5bd7324d83be7ef8d1d244542870be03b9bf7dc71283afeb2415c40dfd188cb99f0cc44bad760b5f3b7c35c3b8e5e00253848fc + languageName: node + linkType: hard + +"@lezer/python@npm:^1.1.4": + version: 1.1.7 + resolution: "@lezer/python@npm:1.1.7" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 7ae6b4ae770b3cd849eee3d8fb1d904745aee202a76e7db0a079725a97571c4778fa5bd74878206e44aa3349044bf056008e19e7a90650fad93d51890f685077 + languageName: node + linkType: hard + +"@lezer/rust@npm:^1.0.0": + version: 1.0.0 + resolution: "@lezer/rust@npm:1.0.0" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 0c42f415674f60ca2ef4274b446577621cdeec8f31168b1c3b90888a4377c513f02a89ee346421c264ec3a77fe2fa3e134996be6463ed506dbbc79b4b4505375 + languageName: node + linkType: hard + +"@lezer/xml@npm:^1.0.0": + version: 1.0.1 + resolution: "@lezer/xml@npm:1.0.1" + dependencies: + "@lezer/highlight": ^1.0.0 + "@lezer/lr": ^1.0.0 + checksum: 271319aa7802c123845b70ffa63d7065c0f92fc6a1ddb1f8ec9f3aa965bca3df3c9fad4d4de53187ddf230e833cd3ab3a84cb2aded76ab5f6831e9a2fc310923 + languageName: node + linkType: hard + +"@lumino/algorithm@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/algorithm@npm:2.0.0" + checksum: 663edf536e94397b449c6a2643a735e602fbb396dec86b56ad1193a768dce27c6e7da5ad0384aa90086ea44cbb64dde3f9d565e9fd81858f1eb0c6b4253f3b94 + languageName: node + linkType: hard + +"@lumino/application@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/application@npm:2.1.1" + dependencies: + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 442a047e43a85b48189d15a5a322f39cac01b9bee7b252aa76579c53e503f2cf2100f2e3aff61cd1d92fef07f04c0a3a6680c475890e0923456e296ceb79a692 + languageName: node + linkType: hard + +"@lumino/collections@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/collections@npm:2.0.0" + dependencies: + "@lumino/algorithm": ^2.0.0 + checksum: 4a7fc3571e92a1368a1ef01300ad7b6e0d4ff13cb78b89533d5962eea66d4a7550e15d8b80fa3ab1816b1a89382f35015f9dddf72ab04654c17e5b516b845d8f + languageName: node + linkType: hard + +"@lumino/commands@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/commands@npm:2.1.1" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/keyboard": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + checksum: a076244e9c4f7a3c6dab02642fdd38dbbaab6e5754acaeeb84a5195dc5c2fc19343ba754c3a0f89c9b60f16c61cb793301cdb6e8d69bdc30e18ed7e32f40d524 + languageName: node + linkType: hard + +"@lumino/coreutils@npm:^1.11.0 || ^2.0.0, @lumino/coreutils@npm:^1.11.0 || ^2.1.1, @lumino/coreutils@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/coreutils@npm:2.1.1" + checksum: dfdeb2b0282caae17b6c3edfebadf4ce7c75fc879fa60cacfef9b154412f4b35e4ffd95b1833b99d8dacb99aaaa04513570129ae2024c3f33e2677a01f0576ce + languageName: node + linkType: hard + +"@lumino/datagrid@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/datagrid@npm:2.1.1" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/dragdrop": ^2.1.1 + "@lumino/keyboard": ^2.0.0 + "@lumino/messaging": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 01ed80f36b31449d16302197549ae091d8ea07d124e5dbfda271c35462bce7f6f56d54978b6b3174d9332b9ee4219568ab3f7308b26ff1df88e9fce748bd5448 + languageName: node + linkType: hard + +"@lumino/disposable@npm:^1.10.0 || ^2.0.0, @lumino/disposable@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/disposable@npm:2.1.1" + dependencies: + "@lumino/signaling": ^2.1.1 + checksum: ed6cdfe13f3346178a087690d4e7baeccaed7e73ca23cb239765202409f5c01b4729a4058b4717f963462ee9ef2e5cb14ad1974e3163741267290edc3715c85c + languageName: node + linkType: hard + +"@lumino/domutils@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/domutils@npm:2.0.0" + checksum: 4a146bfc1006d5fd00ccecc61d9803965d269c15c48c892fd87216336ce967f0db91f31203c5616c83d260224cddf25af4abb6704a6770757d19e44068f690bf + languageName: node + linkType: hard + +"@lumino/dragdrop@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/dragdrop@npm:2.1.1" + dependencies: + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + checksum: 68c896afc44476b11a501e5b30ec55db06c2648a45f078713a111b2bf3b2e9171a7c5478ff6bdeb771a7c1e397fe3bba7bc5eadb4fe3e1294851d677f811b5b8 + languageName: node + linkType: hard + +"@lumino/keyboard@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/keyboard@npm:2.0.0" + checksum: 3852ba51f437b1c1d7e552a0f844592a05e04dd5012070dc6e4384c58965d1ebf536c6875c1b7bae03cde3c715ddc36cd290992fcefc1a8c39094194f4689fdd + languageName: node + linkType: hard + +"@lumino/messaging@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/messaging@npm:2.0.0" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/collections": ^2.0.0 + checksum: 1e82dcf9b110834d4342dc63dfeac0ee780880fb99051bd82d00a1f83afd91b276c1cea5af85a414d92c527adc365d54f20ec780123b562f89c5a2cd3e96bf81 + languageName: node + linkType: hard + +"@lumino/polling@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/polling@npm:2.1.1" + dependencies: + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/signaling": ^2.1.1 + checksum: 69177b26d5fc541e72533cbe7d7f7999eea541d392f1082d20dbd9e1797e7d46fba47bae9c65c06f9ccb2780cbae636e9354d9bf4423b5e1020754d4b07d4f6b + languageName: node + linkType: hard + +"@lumino/properties@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/properties@npm:2.0.0" + checksum: 81187a11a779eed4e20ff0035e77dee99bd271b0cf649096c4e8809dd6bdd06955b1a974bc1a115e536f8d2840b30183bb78a362b2c6991824477df6d17e6c59 + languageName: node + linkType: hard + +"@lumino/signaling@npm:^1.10.0 || ^2.0.0, @lumino/signaling@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/signaling@npm:2.1.1" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/coreutils": ^2.1.1 + checksum: 283ad4239b8577f68aca3d0b2606f73cc1c775f84cab25cf49aa6cd195f0d87949ef43fdff03b38b5a49ebbf2468581c6786d5f8b6159a04b2051260be5eab86 + languageName: node + linkType: hard + +"@lumino/virtualdom@npm:^2.0.0": + version: 2.0.0 + resolution: "@lumino/virtualdom@npm:2.0.0" + dependencies: + "@lumino/algorithm": ^2.0.0 + checksum: 6fc1d88e7d4a656be7664ccfc5745eb1d4e3d2034db0b11ad6abefcc642f22d265003eef0e1d02bca2e42b6da127123118c631369006f78e88a08885a6f36c25 + languageName: node + linkType: hard + +"@lumino/widgets@npm:^1.37.2 || ^2.1.1, @lumino/widgets@npm:^2.1.1": + version: 2.1.1 + resolution: "@lumino/widgets@npm:2.1.1" + dependencies: + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/disposable": ^2.1.1 + "@lumino/domutils": ^2.0.0 + "@lumino/dragdrop": ^2.1.1 + "@lumino/keyboard": ^2.0.0 + "@lumino/messaging": ^2.0.0 + "@lumino/properties": ^2.0.0 + "@lumino/signaling": ^2.1.1 + "@lumino/virtualdom": ^2.0.0 + checksum: e2ad4a97d6ec43e5e1863c2a521b6b8cb7a708a470c1e78b0f34ff4ad8b9fca191597586c3033233a29ff0fa14b62aeef5ea2fe66af3058d39e711c6af129cf4 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f + languageName: node + linkType: hard + +"@playwright/test@npm:^1.21.1, @playwright/test@npm:^1.32.2": + version: 1.35.0 + resolution: "@playwright/test@npm:1.35.0" + dependencies: + "@types/node": "*" + fsevents: 2.3.2 + playwright-core: 1.35.0 + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: c63a281d8711ec817906d7618563709842aaa013ac02919bb7bbef7f7162d4ace0fc1351c6aac94a8957df4d107b38440e55488e99455a07f55e1ace6bb07959 + languageName: node + linkType: hard + +"@rjsf/core@npm:^5.1.0": + version: 5.8.1 + resolution: "@rjsf/core@npm:5.8.1" + dependencies: + lodash: ^4.17.21 + lodash-es: ^4.17.21 + markdown-to-jsx: ^7.2.1 + nanoid: ^3.3.6 + prop-types: ^15.8.1 + peerDependencies: + "@rjsf/utils": ^5.8.x + react: ^16.14.0 || >=17 + checksum: 616691f66285c89d7fb378bbad787960adcf7e8941b3287dce543f022dce3106b80d41cf1f41de926cd8dbe1f5006c5fcc0a6597bbca7ee9a13d422b967bb986 + languageName: node + linkType: hard + +"@rjsf/utils@npm:^5.1.0": + version: 5.8.1 + resolution: "@rjsf/utils@npm:5.8.1" + dependencies: + json-schema-merge-allof: ^0.8.1 + jsonpointer: ^5.0.1 + lodash: ^4.17.21 + lodash-es: ^4.17.21 + react-is: ^18.2.0 + peerDependencies: + react: ^16.14.0 || >=17 + checksum: 7a567ab45e62de01020a6bccd1da20e55a7a484bc5d367e3ded56ba3971d196646b690767c4f2d2840b2df1acdf5cd5611c892b1ce3c59defdd6201a107e6ff4 + languageName: node + linkType: hard + +"@stdlib/array@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/array@npm:0.0.12" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/blas": ^0.0.x + "@stdlib/complex": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/symbol": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 0d95690461f0c4560eabef0796d1170274415cd03de80333c6d39814d0484a6873ef4be04a64941ebf3a600747e84c3a4f23b21c7020e53842c07985331b39f1 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/assert@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/assert@npm:0.0.12" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/complex": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/ndarray": ^0.0.x + "@stdlib/number": ^0.0.x + "@stdlib/os": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/regexp": ^0.0.x + "@stdlib/streams": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/symbol": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: d4dcbeabbfb86ba56cdd972ff785f43e7d25018b2b1800cab8b0deb9e5c54c795d6ead3d142f4dd13c351f636deba4dc1857c85147d6b059fdc78eb2c9510b99 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/bigint@npm:^0.0.x": + version: 0.0.11 + resolution: "@stdlib/bigint@npm:0.0.11" + dependencies: + "@stdlib/utils": ^0.0.x + checksum: 7bf825d116e4b010e214209af239706ac1ef923eecb5c8b0af9229c9975450081355e441ecc7b4765d81a9e653141868e0492b8061d1e65724fa42fb8283aabd + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/blas@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/blas@npm:0.0.12" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/number": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 67ea00a968f7a9c710b37f718b7f756e2830e479a1a1ee44cbf6ec3cc27dd8863078928867707d9d1624007e81de89d040f2326d10f435e2cce913cab121975e + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/buffer@npm:^0.0.x": + version: 0.0.11 + resolution: "@stdlib/buffer@npm:0.0.11" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 93df02e3bf548e940ff9cef65121566e7bf93b554f0614d62336c9dbccfc07c9f1b1c4e9a7aebbe4819ef16a6d2a33a7010c2fdf908fface8298a3109c3c4ef0 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/cli@npm:^0.0.x": + version: 0.0.10 + resolution: "@stdlib/cli@npm:0.0.10" + dependencies: + "@stdlib/utils": ^0.0.x + minimist: ^1.2.0 + checksum: bbece8d3dbff2835518582a7726c6c4c22743dc408d2303d9e35a3b72151d5d0a8e78d61bc896663d4c3fb702e966abea7a1bd621ed943723a359f57053f121f + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/complex@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/complex@npm:0.0.12" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 8eda35027495417f1b0dd9bbbc2d4983f50ad3cf9e2276ffe0945ccdbe78f0fc66b9fc36ab71926d2a125c8fb7467c8970a222b230b42ff4bb8042c53314ca09 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/constants@npm:^0.0.x": + version: 0.0.11 + resolution: "@stdlib/constants@npm:0.0.11" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/number": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: fc19d055a4e71ae84b6c92e4a3a88371d50693da8f0a813df4063dc549374d19b9cf23f4fdae2fb7b2013e13929f713c3e1b9e4054767e741b75561ed43d15c3 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/fs@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/fs@npm:0.0.12" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/utils": ^0.0.x + debug: ^2.6.9 + checksum: 33ac5ee4844d4599fe3a8a8402f1a3e2cafee31a5c9cf5b85df530a61a2b54ef17dc30a67be98dacdc2958219413edd0e4cdc3c28266f4bc30277ee024f6a49e + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/math@npm:^0.0.x": + version: 0.0.11 + resolution: "@stdlib/math@npm:0.0.11" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/ndarray": ^0.0.x + "@stdlib/number": ^0.0.x + "@stdlib/strided": ^0.0.x + "@stdlib/symbol": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + debug: ^2.6.9 + checksum: 6c4c9dda36fbce50553e1437354c5286aa782c42399534dbed8e696ddeb1b91ef6cff5fe5962f1c9e1eb2ef63c63d9bd58f7ca4b87d59018aaac20099c3fb79a + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/ndarray@npm:^0.0.x": + version: 0.0.13 + resolution: "@stdlib/ndarray@npm:0.0.13" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/bigint": ^0.0.x + "@stdlib/buffer": ^0.0.x + "@stdlib/complex": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/number": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 842a94afce5fc74bf8a964b75a302ddb8713eadbc79616e6799f1310c8bce860ed9e9877adc4a39338d9136b8798947ee21cf03368d46408308a313c8075d49a + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/nlp@npm:^0.0.x": + version: 0.0.11 + resolution: "@stdlib/nlp@npm:0.0.11" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/random": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 398fe2853fb95404bb6598e3e199ca3e0435b94447d50e14e2e30582cadfb91f43464f23d80a0e1da4d64567a4a108a7299d7440509f1ab26b02aea7bb16e9a8 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/number@npm:^0.0.x": + version: 0.0.10 + resolution: "@stdlib/number@npm:0.0.10" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/os": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 326190956c787cbf9321c332beedab5ba4b3fa97d52a82aa708a0349b4678c0df7a351424f00a606f4eaca4fb4ba4cc191580c99d7c64ee0f08d37baa3de14f2 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/os@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/os@npm:0.0.12" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 37156b0c723da70d7740d92d08fc592eae803461c1d546cff6ac044765d6e40722fdad342219277e747c39344b513096ac1d0aa1e733cf3079bd8a9a8578612a + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/process@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/process@npm:0.0.12" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/buffer": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/streams": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 6d5c3d943f9914d1ae39bd36ad7436f783cf64baa2bff67a808035c99258676ae3f704c328a78d62754951cf85fe99d8e9af5f4fa7d5f8cba347bca72767e357 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/random@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/random@npm:0.0.12" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/blas": ^0.0.x + "@stdlib/buffer": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/stats": ^0.0.x + "@stdlib/streams": ^0.0.x + "@stdlib/symbol": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + debug: ^2.6.9 + readable-stream: ^2.1.4 + checksum: 67fcb5553274f8596ceae91153e96ae297bacfd55279821cb09f19f2844845aaf892802e4a5962965323dbfded0c7df8a89a6ce77d60d5c8a5899d483055a964 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/regexp@npm:^0.0.x": + version: 0.0.13 + resolution: "@stdlib/regexp@npm:0.0.13" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: dd52adb096ff9a02d1c4818be2889ae01bc04a0cdbc0d52473685e0a7a4eaa13e1be603b964f140f7488d11450b644dc5f8c97029d77db1ed4a563554245ff1c + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/stats@npm:^0.0.x, @stdlib/stats@npm:~0.0.13": + version: 0.0.13 + resolution: "@stdlib/stats@npm:0.0.13" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/blas": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/ndarray": ^0.0.x + "@stdlib/random": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/symbol": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 5ca12b2e123543f56a59aca828e14afaf525ad4aa40467bee7037a9178e21e55d4ce8ba3de9387cc9a0efe3e0d035d6c58705b12f634f77a2b3f87d334dfb076 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/streams@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/streams@npm:0.0.12" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/buffer": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + debug: ^2.6.9 + readable-stream: ^2.1.4 + checksum: 231b4607d082ea81d9dadbeab08002ec398a29c7eb5d611d8a4183f9db6964428e2f8a9e0f8edd085ca12b5d58258576987a575e9d8f6fcabcb5a62c6b8efe88 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/strided@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/strided@npm:0.0.12" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/ndarray": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 55ccc8543596894a2e3ad734b394700c69697b499a54b3bfbcf80cddd8d91509792c23931f5cebf7c89269676ac3f44352582e4f42e2c2c2898363cc3a76403d + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/string@npm:^0.0.x": + version: 0.0.14 + resolution: "@stdlib/string@npm:0.0.14" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/nlp": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/regexp": ^0.0.x + "@stdlib/streams": ^0.0.x + "@stdlib/types": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: aaaaaddf381cccc67f15dbab76f43ce81cb71a4f5595bfa06ef915b6747458deca3c25c60ff3c002c0c36482687d92a150f364069559dfea915f63a040d5f603 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/symbol@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/symbol@npm:0.0.12" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 2263341ce0296de2063d26038902bd63bf1d7b820307402fdf38c3b248bd026f17d96bccdc3189fd9fcc9c83a778eaab797dc11805bd66203b8ac9c6934f6588 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/time@npm:^0.0.x": + version: 0.0.14 + resolution: "@stdlib/time@npm:0.0.14" + dependencies: + "@stdlib/assert": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/utils": ^0.0.x + checksum: 6e8a1b985a09936ab09c98d44bf1b2c79e08995c3c73401494bc1f6f708747ef136d769af4809a8af92a9ceb3d390db6c4c4e01608cd8d794a86c4b57e343eb1 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/types@npm:^0.0.x": + version: 0.0.14 + resolution: "@stdlib/types@npm:0.0.14" + checksum: 5680a655ddb3ad730f5c7eb2363a43e089f3e6a1b85b12546cab49f7749bb3baf293bd50fbfe55486f233f4227f1020b65eb461b754b94fb4a4bc2799647ec22 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@stdlib/utils@npm:^0.0.x": + version: 0.0.12 + resolution: "@stdlib/utils@npm:0.0.12" + dependencies: + "@stdlib/array": ^0.0.x + "@stdlib/assert": ^0.0.x + "@stdlib/blas": ^0.0.x + "@stdlib/buffer": ^0.0.x + "@stdlib/cli": ^0.0.x + "@stdlib/constants": ^0.0.x + "@stdlib/fs": ^0.0.x + "@stdlib/math": ^0.0.x + "@stdlib/os": ^0.0.x + "@stdlib/process": ^0.0.x + "@stdlib/random": ^0.0.x + "@stdlib/regexp": ^0.0.x + "@stdlib/streams": ^0.0.x + "@stdlib/string": ^0.0.x + "@stdlib/symbol": ^0.0.x + "@stdlib/time": ^0.0.x + "@stdlib/types": ^0.0.x + debug: ^2.6.9 + checksum: e0c3671c5f62c11bb3abd721f2958c41641b00a75d449bd25fbb62bcb8689cfe9c1f600c0688e7b6819ae870d6e5974d0fc7b2ec86081c45d9194b316b2a2ec2 + conditions: (os=aix | os=darwin | os=freebsd | os=linux | os=macos | os=openbsd | os=sunos | os=win32 | os=windows) + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@types/clone@npm:~2.1.1": + version: 2.1.1 + resolution: "@types/clone@npm:2.1.1" + checksum: bda9668b9d6e0875d64bbe00763676f566e8647bc224333a03ac7fd66655dfed56a98a9f8304d0145c4411b964649c84c4d1a03adbdb6547eafb9ab8f303d254 + languageName: node + linkType: hard + +"@types/codemirror@npm:^5.60.5": + version: 5.60.8 + resolution: "@types/codemirror@npm:5.60.8" + dependencies: + "@types/tern": "*" + checksum: bc3a63eab0308b3ef5ed2ca22afb7f1c0b8acde6477e1d569df7e93f3fe4f78754d28a3e081c72931259fe1bf906a319b54bcdeba74600b989e5558d32478496 + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.3": + version: 3.7.4 + resolution: "@types/eslint-scope@npm:3.7.4" + dependencies: + "@types/eslint": "*" + "@types/estree": "*" + checksum: ea6a9363e92f301cd3888194469f9ec9d0021fe0a397a97a6dd689e7545c75de0bd2153dfb13d3ab532853a278b6572c6f678ce846980669e41029d205653460 + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.40.2 + resolution: "@types/eslint@npm:8.40.2" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: a4780e45e677e3af21c44a900846996cb6d9ae8f71d51940942a047163ae93a05444392c005f491ed46aa169f3b25f8be125ab42c5d8bdb571154bf62a7c828a + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.1 + resolution: "@types/estree@npm:1.0.1" + checksum: e9aa175eacb797216fafce4d41e8202c7a75555bc55232dee0f9903d7171f8f19f0ae7d5191bb1a88cb90e65468be508c0df850a9fb81b4433b293a5a749899d + languageName: node + linkType: hard + +"@types/geojson@npm:7946.0.4": + version: 7946.0.4 + resolution: "@types/geojson@npm:7946.0.4" + checksum: 541aea46540c918b9fe21ab73f497fe17b1eaf4d0d3baeb5f5614029b7f488c37f63843b644c024a8178dc2fb66d3d6623c25d9cf61d7b553aa19c8dc7f99047 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.12 + resolution: "@types/json-schema@npm:7.0.12" + checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.0": + version: 1.2.2 + resolution: "@types/minimist@npm:1.2.2" + checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.3.1 + resolution: "@types/node@npm:20.3.1" + checksum: 63a393ab6d947be17320817b35d7277ef03728e231558166ed07ee30b09fd7c08861be4d746f10fdc63ca7912e8cd023939d4eab887ff6580ff704ff24ed810c + languageName: node + linkType: hard + +"@types/normalize-package-data@npm:^2.4.0": + version: 2.4.1 + resolution: "@types/normalize-package-data@npm:2.4.1" + checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 + languageName: node + linkType: hard + +"@types/parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/parse-json@npm:4.0.0" + checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b + languageName: node + linkType: hard + +"@types/prop-types@npm:*": + version: 15.7.5 + resolution: "@types/prop-types@npm:15.7.5" + checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + languageName: node + linkType: hard + +"@types/react@npm:^18.0.26": + version: 18.2.12 + resolution: "@types/react@npm:18.2.12" + dependencies: + "@types/prop-types": "*" + "@types/scheduler": "*" + csstype: ^3.0.2 + checksum: ad85a7eadaf1b35cfeee9f715b39311420ff46d46e0650377d918b3f888c2e47416037da4a765e1dccd3d1916abd54c105a3bee803c971ba56c955a7768ce976 + languageName: node + linkType: hard + +"@types/scheduler@npm:*": + version: 0.16.3 + resolution: "@types/scheduler@npm:0.16.3" + checksum: 2b0aec39c24268e3ce938c5db2f2e77f5c3dd280e05c262d9c2fe7d890929e4632a6b8e94334017b66b45e4f92a5aa42ba3356640c2a1175fa37bef2f5200767 + languageName: node + linkType: hard + +"@types/source-list-map@npm:*": + version: 0.1.2 + resolution: "@types/source-list-map@npm:0.1.2" + checksum: fda8f37537aca9d3ed860d559289ab1dddb6897e642e6f53e909bbd18a7ac3129a8faa2a7d093847c91346cf09c86ef36e350c715406fba1f2271759b449adf6 + languageName: node + linkType: hard + +"@types/tern@npm:*": + version: 0.23.4 + resolution: "@types/tern@npm:0.23.4" + dependencies: + "@types/estree": "*" + checksum: d8fd304f147ed08f1d075f09cb8d440b7f785f69c9ec5c30eadf98132fe3f58f3b1bbbd11283858bb261afac5a2039c1c255f290b0f6e4a47cd6a746f30a6aa8 + languageName: node + linkType: hard + +"@types/webpack-sources@npm:^0.1.5": + version: 0.1.9 + resolution: "@types/webpack-sources@npm:0.1.9" + dependencies: + "@types/node": "*" + "@types/source-list-map": "*" + source-map: ^0.6.1 + checksum: bc09c584c7047e8aed29801a3981787dee3898e9e7a99891a362df114fcac3879eea5a00932314866a01b25220391839be09fe1487b16d4970ff4a7afd5b9725 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^4.8.1": + version: 4.33.0 + resolution: "@typescript-eslint/eslint-plugin@npm:4.33.0" + dependencies: + "@typescript-eslint/experimental-utils": 4.33.0 + "@typescript-eslint/scope-manager": 4.33.0 + debug: ^4.3.1 + functional-red-black-tree: ^1.0.1 + ignore: ^5.1.8 + regexpp: ^3.1.0 + semver: ^7.3.5 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: d74855d0a5ffe0b2f362ec02fcd9301d39a53fb4155b9bd0cb15a0a31d065143129ebf98df9d86af4b6f74de1d423a4c0d8c0095520844068117453afda5bc4f + languageName: node + linkType: hard + +"@typescript-eslint/experimental-utils@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/experimental-utils@npm:4.33.0" + dependencies: + "@types/json-schema": ^7.0.7 + "@typescript-eslint/scope-manager": 4.33.0 + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/typescript-estree": 4.33.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + peerDependencies: + eslint: "*" + checksum: f859800ada0884f92db6856f24efcb1d073ac9883ddc2b1aa9339f392215487895bed8447ebce3741e8141bb32e545244abef62b73193ba9a8a0527c523aabae + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^4.8.1": + version: 4.33.0 + resolution: "@typescript-eslint/parser@npm:4.33.0" + dependencies: + "@typescript-eslint/scope-manager": 4.33.0 + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/typescript-estree": 4.33.0 + debug: ^4.3.1 + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 102457eae1acd516211098fea081c8a2ed728522bbda7f5a557b6ef23d88970514f9a0f6285d53fca134d3d4d7d17822b5d5e12438d5918df4d1f89cc9e67d57 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/scope-manager@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/visitor-keys": 4.33.0 + checksum: 9a25fb7ba7c725ea7227a24d315b0f6aacbad002e2549a049edf723c1d3615c22f5c301f0d7d615b377f2cdf2f3519d97e79af0c459de6ef8d2aaf0906dff13e + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/types@npm:4.33.0" + checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/typescript-estree@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/visitor-keys": 4.33.0 + debug: ^4.3.1 + globby: ^11.0.3 + is-glob: ^4.0.1 + semver: ^7.3.5 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/visitor-keys@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + eslint-visitor-keys: ^2.0.0 + checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873 + languageName: node + linkType: hard + +"@vscode/debugprotocol@npm:^1.51.0": + version: 1.61.0 + resolution: "@vscode/debugprotocol@npm:1.61.0" + checksum: 14d4f6d2f385e15a39ba7aa506c25d3e2a2d6a22ebb6ee9d354062634f292b1ce3b0d9b5ac1c098052e3f6e572a1571bf0db647d13d85157b9a50645a0f1c69f + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/ast@npm:1.11.6" + dependencies: + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" + checksum: 29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" + checksum: e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" + checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" + dependencies: + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@xtuc/long": 4.2.2 + checksum: f4b562fa219f84368528339e0f8d273ad44e047a07641ffcaaec6f93e5b76fd86490a009aa91a294584e1436d74b0a01fa9fde45e333a4c657b58168b04da424 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" + checksum: 3535ef4f1fba38de3475e383b3980f4bbf3de72bbb631c2b6584c7df45be4eccd62c6ff48b5edd3f1bcff275cfd605a37679ec199fc91fd0a7705d7f1e3972dc + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/ieee754@npm:1.11.6" + dependencies: + "@xtuc/ieee754": ^1.2.0 + checksum: 13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/leb128@npm:1.11.6" + dependencies: + "@xtuc/long": 4.2.2 + checksum: 7ea942dc9777d4b18a5ebfa3a937b30ae9e1d2ce1fee637583ed7f376334dd1d4274f813d2e250056cca803e0952def4b954913f1a3c9068bcd4ab4ee5143bf0 + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/utf8@npm:1.11.6" + checksum: 807fe5b5ce10c390cfdd93e0fb92abda8aebabb5199980681e7c3743ee3306a75729bcd1e56a3903980e96c885ee53ef901fcbaac8efdfa480f9c0dae1d08713 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-opt": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + "@webassemblyjs/wast-printer": 1.11.6 + checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/wasm-gen": 1.11.6 + "@webassemblyjs/wasm-parser": 1.11.6 + checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.11.6 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 + checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.11.6": + version: 1.11.6 + resolution: "@webassemblyjs/wast-printer@npm:1.11.6" + dependencies: + "@webassemblyjs/ast": 1.11.6 + "@xtuc/long": 4.2.2 + checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^2.1.1": + version: 2.1.1 + resolution: "@webpack-cli/configtest@npm:2.1.1" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 9f9f9145c2d05471fc83d426db1df85cf49f329836b0c4b9f46b6948bed4b013464c00622b136d2a0a26993ce2306976682592245b08ee717500b1db45009a72 + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^2.0.2": + version: 2.0.2 + resolution: "@webpack-cli/info@npm:2.0.2" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 8f9a178afca5c82e113aed1efa552d64ee5ae4fdff63fe747c096a981ec74f18a5d07bd6e89bbe6715c3e57d96eea024a410e58977169489fe1df044c10dd94e + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^2.0.5": + version: 2.0.5 + resolution: "@webpack-cli/serve@npm:2.0.5" + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: 75f0e54681796d567a71ac3e2781d2901a8d8cf1cdfc82f261034dddac59a8343e8c3bc5e32b4bb9d6766759ba49fb29a5cd86ef1701d79c506fe886bb63ac75 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec + languageName: node + linkType: hard + +"abab@npm:^2.0.3": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + +"abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"acorn-import-assertions@npm:^1.9.0": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.1": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn@npm:^7.4.0": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 + languageName: node + linkType: hard + +"acorn@npm:^8.7.1, acorn@npm:^8.8.2": + version: 8.8.2 + resolution: "acorn@npm:8.8.2" + bin: + acorn: bin/acorn + checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.3.0 + resolution: "agentkeepalive@npm:4.3.0" + dependencies: + debug: ^4.1.0 + depd: ^2.0.0 + humanize-ms: ^1.2.1 + checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv-formats@npm:^2.1.1": + version: 2.1.1 + resolution: "ajv-formats@npm:2.1.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 4a287d937f1ebaad4683249a4c40c0fa3beed30d9ddc0adba04859026a622da0d317851316ea64b3680dc60f5c3c708105ddd5d5db8fe595d9d0207fd19f90b7 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + languageName: node + linkType: hard + +"ajv-keywords@npm:^5.1.0": + version: 5.1.0 + resolution: "ajv-keywords@npm:5.1.0" + dependencies: + fast-deep-equal: ^3.1.3 + peerDependencies: + ajv: ^8.8.2 + checksum: c35193940b853119242c6757787f09ecf89a2c19bcd36d03ed1a615e710d19d450cb448bfda407b939aba54b002368c8bff30529cc50a0536a8e10bcce300421 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.12.0, ajv@npm:^8.9.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + +"ansi-colors@npm:^4.1.1": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + is-array-buffer: ^3.0.1 + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"arrify@npm:^1.0.1": + version: 1.0.1 + resolution: "arrify@npm:1.0.1" + checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + languageName: node + linkType: hard + +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"balanced-match@npm:^2.0.0": + version: 2.0.0 + resolution: "balanced-match@npm:2.0.0" + checksum: 9a5caad6a292c5df164cc6d0c38e0eedf9a1413f42e5fece733640949d74d0052cfa9587c1a1681f772147fb79be495121325a649526957fd75b3a216d1fbc68 + languageName: node + linkType: hard + +"big.js@npm:^5.2.2": + version: 5.2.2 + resolution: "big.js@npm:5.2.2" + checksum: b89b6e8419b097a8fb4ed2399a1931a68c612bce3cfd5ca8c214b2d017531191070f990598de2fc6f3f993d91c0f08aa82697717f6b3b8732c9731866d233c9e + languageName: node + linkType: hard + +"bower@npm:*": + version: 1.8.14 + resolution: "bower@npm:1.8.14" + bin: + bower: bin/bower + checksum: 47e8af8a0a9cf8849ecd3c2c20deb522e0663044c210dfdf78c3aa3e85e6234a9b9d1ed3f96833649672ea80c743f03db5a5a5691989604a14cf99d0d59fc31b + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.14.5": + version: 4.21.8 + resolution: "browserslist@npm:4.21.8" + dependencies: + caniuse-lite: ^1.0.30001502 + electron-to-chromium: ^1.4.428 + node-releases: ^2.0.12 + update-browserslist-db: ^1.0.11 + bin: + browserslist: cli.js + checksum: 20ab0adafb1832bdfb19153d09a140b779b8e883ce504221c580094cc2adec691515ed304c9091300996ad35fc24e957fbfde169ba0c4a7d219b0794ad2e1556 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"cacache@npm:^17.0.0": + version: 17.1.3 + resolution: "cacache@npm:17.1.3" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: 385756781e1e21af089160d89d7462b7ed9883c978e848c7075b90b73cb823680e66092d61513050164588387d2ca87dd6d910e28d64bc13a9ac82cd8580c796 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: ^1.1.1 + get-intrinsic: ^1.0.2 + checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase-keys@npm:^6.2.2": + version: 6.2.2 + resolution: "camelcase-keys@npm:6.2.2" + dependencies: + camelcase: ^5.3.1 + map-obj: ^4.0.0 + quick-lru: ^4.0.1 + checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001502": + version: 1.0.30001503 + resolution: "caniuse-lite@npm:1.0.30001503" + checksum: cd5f0af37655ff71ec4ab3c49124d75e0b8b68de625d07ea80e9a82329e616b5203d5dad6865192653be9da50081c06878f081ab069dac0be35adf29aa1599cd + languageName: node + linkType: hard + +"chalk@npm:^2.0.0, chalk@npm:^2.3.0, chalk@npm:^2.4.1": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: ^2.0.4 + kind-of: ^6.0.2 + shallow-clone: ^3.0.0 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + languageName: node + linkType: hard + +"clone@npm:~2.1.2": + version: 2.1.2 + resolution: "clone@npm:2.1.2" + checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"colord@npm:^2.9.3": + version: 2.9.3 + resolution: "colord@npm:2.9.3" + checksum: 95d909bfbcfd8d5605cbb5af56f2d1ce2b323990258fd7c0d2eb0e6d3bb177254d7fb8213758db56bb4ede708964f78c6b992b326615f81a18a6aaf11d64c650 + languageName: node + linkType: hard + +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"commander@npm:2, commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"commander@npm:7": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + languageName: node + linkType: hard + +"commander@npm:^10.0.1": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 436901d64a818295803c1996cd856621a74f30b9f9e28a588e726b2b1670665bccd7c1a77007ebf328729f0139838a88a19265858a0fa7a8728c4656796db948 + languageName: node + linkType: hard + +"commander@npm:^9.4.1": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + +"compute-gcd@npm:^1.2.1": + version: 1.2.1 + resolution: "compute-gcd@npm:1.2.1" + dependencies: + validate.io-array: ^1.0.3 + validate.io-function: ^1.0.2 + validate.io-integer-array: ^1.0.0 + checksum: 51cf33b75f7c8db5142fcb99a9d84a40260993fed8e02a7ab443834186c3ab99b3fd20b30ad9075a6a9d959d69df6da74dd3be8a59c78d9f2fe780ebda8242e1 + languageName: node + linkType: hard + +"compute-lcm@npm:^1.1.2": + version: 1.1.2 + resolution: "compute-lcm@npm:1.1.2" + dependencies: + compute-gcd: ^1.2.1 + validate.io-array: ^1.0.3 + validate.io-function: ^1.0.2 + validate.io-integer-array: ^1.0.0 + checksum: d499ab57dcb48e8d0fd233b99844a06d1cc56115602c920c586e998ebba60293731f5b6976e8a1e83ae6cbfe86716f62d9432e8d94913fed8bd8352f447dc917 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + languageName: node + linkType: hard + +"cosmiconfig@npm:^7.1.0": + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" + dependencies: + "@types/parse-json": ^4.0.0 + import-fresh: ^3.2.1 + parse-json: ^5.0.0 + path-type: ^4.0.0 + yaml: ^1.10.0 + checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f + languageName: node + linkType: hard + +"crelt@npm:^1.0.5": + version: 1.0.6 + resolution: "crelt@npm:1.0.6" + checksum: dad842093371ad702afbc0531bfca2b0a8dd920b23a42f26e66dabbed9aad9acd5b9030496359545ef3937c3aced0fd4ac39f7a2d280a23ddf9eb7fdcb94a69f + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.5": + version: 6.0.5 + resolution: "cross-spawn@npm:6.0.5" + dependencies: + nice-try: ^1.0.4 + path-key: ^2.0.1 + semver: ^5.5.0 + shebang-command: ^1.2.0 + which: ^1.2.9 + checksum: f893bb0d96cd3d5751d04e67145bdddf25f99449531a72e82dcbbd42796bbc8268c1076c6b3ea51d4d455839902804b94bc45dfb37ecbb32ea8e54a6741c3ab9 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"css-functions-list@npm:^3.1.0": + version: 3.1.0 + resolution: "css-functions-list@npm:3.1.0" + checksum: 8a7c9d4ae57cb2f01500263e65a21372048d359ca7aa6430a32a736fe2a421decfebe45e579124b9a158ec68aba2eadcd733e568495a7698240d9607d31f681b + languageName: node + linkType: hard + +"css-loader@npm:^6.7.1": + version: 6.8.1 + resolution: "css-loader@npm:6.8.1" + dependencies: + icss-utils: ^5.1.0 + postcss: ^8.4.21 + postcss-modules-extract-imports: ^3.0.0 + postcss-modules-local-by-default: ^4.0.3 + postcss-modules-scope: ^3.0.0 + postcss-modules-values: ^4.0.0 + postcss-value-parser: ^4.2.0 + semver: ^7.3.8 + peerDependencies: + webpack: ^5.0.0 + checksum: 7c1784247bdbe76dc5c55fb1ac84f1d4177a74c47259942c9cfdb7a8e6baef11967a0bc85ac285f26bd26d5059decb848af8154a03fdb4f4894f41212f45eef3 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: f8c4ababffbc5e2ddf2fa9957dda1ee4af6048e22aeda1869d0d00843223c1b13ad3f5d88b51caa46c994225eacb636b764eb807a8883e2fb6f99b4f4e8c48b2 + languageName: node + linkType: hard + +"csstype@npm:3.0.10": + version: 3.0.10 + resolution: "csstype@npm:3.0.10" + checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 + languageName: node + linkType: hard + +"csstype@npm:^3.0.2": + version: 3.1.2 + resolution: "csstype@npm:3.1.2" + checksum: e1a52e6c25c1314d6beef5168da704ab29c5186b877c07d822bd0806717d9a265e8493a2e35ca7e68d0f5d472d43fac1cdce70fd79fd0853dff81f3028d857b5 + languageName: node + linkType: hard + +"d3-array@npm:1 - 3, d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:^3.2.2": + version: 3.2.4 + resolution: "d3-array@npm:3.2.4" + dependencies: + internmap: 1 - 2 + checksum: a5976a6d6205f69208478bb44920dd7ce3e788c9dceb86b304dbe401a4bfb42ecc8b04c20facde486e9adcb488b5d1800d49393a3f81a23902b68158e12cddd0 + languageName: node + linkType: hard + +"d3-array@npm:3.2.2": + version: 3.2.2 + resolution: "d3-array@npm:3.2.2" + dependencies: + internmap: 1 - 2 + checksum: 98af3db792685ceca5d9c3721efba0c567520da5532b2c7a590fd83627a598ea225d11c2cecbad404dc154120feb5ea6df0ded38f82ddf342c714cfd0c6143d1 + languageName: node + linkType: hard + +"d3-color@npm:1 - 3, d3-color@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b + languageName: node + linkType: hard + +"d3-delaunay@npm:^6.0.2": + version: 6.0.4 + resolution: "d3-delaunay@npm:6.0.4" + dependencies: + delaunator: 5 + checksum: ce6d267d5ef21a8aeadfe4606329fc80a22ab6e7748d47bc220bcc396ee8be84b77a5473033954c5ac4aa522d265ddc45d4165d30fe4787dd60a15ea66b9bbb4 + languageName: node + linkType: hard + +"d3-dispatch@npm:1 - 3": + version: 3.0.1 + resolution: "d3-dispatch@npm:3.0.1" + checksum: fdfd4a230f46463e28e5b22a45dd76d03be9345b605e1b5dc7d18bd7ebf504e6c00ae123fd6d03e23d9e2711e01f0e14ea89cd0632545b9f0c00b924ba4be223 + languageName: node + linkType: hard + +"d3-dsv@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-dsv@npm:3.0.1" + dependencies: + commander: 7 + iconv-lite: 0.6 + rw: 1 + bin: + csv2json: bin/dsv2json.js + csv2tsv: bin/dsv2dsv.js + dsv2dsv: bin/dsv2dsv.js + dsv2json: bin/dsv2json.js + json2csv: bin/json2dsv.js + json2dsv: bin/json2dsv.js + json2tsv: bin/json2dsv.js + tsv2csv: bin/dsv2dsv.js + tsv2json: bin/dsv2json.js + checksum: 5fc0723647269d5dccd181d74f2265920ab368a2868b0b4f55ffa2fecdfb7814390ea28622cd61ee5d9594ab262879509059544e9f815c54fe76fbfb4ffa4c8a + languageName: node + linkType: hard + +"d3-force@npm:^3.0.0": + version: 3.0.0 + resolution: "d3-force@npm:3.0.0" + dependencies: + d3-dispatch: 1 - 3 + d3-quadtree: 1 - 3 + d3-timer: 1 - 3 + checksum: 6c7e96438cab62fa32aeadb0ade3297b62b51f81b1b38b0a60a5ec9fd627d74090c1189654d92df2250775f31b06812342f089f1d5947de9960a635ee3581def + languageName: node + linkType: hard + +"d3-format@npm:1 - 3, d3-format@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-format@npm:3.1.0" + checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 + languageName: node + linkType: hard + +"d3-geo-projection@npm:^4.0.0": + version: 4.0.0 + resolution: "d3-geo-projection@npm:4.0.0" + dependencies: + commander: 7 + d3-array: 1 - 3 + d3-geo: 1.12.0 - 3 + bin: + geo2svg: bin/geo2svg.js + geograticule: bin/geograticule.js + geoproject: bin/geoproject.js + geoquantize: bin/geoquantize.js + geostitch: bin/geostitch.js + checksum: 631422b10dd78d1047ba5a3b073148bea27721060bd7087a5fa6c053ca80445d26432e505e0e3acbd6e0d76cf577c61bf9a5db70dabbc9310c493de1f7ff736d + languageName: node + linkType: hard + +"d3-geo@npm:1.12.0 - 3, d3-geo@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-geo@npm:3.1.0" + dependencies: + d3-array: 2.5.0 - 3 + checksum: adf82b0c105c0c5951ae0a833d4dfc479a563791ad7938579fa14e1cffd623b469d8aa7a37dc413a327fb6ac56880f3da3f6c43d4abe3c923972dd98f34f37d1 + languageName: node + linkType: hard + +"d3-hierarchy@npm:^3.1.2": + version: 3.1.2 + resolution: "d3-hierarchy@npm:3.1.2" + checksum: 0fd946a8c5fd4686d43d3e11bbfc2037a145fda29d2261ccd0e36f70b66af6d7638e2c0c7112124d63fc3d3127197a00a6aecf676bd5bd392a94d7235a214263 + languageName: node + linkType: hard + +"d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: 1 - 3 + checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b + languageName: node + linkType: hard + +"d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 2306f1bd9191e1eac895ec13e3064f732a85f243d6e627d242a313f9777756838a2215ea11562f0c7630c7c3b16a19ec1fe0948b1c82f3317fac55882f6ee5d8 + languageName: node + linkType: hard + +"d3-quadtree@npm:1 - 3": + version: 3.0.1 + resolution: "d3-quadtree@npm:3.0.1" + checksum: 5469d462763811475f34a7294d984f3eb100515b0585ca5b249656f6b1a6e99b20056a2d2e463cc9944b888896d2b1d07859c50f9c0cf23438df9cd2e3146066 + languageName: node + linkType: hard + +"d3-scale@npm:^4.0.2": + version: 4.0.2 + resolution: "d3-scale@npm:4.0.2" + dependencies: + d3-array: 2.10.0 - 3 + d3-format: 1 - 3 + d3-interpolate: 1.2.0 - 3 + d3-time: 2.1.1 - 3 + d3-time-format: 2 - 4 + checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e + languageName: node + linkType: hard + +"d3-shape@npm:^3.2.0": + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" + dependencies: + d3-path: ^3.1.0 + checksum: de2af5fc9a93036a7b68581ca0bfc4aca2d5a328aa7ba7064c11aedd44d24f310c20c40157cb654359d4c15c3ef369f95ee53d71221017276e34172c7b719cfa + languageName: node + linkType: hard + +"d3-time-format@npm:2 - 4, d3-time-format@npm:^4.1.0": + version: 4.1.0 + resolution: "d3-time-format@npm:4.1.0" + dependencies: + d3-time: 1 - 3 + checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 + languageName: node + linkType: hard + +"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-time@npm:3.1.0" + dependencies: + d3-array: 2 - 3 + checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 + languageName: node + linkType: hard + +"d3-timer@npm:1 - 3, d3-timer@npm:^3.0.1": + version: 3.0.1 + resolution: "d3-timer@npm:3.0.1" + checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 + languageName: node + linkType: hard + +"data-urls@npm:^2.0.0": + version: 2.0.0 + resolution: "data-urls@npm:2.0.0" + dependencies: + abab: ^2.0.3 + whatwg-mimetype: ^2.3.0 + whatwg-url: ^8.0.0 + checksum: 97caf828aac25e25e04ba6869db0f99c75e6859bb5b424ada28d3e7841941ebf08ddff3c1b1bb4585986bd507a5d54c2a716853ea6cb98af877400e637393e71 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + +"decamelize-keys@npm:^1.1.0": + version: 1.1.1 + resolution: "decamelize-keys@npm:1.1.1" + dependencies: + decamelize: ^1.1.0 + map-obj: ^1.0.0 + checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + languageName: node + linkType: hard + +"decamelize@npm:^1.1.0, decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": + version: 1.2.0 + resolution: "define-properties@npm:1.2.0" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 + languageName: node + linkType: hard + +"delaunator@npm:5": + version: 5.0.0 + resolution: "delaunator@npm:5.0.0" + dependencies: + robust-predicates: ^3.0.0 + checksum: d6764188442b7f7c6bcacebd96edc00e35f542a96f1af3ef600e586bfb9849a3682c489c0ab423440c90bc4c7cac77f28761babff76fa29e193e1cf50a95b860 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.2.0 + entities: ^2.0.0 + checksum: fbb0b01f87a8a2d18e6e5a388ad0f7ec4a5c05c06d219377da1abc7bb0f674d804f4a8a94e3f71ff15f6cb7dcfc75704a54b261db672b9b3ab03da6b758b0b22 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: ee837a318ff702622f383409d1f5b25dd1024b692ef64d3096ff702e26339f8e345820f29a68bcdcea8cfee3531776b3382651232fbeae95612d6f0a75efb4f6 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: ^2.2.0 + checksum: 4c665ceed016e1911bf7d1dadc09dc888090b64dee7851cccd2fcf5442747ec39c647bb1cb8c8919f8bbdd0f0c625a6bafeeed4b2d656bbecdbae893f43ffaaa + languageName: node + linkType: hard + +"domutils@npm:^2.5.2": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: ^1.0.1 + domelementtype: ^2.2.0 + domhandler: ^4.2.0 + checksum: abf7434315283e9aadc2a24bac0e00eab07ae4313b40cc239f89d84d7315ebdfd2fb1b5bf750a96bc1b4403d7237c7b2ebf60459be394d625ead4ca89b934391 + languageName: node + linkType: hard + +"duplicate-package-checker-webpack-plugin@npm:^3.0.0": + version: 3.0.0 + resolution: "duplicate-package-checker-webpack-plugin@npm:3.0.0" + dependencies: + chalk: ^2.3.0 + find-root: ^1.0.0 + lodash: ^4.17.4 + semver: ^5.4.1 + checksum: d77be45cb72d79a429c64d8f8f7603fea681d182fb795459a3d4afa608faad9a923378a7e80c6855f465263e1983140b6fc3682bd0213228b8cd7906ab4b934d + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.428": + version: 1.4.431 + resolution: "electron-to-chromium@npm:1.4.431" + checksum: 51b76599b1e8141ced50339e873fe961aa56369cd622fb8a26964c084722204866fadbde94219a432398dab1317a5afd79843ba97cdcd5819dfc98be0e47c0a1 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + +"emojis-list@npm:^3.0.0": + version: 3.0.0 + resolution: "emojis-list@npm:3.0.0" + checksum: ddaaa02542e1e9436c03970eeed445f4ed29a5337dfba0fe0c38dfdd2af5da2429c2a0821304e8a8d1cadf27fdd5b22ff793571fa803ae16852a6975c65e8e70 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.15.0": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 + languageName: node + linkType: hard + +"enquirer@npm:^2.3.5": + version: 2.3.6 + resolution: "enquirer@npm:2.3.6" + dependencies: + ansi-colors: ^4.1.1 + checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 19010dacaf0912c895ea262b4f6128574f9ccf8d4b3b65c7e8334ad0079b3706376360e28d8843ff50a78aabcb8f08f0a32dbfacdc77e47ed77ca08b713669b3 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"envinfo@npm:^7.7.3": + version: 7.8.1 + resolution: "envinfo@npm:7.8.1" + bin: + envinfo: dist/cli.js + checksum: de736c98d6311c78523628ff127af138451b162e57af5293c1b984ca821d0aeb9c849537d2fde0434011bed33f6bca5310ca2aab8a51a3f28fc719e89045d648 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": + version: 1.21.2 + resolution: "es-abstract@npm:1.21.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.2.0 + get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + is-array-buffer: ^3.0.2 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.3 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + safe-regex-test: ^1.0.0 + string.prototype.trim: ^1.2.7 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.9 + checksum: 037f55ee5e1cdf2e5edbab5524095a4f97144d95b94ea29e3611b77d852fd8c8a40e7ae7101fa6a759a9b9b1405f188c3c70928f2d3cd88d543a07fc0d5ad41a + languageName: node + linkType: hard + +"es-module-lexer@npm:^1.2.1": + version: 1.3.0 + resolution: "es-module-lexer@npm:1.3.0" + checksum: 48fd9f504a9d2a894126f75c8b7ccc6273a289983e9b67255f165bfd9ae765d50100218251e94e702ca567826905ea2f7b3b4a0c4d74d3ce99cce3a2a606a238 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^6.15.0": + version: 6.15.0 + resolution: "eslint-config-prettier@npm:6.15.0" + dependencies: + get-stdin: ^6.0.0 + peerDependencies: + eslint: ">=3.14.1" + bin: + eslint-config-prettier-check: bin/cli.js + checksum: 02f461a5d7fbf06bd17077e76857eb7cf70def81762fb853094ae16e895231b2bf53c7ca83f535b943d7558fdd02ac41b33eb6d59523e60b1d8c6d1730d00f1e + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^3.1.4": + version: 3.4.1 + resolution: "eslint-plugin-prettier@npm:3.4.1" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + eslint: ">=5.0.0" + prettier: ">=1.13.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: fa6a89f0d7cba1cc87064352f5a4a68dc3739448dd279bec2bced1bfa3b704467e603d13b69dcec853f8fa30b286b8b715912898e9da776e1b016cf0ee48bd99 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "eslint-utils@npm:2.1.0" + dependencies: + eslint-visitor-keys: ^1.1.0 + checksum: 27500938f348da42100d9e6ad03ae29b3de19ba757ae1a7f4a087bdcf83ac60949bbb54286492ca61fac1f5f3ac8692dd21537ce6214240bf95ad0122f24d71d + languageName: node + linkType: hard + +"eslint-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-utils@npm:3.0.0" + dependencies: + eslint-visitor-keys: ^2.0.0 + peerDependencies: + eslint: ">=5" + checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0": + version: 1.3.0 + resolution: "eslint-visitor-keys@npm:1.3.0" + checksum: 37a19b712f42f4c9027e8ba98c2b06031c17e0c0a4c696cd429bd9ee04eb43889c446f2cd545e1ff51bef9593fcec94ecd2c2ef89129fcbbf3adadbef520376a + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d + languageName: node + linkType: hard + +"eslint@npm:^7.14.0": + version: 7.32.0 + resolution: "eslint@npm:7.32.0" + dependencies: + "@babel/code-frame": 7.12.11 + "@eslint/eslintrc": ^0.4.3 + "@humanwhocodes/config-array": ^0.5.0 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.0.1 + doctrine: ^3.0.0 + enquirer: ^2.3.5 + escape-string-regexp: ^4.0.0 + eslint-scope: ^5.1.1 + eslint-utils: ^2.1.0 + eslint-visitor-keys: ^2.0.0 + espree: ^7.3.1 + esquery: ^1.4.0 + 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: ^5.1.2 + globals: ^13.6.0 + ignore: ^4.0.6 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + js-yaml: ^3.13.1 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.0.4 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + progress: ^2.0.0 + regexpp: ^3.1.0 + semver: ^7.2.1 + strip-ansi: ^6.0.0 + strip-json-comments: ^3.1.0 + table: ^6.0.9 + text-table: ^0.2.0 + v8-compile-cache: ^2.0.3 + bin: + eslint: bin/eslint.js + checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37 + languageName: node + linkType: hard + +"espree@npm:^7.3.0, espree@npm:^7.3.1": + version: 7.3.1 + resolution: "espree@npm:7.3.1" + dependencies: + acorn: ^7.4.0 + acorn-jsx: ^5.3.1 + eslint-visitor-keys: ^1.3.0 + checksum: aa9b50dcce883449af2e23bc2b8d9abb77118f96f4cb313935d6b220f77137eaef7724a83c3f6243b96bc0e4ab14766198e60818caad99f9519ae5a336a39b45 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.0": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3, fast-deep-equal@npm:~3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-diff@npm:^1.1.2": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: d22d371b994fdc8cce9ff510d7b8dc4da70ac327bcba20df607dd5b9cae9f908f4d1028f5fe467650f058d1e7270235ae0b8230809a262b4df587a3b3aa216c3 + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:~2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12, fastest-levenshtein@npm:^1.0.16": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-root@npm:^1.0.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 + languageName: node + linkType: hard + +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + languageName: node + linkType: hard + +"free-style@npm:3.1.0": + version: 3.1.0 + resolution: "free-style@npm:3.1.0" + checksum: 949258ae315deda48cac93ecd5f9a80f36e8a027e19ce2103598dc8d5ab60e963bbad5444b2a4990ddb746798dd188896f430285cf484afbf2141f7d75a191d8 + languageName: node + linkType: hard + +"fs-extra@npm:^10.1.0": + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.2 + resolution: "fs-minipass@npm:3.0.2" + dependencies: + minipass: ^5.0.0 + checksum: e9cc0e1f2d01c6f6f62f567aee59530aba65c6c7b2ae88c5027bc34c711ebcfcfaefd0caf254afa6adfe7d1fba16bc2537508a6235196bac7276747d078aef0a + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + +"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": + version: 1.2.1 + resolution: "get-intrinsic@npm:1.2.1" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f + languageName: node + linkType: hard + +"get-stdin@npm:^6.0.0": + version: 6.0.0 + resolution: "get-stdin@npm:6.0.0" + checksum: 593f6fb4fff4c8d49ec93a07c430c1edc6bd4fe7e429d222b5da2f367276a98809af9e90467ad88a2d83722ff95b9b35bbaba02b56801421c5e3668173fe12b4 + languageName: node + linkType: hard + +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 + languageName: node + linkType: hard + +"glob@npm:^10.2.2": + version: 10.2.7 + resolution: "glob@npm:10.2.7" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.0.3 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 + path-scurry: ^1.7.0 + bin: + glob: dist/cjs/src/bin.js + checksum: 555205a74607d6f8d9874ba888924b305b5ea1abfaa2e9ccb11ac713d040aac7edbf7d8702a2f4a1cd81b2d7666412170ce7ef061d33cddde189dae8c1a1a054 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:~7.1.6": + version: 7.1.7 + resolution: "glob@npm:7.1.7" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + languageName: node + linkType: hard + +"global-modules@npm:^2.0.0": + version: 2.0.0 + resolution: "global-modules@npm:2.0.0" + dependencies: + global-prefix: ^3.0.0 + checksum: d6197f25856c878c2fb5f038899f2dca7cbb2f7b7cf8999660c0104972d5cfa5c68b5a0a77fa8206bb536c3903a4615665acb9709b4d80846e1bb47eaef65430 + languageName: node + linkType: hard + +"global-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "global-prefix@npm:3.0.0" + dependencies: + ini: ^1.3.5 + kind-of: ^6.0.2 + which: ^1.3.1 + checksum: 8a82fc1d6f22c45484a4e34656cc91bf021a03e03213b0035098d605bfc612d7141f1e14a21097e8a0413b4884afd5b260df0b6a25605ce9d722e11f1df2881d + languageName: node + linkType: hard + +"globals@npm:^13.6.0, globals@npm:^13.9.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" + dependencies: + type-fest: ^0.20.2 + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + languageName: node + linkType: hard + +"globby@npm:^11.0.3, globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + 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 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"globjoin@npm:^0.1.4": + version: 0.1.4 + resolution: "globjoin@npm:0.1.4" + checksum: 0a47d88d566122d9e42da946453ee38b398e0021515ac6a95d13f980ba8c1e42954e05ee26cfcbffce1ac1ee094d0524b16ce1dd874ca52408d6db5c6d39985b + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"hard-rejection@npm:^2.1.0": + version: 2.1.0 + resolution: "hard-rejection@npm:2.1.0" + checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + languageName: node + linkType: hard + +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: ^1.0.2 + checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.8.9 + resolution: "hosted-git-info@npm:2.8.9" + checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + languageName: node + linkType: hard + +"hosted-git-info@npm:^4.0.1": + version: 4.1.0 + resolution: "hosted-git-info@npm:4.1.0" + dependencies: + lru-cache: ^6.0.0 + checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + languageName: node + linkType: hard + +"html-tags@npm:^3.2.0": + version: 3.3.1 + resolution: "html-tags@npm:3.3.1" + checksum: b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce + languageName: node + linkType: hard + +"htmlparser2@npm:^6.0.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: ^2.0.1 + domhandler: ^4.0.0 + domutils: ^2.5.2 + entities: ^2.0.0 + checksum: 81a7b3d9c3bb9acb568a02fc9b1b81ffbfa55eae7f1c41ae0bf840006d1dbf54cb3aa245b2553e2c94db674840a9f0fdad7027c9a9d01a062065314039058c4e + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": + version: 5.1.0 + resolution: "icss-utils@npm:5.1.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 5c324d283552b1269cfc13a503aaaa172a280f914e5b81544f3803bc6f06a3b585fb79f66f7c771a2c052db7982c18bf92d001e3b47282e3abbbb4c4cc488d68 + languageName: node + linkType: hard + +"ignore@npm:^4.0.6": + version: 4.0.6 + resolution: "ignore@npm:4.0.6" + checksum: 248f82e50a430906f9ee7f35e1158e3ec4c3971451dd9f99c9bc1548261b4db2b99709f60ac6c6cac9333494384176cc4cc9b07acbe42d52ac6a09cad734d800 + languageName: node + linkType: hard + +"ignore@npm:^5.1.8, ignore@npm:^5.2.0, ignore@npm:^5.2.1": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"import-lazy@npm:^4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"inherits@npm:2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 78cb8d7d850d20a5e9a7f3620db31483aa00ad5f722ce03a55b110e5a723539b3716a3b463e2b96ce3fe286f33afc7c131fa2f91407528ba80cea98a7545d4c0 + languageName: node + linkType: hard + +"ini@npm:^1.3.5": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + languageName: node + linkType: hard + +"internal-slot@npm:^1.0.5": + version: 1.0.5 + resolution: "internal-slot@npm:1.0.5" + dependencies: + get-intrinsic: ^1.2.0 + has: ^1.0.3 + side-channel: ^1.0.4 + checksum: 97e84046bf9e7574d0956bd98d7162313ce7057883b6db6c5c7b5e5f05688864b0978ba07610c726d15d66544ffe4b1050107d93f8a39ebc59b15d8b429b497a + languageName: node + linkType: hard + +"internmap@npm:1 - 2": + version: 2.0.3 + resolution: "internmap@npm:2.0.3" + checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 + languageName: node + linkType: hard + +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.0 + is-typed-array: ^1.1.10 + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + +"is-core-module@npm:^2.12.0, is-core-module@npm:^2.5.0": + version: 2.12.1 + resolution: "is-core-module@npm:2.12.1" + dependencies: + has: ^1.0.3 + checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-plain-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "is-plain-obj@npm:1.1.0" + checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + languageName: node + linkType: hard + +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + +"isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + languageName: node + linkType: hard + +"isomorphic.js@npm:^0.2.4": + version: 0.2.5 + resolution: "isomorphic.js@npm:0.2.5" + checksum: d8d1b083f05f3c337a06628b982ac3ce6db953bbef14a9de8ad49131250c3592f864b73c12030fdc9ef138ce97b76ef55c7d96a849561ac215b1b4b9d301c8e9 + languageName: node + linkType: hard + +"jackspeak@npm:^2.0.3": + version: 2.2.1 + resolution: "jackspeak@npm:2.2.1" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: e29291c0d0f280a063fa18fbd1e891ab8c2d7519fd34052c0ebde38538a15c603140d60c2c7f432375ff7ee4c5f1c10daa8b2ae19a97c3d4affe308c8360c1df + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-schema-compare@npm:^0.2.2": + version: 0.2.2 + resolution: "json-schema-compare@npm:0.2.2" + dependencies: + lodash: ^4.17.4 + checksum: dd6f2173857c8e3b77d6ebdfa05bd505bba5b08709ab46b532722f5d1c33b5fee1fc8f3c97d0c0d011db25f9f3b0baf7ab783bb5f55c32abd9f1201760e43c2c + languageName: node + linkType: hard + +"json-schema-merge-allof@npm:^0.8.1": + version: 0.8.1 + resolution: "json-schema-merge-allof@npm:0.8.1" + dependencies: + compute-lcm: ^1.1.2 + json-schema-compare: ^0.2.2 + lodash: ^4.17.20 + checksum: 82700f6ac77351959138d6b153d77375a8c29cf48d907241b85c8292dd77aabd8cb816400f2b0d17062c4ccc8893832ec4f664ab9c814927ef502e7a595ea873 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-schema-traverse@npm:^1.0.0": + version: 1.0.0 + resolution: "json-schema-traverse@npm:1.0.0" + checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json-stringify-pretty-compact@npm:~3.0.0": + version: 3.0.0 + resolution: "json-stringify-pretty-compact@npm:3.0.0" + checksum: 01ab5c5c8260299414868d96db97f53aef93c290fe469edd9a1363818e795006e01c952fa2fd7b47cbbab506d5768998eccc25e1da4fa2ccfebd1788c6098791 + languageName: node + linkType: hard + +"json5@npm:^2.1.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + +"jsonfile@npm:^6.0.1": + version: 6.1.0 + resolution: "jsonfile@npm:6.1.0" + dependencies: + graceful-fs: ^4.1.6 + universalify: ^2.0.0 + dependenciesMeta: + graceful-fs: + optional: true + checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + languageName: node + linkType: hard + +"jsonpointer@npm:^5.0.1": + version: 5.0.1 + resolution: "jsonpointer@npm:5.0.1" + checksum: 0b40f712900ad0c846681ea2db23b6684b9d5eedf55807b4708c656f5894b63507d0e28ae10aa1bddbea551241035afe62b6df0800fc94c2e2806a7f3adecd7c + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + languageName: node + linkType: hard + +"known-css-properties@npm:^0.26.0": + version: 0.26.0 + resolution: "known-css-properties@npm:0.26.0" + checksum: e706f4af9d2683202df9f717e7d713f0f8c3330f155842c40d8f3b2a5837956c34aeb7ba08760977ccde1afce8b5377e29b40eb3e5c0b42bef28ddd108543cfb + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"lib0@npm:^0.2.42, lib0@npm:^0.2.74": + version: 0.2.78 + resolution: "lib0@npm:0.2.78" + dependencies: + isomorphic.js: ^0.2.4 + bin: + 0gentesthtml: bin/gentesthtml.js + 0serve: bin/0serve.js + checksum: a9c90a9228e10e581bf416f4ecade967687d67e6ea3e822ef69e2628a77a2a0254ef7e2eb7e555d412f9e9467049b7fb760c079878f9a934dd85d2646a53d172 + languageName: node + linkType: hard + +"license-webpack-plugin@npm:^2.3.14": + version: 2.3.21 + resolution: "license-webpack-plugin@npm:2.3.21" + dependencies: + "@types/webpack-sources": ^0.1.5 + webpack-sources: ^1.2.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 6208bd2060d200fbffbcc89702c929d50c5a4a3f2158b046cf813b3f7f728bbbe4611b9fea2d67843bb5e7d64ad9122cc368a19ac73f5c4ad41765e6283bdc0c + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.2 + parse-json: ^4.0.0 + pify: ^3.0.0 + strip-bom: ^3.0.0 + checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 + languageName: node + linkType: hard + +"loader-utils@npm:^2.0.0": + version: 2.0.4 + resolution: "loader-utils@npm:2.0.4" + dependencies: + big.js: ^5.2.2 + emojis-list: ^3.0.0 + json5: ^2.1.2 + checksum: a5281f5fff1eaa310ad5e1164095689443630f3411e927f95031ab4fb83b4a98f388185bb1fe949e8ab8d4247004336a625e9255c22122b815bb9a4c5d8fc3b7 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 + languageName: node + linkType: hard + +"lodash.escape@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.escape@npm:4.0.1" + checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lodash.mergewith@npm:^4.6.1": + version: 4.6.2 + resolution: "lodash.mergewith@npm:4.6.2" + checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 + languageName: node + linkType: hard + +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5 + languageName: node + linkType: hard + +"lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: ^3.0.0 || ^4.0.0 + bin: + loose-envify: cli.js + checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"lru-cache@npm:^9.1.1": + version: 9.1.2 + resolution: "lru-cache@npm:9.1.2" + checksum: d3415634be3908909081fc4c56371a8d562d9081eba70543d86871b978702fffd0e9e362b83921b27a29ae2b37b90f55675aad770a54ac83bb3e4de5049d4b15 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^11.0.3": + version: 11.1.1 + resolution: "make-fetch-happen@npm:11.1.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^17.0.0 + http-cache-semantics: ^4.1.1 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^5.0.0 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^10.0.0 + checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + languageName: node + linkType: hard + +"map-obj@npm:^1.0.0": + version: 1.0.1 + resolution: "map-obj@npm:1.0.1" + checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + languageName: node + linkType: hard + +"map-obj@npm:^4.0.0": + version: 4.3.0 + resolution: "map-obj@npm:4.3.0" + checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + languageName: node + linkType: hard + +"markdown-to-jsx@npm:^7.2.1": + version: 7.2.1 + resolution: "markdown-to-jsx@npm:7.2.1" + peerDependencies: + react: ">= 0.14.0" + checksum: 0c8c715229044401ea48c2fc26c2554464100074959dafacdd9e4a0e849f0a190b02f39edb373bbdd95e38b8f910074b83b63d08752b8ae6be6ddcfb40ea50a0 + languageName: node + linkType: hard + +"mathml-tag-names@npm:^2.1.3": + version: 2.1.3 + resolution: "mathml-tag-names@npm:2.1.3" + checksum: 1201a25a137d6b9e328facd67912058b8b45b19a6c4cc62641c9476195da28a275ca6e0eca070af5378b905c2b11abc1114676ba703411db0b9ce007de921ad0 + languageName: node + linkType: hard + +"memorystream@npm:^0.3.1": + version: 0.3.1 + resolution: "memorystream@npm:0.3.1" + checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9 + languageName: node + linkType: hard + +"meow@npm:^9.0.0": + version: 9.0.0 + resolution: "meow@npm:9.0.0" + dependencies: + "@types/minimist": ^1.2.0 + camelcase-keys: ^6.2.2 + decamelize: ^1.2.0 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.0 + read-pkg-up: ^7.0.1 + redent: ^3.0.0 + trim-newlines: ^3.0.0 + type-fest: ^0.18.0 + yargs-parser: ^20.2.3 + checksum: 99799c47247f4daeee178e3124f6ef6f84bde2ba3f37652865d5d8f8b8adcf9eedfc551dd043e2455cd8206545fd848e269c0c5ab6b594680a0ad4d3617c9639 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.27": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0": + version: 1.0.1 + resolution: "min-indent@npm:1.0.1" + checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + languageName: node + linkType: hard + +"mini-css-extract-plugin@npm:^2.7.0": + version: 2.7.6 + resolution: "mini-css-extract-plugin@npm:2.7.6" + dependencies: + schema-utils: ^4.0.0 + peerDependencies: + webpack: ^5.0.0 + checksum: be6f7cefc6275168eb0a6b8fe977083a18c743c9612c9f00e6c1a62c3393ca7960e93fba1a7ebb09b75f36a0204ad087d772c1ef574bc29c90c0e8175a3c0b83 + languageName: node + linkType: hard + +"mini-svg-data-uri@npm:^1.4.4": + version: 1.4.4 + resolution: "mini-svg-data-uri@npm:1.4.4" + bin: + mini-svg-data-uri: cli.js + checksum: 997f1fbd8d59a70f03761e18626d335197a3479cb9d1ff75678e4b64b864d32a0b8fc18115eabde035e5299b8b4a354a78e57dd6ac10f9d604162a6170898d09 + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.1 + resolution: "minimatch@npm:9.0.1" + dependencies: + brace-expansion: ^2.0.1 + checksum: 97f5f5284bb57dc65b9415dec7f17a0f6531a33572193991c60ff18450dcfad5c2dad24ffeaf60b5261dccd63aae58cc3306e2209d57e7f88c51295a532d8ec3 + languageName: node + linkType: hard + +"minimist-options@npm:4.1.0": + version: 4.1.0 + resolution: "minimist-options@npm:4.1.0" + dependencies: + arrify: ^1.0.1 + is-plain-obj: ^1.1.0 + kind-of: ^6.0.3 + checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:~1.2.0": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.3 + resolution: "minipass-fetch@npm:3.0.3" + dependencies: + encoding: ^0.1.13 + minipass: ^5.0.0 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: af5ab2552a16fcf505d35fd7ffb84b57f4a0eeb269e6e1d9a2a75824dda48b36e527083250b7cca4a4def21d9544e2ade441e4730e233c0bc2133f6abda31e18 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2": + version: 6.0.2 + resolution: "minipass@npm:6.0.2" + checksum: d140b91f4ab2e5ce5a9b6c468c0e82223504acc89114c1a120d4495188b81fedf8cade72a9f4793642b4e66672f990f1e0d902dd858485216a07cd3c8a62fac9 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"nanoid@npm:^3.3.6": + version: 3.3.6 + resolution: "nanoid@npm:3.3.6" + bin: + nanoid: bin/nanoid.cjs + checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"nbgrader@workspace:.": + version: 0.0.0-use.local + resolution: "nbgrader@workspace:." + dependencies: + "@jupyter-notebook/application": ^7.0.0-alpha.5 + "@jupyterlab/application": ^4.0.0-alpha.11 + "@jupyterlab/apputils": ^4.0.0-alpha.11 + "@jupyterlab/builder": ^4.0.0-alpha.11 + "@jupyterlab/cells": ^4.0.0-alpha.11 + "@jupyterlab/coreutils": ^6.0.0-alpha.11 + "@jupyterlab/galata": ^5.0.0-alpha.11 + "@jupyterlab/launcher": ^4.0.0-alpha.11 + "@jupyterlab/notebook": ^4.0.0-alpha.11 + "@jupyterlab/services": ^7.0.0-alpha.11 + "@jupyterlab/settingregistry": ^4.0.0-alpha.11 + "@playwright/test": ^1.21.1 + "@types/codemirror": ^5.60.5 + "@typescript-eslint/eslint-plugin": ^4.8.1 + "@typescript-eslint/parser": ^4.8.1 + bower: "*" + eslint: ^7.14.0 + eslint-config-prettier: ^6.15.0 + eslint-plugin-prettier: ^3.1.4 + mkdirp: ^1.0.3 + npm-run-all: ^4.1.5 + prettier: ^2.1.1 + rimraf: ^3.0.2 + stylelint: ^14.3.0 + stylelint-config-prettier: ^9.0.3 + stylelint-config-recommended: ^6.0.0 + stylelint-config-standard: ~24.0.0 + stylelint-prettier: ^2.0.0 + typescript: ~4.1.3 + languageName: unknown + linkType: soft + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 0b4af3b5bb5d86c289f7a026303d192a7eb4417231fe47245c460baeabae7277bcd8fd9c728fb6bd62c30b3e15cd6620373e2cf33353b095d8b403d3e8a15aff + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.7": + version: 2.6.11 + resolution: "node-fetch@npm:2.6.11" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 249d0666a9497553384d46b5ab296ba223521ac88fed4d8a17d6ee6c2efb0fc890f3e8091cafe7f9fba8151a5b8d925db2671543b3409a56c3cd522b468b47b3 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.4.0 + resolution: "node-gyp@npm:9.4.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^11.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.12": + version: 2.0.12 + resolution: "node-releases@npm:2.0.12" + checksum: b8c56db82c4642a0f443332b331a4396dae452a2ac5a65c8dbd93ef89ecb2fbb0da9d42ac5366d4764973febadca816cf7587dad492dce18d2a6b2af59cda260 + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": + version: 2.5.0 + resolution: "normalize-package-data@npm:2.5.0" + dependencies: + hosted-git-info: ^2.1.4 + resolve: ^1.10.0 + semver: 2 || 3 || 4 || 5 + validate-npm-package-license: ^3.0.1 + checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + languageName: node + linkType: hard + +"normalize-package-data@npm:^3.0.0": + version: 3.0.3 + resolution: "normalize-package-data@npm:3.0.3" + dependencies: + hosted-git-info: ^4.0.1 + is-core-module: ^2.5.0 + semver: ^7.3.4 + validate-npm-package-license: ^3.0.1 + checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-all@npm:^4.1.5": + version: 4.1.5 + resolution: "npm-run-all@npm:4.1.5" + dependencies: + ansi-styles: ^3.2.1 + chalk: ^2.4.1 + cross-spawn: ^6.0.5 + memorystream: ^0.3.1 + minimatch: ^3.0.4 + pidtree: ^0.3.0 + read-pkg: ^3.0.0 + shell-quote: ^1.6.1 + string.prototype.padend: ^3.0.0 + bin: + npm-run-all: bin/npm-run-all/index.js + run-p: bin/run-p/index.js + run-s: bin/run-s/index.js + checksum: 373b72c6a36564da13c1642c1fd9bb4dcc756bce7a3648f883772f02661095319820834ff813762d2fee403e9b40c1cd27c8685807c107440f10eb19c006d4a0 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + languageName: node + linkType: hard + +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + dependencies: + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + word-wrap: ^1.2.3 + checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: ^1.3.1 + json-parse-better-errors: ^1.0.1 + checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 + languageName: node + linkType: hard + +"parse-json@npm:^5.0.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"parse-srcset@npm:^1.0.2": + version: 1.0.2 + resolution: "parse-srcset@npm:1.0.2" + checksum: 3a0380380c6082021fcce982f0b89fb8a493ce9dfd7d308e5e6d855201e80db8b90438649b31fdd82a3d6089a8ca17dccddaa2b730a718389af4c037b8539ebf + languageName: node + linkType: hard + +"path-browserify@npm:^1.0.0": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: f7ab0ad42fe3fb8c7f11d0c4f849871e28fbd8e1add65c370e422512fc5887097b9cf34d09c1747d45c942a8c1e26468d6356e2df3f740bf177ab8ca7301ebfd + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-scurry@npm:^1.7.0": + version: 1.9.2 + resolution: "path-scurry@npm:1.9.2" + dependencies: + lru-cache: ^9.1.1 + minipass: ^5.0.0 || ^6.0.2 + checksum: 92888dfb68e285043c6d3291c8e971d5d2bc2f5082f4d7b5392896f34be47024c9d0a8b688dd7ae6d125acc424699195474927cb4f00049a9b1ec7c4256fa8e0 + languageName: node + linkType: hard + +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: ^3.0.0 + checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"path@npm:~0.12.7": + version: 0.12.7 + resolution: "path@npm:0.12.7" + dependencies: + process: ^0.11.1 + util: ^0.10.3 + checksum: 5dedb71e78fc008fcba797defc0b4e1cf06c1f18e0a631e03ba5bb505136f587ff017afc14f9a3d481cbe77aeedff7dc0c1d2ce4d820c1ebf3c4281ca49423a1 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pidtree@npm:^0.3.0": + version: 0.3.1 + resolution: "pidtree@npm:0.3.1" + bin: + pidtree: bin/pidtree.js + checksum: eb49025099f1af89a4696f7673351421f13420f3397b963c901fe23a1c9c2ff50f4750321970d4472c0ffbb065e4a6c3c27f75e226cc62284b19e21d32ce7012 + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"playwright-core@npm:1.35.0": + version: 1.35.0 + resolution: "playwright-core@npm:1.35.0" + bin: + playwright-core: cli.js + checksum: e23050c9de128e02b16ffbeb1adaca6dddd85a6fd581e71da38947f66b3c910504d628285340e3d6de8c099a488ab9dad14241aefe615f65c01a5a3e3b6e633d + languageName: node + linkType: hard + +"postcss-media-query-parser@npm:^0.2.3": + version: 0.2.3 + resolution: "postcss-media-query-parser@npm:0.2.3" + checksum: 8000d4d95b912994928ff86137f5ab0ed4c4ee1498af2336e93d708ae8827a690cd7acbaed55d14684cf44d82c8d44b031c1c69ae6bcd2f9620ea67573888090 + languageName: node + linkType: hard + +"postcss-modules-extract-imports@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-modules-extract-imports@npm:3.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 4b65f2f1382d89c4bc3c0a1bdc5942f52f3cb19c110c57bd591ffab3a5fee03fcf831604168205b0c1b631a3dce2255c70b61aaae3ef39d69cd7eb450c2552d2 + languageName: node + linkType: hard + +"postcss-modules-local-by-default@npm:^4.0.3": + version: 4.0.3 + resolution: "postcss-modules-local-by-default@npm:4.0.3" + dependencies: + icss-utils: ^5.0.0 + postcss-selector-parser: ^6.0.2 + postcss-value-parser: ^4.1.0 + peerDependencies: + postcss: ^8.1.0 + checksum: 2f8083687f3d6067885f8863dd32dbbb4f779cfcc7e52c17abede9311d84faf6d3ed8760e7c54c6380281732ae1f78e5e56a28baf3c271b33f450a11c9e30485 + languageName: node + linkType: hard + +"postcss-modules-scope@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-modules-scope@npm:3.0.0" + dependencies: + postcss-selector-parser: ^6.0.4 + peerDependencies: + postcss: ^8.1.0 + checksum: 330b9398dbd44c992c92b0dc612c0626135e2cc840fee41841eb61247a6cfed95af2bd6f67ead9dd9d0bb41f5b0367129d93c6e434fa3e9c58ade391d9a5a138 + languageName: node + linkType: hard + +"postcss-modules-values@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-modules-values@npm:4.0.0" + dependencies: + icss-utils: ^5.0.0 + peerDependencies: + postcss: ^8.1.0 + checksum: f7f2cdf14a575b60e919ad5ea52fed48da46fe80db2733318d71d523fc87db66c835814940d7d05b5746b0426e44661c707f09bdb83592c16aea06e859409db6 + languageName: node + linkType: hard + +"postcss-resolve-nested-selector@npm:^0.1.1": + version: 0.1.1 + resolution: "postcss-resolve-nested-selector@npm:0.1.1" + checksum: b08fb76ab092a09ee01328bad620a01dcb445ac5eb02dd0ed9ed75217c2f779ecb3bf99a361c46e695689309c08c09f1a1ad7354c8d58c2c2c40d364657fcb08 + languageName: node + linkType: hard + +"postcss-safe-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-safe-parser@npm:6.0.0" + peerDependencies: + postcss: ^8.3.3 + checksum: 06c733eaad83a3954367e7ee02ddfe3796e7a44d4299ccf9239f40964a4daac153c7d77613f32964b5a86c0c6c2f6167738f31d578b73b17cb69d0c4446f0ebe + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": + version: 6.0.13 + resolution: "postcss-selector-parser@npm:6.0.13" + dependencies: + cssesc: ^3.0.0 + util-deprecate: ^1.0.2 + checksum: f89163338a1ce3b8ece8e9055cd5a3165e79a15e1c408e18de5ad8f87796b61ec2d48a2902d179ae0c4b5de10fccd3a325a4e660596549b040bc5ad1b465f096 + languageName: node + linkType: hard + +"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": + version: 4.2.0 + resolution: "postcss-value-parser@npm:4.2.0" + checksum: 819ffab0c9d51cf0acbabf8996dffbfafbafa57afc0e4c98db88b67f2094cb44488758f06e5da95d7036f19556a4a732525e84289a425f4f6fd8e412a9d7442f + languageName: node + linkType: hard + +"postcss@npm:^8.3.11, postcss@npm:^8.4.19, postcss@npm:^8.4.21": + version: 8.4.24 + resolution: "postcss@npm:8.4.24" + dependencies: + nanoid: ^3.3.6 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: 814e2126dacfea313588eda09cc99a9b4c26ec55c059188aa7a916d20d26d483483106dc5ff9e560731b59f45c5bb91b945dfadc670aed875cc90ddbbf4e787d + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier-linter-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "prettier-linter-helpers@npm:1.0.0" + dependencies: + fast-diff: ^1.1.2 + checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + languageName: node + linkType: hard + +"prettier@npm:^2.1.1": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + languageName: node + linkType: hard + +"process@npm:^0.11.1, process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + +"progress@npm:^2.0.0": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"prop-types@npm:^15.8.1": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: ^1.4.0 + object-assign: ^4.1.1 + react-is: ^16.13.1 + checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"quick-lru@npm:^4.0.1": + version: 4.0.1 + resolution: "quick-lru@npm:4.0.1" + checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: ^5.1.0 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + languageName: node + linkType: hard + +"react-dom@npm:^18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + scheduler: ^0.23.0 + peerDependencies: + react: ^18.2.0 + checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f + languageName: node + linkType: hard + +"react-is@npm:^18.2.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + +"react@npm:^18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" + dependencies: + loose-envify: ^1.1.0 + checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + languageName: node + linkType: hard + +"read-pkg-up@npm:^7.0.1": + version: 7.0.1 + resolution: "read-pkg-up@npm:7.0.1" + dependencies: + find-up: ^4.1.0 + read-pkg: ^5.2.0 + type-fest: ^0.8.1 + checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 + languageName: node + linkType: hard + +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: ^4.0.0 + normalize-package-data: ^2.3.2 + path-type: ^3.0.0 + checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 + languageName: node + linkType: hard + +"read-pkg@npm:^5.2.0": + version: 5.2.0 + resolution: "read-pkg@npm:5.2.0" + dependencies: + "@types/normalize-package-data": ^2.4.0 + normalize-package-data: ^2.5.0 + parse-json: ^5.0.0 + type-fest: ^0.6.0 + checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 + languageName: node + linkType: hard + +"readable-stream@npm:^2.1.4": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.3 + isarray: ~1.0.0 + process-nextick-args: ~2.0.0 + safe-buffer: ~5.1.1 + string_decoder: ~1.1.1 + util-deprecate: ~1.0.1 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 + languageName: node + linkType: hard + +"readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" + dependencies: + resolve: ^1.20.0 + checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 + languageName: node + linkType: hard + +"redent@npm:^3.0.0": + version: 3.0.0 + resolution: "redent@npm:3.0.0" + dependencies: + indent-string: ^4.0.0 + strip-indent: ^3.0.0 + checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b + languageName: node + linkType: hard + +"regexp-match-indices@npm:^1.0.2": + version: 1.0.2 + resolution: "regexp-match-indices@npm:1.0.2" + dependencies: + regexp-tree: ^0.1.11 + checksum: 8cc779f6cf8f404ead828d09970a7d4bd66bd78d43ab9eb2b5e65f2ef2ba1ed53536f5b5fa839fb90b350365fb44b6a851c7f16289afc3f37789c113ab2a7916 + languageName: node + linkType: hard + +"regexp-tree@npm:^0.1.11": + version: 0.1.27 + resolution: "regexp-tree@npm:0.1.27" + bin: + regexp-tree: bin/regexp-tree + checksum: 129aebb34dae22d6694ab2ac328be3f99105143737528ab072ef624d599afecbcfae1f5c96a166fa9e5f64fa1ecf30b411c4691e7924c3e11bbaf1712c260c54 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.4.3": + version: 1.5.0 + resolution: "regexp.prototype.flags@npm:1.5.0" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + functions-have-names: ^1.2.3 + checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4 + languageName: node + linkType: hard + +"regexpp@npm:^3.1.0": + version: 3.2.0 + resolution: "regexpp@npm:3.2.0" + checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"require-from-string@npm:^2.0.2": + version: 2.0.2 + resolution: "require-from-string@npm:2.0.2" + checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve@npm:^1.10.0, resolve@npm:^1.20.0": + version: 1.22.3 + resolution: "resolve@npm:1.22.3" + dependencies: + is-core-module: ^2.12.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin": + version: 1.22.3 + resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" + dependencies: + is-core-module: ^2.12.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"robust-predicates@npm:^3.0.0": + version: 3.0.2 + resolution: "robust-predicates@npm:3.0.2" + checksum: 36854c1321548ceca96d36ad9d6e0a5a512986029ec6929ad6ed3ec1612c22cc8b46cc72d2c5674af42e8074a119d793f6f0ea3a5b51373e3ab926c64b172d7a + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"rw@npm:1": + version: 1.3.3 + resolution: "rw@npm:1.3.3" + checksum: c20d82421f5a71c86a13f76121b751553a99cd4a70ea27db86f9b23f33db941f3f06019c30f60d50c356d0bd674c8e74764ac146ea55e217c091bde6fba82aa3 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"sanitize-html@npm:~2.7.3": + version: 2.7.3 + resolution: "sanitize-html@npm:2.7.3" + dependencies: + deepmerge: ^4.2.2 + escape-string-regexp: ^4.0.0 + htmlparser2: ^6.0.0 + is-plain-object: ^5.0.0 + parse-srcset: ^1.0.2 + postcss: ^8.3.11 + checksum: 2399d1fdbbc3a263fb413c1fe1971b3dc2b51abc6cc5cb49490624539d1c57a8fe31e2b21408c118e2a957f4e673e3169b1f9a5807654408f17b130a9d78aed7 + languageName: node + linkType: hard + +"scheduler@npm:^0.23.0": + version: 0.23.0 + resolution: "scheduler@npm:0.23.0" + dependencies: + loose-envify: ^1.1.0 + checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + languageName: node + linkType: hard + +"schema-utils@npm:^2.7.0": + version: 2.7.1 + resolution: "schema-utils@npm:2.7.1" + dependencies: + "@types/json-schema": ^7.0.5 + ajv: ^6.12.4 + ajv-keywords: ^3.5.2 + checksum: 32c62fc9e28edd101e1bd83453a4216eb9bd875cc4d3775e4452b541908fa8f61a7bbac8ffde57484f01d7096279d3ba0337078e85a918ecbeb72872fb09fb2b + languageName: node + linkType: hard + +"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 + languageName: node + linkType: hard + +"schema-utils@npm:^4.0.0": + version: 4.2.0 + resolution: "schema-utils@npm:4.2.0" + dependencies: + "@types/json-schema": ^7.0.9 + ajv: ^8.9.0 + ajv-formats: ^2.1.1 + ajv-keywords: ^5.1.0 + checksum: 26a0463d47683258106e6652e9aeb0823bf0b85843039e068b57da1892f7ae6b6b1094d48e9ed5ba5cbe9f7166469d880858b9d91abe8bd249421eb813850cde + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0": + version: 5.7.1 + resolution: "semver@npm:5.7.1" + bin: + semver: ./bin/semver + checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf + languageName: node + linkType: hard + +"semver@npm:^7.2.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.8": + version: 7.5.1 + resolution: "semver@npm:7.5.1" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: d16dbedad53c65b086f79524b9ef766bf38670b2395bdad5c957f824dcc566b624988013564f4812bcace3f9d405355c3635e2007396a39d1bffc71cfec4a2fc + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1": + version: 6.0.1 + resolution: "serialize-javascript@npm:6.0.1" + dependencies: + randombytes: ^2.1.0 + checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: ^6.0.2 + checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: ^1.0.0 + checksum: 9eed1750301e622961ba5d588af2212505e96770ec376a37ab678f965795e995ade7ed44910f5d3d3cb5e10165a1847f52d3348c64e146b8be922f7707958908 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: 404c5a752cd40f94591dfd9346da40a735a05139dac890ffc229afba610854d8799aaa52f87f7e0c94c5007f2c6af55bdcaeb584b56691926c5eaf41dc8f1372 + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shell-quote@npm:^1.6.1": + version: 1.8.1 + resolution: "shell-quote@npm:1.8.1" + checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.0.2 + resolution: "signal-exit@npm:4.0.2" + checksum: 41f5928431cc6e91087bf0343db786a6313dd7c6fd7e551dbc141c95bb5fb26663444fd9df8ea47c5d7fc202f60aa7468c3162a9365cbb0615fc5e1b1328fe31 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"source-list-map@npm:^2.0.0": + version: 2.0.1 + resolution: "source-list-map@npm:2.0.1" + checksum: 806efc6f75e7cd31e4815e7a3aaf75a45c704871ea4075cb2eb49882c6fca28998f44fc5ac91adb6de03b2882ee6fb02f951fdc85e6a22b338c32bfe19557938 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + +"source-map-loader@npm:~1.0.2": + version: 1.0.2 + resolution: "source-map-loader@npm:1.0.2" + dependencies: + data-urls: ^2.0.0 + iconv-lite: ^0.6.2 + loader-utils: ^2.0.0 + schema-utils: ^2.7.0 + source-map: ^0.6.1 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 0360b536e904f8fea452d0e122b9199661765229dc62a4b8093cc9d14e985f2ddd146355ede6d11acdd0b9bf4639b364e2526afcf9d3218ed45af63aa5eb053f + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" + dependencies: + spdx-expression-parse: ^3.0.0 + spdx-license-ids: ^3.0.0 + checksum: e9ae98d22f69c88e7aff5b8778dc01c361ef635580e82d29e5c60a6533cc8f4d820803e67d7432581af0cc4fb49973125076ee3b90df191d153e223c004193b2 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.13 + resolution: "spdx-license-ids@npm:3.0.13" + checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.4 + resolution: "ssri@npm:10.0.4" + dependencies: + minipass: ^5.0.0 + checksum: fb14da9f8a72b04eab163eb13a9dda11d5962cd2317f85457c4e0b575e9a6e0e3a6a87b5bf122c75cb36565830cd5f263fb457571bf6f1587eb5f95d095d6165 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + +"string.prototype.padend@npm:^3.0.0": + version: 3.1.4 + resolution: "string.prototype.padend@npm:3.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 76e07238fe31dc12177428f0436b7ed6985f6a7ba97470fd53e4f0a6d9860bfee127d81957f3073cc879b434233df143825d140581e1340278053ad993c92f6c + languageName: node + linkType: hard + +"string.prototype.trim@npm:^1.2.7": + version: 1.2.7 + resolution: "string.prototype.trim@npm:1.2.7" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: ~5.1.0 + checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + languageName: node + linkType: hard + +"strip-indent@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-indent@npm:3.0.0" + dependencies: + min-indent: ^1.0.0 + checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"style-loader@npm:~3.3.1": + version: 3.3.3 + resolution: "style-loader@npm:3.3.3" + peerDependencies: + webpack: ^5.0.0 + checksum: f59c953f56f6a935bd6a1dfa409f1128fed2b66b48ce4a7a75b85862a7156e5e90ab163878962762f528ec4d510903d828da645e143fbffd26f055dc1c094078 + languageName: node + linkType: hard + +"style-mod@npm:^4.0.0": + version: 4.0.3 + resolution: "style-mod@npm:4.0.3" + checksum: 934556e720bd29026ff8fef43a1a35b58957813025b91f996d886e9405acf934ddb1934def4400b174bd7784c9263eb9c71f07ae83925af9271b7d921d546854 + languageName: node + linkType: hard + +"style-search@npm:^0.1.0": + version: 0.1.0 + resolution: "style-search@npm:0.1.0" + checksum: 3cfefe335033aad6d47da0725cb48f5db91a73935954c77eab77d9e415e6668cdb406da4a4f7ef9f1aca77853cf5ba7952c45e869caa5bd6439691d88098d468 + languageName: node + linkType: hard + +"stylelint-config-prettier@npm:^9.0.3": + version: 9.0.5 + resolution: "stylelint-config-prettier@npm:9.0.5" + peerDependencies: + stylelint: ">= 11.x < 15" + bin: + stylelint-config-prettier: bin/check.js + stylelint-config-prettier-check: bin/check.js + checksum: 3d04e463e0bb7e42a5ddec49eea6ef4ea07705d887e8a3ff1fcb82278a5e2bec1a36b8498ea7ed2d24878de29d7c94ac75b1d3ac4f8b19c3a84970595b29261f + languageName: node + linkType: hard + +"stylelint-config-recommended@npm:^6.0.0": + version: 6.0.0 + resolution: "stylelint-config-recommended@npm:6.0.0" + peerDependencies: + stylelint: ^14.0.0 + checksum: 103b3c122253a908f91f5728d39eff6fed3866157e29a6e550da051cfc207b0d159b7434e0806126e3c3939e6528a0a1cd5a1cf00b835dd49b3a18ba4a007fa1 + languageName: node + linkType: hard + +"stylelint-config-standard@npm:~24.0.0": + version: 24.0.0 + resolution: "stylelint-config-standard@npm:24.0.0" + dependencies: + stylelint-config-recommended: ^6.0.0 + peerDependencies: + stylelint: ^14.0.0 + checksum: 5993ede913d81410830639db054a7a3f5c87e56254368be45ce876321106fad1c11ee4cb77247049aaf22e283a393dd90d93dec8f796f8f139ed21eb86a9a168 + languageName: node + linkType: hard + +"stylelint-prettier@npm:^2.0.0": + version: 2.0.0 + resolution: "stylelint-prettier@npm:2.0.0" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + prettier: ">=2.0.0" + stylelint: ">=14.0.0" + checksum: 6ce7628517a492e0c2e6104f654c9bc710f1aaf035c8b5274e187b68e8d510e70bae5ded2cb65df76aa01096460b9dfe02f844fea13bfba7e3dcca13baec2ff4 + languageName: node + linkType: hard + +"stylelint@npm:^14.3.0": + version: 14.16.1 + resolution: "stylelint@npm:14.16.1" + dependencies: + "@csstools/selector-specificity": ^2.0.2 + balanced-match: ^2.0.0 + colord: ^2.9.3 + cosmiconfig: ^7.1.0 + css-functions-list: ^3.1.0 + debug: ^4.3.4 + fast-glob: ^3.2.12 + fastest-levenshtein: ^1.0.16 + file-entry-cache: ^6.0.1 + global-modules: ^2.0.0 + globby: ^11.1.0 + globjoin: ^0.1.4 + html-tags: ^3.2.0 + ignore: ^5.2.1 + import-lazy: ^4.0.0 + imurmurhash: ^0.1.4 + is-plain-object: ^5.0.0 + known-css-properties: ^0.26.0 + mathml-tag-names: ^2.1.3 + meow: ^9.0.0 + micromatch: ^4.0.5 + normalize-path: ^3.0.0 + picocolors: ^1.0.0 + postcss: ^8.4.19 + postcss-media-query-parser: ^0.2.3 + postcss-resolve-nested-selector: ^0.1.1 + postcss-safe-parser: ^6.0.0 + postcss-selector-parser: ^6.0.11 + postcss-value-parser: ^4.2.0 + resolve-from: ^5.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + style-search: ^0.1.0 + supports-hyperlinks: ^2.3.0 + svg-tags: ^1.0.0 + table: ^6.8.1 + v8-compile-cache: ^2.3.0 + write-file-atomic: ^4.0.2 + bin: + stylelint: bin/stylelint.js + checksum: bc24050415e3c357a76d8ca2799e74ce31f33c9158b4086462512b0191db5d6a161b81ef35b064039c6eacf98a5553e45fca4c5f21eb4d45e7f1d44b2d226e9b + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-hyperlinks@npm:^2.3.0": + version: 2.3.0 + resolution: "supports-hyperlinks@npm:2.3.0" + dependencies: + has-flag: ^4.0.0 + supports-color: ^7.0.0 + checksum: 9ee0de3c8ce919d453511b2b1588a8205bd429d98af94a01df87411391010fe22ca463f268c84b2ce2abad019dfff8452aa02806eeb5c905a8d7ad5c4f4c52b8 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"svg-tags@npm:^1.0.0": + version: 1.0.0 + resolution: "svg-tags@npm:1.0.0" + checksum: 407e5ef87cfa2fb81c61d738081c2decd022ce13b922d035b214b49810630bf5d1409255a4beb3a940b77b32f6957806deff16f1bf0ce1ab11c7a184115a0b7f + languageName: node + linkType: hard + +"systeminformation@npm:^5.8.6": + version: 5.18.3 + resolution: "systeminformation@npm:5.18.3" + bin: + systeminformation: lib/cli.js + checksum: a58a4568c76e0479460d91d2eee009adeda2469876a3a99b122072bd6b6c5bd0965c8a6062f189ae667ae514ee5e858ea4b3c5c0af4a669e988b929bae767c05 + conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) + languageName: node + linkType: hard + +"table@npm:^6.0.9, table@npm:^6.8.1": + version: 6.8.1 + resolution: "table@npm:6.8.1" + dependencies: + ajv: ^8.0.1 + lodash.truncate: ^4.4.2 + slice-ansi: ^4.0.0 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + languageName: node + linkType: hard + +"tapable@npm:^2.1.1, tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.1.15 + resolution: "tar@npm:6.1.15" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^5.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: f23832fceeba7578bf31907aac744ae21e74a66f4a17a9e94507acf460e48f6db598c7023882db33bab75b80e027c21f276d405e4a0322d58f51c7088d428268 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.3.7": + version: 5.3.9 + resolution: "terser-webpack-plugin@npm:5.3.9" + dependencies: + "@jridgewell/trace-mapping": ^0.3.17 + jest-worker: ^27.4.5 + schema-utils: ^3.1.1 + serialize-javascript: ^6.0.1 + terser: ^5.16.8 + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 41705713d6f9cb83287936b21e27c658891c78c4392159f5148b5623f0e8c48559869779619b058382a4c9758e7820ea034695e57dc7c474b4962b79f553bc5f + languageName: node + linkType: hard + +"terser@npm:^5.16.8": + version: 5.18.0 + resolution: "terser@npm:5.18.0" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.8.2 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: d01eb9805a978b3338b68fd2d9e35c1cd4cad78ea093dc92c7b3c38965232f0af0f95e0c6d90920ecf600a74135c608aebae26302c036c01393a590e1918bb90 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"topojson-client@npm:^3.1.0": + version: 3.1.0 + resolution: "topojson-client@npm:3.1.0" + dependencies: + commander: 2 + bin: + topo2geo: bin/topo2geo + topomerge: bin/topomerge + topoquantize: bin/topoquantize + checksum: 8c029a4f18324ace0b8b55dd90edbd40c9e3c6de18bafbb5da37ca20ebf20e26fbd4420891acb3c2c264e214185f7557871f5651a9eee517028663be98d836de + languageName: node + linkType: hard + +"tr46@npm:^2.1.0": + version: 2.1.0 + resolution: "tr46@npm:2.1.0" + dependencies: + punycode: ^2.1.1 + checksum: ffe6049b9dca3ae329b059aada7f515b0f0064c611b39b51ff6b53897e954650f6f63d9319c6c008d36ead477c7b55e5f64c9dc60588ddc91ff720d64eb710b3 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"trim-newlines@npm:^3.0.0": + version: 3.0.1 + resolution: "trim-newlines@npm:3.0.1" + checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 + languageName: node + linkType: hard + +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:~2.5.0": + version: 2.5.3 + resolution: "tslib@npm:2.5.3" + checksum: 88902b309afaf83259131c1e13da1dceb0ad1682a213143a1346a649143924d78cf3760c448b84d796938fd76127183894f8d85cbb3bf9c4fddbfcc140c0003c + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-fest@npm:^0.18.0": + version: 0.18.1 + resolution: "type-fest@npm:0.18.1" + checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"type-fest@npm:^0.6.0": + version: 0.6.0 + resolution: "type-fest@npm:0.6.0" + checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f + languageName: node + linkType: hard + +"type-fest@npm:^0.8.1": + version: 0.8.1 + resolution: "type-fest@npm:0.8.1" + checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + +"typescript@npm:~4.1.3": + version: 4.1.6 + resolution: "typescript@npm:4.1.6" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 54aed909f94b16178c8a8d8911871b4e1c04454a3e6c82166715e28083e7ce6271e4d1df6f82c89544a4759b07aec780785032534e9c93b254e2107a18712c05 + languageName: node + linkType: hard + +"typescript@patch:typescript@~4.1.3#~builtin": + version: 4.1.6 + resolution: "typescript@patch:typescript@npm%3A4.1.6#~builtin::version=4.1.6&hash=4a8eb8" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 3bd9915f236817e4e2d32dd0d90e8902875929f014bb87a478000e32adda91d12f0425931ee6f9d6a2bc7d0c9242588fcee1050ac294497dfabf27d3d73b335c + languageName: node + linkType: hard + +"typestyle@npm:^2.0.4": + version: 2.4.0 + resolution: "typestyle@npm:2.4.0" + dependencies: + csstype: 3.0.10 + free-style: 3.1.0 + checksum: 8b4f02c24f67b594f98507b15a753dabd4db5eb0af007e1d310527c64030e11e9464b25b5a6bc65fb5eec9a4459a8336050121ecc29063ac87b8b47a6d698893 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + +"universalify@npm:^2.0.0": + version: 2.0.0 + resolution: "universalify@npm:2.0.0" + checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.11": + version: 1.0.11 + resolution: "update-browserslist-db@npm:1.0.11" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: b98327518f9a345c7cad5437afae4d2ae7d865f9779554baf2a200fdf4bac4969076b679b1115434bd6557376bdd37ca7583d0f9b8f8e302d7d4cc1e91b5f231 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"url-parse@npm:~1.5.4": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"util@npm:^0.10.3": + version: 0.10.4 + resolution: "util@npm:0.10.4" + dependencies: + inherits: 2.0.3 + checksum: 913f9a90d05a60e91f91af01b8bd37e06bca4cc02d7b49e01089f9d5b78be2fffd61fb1a41b517de7238c5fc7337fa939c62d1fb4eb82e014894c7bee6637aaf + languageName: node + linkType: hard + +"v8-compile-cache@npm:^2.0.3, v8-compile-cache@npm:^2.3.0": + version: 2.3.0 + resolution: "v8-compile-cache@npm:2.3.0" + checksum: adb0a271eaa2297f2f4c536acbfee872d0dd26ec2d76f66921aa7fc437319132773483344207bdbeee169225f4739016d8d2dbf0553913a52bb34da6d0334f8e + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.4 + resolution: "validate-npm-package-license@npm:3.0.4" + dependencies: + spdx-correct: ^3.0.0 + spdx-expression-parse: ^3.0.0 + checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + languageName: node + linkType: hard + +"validate.io-array@npm:^1.0.3": + version: 1.0.6 + resolution: "validate.io-array@npm:1.0.6" + checksum: 54eca83ebc702e3e46499f9d9e77287a95ae25c4e727cd2fafee29c7333b3a36cca0c5d8f090b9406262786de80750fba85e7e7ef41e20bf8cc67d5570de449b + languageName: node + linkType: hard + +"validate.io-function@npm:^1.0.2": + version: 1.0.2 + resolution: "validate.io-function@npm:1.0.2" + checksum: e4cce2479a20cb7c42e8630c777fb107059c27bc32925f769e3a73ca5fd62b4892d897b3c80227e14d5fcd1c5b7d05544e0579d63e59f14034c0052cda7f7c44 + languageName: node + linkType: hard + +"validate.io-integer-array@npm:^1.0.0": + version: 1.0.0 + resolution: "validate.io-integer-array@npm:1.0.0" + dependencies: + validate.io-array: ^1.0.3 + validate.io-integer: ^1.0.4 + checksum: 5f6d7fab8df7d2bf546a05e830201768464605539c75a2c2417b632b4411a00df84b462f81eac75e1be95303e7e0ac92f244c137424739f4e15cd21c2eb52c7f + languageName: node + linkType: hard + +"validate.io-integer@npm:^1.0.4": + version: 1.0.5 + resolution: "validate.io-integer@npm:1.0.5" + dependencies: + validate.io-number: ^1.0.3 + checksum: 88b3f8bb5a5277a95305d64abbfc437079220ce4f57a148cc6113e7ccec03dd86b10a69d413982602aa90a62b8d516148a78716f550dcd3aff863ac1c2a7a5e6 + languageName: node + linkType: hard + +"validate.io-number@npm:^1.0.3": + version: 1.0.3 + resolution: "validate.io-number@npm:1.0.3" + checksum: 42418aeb6c969efa745475154fe576809b02eccd0961aad0421b090d6e7a12d23a3e28b0d5dddd2c6347c1a6bdccb82bba5048c716131cd20207244d50e07282 + languageName: node + linkType: hard + +"vega-canvas@npm:^1.2.6, vega-canvas@npm:^1.2.7": + version: 1.2.7 + resolution: "vega-canvas@npm:1.2.7" + checksum: 6ff92fcdf0c359f2f662909c859a7f4cb4a502436136ab2f4c02373c47a621996ec0eea23e2108f11d62a618be301de86cd8528b5058c2e207a53ddd7ff58d1b + languageName: node + linkType: hard + +"vega-crossfilter@npm:~4.1.1": + version: 4.1.1 + resolution: "vega-crossfilter@npm:4.1.1" + dependencies: + d3-array: ^3.2.2 + vega-dataflow: ^5.7.5 + vega-util: ^1.17.1 + checksum: e399f7e92d7ba273ad5c1a9e29d362a9ec7feaeacb976eff3aa205b318382fb37a9fac3150ec1cb806364cd2b2cb54d5f23aea3285db684df2b4c27836422464 + languageName: node + linkType: hard + +"vega-dataflow@npm:^5.7.3, vega-dataflow@npm:^5.7.5, vega-dataflow@npm:~5.7.5": + version: 5.7.5 + resolution: "vega-dataflow@npm:5.7.5" + dependencies: + vega-format: ^1.1.1 + vega-loader: ^4.5.1 + vega-util: ^1.17.1 + checksum: 917ed63e88b0871169a883f68da127a404d88e50c9ed6fa3f063a706016b064594fb804a2bf99f09bc4a899819cac320bdde12467edc861af1acc024552dd202 + languageName: node + linkType: hard + +"vega-encode@npm:~4.9.2": + version: 4.9.2 + resolution: "vega-encode@npm:4.9.2" + dependencies: + d3-array: ^3.2.2 + d3-interpolate: ^3.0.1 + vega-dataflow: ^5.7.5 + vega-scale: ^7.3.0 + vega-util: ^1.17.1 + checksum: fcba123d2efb865b4f6cf8e9d64e0752ebae163dcfe61013f4874f7fe6fce3003ea9dd83b89db3ffab2a1530532a7c902dd24dfec226eb53d08dcf69189f308d + languageName: node + linkType: hard + +"vega-event-selector@npm:^3.0.1, vega-event-selector@npm:~3.0.1": + version: 3.0.1 + resolution: "vega-event-selector@npm:3.0.1" + checksum: 66d09b5800a19a9b0c75f28811b140a1a2e70e84be6d6f87c568cdbce6e17c8e195f130f4e3de5d6dc737142d1f46f4fe7645177e154582cc8ba27c6845b54e8 + languageName: node + linkType: hard + +"vega-expression@npm:^5.0.1, vega-expression@npm:^5.1.0, vega-expression@npm:~5.1.0": + version: 5.1.0 + resolution: "vega-expression@npm:5.1.0" + dependencies: + "@types/estree": ^1.0.0 + vega-util: ^1.17.1 + checksum: 0355ebb6edd8f2ccc2dcf277a29b42b13f971725443212ce8a64cb8a02049f75f0add7ca9afcd3bc6744b93be791b526e7f983d9080d5052e9b0ca55bd488ae5 + languageName: node + linkType: hard + +"vega-force@npm:~4.2.0": + version: 4.2.0 + resolution: "vega-force@npm:4.2.0" + dependencies: + d3-force: ^3.0.0 + vega-dataflow: ^5.7.5 + vega-util: ^1.17.1 + checksum: 8a371ca8d0892bc3e932cc279bbf54fe8b88e2b384c42f8df9877c801191953f3ee3e2f516f675a69ecb052ed081232dfb3438989620e8ad5c2a316ccee60277 + languageName: node + linkType: hard + +"vega-format@npm:^1.1.1, vega-format@npm:~1.1.1": + version: 1.1.1 + resolution: "vega-format@npm:1.1.1" + dependencies: + d3-array: ^3.2.2 + d3-format: ^3.1.0 + d3-time-format: ^4.1.0 + vega-time: ^2.1.1 + vega-util: ^1.17.1 + checksum: d506acb8611a6340ff419ebf308a758a54aaf3cf141863553df83980dcf8dc7bf806bee257d11a52d43682d159d7be03ab8a92bdd4d018d8c9f39a70c45cb197 + languageName: node + linkType: hard + +"vega-functions@npm:^5.13.1, vega-functions@npm:~5.13.2": + version: 5.13.2 + resolution: "vega-functions@npm:5.13.2" + dependencies: + d3-array: ^3.2.2 + d3-color: ^3.1.0 + d3-geo: ^3.1.0 + vega-dataflow: ^5.7.5 + vega-expression: ^5.1.0 + vega-scale: ^7.3.0 + vega-scenegraph: ^4.10.2 + vega-selections: ^5.4.1 + vega-statistics: ^1.8.1 + vega-time: ^2.1.1 + vega-util: ^1.17.1 + checksum: 178498cf93c3d9ef392fb57a5c7992dbb9118c546a6acb4cff9783f911fb30dbf50634cbfd6e3a9bc358c4aec9a571bd55f9cf3de551213cd386f152ac882986 + languageName: node + linkType: hard + +"vega-geo@npm:~4.4.1": + version: 4.4.1 + resolution: "vega-geo@npm:4.4.1" + dependencies: + d3-array: ^3.2.2 + d3-color: ^3.1.0 + d3-geo: ^3.1.0 + vega-canvas: ^1.2.7 + vega-dataflow: ^5.7.5 + vega-projection: ^1.6.0 + vega-statistics: ^1.8.1 + vega-util: ^1.17.1 + checksum: e9c62d9134c2449a1a80cd5cb71ed6dc455d893a36fdcb1a696bcae3897670c32687cf14a0f366b0ec76905e5be406131dc671e5d607ffcbef74e94b8c697007 + languageName: node + linkType: hard + +"vega-hierarchy@npm:~4.1.1": + version: 4.1.1 + resolution: "vega-hierarchy@npm:4.1.1" + dependencies: + d3-hierarchy: ^3.1.2 + vega-dataflow: ^5.7.5 + vega-util: ^1.17.1 + checksum: beb23948922f1b52bf03b836d71d3a5a36db3a6bfe2af74b6a5fc45a2e2e877226313e2389772be62a459728467618175d8c02a07e88330844fdec45fd5f69ac + languageName: node + linkType: hard + +"vega-label@npm:~1.2.1": + version: 1.2.1 + resolution: "vega-label@npm:1.2.1" + dependencies: + vega-canvas: ^1.2.6 + vega-dataflow: ^5.7.3 + vega-scenegraph: ^4.9.2 + vega-util: ^1.15.2 + checksum: 2704c99328ead677441e746acd8f4529301437d08b2758933fc13353d2eab9af353e4ebcc4ff1f09f41d600401b097e2df3c9e8e56d4861e5216222dd9e29185 + languageName: node + linkType: hard + +"vega-lite@npm:^5.6.1": + version: 5.9.3 + resolution: "vega-lite@npm:5.9.3" + dependencies: + "@types/clone": ~2.1.1 + clone: ~2.1.2 + fast-deep-equal: ~3.1.3 + fast-json-stable-stringify: ~2.1.0 + json-stringify-pretty-compact: ~3.0.0 + tslib: ~2.5.0 + vega-event-selector: ~3.0.1 + vega-expression: ~5.1.0 + vega-util: ~1.17.2 + yargs: ~17.7.2 + peerDependencies: + vega: ^5.24.0 + bin: + vl2pdf: bin/vl2pdf + vl2png: bin/vl2png + vl2svg: bin/vl2svg + vl2vg: bin/vl2vg + checksum: 0f020942c78e4acc8c4d9c13c80cebf76c769caad2de29f382ee308fbd1c7f7abe575b092b56351ba55ca3ad46e14ec969edaa39dc59c1f61c5bcd1c1e4e16c7 + languageName: node + linkType: hard + +"vega-loader@npm:^4.5.1, vega-loader@npm:~4.5.1": + version: 4.5.1 + resolution: "vega-loader@npm:4.5.1" + dependencies: + d3-dsv: ^3.0.1 + node-fetch: ^2.6.7 + topojson-client: ^3.1.0 + vega-format: ^1.1.1 + vega-util: ^1.17.1 + checksum: 95f6eebc75a97665cf34faaea431934047e1b2e9d7532f48f62dab4884d606a7d9da53962e1631a5790a7a867f720581852a3db9be1a7f667882062f6c102ee0 + languageName: node + linkType: hard + +"vega-parser@npm:~6.2.0": + version: 6.2.0 + resolution: "vega-parser@npm:6.2.0" + dependencies: + vega-dataflow: ^5.7.5 + vega-event-selector: ^3.0.1 + vega-functions: ^5.13.1 + vega-scale: ^7.3.0 + vega-util: ^1.17.1 + checksum: 19872153c16aab30c4df338e0df7bd331e0bf74c7c6afce5428df555b9bdb0c4acf76b54092cacd4726a1349912ea803c90e1b30d53f4a02044e0559873969a7 + languageName: node + linkType: hard + +"vega-projection@npm:^1.6.0, vega-projection@npm:~1.6.0": + version: 1.6.0 + resolution: "vega-projection@npm:1.6.0" + dependencies: + d3-geo: ^3.1.0 + d3-geo-projection: ^4.0.0 + vega-scale: ^7.3.0 + checksum: 9c52848e294ff68051fe9f44fa536656c4e6be3d474bd3359e21aa154ab282755eaee624ac31b1ca01816227900e1d81a6d191e36f46e47525ed6648397f0fa0 + languageName: node + linkType: hard + +"vega-regression@npm:~1.2.0": + version: 1.2.0 + resolution: "vega-regression@npm:1.2.0" + dependencies: + d3-array: ^3.2.2 + vega-dataflow: ^5.7.3 + vega-statistics: ^1.9.0 + vega-util: ^1.15.2 + checksum: 5f79db18c7849b465550e00ca8fec9d896aa3cf6d6279daac8b862beb632d841dcb6a93136d6b827c37e3d1cbd2bb2f7dec58f96c572763870c2d38f2cc4e0b3 + languageName: node + linkType: hard + +"vega-runtime@npm:^6.1.4, vega-runtime@npm:~6.1.4": + version: 6.1.4 + resolution: "vega-runtime@npm:6.1.4" + dependencies: + vega-dataflow: ^5.7.5 + vega-util: ^1.17.1 + checksum: a1da40ddb3109f1ced8e61d2e7b52784fbb29936ee4c47cb5630dbbeb12ef6e0c3cd3cd189c34377f82402bf19c61dd148d90330fec743b8667635ac48e4ba29 + languageName: node + linkType: hard + +"vega-scale@npm:^7.3.0, vega-scale@npm:~7.3.0": + version: 7.3.0 + resolution: "vega-scale@npm:7.3.0" + dependencies: + d3-array: ^3.2.2 + d3-interpolate: ^3.0.1 + d3-scale: ^4.0.2 + vega-time: ^2.1.1 + vega-util: ^1.17.1 + checksum: 8e434f27a51a913dd18374ec0d2bc33758eda7db1ee6342721644f977e705268b8df6b3e89813774d776d03a0cd24f91d4d59f9e80951f67dfbbf8637f5a69ad + languageName: node + linkType: hard + +"vega-scenegraph@npm:^4.10.2, vega-scenegraph@npm:^4.9.2, vega-scenegraph@npm:~4.10.2": + version: 4.10.2 + resolution: "vega-scenegraph@npm:4.10.2" + dependencies: + d3-path: ^3.1.0 + d3-shape: ^3.2.0 + vega-canvas: ^1.2.7 + vega-loader: ^4.5.1 + vega-scale: ^7.3.0 + vega-util: ^1.17.1 + checksum: 6caf3e298297b918c8b6a72f019e51e2bfbaecd316e4d1c37d855ac9366d177cdbf16e9c8857c5ccde128bcd9645af7ee7dc81111bcd743d192e1a3b9a9d7185 + languageName: node + linkType: hard + +"vega-selections@npm:^5.4.1": + version: 5.4.1 + resolution: "vega-selections@npm:5.4.1" + dependencies: + d3-array: 3.2.2 + vega-expression: ^5.0.1 + vega-util: ^1.17.1 + checksum: c594d41ec3886af94976e4dc4e152bea9b3975a22d435aa38dac2aab105851cb83fd4aa0f1e81a47f8bc0bea1677af93816331e3ed084ab3ec2e51b3544c109f + languageName: node + linkType: hard + +"vega-statistics@npm:^1.7.9, vega-statistics@npm:^1.8.1, vega-statistics@npm:^1.9.0, vega-statistics@npm:~1.9.0": + version: 1.9.0 + resolution: "vega-statistics@npm:1.9.0" + dependencies: + d3-array: ^3.2.2 + checksum: bbf2ea088c5a6a662c6aed1bf57996c06a82a98228730ada8a97e57824a6ed391999ea974f16dcde6e73bf88799976d91aff748842848d38ab45dbb9fafba3f9 + languageName: node + linkType: hard + +"vega-time@npm:^2.1.1, vega-time@npm:~2.1.1": + version: 2.1.1 + resolution: "vega-time@npm:2.1.1" + dependencies: + d3-array: ^3.2.2 + d3-time: ^3.1.0 + vega-util: ^1.17.1 + checksum: 3d6a50f779be4b5e7f27bd2aae766035c29e59e03e62d2e96b94a2f759ed3104c1102c1006dd416e7b819ee501880ae7a722c2fa9aabf9efac86503c1aada14a + languageName: node + linkType: hard + +"vega-transforms@npm:~4.10.2": + version: 4.10.2 + resolution: "vega-transforms@npm:4.10.2" + dependencies: + d3-array: ^3.2.2 + vega-dataflow: ^5.7.5 + vega-statistics: ^1.8.1 + vega-time: ^2.1.1 + vega-util: ^1.17.1 + checksum: 2dbe4c767542a5dc4dbb453fd1317b00912e47dbdb3de637259b2552497dd8039c20c795318ad57341eb0d30b69712c55a2da16dc9ad2329a68c35fb75b4fee6 + languageName: node + linkType: hard + +"vega-typings@npm:~0.24.0": + version: 0.24.1 + resolution: "vega-typings@npm:0.24.1" + dependencies: + "@types/geojson": 7946.0.4 + vega-event-selector: ^3.0.1 + vega-expression: ^5.0.1 + vega-util: ^1.17.1 + checksum: e6b7bf88d6e505ba472c8e5e734d1914515db0e4e23ca36c5b81f7bd2bf4df6ebf519ecc1f089dcef3caae48e196d29946dc5c9fa8ee454ea31d12f111f857ae + languageName: node + linkType: hard + +"vega-util@npm:^1.15.2, vega-util@npm:^1.17.1, vega-util@npm:~1.17.2": + version: 1.17.2 + resolution: "vega-util@npm:1.17.2" + checksum: 5d681cb1a6ffda7af1b74df7c1c46a32f1d874daef54f9c9c65c7d7c7bfc4271dc6d9b1c1c7a853b14eb6e4cc8ec811b0132cd3ea25fa85259eac92e1b4f07fa + languageName: node + linkType: hard + +"vega-view-transforms@npm:~4.5.9": + version: 4.5.9 + resolution: "vega-view-transforms@npm:4.5.9" + dependencies: + vega-dataflow: ^5.7.5 + vega-scenegraph: ^4.10.2 + vega-util: ^1.17.1 + checksum: aeeaf3c2f1a02b1303c16a586dbcb20f208c101d06d7e988e18ab71fb67d87be5d8ff228ebf25971535d6e41dc816168cfa68b8676e7250df07a40aefdea32a7 + languageName: node + linkType: hard + +"vega-view@npm:~5.11.1": + version: 5.11.1 + resolution: "vega-view@npm:5.11.1" + dependencies: + d3-array: ^3.2.2 + d3-timer: ^3.0.1 + vega-dataflow: ^5.7.5 + vega-format: ^1.1.1 + vega-functions: ^5.13.1 + vega-runtime: ^6.1.4 + vega-scenegraph: ^4.10.2 + vega-util: ^1.17.1 + checksum: 82ddc74593b3a359d0b3458bc06573673ff9bf13f84020cb36fb4676c5d7f547e9650eb6faaa76799fbcedd27bcd266603dbd08c420e2d2229cc6b9f48a4a66d + languageName: node + linkType: hard + +"vega-voronoi@npm:~4.2.1": + version: 4.2.1 + resolution: "vega-voronoi@npm:4.2.1" + dependencies: + d3-delaunay: ^6.0.2 + vega-dataflow: ^5.7.5 + vega-util: ^1.17.1 + checksum: f618174ad5f451c507a80e373288bb2c0da7a8a908d62f885bc77b354c4334504ae2d1042742f68ad419ade7b548aeca9ca1042ae5541bebd7f5297afc23bb35 + languageName: node + linkType: hard + +"vega-wordcloud@npm:~4.1.4": + version: 4.1.4 + resolution: "vega-wordcloud@npm:4.1.4" + dependencies: + vega-canvas: ^1.2.7 + vega-dataflow: ^5.7.5 + vega-scale: ^7.3.0 + vega-statistics: ^1.8.1 + vega-util: ^1.17.1 + checksum: 34d1882651d3a2f34ce40a6eaeed700de126f627cdf041ec2bcc7ada46d7b4b68a38a2974236eec87ee876d9abd095af7ab17e7698b0e2fbc831460767969d7a + languageName: node + linkType: hard + +"vega@npm:^5.20.0": + version: 5.25.0 + resolution: "vega@npm:5.25.0" + dependencies: + vega-crossfilter: ~4.1.1 + vega-dataflow: ~5.7.5 + vega-encode: ~4.9.2 + vega-event-selector: ~3.0.1 + vega-expression: ~5.1.0 + vega-force: ~4.2.0 + vega-format: ~1.1.1 + vega-functions: ~5.13.2 + vega-geo: ~4.4.1 + vega-hierarchy: ~4.1.1 + vega-label: ~1.2.1 + vega-loader: ~4.5.1 + vega-parser: ~6.2.0 + vega-projection: ~1.6.0 + vega-regression: ~1.2.0 + vega-runtime: ~6.1.4 + vega-scale: ~7.3.0 + vega-scenegraph: ~4.10.2 + vega-statistics: ~1.9.0 + vega-time: ~2.1.1 + vega-transforms: ~4.10.2 + vega-typings: ~0.24.0 + vega-util: ~1.17.2 + vega-view: ~5.11.1 + vega-view-transforms: ~4.5.9 + vega-voronoi: ~4.2.1 + vega-wordcloud: ~4.1.4 + checksum: ddc7b1f2a70c72b842e111d32bdd8ff050992a50e385e8ddc6e35c02e7c481a652383c81c547b7ebfd31cda04ab9f9acf0a8cc47c6bd19b91765b254aac30d24 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:8.1.0, vscode-jsonrpc@npm:^8.0.2": + version: 8.1.0 + resolution: "vscode-jsonrpc@npm:8.1.0" + checksum: 8980037cc0014802e6ac1e5dfcff9a65e8292727096dfd23c92d2039c0c45de74a00d6ee06938cf1a671286dd8258a5f418cf048c26ad0fcb0c44f96c9e0f278 + languageName: node + linkType: hard + +"vscode-jsonrpc@npm:^6.0.0": + version: 6.0.0 + resolution: "vscode-jsonrpc@npm:6.0.0" + checksum: 3a67a56f287e8c449f2d9752eedf91e704dc7b9a326f47fb56ac07667631deb45ca52192e9bccb2ab108764e48409d70fa64b930d46fc3822f75270b111c5f53 + languageName: node + linkType: hard + +"vscode-languageserver-protocol@npm:^3.17.0": + version: 3.17.3 + resolution: "vscode-languageserver-protocol@npm:3.17.3" + dependencies: + vscode-jsonrpc: 8.1.0 + vscode-languageserver-types: 3.17.3 + checksum: ffea508b2efd7f4853f1cef5e5eac58672f0ae71a9ec275ad37a4a2a24cdc3ff023f941e759951aee01c79da3f3279f10e034f19d875f081eb387181241bd836 + languageName: node + linkType: hard + +"vscode-languageserver-types@npm:3.17.3": + version: 3.17.3 + resolution: "vscode-languageserver-types@npm:3.17.3" + checksum: fbc8221297261f659a6482875ff2a419dc9d55965dc53745797da569ff9f819cd832e6f2699017baadd946548bbfe212e3f6971f3d960f12dc0ee9c629dacc07 + languageName: node + linkType: hard + +"vscode-ws-jsonrpc@npm:~1.0.2": + version: 1.0.2 + resolution: "vscode-ws-jsonrpc@npm:1.0.2" + dependencies: + vscode-jsonrpc: ^8.0.2 + checksum: eb2fdb5c96f124326505f06564dfc6584318b748fd6e39b4c0ba16a0d383d13ba0e9433596abdb841428dfc2a5501994c3206723d1cb38c6af5fcac1faf4be26 + languageName: node + linkType: hard + +"w3c-keyname@npm:^2.2.4": + version: 2.2.8 + resolution: "w3c-keyname@npm:2.2.8" + checksum: 95bafa4c04fa2f685a86ca1000069c1ec43ace1f8776c10f226a73296caeddd83f893db885c2c220ebeb6c52d424e3b54d7c0c1e963bbf204038ff1a944fbb07 + languageName: node + linkType: hard + +"watchpack@npm:^2.4.0": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" + dependencies: + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.1.2 + checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"webidl-conversions@npm:^6.1.0": + version: 6.1.0 + resolution: "webidl-conversions@npm:6.1.0" + checksum: 1f526507aa491f972a0c1409d07f8444e1d28778dfa269a9971f2e157182f3d496dc33296e4ed45b157fdb3bf535bb90c90bf10c50dcf1dd6caacb2a34cc84fb + languageName: node + linkType: hard + +"webpack-cli@npm:^5.0.1": + version: 5.1.4 + resolution: "webpack-cli@npm:5.1.4" + dependencies: + "@discoveryjs/json-ext": ^0.5.0 + "@webpack-cli/configtest": ^2.1.1 + "@webpack-cli/info": ^2.0.2 + "@webpack-cli/serve": ^2.0.5 + colorette: ^2.0.14 + commander: ^10.0.1 + cross-spawn: ^7.0.3 + envinfo: ^7.7.3 + fastest-levenshtein: ^1.0.12 + import-local: ^3.0.2 + interpret: ^3.1.1 + rechoir: ^0.8.0 + webpack-merge: ^5.7.3 + peerDependencies: + webpack: 5.x.x + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: bin/cli.js + checksum: 3a4ad0d0342a6815c850ee4633cc2a8a5dae04f918e7847f180bf24ab400803cf8a8943707ffbed03eb20fe6ce647f996f60a2aade87b0b4a9954da3da172ce0 + languageName: node + linkType: hard + +"webpack-merge@npm:^5.7.3, webpack-merge@npm:^5.8.0": + version: 5.9.0 + resolution: "webpack-merge@npm:5.9.0" + dependencies: + clone-deep: ^4.0.1 + wildcard: ^2.0.0 + checksum: 64fe2c23aacc5f19684452a0e84ec02c46b990423aee6fcc5c18d7d471155bd14e9a6adb02bd3656eb3e0ac2532c8e97d69412ad14c97eeafe32fa6d10050872 + languageName: node + linkType: hard + +"webpack-sources@npm:^1.2.0": + version: 1.4.3 + resolution: "webpack-sources@npm:1.4.3" + dependencies: + source-list-map: ^2.0.0 + source-map: ~0.6.1 + checksum: 37463dad8d08114930f4bc4882a9602941f07c9f0efa9b6bc78738cd936275b990a596d801ef450d022bb005b109b9f451dd087db2f3c9baf53e8e22cf388f79 + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.3": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 + languageName: node + linkType: hard + +"webpack@npm:^5.76.1": + version: 5.87.0 + resolution: "webpack@npm:5.87.0" + dependencies: + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 + acorn: ^8.7.1 + acorn-import-assertions: ^1.9.0 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.15.0 + es-module-lexer: ^1.2.1 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.2.0 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.3.7 + watchpack: ^2.4.0 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: b7d0e390f9d30627e303d54b17cb87b62f49ecffe2d35481f830679904993bae208e23748ffe0e6091b6dd4810562b2f2e88bb0f23b96515d74fb1e3c2898210 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^2.3.0": + version: 2.3.0 + resolution: "whatwg-mimetype@npm:2.3.0" + checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"whatwg-url@npm:^8.0.0": + version: 8.7.0 + resolution: "whatwg-url@npm:8.7.0" + dependencies: + lodash: ^4.7.0 + tr46: ^2.1.0 + webidl-conversions: ^6.1.0 + checksum: a87abcc6cefcece5311eb642858c8fdb234e51ec74196bfacf8def2edae1bfbffdf6acb251646ed6301f8cee44262642d8769c707256125a91387e33f405dd1e + languageName: node + linkType: hard + +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + is-typed-array: ^1.1.10 + checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef + languageName: node + linkType: hard + +"which@npm:^1.2.9, which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: ^2.0.0 + bin: + which: ./bin/which + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"wildcard@npm:^2.0.0": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f + languageName: node + linkType: hard + +"worker-loader@npm:^3.0.2": + version: 3.0.8 + resolution: "worker-loader@npm:3.0.8" + dependencies: + loader-utils: ^2.0.0 + schema-utils: ^3.0.0 + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 84f4a7eeb2a1d8b9704425837e017c91eedfae67ac89e0b866a2dcf283323c1dcabe0258196278b7d5fd0041392da895c8a0c59ddf3a94f1b2e003df68ddfec3 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + languageName: node + linkType: hard + +"ws@npm:^8.11.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"y-protocols@npm:^1.0.5": + version: 1.0.5 + resolution: "y-protocols@npm:1.0.5" + dependencies: + lib0: ^0.2.42 + checksum: d19404a4ebafcf3761c28b881abe8c32ab6e457db0e5ffc7dbb749cbc2c3bb98e003a43f3e8eba7f245b2698c76f2c4cdd1c2db869f8ec0c6ef94736d9a88652 + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yaml@npm:^1.10.0": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.3": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs@npm:~17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + languageName: node + linkType: hard + +"yjs@npm:^13.5.40": + version: 13.6.2 + resolution: "yjs@npm:13.6.2" + dependencies: + lib0: ^0.2.74 + checksum: a69fecdfbdaa8103a732a79e27c128df83a0f1cdd764fa1ef6c51de86a5e1930501a29681124da16332a6afc2824fbdc5c5abe0a6868e1d94ca4fafee8bee503 + languageName: node + linkType: hard From 7a2c9da20eb9b2cbde0139d4296faa12e16a23a3 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Tue, 19 Jul 2022 14:16:28 +0200 Subject: [PATCH 02/27] Includes assignment-list, course-list and formgrader extensions as main panel tab --- src/assignment_list/index.ts | 30 ++-- src/course_list/index.ts | 270 ++++++++++++++++++----------------- src/formgrader/index.ts | 30 ++-- 3 files changed, 185 insertions(+), 145 deletions(-) diff --git a/src/assignment_list/index.ts b/src/assignment_list/index.ts index e36fa63cd..103abf69d 100644 --- a/src/assignment_list/index.ts +++ b/src/assignment_list/index.ts @@ -11,13 +11,16 @@ import { } from '@jupyterlab/apputils'; import { - Widget + Widget, + TabPanel } from '@lumino/widgets'; import { PageConfig } from '@jupyterlab/coreutils'; +import { INotebookShell } from '@jupyter-notebook/application'; + import { requestAPI, CourseList, @@ -171,11 +174,12 @@ export const assignment_list_extension: JupyterFrontEndPlugin = { id: PLUGIN_ID, autoStart: true, requires: [ICommandPalette], - optional: [ILayoutRestorer], + optional: [ILayoutRestorer, INotebookShell], activate: async ( app: JupyterFrontEnd, palette: ICommandPalette, - restorer: ILayoutRestorer | null + restorer: ILayoutRestorer | null, + notebookShell: INotebookShell | null )=> { // Declare a widget variable @@ -200,19 +204,29 @@ export const assignment_list_extension: JupyterFrontEndPlugin = { widget.title.label = 'Assignments'; widget.title.closable = true; } - + console.log("Assignments list initialized"); if(!tracker.has(widget)){ // Track the state of the widget for later restoration tracker.add(widget); } + if(!widget.isAttached){ + // Attach the widget to the mainwork area if it's not there - app.shell.add(widget, 'main'); + // and activate it. + if (notebookShell) { + let w = app.shell.widgets('main').next() as TabPanel; + w.addWidget(widget); + } + else { + app.shell.add(widget, 'main'); + } } - widget.content.update(); - // Activate the widget - app.shell.activateById(widget.id); + widget.content.update(); + // TODO: fix the activation which does nothing + widget.activate(); + // app.shell.activateById(widget.id); } }); diff --git a/src/course_list/index.ts b/src/course_list/index.ts index f554a3c45..f736aeca5 100644 --- a/src/course_list/index.ts +++ b/src/course_list/index.ts @@ -6,7 +6,9 @@ import { import { ICommandPalette, MainAreaWidget, WidgetTracker } from '@jupyterlab/apputils'; -import { Widget } from '@lumino/widgets'; +import { INotebookShell } from '@jupyter-notebook/application'; + +import { Widget, TabPanel } from '@lumino/widgets'; import { requestAPI, CourseList } from './courselist'; @@ -15,84 +17,84 @@ const PLUGIN_ID = "nbgrader:course-list"; const COMMAND_NAME = "nbgrader:open-course-list"; class CourseListWidget extends Widget { - version_alert: HTMLDivElement; - courselist: CourseList; - app: JupyterFrontEnd; - - constructor(app: JupyterFrontEnd) { - super(); - this.app = app; - var maindiv = document.createElement('div') as HTMLDivElement; - maindiv.id = 'courses'; - maindiv.classList.add("tab-pane"); - - this.version_alert = document.createElement('div') as HTMLDivElement; - this.version_alert.classList.add('alert', 'alert-danger', 'version_error') - this.version_alert.hidden = true; - maindiv.appendChild(this.version_alert); - - var panelgroup = document.createElement('div') as HTMLDivElement; - panelgroup.classList.add('panel-group'); - var panel = document.createElement('div') as HTMLDivElement; - panel.classList.add('panel', 'panel-default'); - - var panelheading = document.createElement('div') as HTMLDivElement; - panelheading.classList.add('panel-heading'); - panelheading.textContent = 'Available formgraders'; - - var formgraderbuttons = document.createElement('span') as HTMLSpanElement; - formgraderbuttons.id = 'formgrader_buttons'; - formgraderbuttons.classList.add('pull-right', 'toolbar_buttons'); - - var refreshbutton = document.createElement('button') as HTMLButtonElement; - refreshbutton.id = 'refresh_formgrader_list'; - refreshbutton.title = 'Refresh formgrader list'; - refreshbutton.classList.add('btn', 'btn-default', 'btn-xs'); - - // I have no idea why this is an italics tag, but I'm just recreating it so :/ - var buttonimg = document.createElement('i') as HTMLElement; - buttonimg.classList.add('fa', 'fa-refresh'); - - refreshbutton.appendChild(buttonimg); - formgraderbuttons.appendChild(refreshbutton); - panelheading.appendChild(formgraderbuttons); - panel.appendChild(panelheading); - - var panelbody = document.createElement('div') as HTMLDivElement; - panelbody.classList.add('panel-body'); - var formgraderlist = document.createElement('div') as HTMLDivElement; - formgraderlist.id = 'formgrader_list'; - formgraderlist.classList.add('list_container'); - - // further initialization of formgraderlist is in here - this.courselist = new CourseList(formgraderlist, this.app); - - panelbody.appendChild(formgraderlist); - panel.appendChild(panelbody); - panelgroup.appendChild(panel); - maindiv.appendChild(panelgroup); - this.node.appendChild(maindiv); - this.node.style.overflowY = 'auto'; - - refreshbutton.onclick = () => this.courselist.load_list.call(this.courselist); - this.checkNbGraderVersion(); - this.courselist.load_list(); - } + version_alert: HTMLDivElement; + courselist: CourseList; + app: JupyterFrontEnd; + + constructor(app: JupyterFrontEnd) { + super(); + this.app = app; + var maindiv = document.createElement('div') as HTMLDivElement; + maindiv.id = 'courses'; + maindiv.classList.add("tab-pane"); + + this.version_alert = document.createElement('div') as HTMLDivElement; + this.version_alert.classList.add('alert', 'alert-danger', 'version_error') + this.version_alert.hidden = true; + maindiv.appendChild(this.version_alert); + + var panelgroup = document.createElement('div') as HTMLDivElement; + panelgroup.classList.add('panel-group'); + var panel = document.createElement('div') as HTMLDivElement; + panel.classList.add('panel', 'panel-default'); + + var panelheading = document.createElement('div') as HTMLDivElement; + panelheading.classList.add('panel-heading'); + panelheading.textContent = 'Available formgraders'; + + var formgraderbuttons = document.createElement('span') as HTMLSpanElement; + formgraderbuttons.id = 'formgrader_buttons'; + formgraderbuttons.classList.add('pull-right', 'toolbar_buttons'); + + var refreshbutton = document.createElement('button') as HTMLButtonElement; + refreshbutton.id = 'refresh_formgrader_list'; + refreshbutton.title = 'Refresh formgrader list'; + refreshbutton.classList.add('btn', 'btn-default', 'btn-xs'); + + // I have no idea why this is an italics tag, but I'm just recreating it so :/ + var buttonimg = document.createElement('i') as HTMLElement; + buttonimg.classList.add('fa', 'fa-refresh'); + + refreshbutton.appendChild(buttonimg); + formgraderbuttons.appendChild(refreshbutton); + panelheading.appendChild(formgraderbuttons); + panel.appendChild(panelheading); + + var panelbody = document.createElement('div') as HTMLDivElement; + panelbody.classList.add('panel-body'); + var formgraderlist = document.createElement('div') as HTMLDivElement; + formgraderlist.id = 'formgrader_list'; + formgraderlist.classList.add('list_container'); + + // further initialization of formgraderlist is in here + this.courselist = new CourseList(formgraderlist, this.app); + + panelbody.appendChild(formgraderlist); + panel.appendChild(panelbody); + panelgroup.appendChild(panel); + maindiv.appendChild(panelgroup); + this.node.appendChild(maindiv); + this.node.style.overflowY = 'auto'; + + refreshbutton.onclick = () => this.courselist.load_list.call(this.courselist); + this.checkNbGraderVersion(); + this.courselist.load_list(); + } checkNbGraderVersion() { - let nbgrader_version = '0.8.4'; - requestAPI('nbgrader_version?version='+nbgrader_version) - .then(response => { - if (!response['success']) { - this.version_alert.textContent = response['message']; - this.version_alert.hidden = false; - } - }) - .catch(reason => { - console.error( - `The course_list server extension appears to be missing.\n${reason}` - ); - }); + let nbgrader_version = '0.8.4'; + requestAPI('nbgrader_version?version='+nbgrader_version) + .then(response => { + if (!response['success']) { + this.version_alert.textContent = response['message']; + this.version_alert.hidden = false; + } + }) + .catch(reason => { + console.error( + `The course_list server extension appears to be missing.\n${reason}` + ); + }); } } @@ -100,59 +102,71 @@ class CourseListWidget extends Widget { * Initialization data for the course_list extension. */ export const course_list_extension: JupyterFrontEndPlugin = { - id: PLUGIN_ID, - autoStart: true, - requires: [ICommandPalette], - optional: [ILayoutRestorer], - - activate: async ( - app: JupyterFrontEnd, - palette: ICommandPalette, - restorer: ILayoutRestorer | null - ) => { - - let widget: MainAreaWidget; - - const command:string = COMMAND_NAME; - - // Track the widget state - let tracker = new WidgetTracker>({ - namespace: 'nbgrader-course-list' - }); - - app.commands.addCommand(command, { - label: 'Course List', - execute: () => { - if (!widget || widget.isDisposed) { - const content = new CourseListWidget(app); - widget = new MainAreaWidget({content}); - widget.id = 'nbgrader-course-list' - widget.addClass('nbgrader-mainarea-widget'); - widget.title.label = 'Courses' - widget.title.closable = true; - } - if (!tracker.has(widget)) { - tracker.add(widget); - } - if (!widget.isAttached) { - app.shell.add(widget, 'main'); - } - widget.content.update(); - app.shell.activateById(widget.id); - } - }) - - palette.addItem({ command, category: "nbgrader" }); - - // Restore the widget state - if (restorer != null){ - restorer.restore(tracker, { - command, - name: () => 'nbgrader-course-list' - }); + id: PLUGIN_ID, + autoStart: true, + requires: [ICommandPalette], + optional: [ILayoutRestorer, INotebookShell], + + activate: async ( + app: JupyterFrontEnd, + palette: ICommandPalette, + restorer: ILayoutRestorer | null, + notebookShell: INotebookShell | null + ) => { + + let widget: MainAreaWidget; + + const command:string = COMMAND_NAME; + + // Track the widget state + let tracker = new WidgetTracker>({ + namespace: 'nbgrader-course-list' + }); + + app.commands.addCommand(command, { + label: 'Course List', + execute: () => { + if (!widget || widget.isDisposed) { + const content = new CourseListWidget(app); + widget = new MainAreaWidget({content}); + widget.id = 'nbgrader-course-list'; + widget.addClass('nbgrader-mainarea-widget'); + widget.title.label = 'Courses'; + widget.title.closable = true; + } + if (!tracker.has(widget)) { + tracker.add(widget); + } + if (!widget.isAttached) { + + // Attach the widget to the mainwork area if it's not there + // and activate it. + if (notebookShell) { + let w = app.shell.widgets('main').next() as TabPanel; + w.addWidget(widget); + } + else { + app.shell.add(widget, 'main'); + } } - console.log('JupyterLab extension course-list is activated!'); + widget.content.update(); + // TODO: fix the activation which does nothing + widget.activate(); + } + }) + + palette.addItem({ command, category: "nbgrader" }); + + // Restore the widget state + if (restorer != null){ + restorer.restore(tracker, { + command, + name: () => 'nbgrader-course-list' + }); + } + + console.log('JupyterLab extension course-list is activated!'); } }; diff --git a/src/formgrader/index.ts b/src/formgrader/index.ts index b5efbf04a..c4c5bd755 100644 --- a/src/formgrader/index.ts +++ b/src/formgrader/index.ts @@ -15,6 +15,9 @@ import { IFrame } from '@jupyterlab/apputils'; +import { INotebookShell } from '@jupyter-notebook/application'; + +import { TabPanel } from '@lumino/widgets'; const PLUGIN_ID = "nbgrader:formgrader" const COMMAND_NAME = "nbgrader:open-formgrader" @@ -36,12 +39,12 @@ class FormgraderWidget extends IFrame { var this_widget = this; window.addEventListener('message', function (event) { - this_widget.on_click(event); + this_widget.on_message(event); }); } - private on_click(event:MessageEvent){ + private on_message(event:MessageEvent){ var contentWindow = this.node.querySelector('iframe').contentWindow; if (contentWindow === event.source){ var data = JSON.parse(event.data); @@ -57,11 +60,12 @@ export const formgrader_extension: JupyterFrontEndPlugin = { id: PLUGIN_ID, autoStart: true, requires: [ICommandPalette], - optional: [ILayoutRestorer], + optional: [ILayoutRestorer, INotebookShell], activate: async ( app: JupyterFrontEnd, palette: ICommandPalette, - restorer: ILayoutRestorer | null + restorer: ILayoutRestorer | null, + notebookShell: INotebookShell | null )=> { console.log('JupyterLab extension formgrader is activated!'); @@ -96,13 +100,21 @@ export const formgrader_extension: JupyterFrontEndPlugin = { tracker.add(widget); } if(!widget.isAttached){ - // Attach the widget to the mainwork area if it's not there - app.shell.add(widget, 'main'); + + // Attach the widget to the mainwork area if it's not there + // and activate it. + if (notebookShell) { + let w = app.shell.widgets('main').next() as TabPanel; + w.addWidget(widget); + } + else { + app.shell.add(widget, 'main'); + } } - widget.content.update(); - // Activate the widget - app.shell.activateById(widget.id); + widget.content.update(); + // TODO: fix the activation which does nothing + widget.activate(); } }); From 54a415ce9194ec61afbc56ff408145bbec535ecc Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 20 Jul 2022 11:15:33 +0200 Subject: [PATCH 03/27] Remove required dependency to LabShell --- src/create_assignment/create_assignment_extension.ts | 4 ++-- src/create_assignment/index.ts | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/create_assignment/create_assignment_extension.ts b/src/create_assignment/create_assignment_extension.ts index 03bfd1902..61f4f2676 100644 --- a/src/create_assignment/create_assignment_extension.ts +++ b/src/create_assignment/create_assignment_extension.ts @@ -95,11 +95,11 @@ export class CreateAssignmentWidget extends Panel { private notebookTracker: INotebookTracker; private shell: ILabShell; - constructor(tracker: INotebookTracker, shell: ILabShell) { + constructor(tracker: INotebookTracker, shell: ILabShell | null) { super(); this.addClass(CSS_CREATE_ASSIGNMENT_WIDGET); this.addNotebookListeners(tracker); - this.addMainAreaActiveListener(shell); + if (shell) this.addMainAreaActiveListener(shell); this.activeNotebook = null; this.notebookTracker = tracker; this.shell = shell; diff --git a/src/create_assignment/index.ts b/src/create_assignment/index.ts index ac70e7e04..544522af9 100644 --- a/src/create_assignment/index.ts +++ b/src/create_assignment/index.ts @@ -24,11 +24,16 @@ const PLUGIN_ID = "nbgrader:create-assignment" export const create_assignment_extension: JupyterFrontEndPlugin = { id: PLUGIN_ID, autoStart: true, - requires: [INotebookTracker, ILabShell], + requires: [INotebookTracker], + optional: [ILabShell], activate: activate_extension }; -function activate_extension(app: JupyterFrontEnd, tracker: INotebookTracker, shell: ILabShell) { +function activate_extension( + app: JupyterFrontEnd, + tracker: INotebookTracker, + shell: ILabShell | null +) { console.log('Activating extension "create_assignment".'); const panel = new Panel(); From 73842d7cb3efc4afa7dbc316aa6f238d7ddf8603 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Fri, 14 Oct 2022 11:53:04 +0200 Subject: [PATCH 04/27] Make it work with Notebook7 and JupyterLab4 --- package.json | 25 ++-- playwright.config.ts | 14 +-- src/assignment_list/assignmentlist.ts | 2 +- src/assignment_list/index.ts | 32 ++--- src/course_list/courselist.ts | 2 +- src/course_list/index.ts | 33 +++--- .../create_assignment_extension.ts | 54 +++++---- src/create_assignment/index.ts | 17 ++- src/formgrader/index.ts | 35 +++--- src/validate_assignment/index.ts | 7 +- src/validate_assignment/validateassignment.ts | 2 +- tsconfig.json | 2 +- yarn.lock | 110 ++++++++++++------ 13 files changed, 176 insertions(+), 159 deletions(-) diff --git a/package.json b/package.json index d905c68c1..e50e9b813 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,20 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter-notebook/application": "^7.0.0-alpha.5", - "@jupyterlab/application": "^4.0.0-alpha.11", - "@jupyterlab/apputils": "^4.0.0-alpha.11", - "@jupyterlab/cells": "^4.0.0-alpha.11", - "@jupyterlab/coreutils": "^6.0.0-alpha.11", - "@jupyterlab/launcher": "^4.0.0-alpha.11", - "@jupyterlab/notebook": "^4.0.0-alpha.11", - "@jupyterlab/services": "^7.0.0-alpha.11", - "@jupyterlab/settingregistry": "^4.0.0-alpha.11" + "@jupyter-notebook/application": "^7.0.0-alpha.7", + "@jupyter-notebook/tree": "^7.0.0-alpha.7", + "@jupyterlab/application": "^4.0.0-alpha.15", + "@jupyterlab/apputils": "^4.0.0-alpha.15", + "@jupyterlab/cells": "^4.0.0-alpha.15", + "@jupyterlab/coreutils": "^6.0.0-alpha.15", + "@jupyterlab/launcher": "^4.0.0-alpha.15", + "@jupyterlab/notebook": "^4.0.0-alpha.15", + "@jupyterlab/services": "^7.0.0-alpha.15", + "@jupyterlab/settingregistry": "^4.0.0-alpha.15" }, "devDependencies": { - "@jupyterlab/builder": "^4.0.0-alpha.11", - "@jupyterlab/galata": "^5.0.0-alpha.11", + "@jupyterlab/builder": "^4.0.0-alpha.15", + "@jupyterlab/galata": "^5.0.0-alpha.15", "@playwright/test": "^1.21.1", "@types/codemirror": "^5.60.5", "@typescript-eslint/eslint-plugin": "^4.8.1", @@ -72,7 +73,7 @@ "stylelint-config-recommended": "^6.0.0", "stylelint-config-standard": "~24.0.0", "stylelint-prettier": "^2.0.0", - "typescript": "~4.1.3" + "typescript": "~4.7.3" }, "sideEffects": [ "style/*.css", diff --git a/playwright.config.ts b/playwright.config.ts index a18d2d11f..fda2623b1 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -12,13 +12,13 @@ const config: PlaywrightTestConfig = { reporter: [[process.env.CI ? 'dot' : 'list'], ['html', { outputFolder: 'playwright-tests' }]], workers: 1, use: { - // Browser options - // headless: false, - // slowMo: 500, - // Context options - viewport: { width: 1024, height: 768 }, - // Artifacts - video: 'retain-on-failure' + // Browser options + // headless: false, + // slowMo: 500, + // Context options + viewport: { width: 1024, height: 768 }, + // Artifacts + video: 'retain-on-failure' }, webServer: { diff --git a/src/assignment_list/assignmentlist.ts b/src/assignment_list/assignmentlist.ts index ff3f6cd68..7c61db091 100644 --- a/src/assignment_list/assignmentlist.ts +++ b/src/assignment_list/assignmentlist.ts @@ -755,7 +755,7 @@ export async function requestAPI( try { response = await ServerConnection.makeRequest(requestUrl, init, settings); } catch (error) { - throw new ServerConnection.NetworkError(error); + throw new ServerConnection.NetworkError(error as TypeError); } const data = await response.json(); diff --git a/src/assignment_list/index.ts b/src/assignment_list/index.ts index 103abf69d..5fb879cf8 100644 --- a/src/assignment_list/index.ts +++ b/src/assignment_list/index.ts @@ -12,14 +12,14 @@ import { import { Widget, - TabPanel + // TabPanel } from '@lumino/widgets'; import { PageConfig } from '@jupyterlab/coreutils'; -import { INotebookShell } from '@jupyter-notebook/application'; +import { INotebookTree } from '@jupyter-notebook/tree'; import { requestAPI, @@ -169,17 +169,16 @@ class AssignmentListWidget extends Widget { } - export const assignment_list_extension: JupyterFrontEndPlugin = { id: PLUGIN_ID, autoStart: true, requires: [ICommandPalette], - optional: [ILayoutRestorer, INotebookShell], - activate: async ( + optional: [ILayoutRestorer, INotebookTree], + activate: ( app: JupyterFrontEnd, palette: ICommandPalette, restorer: ILayoutRestorer | null, - notebookShell: INotebookShell | null + notebookTree: INotebookTree | null )=> { // Declare a widget variable @@ -204,29 +203,20 @@ export const assignment_list_extension: JupyterFrontEndPlugin = { widget.title.label = 'Assignments'; widget.title.closable = true; } - console.log("Assignments list initialized"); if(!tracker.has(widget)){ // Track the state of the widget for later restoration tracker.add(widget); } + // Attach the widget to the main area if it's not there if(!widget.isAttached){ - - // Attach the widget to the mainwork area if it's not there - // and activate it. - if (notebookShell) { - let w = app.shell.widgets('main').next() as TabPanel; - w.addWidget(widget); - } - else { - app.shell.add(widget, 'main'); - } + if (notebookTree) notebookTree.addWidget(widget); + else app.shell.add(widget, 'main'); } widget.content.update(); - // TODO: fix the activation which does nothing - widget.activate(); - // app.shell.activateById(widget.id); + + app.shell.activateById(widget.id); } }); @@ -241,7 +231,7 @@ export const assignment_list_extension: JupyterFrontEndPlugin = { }); } - console.log('JupyterLab extension assignment-list is activated!'); + console.debug('JupyterLab extension assignment-list is activated!'); } }; diff --git a/src/course_list/courselist.ts b/src/course_list/courselist.ts index 98f0b0f6f..b40403a16 100644 --- a/src/course_list/courselist.ts +++ b/src/course_list/courselist.ts @@ -27,7 +27,7 @@ export async function requestAPI( try { response = await ServerConnection.makeRequest(requestUrl, init, settings); } catch (error) { - throw new ServerConnection.NetworkError(error); + throw new ServerConnection.NetworkError(error as TypeError); } const data = await response.json(); diff --git a/src/course_list/index.ts b/src/course_list/index.ts index f736aeca5..beb8b7242 100644 --- a/src/course_list/index.ts +++ b/src/course_list/index.ts @@ -6,12 +6,11 @@ import { import { ICommandPalette, MainAreaWidget, WidgetTracker } from '@jupyterlab/apputils'; -import { INotebookShell } from '@jupyter-notebook/application'; - -import { Widget, TabPanel } from '@lumino/widgets'; +import { Widget } from '@lumino/widgets'; import { requestAPI, CourseList } from './courselist'; +import { INotebookTree } from '@jupyter-notebook/tree'; const PLUGIN_ID = "nbgrader:course-list"; const COMMAND_NAME = "nbgrader:open-course-list"; @@ -105,13 +104,13 @@ export const course_list_extension: JupyterFrontEndPlugin = { id: PLUGIN_ID, autoStart: true, requires: [ICommandPalette], - optional: [ILayoutRestorer, INotebookShell], + optional: [ILayoutRestorer, INotebookTree], - activate: async ( + activate: ( app: JupyterFrontEnd, palette: ICommandPalette, restorer: ILayoutRestorer | null, - notebookShell: INotebookShell | null + notebookTree: INotebookTree | null ) => { let widget: MainAreaWidget; @@ -137,22 +136,16 @@ export const course_list_extension: JupyterFrontEndPlugin = { if (!tracker.has(widget)) { tracker.add(widget); } - if (!widget.isAttached) { - - // Attach the widget to the mainwork area if it's not there - // and activate it. - if (notebookShell) { - let w = app.shell.widgets('main').next() as TabPanel; - w.addWidget(widget); - } - else { - app.shell.add(widget, 'main'); - } + + // Attach the widget to the main area if it's not there + if(!widget.isAttached){ + if (notebookTree) notebookTree.addWidget(widget); + else app.shell.add(widget, 'main'); } widget.content.update(); - // TODO: fix the activation which does nothing - widget.activate(); + + app.shell.activateById(widget.id); } }) @@ -166,7 +159,7 @@ export const course_list_extension: JupyterFrontEndPlugin = { }); } - console.log('JupyterLab extension course-list is activated!'); + console.debug('JupyterLab extension course-list is activated!'); } }; diff --git a/src/create_assignment/create_assignment_extension.ts b/src/create_assignment/create_assignment_extension.ts index 61f4f2676..d223d4a77 100644 --- a/src/create_assignment/create_assignment_extension.ts +++ b/src/create_assignment/create_assignment_extension.ts @@ -23,15 +23,15 @@ import { Notebook, NotebookPanel } from '@jupyterlab/notebook'; +import { CellList } from '@jupyterlab/notebook/lib/celllist'; import { IObservableJSON, IObservableList, IObservableMap, - IObservableUndoableList } from '@jupyterlab/observables'; -import { each } from '@lumino/algorithm'; +// import { each } from '@lumino/algorithm'; import { ReadonlyPartialJSONValue @@ -93,16 +93,16 @@ export class CreateAssignmentWidget extends Panel { private mainAreaListener: (shell: LabShell, changed: ILabShell.IChangedArgs) => void; private notebookPanelWidgets = new Map(); private notebookTracker: INotebookTracker; - private shell: ILabShell; + private labShell: ILabShell; - constructor(tracker: INotebookTracker, shell: ILabShell | null) { + constructor(tracker: INotebookTracker, labShell: ILabShell | null) { super(); this.addClass(CSS_CREATE_ASSIGNMENT_WIDGET); this.addNotebookListeners(tracker); - if (shell) this.addMainAreaActiveListener(shell); + if (labShell) this.addMainAreaActiveListener(labShell); this.activeNotebook = null; this.notebookTracker = tracker; - this.shell = shell; + this.labShell = labShell; } private addNotebookListeners(tracker: INotebookTracker): void { @@ -110,9 +110,9 @@ export class CreateAssignmentWidget extends Panel { tracker.currentChanged.connect(this.currentNotebookListener); } - private addMainAreaActiveListener(shell: LabShell): void { + private addMainAreaActiveListener(labShell: LabShell): void { this.mainAreaListener = this.getMainAreaActiveListener(); - shell.currentChanged.connect(this.mainAreaListener); + labShell.currentChanged.connect(this.mainAreaListener); } private async addNotebookWidget( @@ -210,22 +210,23 @@ export class CreateAssignmentWidget extends Panel { * -> is there an active Notebook visible in main panel ? */ protected onAfterShow(): void { - const widgets = this.shell.widgets('main'); + if (!this.labShell) return; + const widgets = this.labShell.widgets('main'); if (this.activeNotebook == null){ this.hideRightPanel(); } else { - each(widgets, w => { + for (let w of widgets) { if (w.title == this.activeNotebook.title) { if (!w.isVisible) this.hideRightPanel(); else w.activate(); } - }); + }; } } private hideRightPanel(): void { - this.shell.collapseRight(); + this.labShell.collapseRight(); } private removeNotebookListeners(tracker: INotebookTracker): void { @@ -426,10 +427,12 @@ class CellWidget extends Panel { private newHeaderElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_CELL_HEADER; - const promptNode = this.cell.promptNode.cloneNode(true) as HTMLElement; - element.appendChild(promptNode); - this.cell.model.stateChanged.connect(this.getCellStateChangedListener( - this.cell.promptNode, promptNode)); + if (this.cell.promptNode) { + const promptNode = this.cell.promptNode.cloneNode(true) as HTMLElement; + element.appendChild(promptNode); + this.cell.model.stateChanged.connect(this.getCellStateChangedListener( + this.cell.promptNode, promptNode)); + } const lockElement = document.createElement('a'); lockElement.className = CSS_LOCK_BUTTON; const listElement = document.createElement('li'); @@ -645,7 +648,7 @@ class NotebookWidget extends Panel { private activeCellWidgetListener: (cellWidget: CellWidget) => void; private cellListener: (notebook: Notebook, cell: Cell) => void; private cellListListener: - (sender: IObservableUndoableList, + (sender: CellList, args: IObservableList.IChangedArgs) => void; private _cellMetadataChanged = new Signal(this); private cellWidgets = new Map(); @@ -680,7 +683,7 @@ class NotebookWidget extends Panel { private addCellListListener(panel: NotebookPanel) { this.cellListListener = - (sender: IObservableUndoableList, + (sender: CellList, args: IObservableList.IChangedArgs) => { switch (args.type) { case 'add': { @@ -900,8 +903,7 @@ class NotebookWidget extends Panel { private validateIds(): void { const set = new Set(); const valid = /^[a-zA-Z0-9_\-]+$/; - const iter = this.notebookPanel.model.cells.iter(); - for (let cellModel = iter.next(); cellModel != null; cellModel = iter.next()) { + for (let cellModel of this.notebookPanel.model.cells) { const data = CellModel.getNbgraderData(cellModel.metadata); if (data == null) continue; @@ -923,9 +925,7 @@ class NotebookWidget extends Panel { } private validateSchemaVersion(): void { - const iter = this.notebookPanel.model.cells.iter(); - for (let cellModel = iter.next(); cellModel != null; - cellModel = iter.next()) { + for (let cellModel of this.notebookPanel.model.cells) { const data = CellModel.getNbgraderData(cellModel.metadata) let version = data == null ? null : data.schema_version; version = version === undefined ? 0 : version; @@ -1005,7 +1005,7 @@ class NotebookWidget extends Panel { */ class NotebookPanelWidget extends Panel { private cellListListener: - (cellModels: IObservableUndoableList, + (cellModels: CellList, args: IObservableList.IChangedArgs) => void; private cellModelListener: (notebookWidget: NotebookWidget, cellWidget: CellWidget) => void; @@ -1021,9 +1021,7 @@ class NotebookPanelWidget extends Panel { private calcTotalPoints(): number { let totalPoints = 0; - const iter = this.notebookWidget.notebookPanel.model.cells.iter(); - for (let cellModel = iter.next(); cellModel != null; - cellModel = iter.next()) { + for (let cellModel of this.notebookWidget.notebookPanel.model.cells) { const data = CellModel.getNbgraderData(cellModel.metadata); const points = (data == null || data.points == null || !CellModel.isGraded(data)) ? 0 : data.points; @@ -1063,7 +1061,7 @@ class NotebookPanelWidget extends Panel { private setUpTotalPoints(): void { this.notebookHeaderWidget.totalPoints = this.calcTotalPoints(); this.cellListListener = - (cellModels: IObservableUndoableList, + (cellModels: CellList, args: IObservableList.IChangedArgs) => { if (args.type != 'move') { this.notebookHeaderWidget.totalPoints = this.calcTotalPoints(); diff --git a/src/create_assignment/index.ts b/src/create_assignment/index.ts index 544522af9..8a1727e9f 100644 --- a/src/create_assignment/index.ts +++ b/src/create_assignment/index.ts @@ -12,6 +12,7 @@ import { Panel } from '@lumino/widgets'; + import { CreateAssignmentWidget } from './create_assignment_extension'; @@ -29,23 +30,27 @@ export const create_assignment_extension: JupyterFrontEndPlugin = { activate: activate_extension }; -function activate_extension( +/** + * + * @param app JupyterFrontEnd + * @param tracker track any changes on the Notebook + * @param labShell used only to track if the main area of JupyterLab has a Notebook in frontend. + */ +function activate_extension ( app: JupyterFrontEnd, tracker: INotebookTracker, - shell: ILabShell | null + labShell: ILabShell | null ) { - console.log('Activating extension "create_assignment".'); - const panel = new Panel(); panel.node.style.overflowY = 'auto'; - const createAssignmentWidget = new CreateAssignmentWidget(tracker, shell); + const createAssignmentWidget = new CreateAssignmentWidget(tracker, labShell); panel.addWidget(createAssignmentWidget); panel.id = 'nbgrader-create_assignemnt'; panel.title.label = 'Create Assignment'; panel.title.caption = 'nbgrader Create Assignment'; app.shell.add(panel, 'right'); - console.log('Extension "create_assignment" activated.'); + console.debug('Extension "create_assignment" activated.'); } export default create_assignment_extension; diff --git a/src/formgrader/index.ts b/src/formgrader/index.ts index c4c5bd755..9823ec73c 100644 --- a/src/formgrader/index.ts +++ b/src/formgrader/index.ts @@ -15,9 +15,7 @@ import { IFrame } from '@jupyterlab/apputils'; -import { INotebookShell } from '@jupyter-notebook/application'; - -import { TabPanel } from '@lumino/widgets'; +import { INotebookTree } from '@jupyter-notebook/tree'; const PLUGIN_ID = "nbgrader:formgrader" const COMMAND_NAME = "nbgrader:open-formgrader" @@ -60,15 +58,13 @@ export const formgrader_extension: JupyterFrontEndPlugin = { id: PLUGIN_ID, autoStart: true, requires: [ICommandPalette], - optional: [ILayoutRestorer, INotebookShell], - activate: async ( + optional: [ILayoutRestorer, INotebookTree], + activate: ( app: JupyterFrontEnd, palette: ICommandPalette, restorer: ILayoutRestorer | null, - notebookShell: INotebookShell | null + notebookTree: INotebookTree | null )=> { - console.log('JupyterLab extension formgrader is activated!'); - // Declare a widget variable let widget: MainAreaWidget; @@ -96,25 +92,19 @@ export const formgrader_extension: JupyterFrontEndPlugin = { } if(!tracker.has(widget)){ - // Track the state of the widget for later restoration - tracker.add(widget); + // Track the state of the widget for later restoration + tracker.add(widget); } - if(!widget.isAttached){ - // Attach the widget to the mainwork area if it's not there - // and activate it. - if (notebookShell) { - let w = app.shell.widgets('main').next() as TabPanel; - w.addWidget(widget); - } - else { - app.shell.add(widget, 'main'); - } + // Attach the widget to the main area if it's not there + if(!widget.isAttached){ + if (notebookTree) notebookTree.addWidget(widget); + else app.shell.add(widget, 'main'); } widget.content.update(); - // TODO: fix the activation which does nothing - widget.activate(); + + app.shell.activateById(widget.id); } }); @@ -128,6 +118,7 @@ export const formgrader_extension: JupyterFrontEndPlugin = { name: () => 'nbgrader-formgrader' }); } + console.debug('JupyterLab extension formgrader is activated!'); } }; diff --git a/src/validate_assignment/index.ts b/src/validate_assignment/index.ts index 5032d1339..936c49329 100644 --- a/src/validate_assignment/index.ts +++ b/src/validate_assignment/index.ts @@ -173,17 +173,16 @@ export class ButtonExtension implements DocumentRegistry.IWidgetExtension): IDisposable { const button = new ValidateButton(panel); - let children = panel.toolbar.children(); + // let children = panel.toolbar.children(); let index = 0; - for (let i = 0; ; i++) { - let widget = children.next(); + for (let widget of panel.toolbar.children()) { if (widget == undefined) { break; } if (widget.node.classList.contains("jp-Toolbar-spacer")) { - index = i; break; } + index ++; } panel.toolbar.insertItem(index, 'runAll', button); return new DisposableDelegate(() => { diff --git a/src/validate_assignment/validateassignment.ts b/src/validate_assignment/validateassignment.ts index 9640d9e47..4542bb9ba 100644 --- a/src/validate_assignment/validateassignment.ts +++ b/src/validate_assignment/validateassignment.ts @@ -32,7 +32,7 @@ export async function requestAPI( try { response = await ServerConnection.makeRequest(requestUrl, init, settings); } catch (error) { - throw new ServerConnection.NetworkError(error); + throw new ServerConnection.NetworkError(error as TypeError); } const data = await response.json(); diff --git a/tsconfig.json b/tsconfig.json index 8cde80ebe..e654203de 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,7 +17,7 @@ "rootDir": "src", "strict": true, "strictNullChecks": false, - "target": "es2017", + "target": "es2018", "types": [] }, "include": ["src/**/*"] diff --git a/yarn.lock b/yarn.lock index b79c70f0d..ce99e3697 100644 --- a/yarn.lock +++ b/yarn.lock @@ -424,7 +424,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/application@npm:^7.0.0-alpha.5": +"@jupyter-notebook/application@npm:^7.0.0-alpha.7, @jupyter-notebook/application@npm:^7.0.0-beta.4": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/application@npm:7.0.0-beta.4" dependencies: @@ -443,6 +443,30 @@ __metadata: languageName: node linkType: hard +"@jupyter-notebook/tree@npm:^7.0.0-alpha.7": + version: 7.0.0-beta.4 + resolution: "@jupyter-notebook/tree@npm:7.0.0-beta.4" + dependencies: + "@jupyter-notebook/application": ^7.0.0-beta.4 + "@jupyterlab/application": ^4.0.1 + "@jupyterlab/apputils": ^4.1.1 + "@jupyterlab/coreutils": ^6.0.1 + "@jupyterlab/docmanager": ^4.0.1 + "@jupyterlab/filebrowser": ^4.0.1 + "@jupyterlab/mainmenu": ^4.0.1 + "@jupyterlab/services": ^7.0.1 + "@jupyterlab/settingregistry": ^4.0.1 + "@jupyterlab/statedb": ^4.0.1 + "@jupyterlab/translation": ^4.0.1 + "@jupyterlab/ui-components": ^4.0.1 + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: 8ec7b6cf7c8358ee1b55712c0817a29615dea772977a9af0f9fd853ffe58a489281a480720caa96b10770e797c980686e78f7009d27b27e4439bf6a904201606 + languageName: node + linkType: hard + "@jupyter/ydoc@npm:^1.0.2": version: 1.0.2 resolution: "@jupyter/ydoc@npm:1.0.2" @@ -457,7 +481,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application@npm:^4.0.0-alpha.11, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": +"@jupyterlab/application@npm:^4.0.0-alpha.15, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/application@npm:4.0.2" dependencies: @@ -485,7 +509,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/apputils@npm:^4.0.0-alpha.11, @jupyterlab/apputils@npm:^4.1.2": +"@jupyterlab/apputils@npm:^4.0.0-alpha.15, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": version: 4.1.2 resolution: "@jupyterlab/apputils@npm:4.1.2" dependencies: @@ -528,7 +552,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.0.0-alpha.11": +"@jupyterlab/builder@npm:^4.0.0-alpha.15": version: 4.0.2 resolution: "@jupyterlab/builder@npm:4.0.2" dependencies: @@ -569,7 +593,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/cells@npm:^4.0.0-alpha.11, @jupyterlab/cells@npm:^4.0.2": +"@jupyterlab/cells@npm:^4.0.0-alpha.15, @jupyterlab/cells@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/cells@npm:4.0.2" dependencies: @@ -697,7 +721,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.0.0-alpha.11, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": +"@jupyterlab/coreutils@npm:^6.0.0-alpha.15, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": version: 6.0.2 resolution: "@jupyterlab/coreutils@npm:6.0.2" dependencies: @@ -748,7 +772,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/docmanager@npm:^4.0.2": +"@jupyterlab/docmanager@npm:^4.0.1, @jupyterlab/docmanager@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/docmanager@npm:4.0.2" dependencies: @@ -814,7 +838,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/filebrowser@npm:^4.0.2": +"@jupyterlab/filebrowser@npm:^4.0.1, @jupyterlab/filebrowser@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/filebrowser@npm:4.0.2" dependencies: @@ -867,7 +891,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/galata@npm:^5.0.0-alpha.11": +"@jupyterlab/galata@npm:^5.0.0-alpha.15": version: 5.0.2 resolution: "@jupyterlab/galata@npm:5.0.2" dependencies: @@ -894,7 +918,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/launcher@npm:^4.0.0-alpha.11": +"@jupyterlab/launcher@npm:^4.0.0-alpha.15": version: 4.0.2 resolution: "@jupyterlab/launcher@npm:4.0.2" dependencies: @@ -933,6 +957,21 @@ __metadata: languageName: node linkType: hard +"@jupyterlab/mainmenu@npm:^4.0.1": + version: 4.0.2 + resolution: "@jupyterlab/mainmenu@npm:4.0.2" + dependencies: + "@jupyterlab/apputils": ^4.1.2 + "@jupyterlab/translation": ^4.0.2 + "@jupyterlab/ui-components": ^4.0.2 + "@lumino/algorithm": ^2.0.0 + "@lumino/commands": ^2.1.1 + "@lumino/coreutils": ^2.1.1 + "@lumino/widgets": ^2.1.1 + checksum: de84dad79c237aad7db8c433c598d0e57e415bafac0e2029ddbe200ab8129e18ddd45674b5506e8f9cd8c23af491ec30c39ee2e9478647af72cf419c266127c7 + languageName: node + linkType: hard + "@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/nbformat@npm:4.0.2" @@ -942,7 +981,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/notebook@npm:^4.0.0-alpha.11, @jupyterlab/notebook@npm:^4.0.2": +"@jupyterlab/notebook@npm:^4.0.0-alpha.15, @jupyterlab/notebook@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/notebook@npm:4.0.2" dependencies: @@ -1043,7 +1082,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/services@npm:^7.0.0-alpha.11, @jupyterlab/services@npm:^7.0.2": +"@jupyterlab/services@npm:^7.0.0-alpha.15, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": version: 7.0.2 resolution: "@jupyterlab/services@npm:7.0.2" dependencies: @@ -1062,7 +1101,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^4.0.0-alpha.11, @jupyterlab/settingregistry@npm:^4.0.2": +"@jupyterlab/settingregistry@npm:^4.0.0-alpha.15, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/settingregistry@npm:4.0.2" dependencies: @@ -1081,7 +1120,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/statedb@npm:^4.0.2": +"@jupyterlab/statedb@npm:^4.0.1, @jupyterlab/statedb@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/statedb@npm:4.0.2" dependencies: @@ -1131,7 +1170,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/translation@npm:^4.0.2": +"@jupyterlab/translation@npm:^4.0.1, @jupyterlab/translation@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/translation@npm:4.0.2" dependencies: @@ -5387,17 +5426,18 @@ __metadata: version: 0.0.0-use.local resolution: "nbgrader@workspace:." dependencies: - "@jupyter-notebook/application": ^7.0.0-alpha.5 - "@jupyterlab/application": ^4.0.0-alpha.11 - "@jupyterlab/apputils": ^4.0.0-alpha.11 - "@jupyterlab/builder": ^4.0.0-alpha.11 - "@jupyterlab/cells": ^4.0.0-alpha.11 - "@jupyterlab/coreutils": ^6.0.0-alpha.11 - "@jupyterlab/galata": ^5.0.0-alpha.11 - "@jupyterlab/launcher": ^4.0.0-alpha.11 - "@jupyterlab/notebook": ^4.0.0-alpha.11 - "@jupyterlab/services": ^7.0.0-alpha.11 - "@jupyterlab/settingregistry": ^4.0.0-alpha.11 + "@jupyter-notebook/application": ^7.0.0-alpha.7 + "@jupyter-notebook/tree": ^7.0.0-alpha.7 + "@jupyterlab/application": ^4.0.0-alpha.15 + "@jupyterlab/apputils": ^4.0.0-alpha.15 + "@jupyterlab/builder": ^4.0.0-alpha.15 + "@jupyterlab/cells": ^4.0.0-alpha.15 + "@jupyterlab/coreutils": ^6.0.0-alpha.15 + "@jupyterlab/galata": ^5.0.0-alpha.15 + "@jupyterlab/launcher": ^4.0.0-alpha.15 + "@jupyterlab/notebook": ^4.0.0-alpha.15 + "@jupyterlab/services": ^7.0.0-alpha.15 + "@jupyterlab/settingregistry": ^4.0.0-alpha.15 "@playwright/test": ^1.21.1 "@types/codemirror": ^5.60.5 "@typescript-eslint/eslint-plugin": ^4.8.1 @@ -5415,7 +5455,7 @@ __metadata: stylelint-config-recommended: ^6.0.0 stylelint-config-standard: ~24.0.0 stylelint-prettier: ^2.0.0 - typescript: ~4.1.3 + typescript: ~4.7.3 languageName: unknown linkType: soft @@ -7114,23 +7154,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~4.1.3": - version: 4.1.6 - resolution: "typescript@npm:4.1.6" +"typescript@npm:~4.7.3": + version: 4.7.4 + resolution: "typescript@npm:4.7.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 54aed909f94b16178c8a8d8911871b4e1c04454a3e6c82166715e28083e7ce6271e4d1df6f82c89544a4759b07aec780785032534e9c93b254e2107a18712c05 + checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df languageName: node linkType: hard -"typescript@patch:typescript@~4.1.3#~builtin": - version: 4.1.6 - resolution: "typescript@patch:typescript@npm%3A4.1.6#~builtin::version=4.1.6&hash=4a8eb8" +"typescript@patch:typescript@~4.7.3#~builtin": + version: 4.7.4 + resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=65a307" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3bd9915f236817e4e2d32dd0d90e8902875929f014bb87a478000e32adda91d12f0425931ee6f9d6a2bc7d0c9242588fcee1050ac294497dfabf27d3d73b335c + checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e languageName: node linkType: hard From 98a8464750fb3eba3b4bcf2b144ee9be08d76885 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Fri, 14 Oct 2022 13:14:05 +0200 Subject: [PATCH 05/27] update dependencies --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6eeddf75c..a28ea7708 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [build-system] requires = [ "hatchling>=1.10.0", - "jupyterlab<4", + "jupyterlab>=4.0.0a30", ] build-backend = "hatchling.build" @@ -37,12 +37,12 @@ dependencies = [ "Jinja2>=3", "jsonschema>=3", "jupyter_client<9", - "jupyter_server>=1.12,<2", - "jupyterlab<4", + "jupyter_server>=1.16", + "jupyterlab>=4.0.0a30", "jupyterlab_server", "nbclient>=0.6.1", "nbconvert>=6", - "notebook>=6.4,<7", + "notebook>=7.0.0a7", "python-dateutil>=2.8", "rapidfuzz>=1.8", "requests>=2.26", From b5830f987b30faa686566ed8e8690b1616ad8662 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 26 Oct 2022 09:28:48 +0200 Subject: [PATCH 06/27] Refactore create_assignment_extension to depend on CellModel instead of Cell widget, and to simplify the listeners --- .../create_assignment_extension.ts | 1003 ++++++++--------- 1 file changed, 463 insertions(+), 540 deletions(-) diff --git a/src/create_assignment/create_assignment_extension.ts b/src/create_assignment/create_assignment_extension.ts index d223d4a77..4e94ac66e 100644 --- a/src/create_assignment/create_assignment_extension.ts +++ b/src/create_assignment/create_assignment_extension.ts @@ -1,4 +1,4 @@ -import { ILabShell, LabShell } from '@jupyterlab/application'; +import { ILabShell } from '@jupyterlab/application'; import { Dialog, Styling @@ -9,9 +9,9 @@ import { ICellModel } from '@jupyterlab/cells'; -import { - IChangedArgs -} from '@jupyterlab/coreutils'; +// import { +// IChangedArgs +// } from '@jupyterlab/coreutils'; import { DocumentRegistry @@ -31,8 +31,6 @@ import { IObservableMap, } from '@jupyterlab/observables'; -// import { each } from '@lumino/algorithm'; - import { ReadonlyPartialJSONValue } from '@lumino/coreutils'; @@ -50,7 +48,6 @@ import { Panel, Widget } from '@lumino/widgets'; - import { CellModel, CellType, @@ -87,117 +84,49 @@ function showErrorDialog(options: Partial> = {}): Promise< * A widget which shows the "Create Assignment" widgets for the active notebook. */ export class CreateAssignmentWidget extends Panel { - private activeNotebook: NotebookPanel; - private currentNotebookListener: (tracker: INotebookTracker, - panel: NotebookPanel) => void; - private mainAreaListener: (shell: LabShell, changed: ILabShell.IChangedArgs) => void; - private notebookPanelWidgets = new Map(); - private notebookTracker: INotebookTracker; - private labShell: ILabShell; constructor(tracker: INotebookTracker, labShell: ILabShell | null) { super(); this.addClass(CSS_CREATE_ASSIGNMENT_WIDGET); - this.addNotebookListeners(tracker); - if (labShell) this.addMainAreaActiveListener(labShell); - this.activeNotebook = null; - this.notebookTracker = tracker; - this.labShell = labShell; - } - - private addNotebookListeners(tracker: INotebookTracker): void { - this.currentNotebookListener = this.getCurrentNotebookListener(); - tracker.currentChanged.connect(this.currentNotebookListener); - } - - private addMainAreaActiveListener(labShell: LabShell): void { - this.mainAreaListener = this.getMainAreaActiveListener(); - labShell.currentChanged.connect(this.mainAreaListener); - } - - private async addNotebookWidget( - tracker: INotebookTracker, - panel: NotebookPanel) { - - if (panel === null) return; - - await panel.revealed; - const notebookPanelWidget = new NotebookPanelWidget(panel); - this.addWidget(notebookPanelWidget); - this.notebookPanelWidgets.set(panel, notebookPanelWidget); - - panel.disposed.connect(() => { - notebookPanelWidget.dispose(); - }); - notebookPanelWidget.disposed.connect(() => { - this.notebookPanelWidgets.delete(panel); - }); - if (tracker.currentWidget != panel) { - notebookPanelWidget.hide(); - } - return panel.revealed; + tracker.currentChanged.connect(this._onCurrentNotebookChange, this); + if (labShell) { + labShell.currentChanged.connect(this._onMainAreaActiveChange, this); + } + this._activeNotebook = null; + this._notebookTracker = tracker; + this._labShell = labShell; } + /** + * Dispose of the Panel. + */ dispose(): void { if (this.isDisposed) { return; } - if (this.notebookPanelWidgets != null) { - for (const widget of this.notebookPanelWidgets) { + if (this._notebookPanelWidgets != null) { + for (const widget of this._notebookPanelWidgets) { widget[1].dispose(); } } - if (this.notebookTracker != null) { - this.removeNotebookListeners(this.notebookTracker); + this._notebookTracker.currentChanged.disconnect( + this._onCurrentNotebookChange, this + ); + if (this._labShell) { + this._labShell.currentChanged.disconnect(this._onMainAreaActiveChange, this); } - this.activeNotebook = null; - this.notebookPanelWidgets = null; - this.notebookTracker = null; + this._activeNotebook = null; + this._notebookPanelWidgets = null; + this._notebookTracker = null; super.dispose(); } - private getCurrentNotebookListener(): (tracker: INotebookTracker, - panel: NotebookPanel) => void { - return async (tracker: INotebookTracker, panel: NotebookPanel) => { - if (this.activeNotebook != null) { - const widget = this.notebookPanelWidgets.get(this.activeNotebook); - if (widget != null) { - widget.hide(); - } - } - if (panel != null) { - if (this.isVisible && this.notebookPanelWidgets.get(panel) == null) { - await this.addNotebookWidget(tracker, panel); - } - const widget = this.notebookPanelWidgets.get(panel); - if (widget != null) { - widget.show(); - } - } - this.activeNotebook = panel; - } - } - - /* - * The listener on the main area tab change - * to collapse create_assignment widget if the current tab is not a Notebook - */ - private getMainAreaActiveListener(): ( - shell: ILabShell, - changed: ILabShell.IChangedArgs) => void { - return async (shell: ILabShell, changed: ILabShell.IChangedArgs) => { - if ( !(changed.newValue instanceof NotebookPanel) && this.isVisible) { - this.hideRightPanel(); - } - } - } - protected onBeforeShow(msg: Message): void { super.onBeforeShow(msg); - if (this.activeNotebook != null){ - const notebookWidget = this.notebookPanelWidgets.get(this.activeNotebook); + if (this._activeNotebook != null){ + const notebookWidget = this._notebookPanelWidgets.get(this._activeNotebook); if (notebookWidget == null) { - this.addNotebookWidget(this.notebookTracker, this.activeNotebook); + this._addNotebookWidget(this._notebookTracker, this._activeNotebook); } else { notebookWidget.show(); @@ -210,75 +139,125 @@ export class CreateAssignmentWidget extends Panel { * -> is there an active Notebook visible in main panel ? */ protected onAfterShow(): void { - if (!this.labShell) return; - const widgets = this.labShell.widgets('main'); - if (this.activeNotebook == null){ - this.hideRightPanel(); + if (!this._labShell) return; + const widgets = this._labShell.widgets('main'); + if (this._activeNotebook == null){ + this._hideRightPanel(); } else { for (let w of widgets) { - if (w.title == this.activeNotebook.title) { - if (!w.isVisible) this.hideRightPanel(); + if (w.title == this._activeNotebook.title) { + if (!w.isVisible) this._hideRightPanel(); else w.activate(); } }; } } - private hideRightPanel(): void { - this.labShell.collapseRight(); + /** + * Add a notebook widget in the panel, which handle each cell of the notebookPanel. + */ + private async _addNotebookWidget( + tracker: INotebookTracker, + panel: NotebookPanel + ) { + if (panel === null) return; + + await panel.revealed; + const notebookPanelWidget = new NotebookPanelWidget(panel); + this.addWidget(notebookPanelWidget); + this._notebookPanelWidgets.set(panel, notebookPanelWidget); + + panel.disposed.connect(() => { + notebookPanelWidget.dispose(); + }); + notebookPanelWidget.disposed.connect(() => { + this._notebookPanelWidgets.delete(panel); + }); + if (tracker.currentWidget != panel) { + notebookPanelWidget.hide(); + } + return panel.revealed; + } + + /** + * handle change of current notebook panel. + */ + private async _onCurrentNotebookChange( + tracker: INotebookTracker, + panel: NotebookPanel + ) { + if (this._activeNotebook != null) { + const widget = this._notebookPanelWidgets.get(this._activeNotebook); + if (widget != null) { + widget.hide(); + } + } + if (panel != null) { + if (this.isVisible && this._notebookPanelWidgets.get(panel) == null) { + await this._addNotebookWidget(tracker, panel); + } + const widget = this._notebookPanelWidgets.get(panel); + if (widget != null) { + widget.show(); + } + } + this._activeNotebook = panel; + } + + /* + * The listener on the main area tab change, to collapse + * create_assignment widget if the current tab is not a Notebook. + */ + private _onMainAreaActiveChange ( + shell: ILabShell, + changed: ILabShell.IChangedArgs + ) { + if ( !(changed.newValue instanceof NotebookPanel) && this.isVisible) { + this._hideRightPanel(); + } } - private removeNotebookListeners(tracker: INotebookTracker): void { - tracker.currentChanged.disconnect(this.currentNotebookListener); - this.currentNotebookListener = null; + /** + * Hide the right panel. + */ + private _hideRightPanel(): void { + this._labShell.collapseRight(); } + + private _activeNotebook: NotebookPanel; + private _notebookPanelWidgets = new Map(); + private _notebookTracker: INotebookTracker; + private _labShell: ILabShell; } /** * Shows a cell's assignment data. */ class CellWidget extends Panel { - private _cell: Cell; - private _click = new Signal(this); - private metadataChangedHandler: - (metadata: IObservableJSON, - changedArgs: IObservableMap.IChangedArgs) => - void; - private onclick: (this: HTMLElement, ev: MouseEvent) => any; - private lock: HTMLAnchorElement; - private gradeId: HTMLDivElement; - private points: HTMLDivElement; - private taskInput: HTMLSelectElement; - private gradeIdInput: HTMLInputElement; - private pointsInput: HTMLInputElement; - - constructor(cell: Cell) { + + constructor(cellModel: ICellModel) { super(); - this._cell = cell; - this.addMetadataListener(cell); - this.initLayout(); - this.initClickListener(); - this.initInputListeners(); - this.initMetadata(cell); + this._cellModel = cellModel; + this._cellModel.metadata.changed.connect( + this._onMetadataChange, this + ); + this._initLayout(); + this._initInputListeners(); + this._initMetadata(cellModel); this.addClass(CSS_CELL_WIDGET); - } - - private async addMetadataListener(cell: Cell) { - await cell.ready; - this.metadataChangedHandler = this.getMetadataChangedHandler(); - cell.model.metadata.changed.connect(this.metadataChangedHandler); + this.node.addEventListener('click', this._onClick.bind(this)); } /** * The notebook cell associated with this widget. */ - get cell(): Cell { - return this._cell; + get cellModel(): ICellModel { + return this._cellModel; } - private cleanNbgraderData(cell: Cell): void { - CellModel.cleanNbgraderData(cell.model.metadata, cell.model.type); + private cleanNbgraderData(cellModel: ICellModel): void { + CellModel.cleanNbgraderData(cellModel.metadata, cellModel.type); } /** @@ -292,110 +271,111 @@ class CellWidget extends Panel { if (this.isDisposed) { return; } - if (this.metadataChangedHandler != null) { - this.cell?.model?.metadata?.changed?.disconnect( - this.metadataChangedHandler); - } - if (this.onclick != null) { - this.node?.removeEventListener('click', this.onclick); + this.cellModel?.metadata?.changed?.disconnect( + this._onMetadataChange, this + ); + this.node.removeEventListener('click', this._onClick); + if (this._taskInput != null) { + this._taskInput.onchange = null; } - if (this.taskInput != null) { - this.taskInput.onchange = null; + if (this._gradeIdInput != null) { + this._gradeIdInput.onchange = null; } - if (this.gradeIdInput != null) { - this.gradeIdInput.onchange = null; + if (this._pointsInput != null) { + this._pointsInput.onchange = null; } - if (this.pointsInput != null) { - this.pointsInput.onchange = null; - } - this._cell = null; + this._cellModel = null; this._click = null; - this.metadataChangedHandler = null; - this.onclick = null; - this.lock = null; - this.gradeId = null; - this.points = null; - this.taskInput = null; - this.gradeIdInput = null; - this.pointsInput = null; + this._lock = null; + this._gradeId = null; + this._points = null; + this._taskInput = null; + this._gradeIdInput = null; + this._pointsInput = null; super.dispose(); } - private getCellStateChangedListener( - srcPrompt: HTMLElement, destPrompt: HTMLElement): - (model: ICellModel, changedArgs: IChangedArgs) => void { - return (model: ICellModel, changedArgs: IChangedArgs) => { - if (changedArgs.name == 'executionCount') { - destPrompt.innerText = srcPrompt.innerText; - } + /** + * Sets this cell as active/focused. + */ + setActive(active: boolean): void { + if (active) { + this.addClass(CSS_MOD_ACTIVE); + } + else { + this.removeClass(CSS_MOD_ACTIVE); } } - private getMetadataChangedHandler(): - (metadata: IObservableJSON, - changedArgs: IObservableMap.IChangedArgs) => - void { - return (metadata: IObservableJSON, changedArgs: - IObservableMap.IChangedArgs) => { - const nbgraderData = CellModel.getNbgraderData(metadata); - const toolData = CellModel.newToolData(nbgraderData, this.cell.model.type); - this.updateValues(toolData); - } + // private getCellStateChangedListener( + // srcPrompt: HTMLElement, destPrompt: HTMLElement): + // (model: ICellModel, changedArgs: IChangedArgs) => void { + // return (model: ICellModel, changedArgs: IChangedArgs) => { + // if (changedArgs.name == 'executionCount') { + // destPrompt.innerText = srcPrompt.innerText; + // } + // } + // } + + private _onMetadataChange ( + metadata: IObservableJSON, + changedArgs: IObservableMap.IChangedArgs + ) { + const nbgraderData = CellModel.getNbgraderData(metadata); + const toolData = CellModel.newToolData(nbgraderData, this.cellModel.type); + this._updateValues(toolData); } - private getOnInputChanged(): () => void { + private _getOnInputChanged(): () => void { return () => { const toolData = new ToolData(); - toolData.type = this.taskInput.value as CellType; - if (!this.gradeId.classList.contains(CSS_MOD_UNEDITABLE)) { - toolData.id = this.gradeIdInput.value; + toolData.type = this._taskInput.value as CellType; + if (!this._gradeId.classList.contains(CSS_MOD_UNEDITABLE)) { + toolData.id = this._gradeIdInput.value; } else { const nbgraderData = CellModel.getNbgraderData( - this.cell.model.metadata); + this.cellModel.metadata); if (nbgraderData?.grade_id == null) { - toolData.id = 'cell-' + this.randomString(16); + toolData.id = 'cell-' + this._randomString(16); } else { toolData.id = nbgraderData.grade_id; } - this.gradeIdInput.value = toolData.id; + this._gradeIdInput.value = toolData.id; } - if (!this.points.classList.contains(CSS_MOD_UNEDITABLE)) { - toolData.points = this.pointsInput.valueAsNumber; + if (!this._points.classList.contains(CSS_MOD_UNEDITABLE)) { + toolData.points = this._pointsInput.valueAsNumber; } const data = CellModel.newNbgraderData(toolData); - CellModel.setNbgraderData(data, this.cell.model.metadata); + CellModel.setNbgraderData(data, this.cellModel.metadata); } } - private getOnTaskInputChanged(): () => void { - const onInputChanged = this.getOnInputChanged(); + private _getOnTaskInputChanged(): () => void { + const onInputChanged = this._getOnInputChanged(); return () => { onInputChanged(); - this.updateDisplayClass(); + this._updateDisplayClass(); } } - private initClickListener(): void { - this.onclick = () => { - this._click.emit(); - }; - this.node.addEventListener('click', this.onclick); + private _onClick() { + this._click.emit(); } - private initInputListeners(): void { - this.taskInput.onchange = this.getOnTaskInputChanged(); - this.gradeIdInput.onchange = this.getOnInputChanged(); - this.pointsInput.onchange = this.getOnInputChanged(); + private _initInputListeners(): void { + this._taskInput.onchange = this._getOnTaskInputChanged(); + this._gradeIdInput.onchange = this._getOnInputChanged(); + this._pointsInput.onchange = this._getOnInputChanged(); } - private initLayout(): void { + private _initLayout(): void { const bodyElement = document.createElement('div'); - const headerElement = this.newHeaderElement(); - const taskElement = this.newTaskElement(); - const idElement = this.newIdElement(); - const pointsElement = this.newPointsElement(); + const headerElement = this._newHeaderElement(); + const taskElement = this._newTaskElement(); + const idElement = this._newIdElement(); + const pointsElement = this._newPointsElement(); const elements = [headerElement, taskElement, idElement, pointsElement]; const fragment = document.createDocumentFragment(); for (const element of elements) { @@ -403,36 +383,32 @@ class CellWidget extends Panel { } bodyElement.appendChild(fragment); this.node.appendChild(bodyElement); - this.lock = headerElement.getElementsByTagName('a')[0]; - this.gradeId = idElement; - this.points = pointsElement; - this.taskInput = taskElement.getElementsByTagName('select')[0]; - this.gradeIdInput = idElement.getElementsByTagName('input')[0]; - this.pointsInput = pointsElement.getElementsByTagName('input')[0]; + this._lock = headerElement.getElementsByTagName('a')[0]; + this._gradeId = idElement; + this._points = pointsElement; + this._taskInput = taskElement.getElementsByTagName('select')[0]; + this._gradeIdInput = idElement.getElementsByTagName('input')[0]; + this._pointsInput = pointsElement.getElementsByTagName('input')[0]; } - private async initMetadata(cell: Cell) { - await cell.ready - if (cell.model == null) { - return; - } - this.cleanNbgraderData(cell); - const nbgraderData = CellModel.getNbgraderData(cell.model.metadata); - const toolData = CellModel.newToolData(nbgraderData, this.cell.model.type); - CellModel.clearCellType(cell.model.metadata); - this.updateDisplayClass(); - this.updateValues(toolData); + private async _initMetadata(cellModel: ICellModel) { + this.cleanNbgraderData(cellModel); + const nbgraderData = CellModel.getNbgraderData(cellModel.metadata); + const toolData = CellModel.newToolData(nbgraderData, this.cellModel.type); + CellModel.clearCellType(cellModel.metadata); + this._updateDisplayClass(); + this._updateValues(toolData); } - private newHeaderElement(): HTMLDivElement { + private _newHeaderElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_CELL_HEADER; - if (this.cell.promptNode) { - const promptNode = this.cell.promptNode.cloneNode(true) as HTMLElement; - element.appendChild(promptNode); - this.cell.model.stateChanged.connect(this.getCellStateChangedListener( - this.cell.promptNode, promptNode)); - } + // if (this.cell && this.cell.promptNode) { + // const promptNode = this.cell.promptNode.cloneNode(true) as HTMLElement; + // element.appendChild(promptNode); + // this.cell.stateChanged.connect(this.getCellStateChangedListener( + // this.cell.promptNode, promptNode)); + // } const lockElement = document.createElement('a'); lockElement.className = CSS_LOCK_BUTTON; const listElement = document.createElement('li'); @@ -443,7 +419,7 @@ class CellWidget extends Panel { return element; } - private newIdElement(): HTMLDivElement { + private _newIdElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_CELL_ID; const label = document.createElement('label'); @@ -455,7 +431,7 @@ class CellWidget extends Panel { return element; } - private newPointsElement(): HTMLDivElement { + private _newPointsElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_CELL_POINTS; const label = document.createElement('label'); @@ -468,7 +444,7 @@ class CellWidget extends Panel { return element; } - private newTaskElement(): HTMLDivElement { + private _newTaskElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_CELL_TYPE; const label = document.createElement('label'); @@ -482,7 +458,7 @@ class CellWidget extends Panel { ['tests', 'Autograded tests'], ['readonly', 'Read-only'] ]); - if (this.cell.model.type !== 'code') { + if (this.cellModel.type !== 'code') { options.delete('solution'); options.delete('tests'); } @@ -500,7 +476,7 @@ class CellWidget extends Panel { return element; } - private randomString(length: number): string { + private _randomString(length: number): string { var result = ''; var chars = 'abcdef0123456789'; var i; @@ -510,23 +486,11 @@ class CellWidget extends Panel { return result; } - /** - * Sets this cell as active/focused. - */ - setActive(active: boolean): void { - if (active) { - this.addClass(CSS_MOD_ACTIVE); - } - else { - this.removeClass(CSS_MOD_ACTIVE); - } - } - - private setGradeId(value: string): void { - this.gradeIdInput.value = value; + private _setGradeId(value: string): void { + this._gradeIdInput.value = value; } - private setElementEditable(element: HTMLElement, visible: boolean): void { + private _setElementEditable(element: HTMLElement, visible: boolean): void { if (visible) { element.classList.remove(CSS_MOD_UNEDITABLE); } @@ -535,24 +499,24 @@ class CellWidget extends Panel { } } - private setGradeIdEditable(visible: boolean): void { - this.setElementEditable(this.gradeId, visible); + private _setGradeIdEditable(visible: boolean): void { + this._setElementEditable(this._gradeId, visible); } - private setPoints(value: number): void { - this.pointsInput.value = value.toString(); + private _setPoints(value: number): void { + this._pointsInput.value = value.toString(); } - private setPointsEditable(visible: boolean): void { - this.setElementEditable(this.points, visible); + private _setPointsEditable(visible: boolean): void { + this._setElementEditable(this._points, visible); } - private setTask(value: string): void { - this.taskInput.value = value; + private _setTask(value: string): void { + this._taskInput.value = value; } - private updateDisplayClass(): void { - const data = CellModel.getNbgraderData(this.cell.model.metadata); + private _updateDisplayClass(): void { + const data = CellModel.getNbgraderData(this.cellModel.metadata); if (CellModel.isRelevantToNbgrader(data)) { this.addClass(CSS_MOD_HIGHLIGHT); } @@ -561,31 +525,40 @@ class CellWidget extends Panel { } } - private updateValues(data: ToolData): void { - this.setTask(data.type); + private _updateValues(data: ToolData): void { + this._setTask(data.type); if (data.id == null) { - this.setGradeIdEditable(false); - this.setGradeId(''); + this._setGradeIdEditable(false); + this._setGradeId(''); } else { - this.setGradeId(data.id); - this.setGradeIdEditable(true); + this._setGradeId(data.id); + this._setGradeIdEditable(true); } if (data.points == null) { - this.setPointsEditable(false); - this.setPoints(0); + this._setPointsEditable(false); + this._setPoints(0); } else { - this.setPoints(data.points); - this.setPointsEditable(true); + this._setPoints(data.points); + this._setPointsEditable(true); } if (data.locked) { - this.lock.classList.add(CSS_MOD_LOCKED); + this._lock.classList.add(CSS_MOD_LOCKED); } else { - this.lock.classList.remove(CSS_MOD_LOCKED); + this._lock.classList.remove(CSS_MOD_LOCKED); } } + + private _cellModel: ICellModel; + private _click = new Signal(this); + private _lock: HTMLAnchorElement; + private _gradeId: HTMLDivElement; + private _points: HTMLDivElement; + private _taskInput: HTMLSelectElement; + private _gradeIdInput: HTMLInputElement; + private _pointsInput: HTMLInputElement; } /** @@ -594,29 +567,37 @@ class CellWidget extends Panel { * Displays the total points in the notebook. */ class NotebookHeaderWidget extends Widget { - private pointsInput: HTMLInputElement; constructor() { super(); this.addClass(CSS_NOTEBOOK_HEADER_WIDGET); - this.initLayout(); + this._initLayout(); } dispose(): void { if (this.isDisposed) { return; } - this.pointsInput = null; + this._pointsInput = null; super.dispose(); } - private initLayout(): void { - const totalPoints = this.newTotalPointsElement(); + /** + * The total points in the notebook. + */ + set totalPoints(points: number) { + if (this._pointsInput != null) { + this._pointsInput.value = points.toString(); + } + } + + private _initLayout(): void { + const totalPoints = this._newTotalPointsElement(); this.node.appendChild(totalPoints); - this.pointsInput = totalPoints.getElementsByTagName('input')[0]; + this._pointsInput = totalPoints.getElementsByTagName('input')[0]; } - private newTotalPointsElement(): HTMLDivElement { + private _newTotalPointsElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_NOTEBOOK_POINTS; const label = document.createElement('label'); @@ -630,134 +611,55 @@ class NotebookHeaderWidget extends Widget { return element; } - /** - * The total points in the notebook. - */ - set totalPoints(points: number) { - if (this.pointsInput != null) { - this.pointsInput.value = points.toString(); - } - } + private _pointsInput: HTMLInputElement; } /** * Contains a list of {@link CellWidget}s for a notebook. */ class NotebookWidget extends Panel { - private activeCell = null as Cell; - private activeCellWidgetListener: (cellWidget: CellWidget) => void; - private cellListener: (notebook: Notebook, cell: Cell) => void; - private cellListListener: - (sender: CellList, - args: IObservableList.IChangedArgs) => void; - private _cellMetadataChanged = new Signal(this); - private cellWidgets = new Map(); - private metadataChangedHandlers = new Map< - CellWidget, - (metadata: IObservableJSON, - args: IObservableMap.IChangedArgs) => void>(); - private notebookDisposedListener: (panel: NotebookPanel) => void; - private _notebookPanel: NotebookPanel; - private validateIdsListener: - (context: DocumentRegistry.IContext, - args: DocumentRegistry.SaveState) => void; constructor(panel: NotebookPanel) { super(); - this.activeCell = panel.content.activeCell; - this.activeCellWidgetListener = this.getActiveCellWidgetListener(); + this._activeCell = panel.content.activeCell.model; this._notebookPanel = panel; this.addClass(CSS_NOTEBOOK_WIDGET); - this.addCellListener(panel); - this.addCellListListener(panel); - this.initCellWidgets(panel.content); - this.validateSchemaVersion(); - this.addValidateIdsListener(); - this.addNotebookDisposedListener(panel); - } - - private addCellListener(panel: NotebookPanel) { - this.cellListener = this.getActiveCellListener(); - panel.content.activeCellChanged.connect(this.cellListener); - } - - private addCellListListener(panel: NotebookPanel) { - this.cellListListener = - (sender: CellList, - args: IObservableList.IChangedArgs) => { - switch (args.type) { - case 'add': { - const cell = this.findCellInArray(args.newValues[0], - panel.content.widgets); - this.addCellWidget(cell, args.newIndex); - break; - } - case 'move': { - const cell = panel.content.widgets[args.newIndex]; - this.moveCellWidget(cell, args.newIndex); - break; - } - case 'remove': { - const cell = this.findDeadCell(this.cellWidgets.keys()); - if (cell != null) { - this.removeCellWidget(cell); - } - else { - console.warn('nbgrader: Unable to find newly deleted cell.'); - } - break; - } - case 'set': { - // Existing notebook cell changed. Update the corresponding widget. - const oldCell = this.findDeadCell(this.cellWidgets.keys()); - if (oldCell != null) { - const newCell = this.findCellInArray(args.newValues[0], - panel.content.widgets); - this.cellWidgets.get(oldCell).dispose(); - this.cellWidgets.delete(oldCell); - const cellWidget = this.addCellWidget(newCell, args.newIndex); - if (this.activeCell === newCell) { - cellWidget.setActive(this.activeCell === newCell); - this.scrollIntoViewNearest(cellWidget); - } - } - } - } - }; - panel.model.cells.changed.connect(this.cellListListener); + this._initCellWidgets(panel.content); + this._validateSchemaVersion(); + + this._notebookPanel.content.activeCellChanged.connect(this._onActiveCellChange, this); + this._notebookPanel.model.cells.changed.connect(this._onCellsListChange, this); + this._notebookPanel.disposed.connect(this._onNotebookDisposed, this); + this._notebookPanel.context.saveState.connect(this._onValidateIds, this); } - private addCellWidget(cell: Cell, index = undefined as number): CellWidget { - const cellWidget = new CellWidget(cell); - this.cellWidgets.set(cell, cellWidget); - if (index == null) { - this.addWidget(cellWidget); + dispose(): void { + if (this.isDisposed) { + return; } - else { - this.insertWidget(index, cellWidget); + if (this._cellWidgets != null) { + for (const widgets of this._cellWidgets) { + this._removeCellWidget(widgets[0]); + } } - cellWidget.click.connect(this.activeCellWidgetListener); - const metadataChangedHandler = this.getMetadataChangedHandler(cellWidget); - cell.model.metadata.changed.connect(metadataChangedHandler); - this.metadataChangedHandlers.set(cellWidget, metadataChangedHandler); - return cellWidget; - } + this.notebookPanel?.content?.activeCellChanged?.disconnect( + this._onActiveCellChange, this + ); + this.notebookPanel?.model?.cells?.changed?.disconnect( + this._onCellsListChange, this + ); + this.notebookPanel?.context?.saveState?.disconnect( + this._onValidateIds, this + ); + this.notebookPanel?.disposed?.disconnect(this._onNotebookDisposed, this); - private addNotebookDisposedListener(panel: NotebookPanel): void { - this.notebookDisposedListener = this.getNotebookDisposedListener(); - panel.disposed.connect(this.notebookDisposedListener); - } - - private addValidateIdsListener(): void { - this.validateIdsListener = - (context: DocumentRegistry.IContext, - args: DocumentRegistry.SaveState) => { - if (args != 'started') { - return; - } - this.validateIds(); - }; - this.notebookPanel.context.saveState.connect(this.validateIdsListener); + this.notebookPanel?.dispose(); + this._activeCell = null; + this._cellMetadataChanged = null; + this._cellWidgets = null; + this._metadataChangedHandlers = null; + this._notebookPanel = null; + super.dispose(); } /** @@ -767,100 +669,120 @@ class NotebookWidget extends Panel { return this._cellMetadataChanged; } - dispose(): void { - if (this.isDisposed) { - return; - } - if (this.cellWidgets != null) { - for (const widgets of this.cellWidgets) { - this.removeCellWidget(widgets[0]); + /** + * The notebook panel associated with this widget. + */ + get notebookPanel(): NotebookPanel { + return this._notebookPanel; + } + + private _onCellsListChange ( + sender: CellList, + args: IObservableList.IChangedArgs + ) { + switch (args.type) { + case 'add': { + this._addCellWidget(args.newValues[0], args.newIndex); + break; + } + case 'move': { + const cellModel = this._notebookPanel.model.cells.get(args.newIndex) + this._moveCellWidget(cellModel, args.newIndex); + break; + } + case 'remove': { + this._removeCellWidget(args.oldValues[0]); + break; + } + case 'set': { + // Existing notebook cell changed. Update the corresponding widget. + // const oldCell = this.findDeadCell(this.cellWidgets.keys()); + const oldCell = args.oldValues[0] + if (oldCell != null) { + const newCell = args.newValues[0]; + this._cellWidgets.get(oldCell).dispose(); + this._cellWidgets.delete(oldCell); + const cellWidget = this._addCellWidget(newCell, args.newIndex); + cellWidget.setActive(this._activeCell === newCell); + if (this._activeCell === newCell) { + this._scrollIntoViewNearest(cellWidget); + } + } } } - if (this.cellListener != null) { - this.notebookPanel?.content?.activeCellChanged?.disconnect( - this.cellListener); - } - if (this.cellListListener != null) { - this.notebookPanel?.model?.cells?.changed?.disconnect( - this.cellListListener); - } - if (this.validateIdsListener != null) { - this.notebookPanel?.context?.saveState?.disconnect( - this.validateIdsListener); - } - if (this.notebookDisposedListener != null) { - this.notebookPanel?.disposed?.disconnect(this.notebookDisposedListener); - } - this.notebookPanel?.dispose(); - this.activeCell = null; - this.activeCellWidgetListener = null; - this.cellListener = null; - this.cellListListener = null; - this._cellMetadataChanged = null; - this.cellWidgets = null; - this.metadataChangedHandlers = null; - this.notebookDisposedListener = null; - this._notebookPanel = null; - this.validateIdsListener = null; - super.dispose(); } - private findCellInArray(model: ICellModel, cells: readonly Cell[]): Cell { - return cells.find( - (value: Cell, index: number, obj: readonly Cell[]) => { - return value.model === model; - }); + private _addCellWidget(cell: ICellModel, index = undefined as number): CellWidget { + const cellWidget = new CellWidget(cell); + this._cellWidgets.set(cell, cellWidget); + if (index == null) { + this.addWidget(cellWidget); + } + else { + this.insertWidget(index, cellWidget); + } + cellWidget.click.connect(this._activeCellWidgetListener, this); + const metadataChangedHandler = this._getMetadataChangedHandler(cellWidget); + cell.metadata.changed.connect(metadataChangedHandler); + this._metadataChangedHandlers.set(cellWidget, metadataChangedHandler); + return cellWidget; } - private findDeadCell(cells: IterableIterator): Cell { - for (const cell of cells) { - if (cell.model == null) { - return cell; - } + private _onValidateIds( + context: DocumentRegistry.IContext, + args: DocumentRegistry.SaveState + ) { + if (args != 'started') { + return; } - return undefined; + this._validateIds(); } - private getActiveCellListener(): (notebook: Notebook, cell: Cell) => void { - return (notebook: Notebook, cell: Cell) => { - if (this.activeCell != null) { - const activeWidget = this.cellWidgets.get(this.activeCell); - if (activeWidget != null) { - activeWidget.setActive(false); - } + /** + * Called when the selected cell on notebook panel changes. + */ + private _onActiveCellChange(notebook: Notebook, cell: Cell) { + if (this._activeCell != null) { + const activeWidget = this._cellWidgets.get(this._activeCell); + if (activeWidget != null) { + activeWidget.setActive(false); } - if (cell != null) { - const activeWidget = this.cellWidgets.get(cell); - if (activeWidget != null) { - activeWidget.setActive(true); - this.scrollIntoViewNearest(activeWidget); - } + } + if (cell != null) { + const activeWidget = this._cellWidgets.get(cell.model); + if (activeWidget != null) { + activeWidget.setActive(true); + this._scrollIntoViewNearest(activeWidget); } - this.activeCell = cell; } + this._activeCell = cell.model; } - private getActiveCellWidgetListener(): (cellWidget: CellWidget) => void { - return (cellWidget: CellWidget) => { - const i = this.notebookPanel.content.widgets.indexOf(cellWidget.cell); - this.notebookPanel.content.activeCellIndex = i; - } + /** + * Called when the selected widget on this panel changes. + */ + private _activeCellWidgetListener(cellWidget: CellWidget) { + const cell: Cell = this.notebookPanel.content.widgets.find(widget => { + return widget.model.id === cellWidget.cellModel.id + }); + this.notebookPanel.content.activeCellIndex = this.notebookPanel.content.widgets.indexOf(cell); } - private getNotebookDisposedListener(): (panel: NotebookPanel) => void { - return (panel: NotebookPanel) => { - this.dispose(); - } + /** + * When the notebook panel is disposed. + */ + private _onNotebookDisposed(panel: NotebookPanel) { + this.dispose(); } - private initCellWidgets(notebook: Notebook): void { + private _initCellWidgets(notebook: Notebook): void { for (const cell of notebook.widgets) { - const cellWidget = this.addCellWidget(cell); + const cellWidget = this._addCellWidget(cell.model); cellWidget.setActive(notebook.activeCell === cell); } } - private getMetadataChangedHandler(cellWidget: CellWidget): + private _getMetadataChangedHandler(cellWidget: CellWidget): (metadata: IObservableJSON, args: IObservableMap.IChangedArgs) => void { return (metadata: IObservableJSON, @@ -869,38 +791,30 @@ class NotebookWidget extends Panel { } } - private moveCellWidget(cell: Cell, index: number): void { - const cellWidget = this.cellWidgets.get(cell); + private _moveCellWidget(cell: ICellModel, index: number): void { + const cellWidget = this._cellWidgets.get(cell); this.insertWidget(index, cellWidget); } - /** - * The notebook panel associated with this widget. - */ - get notebookPanel(): NotebookPanel { - return this._notebookPanel; - } - - private removeCellWidget(cell: Cell): void { - if (this.cellWidgets == null) { + private _removeCellWidget(cell: ICellModel): void { + if (this._cellWidgets == null) { return; } - const cellWidget = this.cellWidgets.get(cell); + const cellWidget = this._cellWidgets.get(cell); if (cellWidget == null) { return; } - if (this.activeCellWidgetListener != null) { - cellWidget.click?.disconnect(this.activeCellWidgetListener); - } - const handler = this.metadataChangedHandlers?.get(cellWidget); + + cellWidget.click?.disconnect(this._activeCellWidgetListener, this); + const handler = this._metadataChangedHandlers?.get(cellWidget); if (handler != null) { - cell.model?.metadata?.changed?.disconnect(handler); + cell.metadata?.changed?.disconnect(handler); } - this.cellWidgets.delete(cell); + this._cellWidgets.delete(cell); cellWidget.dispose(); } - private validateIds(): void { + private _validateIds(): void { const set = new Set(); const valid = /^[a-zA-Z0-9_\-]+$/; for (let cellModel of this.notebookPanel.model.cells) { @@ -911,11 +825,11 @@ class NotebookWidget extends Panel { const id = data.grade_id; if (!valid.test(id)) { - this.warnInvalidId(true, false, id); + this._warnInvalidId(true, false, id); return; } else if (set.has(id)) { - this.warnInvalidId(false, true, id); + this._warnInvalidId(false, true, id); return; } else { @@ -924,19 +838,19 @@ class NotebookWidget extends Panel { } } - private validateSchemaVersion(): void { + private _validateSchemaVersion(): void { for (let cellModel of this.notebookPanel.model.cells) { const data = CellModel.getNbgraderData(cellModel.metadata) let version = data == null ? null : data.schema_version; version = version === undefined ? 0 : version; if (version != null && version < NBGRADER_SCHEMA_VERSION) { - this.warnSchemaVersion(version); + this._warnSchemaVersion(version); return; } } } - private warnInvalidId(badFormat: boolean, duplicateId: boolean, id: string): + private _warnInvalidId(badFormat: boolean, duplicateId: boolean, id: string): void { const options = { buttons: [Dialog.okButton()], @@ -960,7 +874,7 @@ class NotebookWidget extends Panel { } } - private warnSchemaVersion(schemaVersion: number): void { + private _warnSchemaVersion(schemaVersion: number): void { const version = schemaVersion.toString(); const notebookPath = this.notebookPanel.sessionContext.path; const body = document.createElement('p'); @@ -981,7 +895,7 @@ class NotebookWidget extends Panel { showErrorDialog(options); } - private scrollIntoViewNearest(widget: CellWidget): void { + private _scrollIntoViewNearest(widget: CellWidget): void { const parentTop = this.node.scrollTop; const parentBottom = parentTop + this.node.clientHeight; const widgetTop = widget.node.offsetTop; @@ -998,30 +912,56 @@ class NotebookWidget extends Panel { } } } + + private _activeCell = null as ICellModel; + private _cellMetadataChanged = new Signal(this); + private _cellWidgets = new Map(); + private _metadataChangedHandlers = new Map< + CellWidget, + (metadata: IObservableJSON, + args: IObservableMap.IChangedArgs) => void>(); + private _notebookPanel: NotebookPanel; } /** * Contains a notebook's "Create Assignment" UI. */ class NotebookPanelWidget extends Panel { - private cellListListener: - (cellModels: CellList, - args: IObservableList.IChangedArgs) => void; - private cellModelListener: - (notebookWidget: NotebookWidget, cellWidget: CellWidget) => void; - private notebookHeaderWidget: NotebookHeaderWidget; - private notebookWidget: NotebookWidget; constructor(panel: NotebookPanel) { super(); this.addClass(CSS_NOTEBOOK_PANEL_WIDGET); - this.initLayout(panel); - this.setUpTotalPoints(); + this._initLayout(panel); + this._notebookHeaderWidget.totalPoints = this._calcTotalPoints(); + panel.model.cells.changed.connect( + this._onCellListChange, this + ); + this._notebookWidget.cellMetadataChanged.connect( + this._onCellMetadataChange, this + ); } - private calcTotalPoints(): number { + dispose(): void { + if (this.isDisposed) { + return; + } + this._notebookWidget.notebookPanel.model.cells.changed.disconnect( + this._onCellListChange, this + ); + this._notebookWidget.cellMetadataChanged.disconnect( + this._onCellMetadataChange, this + ); + this._notebookHeaderWidget?.dispose(); + this._notebookWidget?.dispose(); + this._notebookHeaderWidget = null; + this._notebookWidget = null; + super.dispose(); + } + + + private _calcTotalPoints(): number { let totalPoints = 0; - for (let cellModel of this.notebookWidget.notebookPanel.model.cells) { + for (let cellModel of this._notebookWidget.notebookPanel.model.cells) { const data = CellModel.getNbgraderData(cellModel.metadata); const points = (data == null || data.points == null || !CellModel.isGraded(data)) ? 0 : data.points; @@ -1030,49 +970,32 @@ class NotebookPanelWidget extends Panel { return totalPoints; } - dispose(): void { - if (this.isDisposed) { - return; - } - if (this.cellListListener != null) { - this.notebookWidget?.notebookPanel?.model?.cells?.changed?.disconnect( - this.cellListListener); - } - if (this.cellModelListener != null) { - this.notebookWidget?.cellMetadataChanged?.disconnect( - this.cellModelListener); + private _initLayout(panel: NotebookPanel): void { + this._notebookHeaderWidget = new NotebookHeaderWidget(); + this._notebookWidget = new NotebookWidget(panel); + this.addWidget(this._notebookHeaderWidget); + this.addWidget(this._notebookWidget); + } + + /** + * handle event on the cell list of the NotebookPanel. + */ + private _onCellListChange ( + cellModels: CellList, + args: IObservableList.IChangedArgs + ) { + if (args.type != 'move') { + this._notebookHeaderWidget.totalPoints = this._calcTotalPoints(); } - this.notebookHeaderWidget?.dispose(); - this.notebookWidget?.dispose(); - this.cellListListener = null; - this.cellModelListener = null; - this.notebookHeaderWidget = null; - this.notebookWidget = null; - super.dispose(); } - private initLayout(panel: NotebookPanel): void { - this.notebookHeaderWidget = new NotebookHeaderWidget(); - this.notebookWidget = new NotebookWidget(panel); - this.addWidget(this.notebookHeaderWidget); - this.addWidget(this.notebookWidget); - } - - private setUpTotalPoints(): void { - this.notebookHeaderWidget.totalPoints = this.calcTotalPoints(); - this.cellListListener = - (cellModels: CellList, - args: IObservableList.IChangedArgs) => { - if (args.type != 'move') { - this.notebookHeaderWidget.totalPoints = this.calcTotalPoints(); - } - }; - this.cellModelListener = - (notebookWidget: NotebookWidget, cellWidget: CellWidget) => { - this.notebookHeaderWidget.totalPoints = this.calcTotalPoints(); - }; - this.notebookWidget.notebookPanel.model.cells.changed.connect( - this.cellListListener); - this.notebookWidget.cellMetadataChanged.connect(this.cellModelListener); + /** + * handle changes on the Cell widget metadata; + */ + private _onCellMetadataChange(notebookWidget: NotebookWidget, cellWidget: CellWidget) { + this._notebookHeaderWidget.totalPoints = this._calcTotalPoints(); } + + private _notebookHeaderWidget: NotebookHeaderWidget; + private _notebookWidget: NotebookWidget; } From 3269a137f7cddc0c55092f62e14e791fd0d1b544 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 26 Oct 2022 09:31:29 +0200 Subject: [PATCH 07/27] Update the tests according to the updates of JupyterLab --- .../tests/test_assignment_list.spec.ts | 104 +++++++++--------- .../tests/test_course_list.spec.ts | 43 ++++---- .../tests/test_create_assignement.spec.ts | 18 +-- .../tests/test_formgrader.spec.ts | 63 ++++++----- .../tests/test_validate_assignment.spec.ts | 16 +-- 5 files changed, 126 insertions(+), 118 deletions(-) diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts index 867172857..5141d44f2 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts +++ b/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts @@ -1,5 +1,5 @@ import { test, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { expect, Locator, Page } from '@playwright/test'; +import { APIRequestContext, expect, Locator, Page } from '@playwright/test'; import { execute_command, create_env, @@ -29,9 +29,9 @@ const is_windows = os.platform().startsWith('win') /* * Create environment */ -test.beforeEach(async ({ baseURL, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - const contents = galata.newContentsHelper(baseURL); +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); await contents.createDirectory(tmpPath); @@ -44,14 +44,14 @@ test.beforeEach(async ({ baseURL, tmpPath }) => { /* * delete temp directories at the end of test */ -test.afterEach(async ({ baseURL, tmpPath }) => { +test.afterEach(async ({ request, tmpPath }) => { if (!is_windows){ fs.rmSync(exchange_dir, { recursive: true, force: true }); fs.rmSync(cache_dir, { recursive: true, force: true }); } - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - const contents = galata.newContentsHelper(baseURL); + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); @@ -62,9 +62,9 @@ test.afterEach(async ({ baseURL, tmpPath }) => { /* * Create a nbgrader file system and modify config */ -const add_courses = async (page:IJupyterLabPageFixture, baseURL:string, tmpPath:string) => { +const add_courses = async (page:IJupyterLabPageFixture, request:APIRequestContext, tmpPath:string) => { - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); // copy files from the user guide const source = path.resolve(__dirname, "..", "..", "..", "docs", "source", "user_guide", "source"); @@ -91,15 +91,15 @@ const add_courses = async (page:IJupyterLabPageFixture, baseURL:string, tmpPath: */ const open_assignment_list = async (page:IJupyterLabPageFixture) => { - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(1); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(1); await page.keyboard.press('Control+Shift+c'); await page.locator('#modal-command-palette li[data-command="nbgrader:open-assignment-list"]').click(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(2); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(2); - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(newTab_label).toHaveText("Assignments"); } @@ -156,21 +156,21 @@ test('Open assignment list tab from menu', async({ page }) => { - const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel.p-MenuBar-itemLabel:text("Nbgrader")'); + const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel:text("Nbgrader")'); const assignmentList_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-assignment-list"]'); - const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(tabs).toHaveCount(1); - // Check main menu exists + // Check main menu exists await expect(nbgrader_menu).toHaveCount(1); // Open assignment list from the menu - await nbgrader_menu.click(); + await nbgrader_menu.click(); await assignmentList_menu.click(); - await expect(tabs).toHaveCount(2); + await expect(tabs).toHaveCount(2); await expect(lastTab_label).toHaveText("Assignments"); // Close the last tab @@ -190,16 +190,16 @@ test('Open assignment list tab from menu', async({ */ test('Show assignment list', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // Wait for DOM of each status @@ -226,16 +226,16 @@ test('Show assignment list', async({ */ test('Multiple released assignments', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release two assignments @@ -262,16 +262,16 @@ test('Multiple released assignments', async({ */ test('Fetch assignments', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -296,7 +296,7 @@ test('Fetch assignments', async({ expect(rows.first().locator('.item_course').first()).toHaveText("xyz 200"); // check that the directory has been created - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); expect(contents.directoryExists('ps.01')); // expand assignment notebooks @@ -314,17 +314,17 @@ test('Fetch assignments', async({ */ test('Submit assignments', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); // create directories and config files, and open assignment_list tab await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -376,17 +376,17 @@ test('Submit assignments', async({ */ test('submit assignment missing notebook', async ({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); // create directories and config files, and open assignment_list tab const rootDir = await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -417,7 +417,7 @@ test('submit assignment missing notebook', async ({ expect(rows).toHaveCount(2); // rename the assignment notebook file - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); expect(await contents.fileExists(`${tmpPath}/ps.01/problem 1.ipynb`)); await contents.renameFile( `${tmpPath}/ps.01/problem 1.ipynb`, @@ -462,16 +462,16 @@ test('submit assignment missing notebook', async ({ */ test('Fetch a second assignment', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -503,7 +503,7 @@ test('Fetch a second assignment', async({ expect(rows.first().locator('.item_course').first()).toHaveText("abc101"); // check that the directory has been created - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); expect(contents.directoryExists('Problem Set 1')); // expand assignment notebooks @@ -522,17 +522,17 @@ test('Fetch a second assignment', async({ */ test('Submit another assignments', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); // create directories and config files, and open assignment_list tab await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -572,17 +572,17 @@ test('Submit another assignments', async({ */ test('Validate OK', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); // create directories and config files, and open assignment_list tab await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -622,17 +622,17 @@ test('Validate OK', async({ */ test('Validate failure', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); // create directories and config files, and open assignment_list tab await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_assignment_list(page); // release some assignments @@ -672,17 +672,17 @@ test('Validate failure', async({ */ test('Missing exchange directory', async({ page, - baseURL, + request, tmpPath }) => { test.skip(is_windows, 'This feature is not implemented for Windows'); - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); // create directories and config files await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); // delete exchange directory fs.rmSync(exchange_dir, { recursive: true, force: true }); diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts index 008d3ea0c..19ef56b08 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts +++ b/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts @@ -23,9 +23,9 @@ const is_windows = os.platform().startsWith('win') /* * Create environment */ -test.beforeEach(async ({ baseURL, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - const contents = galata.newContentsHelper(baseURL); +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); await contents.createDirectory(tmpPath); @@ -38,9 +38,9 @@ test.beforeEach(async ({ baseURL, tmpPath }) => { /* * delete temp directories at the end of test */ -test.afterEach(async ({ baseURL, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - const contents = galata.newContentsHelper(baseURL); +test.afterEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); if (!is_windows){ @@ -57,15 +57,15 @@ test.afterEach(async ({ baseURL, tmpPath }) => { */ const open_courses_list = async (page:IJupyterLabPageFixture) => { - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(1); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(1); await page.keyboard.press('Control+Shift+c'); await page.locator('#modal-command-palette li[data-command="nbgrader:open-course-list"]').click(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(2); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(2); - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(newTab_label).toHaveText("Courses"); await page.waitForSelector("#formgrader_list"); } @@ -103,10 +103,10 @@ test('Open course list tab from menu', async({ page }) => { - const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel.p-MenuBar-itemLabel:text("Nbgrader")'); + const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel:text("Nbgrader")'); const courseList_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-course-list"]'); - const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(tabs).toHaveCount(1); @@ -114,10 +114,10 @@ test('Open course list tab from menu', async({ await expect(nbgrader_menu).toHaveCount(1); // Open course list from the menu - await nbgrader_menu.click(); + await nbgrader_menu.click(); await courseList_menu.click(); - await expect(tabs).toHaveCount(2); + await expect(tabs).toHaveCount(2); await expect(lastTab_label).toHaveText("Courses"); // Close the last tab @@ -138,7 +138,6 @@ test('Open course list tab from menu', async({ */ test('local formgrader', async ({ page, - baseURL, tmpPath }) => { @@ -159,10 +158,10 @@ test('local formgrader', async ({ await expect(page.locator("#formgrader_list > .list_item a")).toHaveCount(1); await page.locator("#formgrader_list > .list_item a").click(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(3); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(3); - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(newTab_label).toHaveText("Formgrader"); } @@ -203,10 +202,10 @@ test('local formgrader', async ({ // await expect(page.locator("#formgrader_list > .list_item a")).toHaveCount(1); // await page.locator("#formgrader_list > .list_item a").click(); -// await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(3); +// await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(3); -// var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); -// var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); +// var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); +// var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); // await expect(newTab_label).toHaveText("Formgrader"); // } diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts index b955bcd98..e4e01aa58 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts +++ b/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts @@ -18,11 +18,11 @@ const nb_files = ["blank.ipynb", "task.ipynb", "old-schema.ipynb"]; /* * copy notebook files before each test */ -test.beforeEach(async ({ baseURL, tmpPath }) => { +test.beforeEach(async ({ request, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); nb_files.forEach(elem => { contents.uploadFile( path.resolve( @@ -37,11 +37,11 @@ test.beforeEach(async ({ baseURL, tmpPath }) => { /* * delete temp directory at the end of test */ -test.afterAll(async ({ baseURL, tmpPath }) => { +test.afterAll(async ({ request, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); @@ -55,9 +55,9 @@ test.afterAll(async ({ baseURL, tmpPath }) => { const open_notebook = async (page:IJupyterLabPageFixture, notebook:string) => { var filename = notebook + '.ipynb'; - var tab_count = await page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab").count(); + var tab_count = await page.locator("#jp-main-dock-panel .lm-TabBar-tab").count(); await page.locator(`#filebrowser .jp-DirListing-content .jp-DirListing-itemText span:text-is('${filename}')`).dblclick(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(tab_count + 1); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(tab_count + 1); await page.waitForSelector(".jp-Notebook-cell"); } @@ -86,7 +86,7 @@ const activate_toolbar = async (page:IJupyterLabPageFixture) => { } } - const widget_button = page.locator(".lm-TabBar-tab.p-TabBar-tab[title='nbgrader Create Assignment']"); + const widget_button = page.locator(".lm-TabBar-tab[title='nbgrader Create Assignment']"); const button_position = await widget_button.boundingBox(); if (button_position === null) throw new Error("Cannot get the position of the create assignment button."); diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts index badb4bb45..ae0138a2a 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts +++ b/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts @@ -1,5 +1,5 @@ import { test, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { expect, Frame } from '@playwright/test'; +import { APIRequestContext, expect, Frame } from '@playwright/test'; import { execute_command, @@ -30,11 +30,11 @@ var cache_dir: string; /* * Create environment */ -test.beforeEach(async ({ baseURL, tmpPath }) => { +test.beforeEach(async ({ request, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); await contents.createDirectory(tmpPath); @@ -47,15 +47,15 @@ test.beforeEach(async ({ baseURL, tmpPath }) => { /* * delete temp directories at the end of test */ -test.afterEach(async ({ baseURL, tmpPath }) => { +test.afterEach(async ({ request, tmpPath }) => { if (!is_windows){ fs.rmSync(exchange_dir, { recursive: true, force: true }); fs.rmSync(cache_dir, { recursive: true, force: true }); } - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); @@ -65,9 +65,9 @@ test.afterEach(async ({ baseURL, tmpPath }) => { /* * Create a nbgrader file system */ -const add_courses = async (page:IJupyterLabPageFixture, baseURL:string, tmpPath:string) => { +const add_courses = async (page:IJupyterLabPageFixture, request:APIRequestContext, tmpPath:string) => { - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); // copy files from the user guide const source_path = path.resolve(__dirname, "..", "..", "..", "docs", "source", "user_guide", "source"); @@ -115,15 +115,15 @@ const add_courses = async (page:IJupyterLabPageFixture, baseURL:string, tmpPath: */ const open_formgrader = async (page:IJupyterLabPageFixture) => { - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(1); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(1); await page.keyboard.press('Control+Shift+c'); await page.locator('#modal-command-palette li[data-command="nbgrader:open-formgrader"]').click(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(2); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(2); - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(newTab_label).toHaveText("Formgrader"); } @@ -197,10 +197,10 @@ test('Open formgrader tab from menu', async({ page }) => { - const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel.p-MenuBar-itemLabel:text("Nbgrader")'); + const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel:text("Nbgrader")'); const formgrader_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-formgrader"]'); - const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab"); - const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel.p-TabBar-tabLabel"); + const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); + const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); await expect(tabs).toHaveCount(1); @@ -208,10 +208,10 @@ test('Open formgrader tab from menu', async({ await expect(nbgrader_menu).toHaveCount(1); // Open course list from the menu - await nbgrader_menu.click(); + await nbgrader_menu.click(); await formgrader_menu.click(); - await expect(tabs).toHaveCount(2); + await expect(tabs).toHaveCount(2); await expect(lastTab_label).toHaveText("Formgrader"); // Close the last tab @@ -233,6 +233,7 @@ test('Open formgrader tab from menu', async({ test('Load manage assignments', async ({ page, baseURL, + request, tmpPath }) => { @@ -242,7 +243,7 @@ test('Load manage assignments', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe and check for breadcrumbs @@ -274,6 +275,7 @@ test('Load manage assignments', async ({ test('Load manage submissions', async ({ page, baseURL, + request, tmpPath }) => { @@ -283,7 +285,7 @@ test('Load manage submissions', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -322,6 +324,7 @@ test('Load manage submissions', async ({ test('Load gradebook1', async ({ page, baseURL, + request, tmpPath }) => { @@ -331,7 +334,7 @@ test('Load gradebook1', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -359,6 +362,7 @@ test('Load gradebook1', async ({ test('Load gradebook2', async ({ page, baseURL, + request, tmpPath }) => { @@ -368,7 +372,7 @@ test('Load gradebook2', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -404,6 +408,7 @@ test('Load gradebook2', async ({ test('Load gradebook3', async ({ page, baseURL, + request, tmpPath }) => { @@ -413,7 +418,7 @@ test('Load gradebook3', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -468,6 +473,7 @@ test('Load gradebook3', async ({ test('Gradebook3 show hide names', async ({ page, baseURL, + request, tmpPath }) => { @@ -477,7 +483,7 @@ test('Gradebook3 show hide names', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -565,6 +571,7 @@ test('Gradebook toggle names button', async ({ test('Load students', async ({ page, baseURL, + request, tmpPath }) => { @@ -574,7 +581,7 @@ test('Load students', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -604,6 +611,7 @@ test('Load students', async ({ test('Load students submissions', async ({ page, baseURL, + request, tmpPath }) => { @@ -613,7 +621,7 @@ test('Load students submissions', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe @@ -641,6 +649,7 @@ test('Load students submissions', async ({ test('Switch views', async ({ page, baseURL, + request, tmpPath }) => { @@ -650,7 +659,7 @@ test('Switch views', async ({ // create environment await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); + await add_courses(page, request, tmpPath); await open_formgrader(page); // get formgrader iframe diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_validate_assignment.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_validate_assignment.spec.ts index fe0cdb93b..cd697c73b 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_validate_assignment.spec.ts +++ b/nbgrader/tests/labextension_ui-tests/tests/test_validate_assignment.spec.ts @@ -32,11 +32,11 @@ const nb_files = [ /* * copy notebook files before each test */ -test.beforeEach(async ({ baseURL, tmpPath }) => { +test.beforeEach(async ({ request, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); nb_files.forEach(elem => { contents.uploadFile( path.resolve( @@ -51,11 +51,11 @@ test.beforeEach(async ({ baseURL, tmpPath }) => { /* * delete temp directory at the end of test */ -test.afterAll(async ({ baseURL, tmpPath }) => { +test.afterAll(async ({ request, tmpPath }) => { - if (baseURL === undefined) throw new Error("BaseURL is undefined."); + if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(baseURL); + const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); @@ -69,9 +69,9 @@ test.afterAll(async ({ baseURL, tmpPath }) => { const open_notebook = async (page:IJupyterLabPageFixture, notebook:string) => { var filename = notebook + '.ipynb'; - var tab_count = await page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab").count(); + var tab_count = await page.locator("#jp-main-dock-panel .lm-TabBar-tab").count(); await page.locator(`#filebrowser .jp-DirListing-content .jp-DirListing-itemText span:text-is('${filename}')`).dblclick(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab.p-TabBar-tab")).toHaveCount(tab_count + 1); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(tab_count + 1); await page.waitForSelector(".jp-Notebook-cell"); await page.waitForSelector("button.validate-button") From d419d43ce7d471636bd1fc6810f972695952b0d0 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 26 Oct 2022 18:48:40 +0200 Subject: [PATCH 08/27] Reintegrate the cellPrompt in create assignment cell widget --- .../create_assignment_extension.ts | 110 +++++++++++------- 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/src/create_assignment/create_assignment_extension.ts b/src/create_assignment/create_assignment_extension.ts index 4e94ac66e..c4488fdac 100644 --- a/src/create_assignment/create_assignment_extension.ts +++ b/src/create_assignment/create_assignment_extension.ts @@ -3,20 +3,14 @@ import { Dialog, Styling } from '@jupyterlab/apputils'; - import { Cell, ICellModel } from '@jupyterlab/cells'; - -// import { -// IChangedArgs -// } from '@jupyterlab/coreutils'; - +import { IChangedArgs } from '@jupyterlab/coreutils'; import { DocumentRegistry } from '@jupyterlab/docregistry'; - import { INotebookModel, INotebookTracker, @@ -24,30 +18,26 @@ import { NotebookPanel } from '@jupyterlab/notebook'; import { CellList } from '@jupyterlab/notebook/lib/celllist'; - import { IObservableJSON, IObservableList, IObservableMap, } from '@jupyterlab/observables'; - import { ReadonlyPartialJSONValue } from '@lumino/coreutils'; - import { Message } from '@lumino/messaging'; - import { ISignal, Signal } from '@lumino/signaling'; - import { Panel, Widget } from '@lumino/widgets'; + import { CellModel, CellType, @@ -236,8 +226,9 @@ export class CreateAssignmentWidget extends Panel { */ class CellWidget extends Panel { - constructor(cellModel: ICellModel) { + constructor(cellModel: ICellModel, notebookPanel?: NotebookPanel) { super(); + this._notebookPanel = notebookPanel; this._cellModel = cellModel; this._cellModel.metadata.changed.connect( this._onMetadataChange, this @@ -247,6 +238,10 @@ class CellWidget extends Panel { this._initMetadata(cellModel); this.addClass(CSS_CELL_WIDGET); this.node.addEventListener('click', this._onClick.bind(this)); + this.cellModel.stateChanged.connect(this._onStateChange, this); + + // Try to update the prompt (works only if cell widget has been created). + this._updatePrompt(); } /** @@ -275,6 +270,8 @@ class CellWidget extends Panel { this._onMetadataChange, this ); this.node.removeEventListener('click', this._onClick); + this.cellModel.stateChanged.disconnect(this._onStateChange, this); + if (this._taskInput != null) { this._taskInput.onchange = null; } @@ -298,24 +295,46 @@ class CellWidget extends Panel { /** * Sets this cell as active/focused. */ - setActive(active: boolean): void { + setActive(active: boolean): void { if (active) { this.addClass(CSS_MOD_ACTIVE); - } - else { + + // This _updatePrompt() call is a hack to create a prompt when a new cell is + // added in cellList. Indeed the listener catches that a new cell model is added + // to cellList, but not that the cell widget is created in the NotebookPanel. + // The prompt is a copy of the one from the cell widget but there is no listener + // on its creation. When a new cell is created, it is activated, so we use here + // this activation to create the prompt. + this._updatePrompt(); + } else { this.removeClass(CSS_MOD_ACTIVE); } } - // private getCellStateChangedListener( - // srcPrompt: HTMLElement, destPrompt: HTMLElement): - // (model: ICellModel, changedArgs: IChangedArgs) => void { - // return (model: ICellModel, changedArgs: IChangedArgs) => { - // if (changedArgs.name == 'executionCount') { - // destPrompt.innerText = srcPrompt.innerText; - // } - // } - // } + /** + * Copy the prompt of the cell widget of the notebook. + */ + private _updatePrompt() { + this._headerElement.removeChild(this._promptNode); + const cell: Cell = this._notebookPanel.content.widgets.find(widget => { + return widget.model.id === this.cellModel.id + }); + if (cell && cell.promptNode){ + this._promptNode = cell.promptNode.cloneNode(true) as HTMLElement; + } else { + this._promptNode = document.createElement('div'); + } + this._headerElement.insertBefore(this._promptNode, this._headerElement.firstChild); + } + + private _onStateChange( + model: ICellModel, + changedArgs: IChangedArgs + ) { + if (changedArgs.name == 'executionCount') { + this._updatePrompt(); + } + } private _onMetadataChange ( metadata: IObservableJSON, @@ -383,6 +402,7 @@ class CellWidget extends Panel { } bodyElement.appendChild(fragment); this.node.appendChild(bodyElement); + this._headerElement = headerElement; this._lock = headerElement.getElementsByTagName('a')[0]; this._gradeId = idElement; this._points = pointsElement; @@ -403,12 +423,8 @@ class CellWidget extends Panel { private _newHeaderElement(): HTMLDivElement { const element = document.createElement('div'); element.className = CSS_CELL_HEADER; - // if (this.cell && this.cell.promptNode) { - // const promptNode = this.cell.promptNode.cloneNode(true) as HTMLElement; - // element.appendChild(promptNode); - // this.cell.stateChanged.connect(this.getCellStateChangedListener( - // this.cell.promptNode, promptNode)); - // } + this._promptNode = document.createElement('div'); + element.appendChild(this._promptNode); const lockElement = document.createElement('a'); lockElement.className = CSS_LOCK_BUTTON; const listElement = document.createElement('li'); @@ -552,6 +568,9 @@ class CellWidget extends Panel { } private _cellModel: ICellModel; + private _notebookPanel: NotebookPanel | null; + private _promptNode: HTMLElement; + private _headerElement: HTMLDivElement; private _click = new Signal(this); private _lock: HTMLAnchorElement; private _gradeId: HTMLDivElement; @@ -621,7 +640,7 @@ class NotebookWidget extends Panel { constructor(panel: NotebookPanel) { super(); - this._activeCell = panel.content.activeCell.model; + this._activeCellModel = panel.content.activeCell.model; this._notebookPanel = panel; this.addClass(CSS_NOTEBOOK_WIDGET); this._initCellWidgets(panel.content); @@ -654,7 +673,7 @@ class NotebookWidget extends Panel { this.notebookPanel?.disposed?.disconnect(this._onNotebookDisposed, this); this.notebookPanel?.dispose(); - this._activeCell = null; + this._activeCellModel = null; this._cellMetadataChanged = null; this._cellWidgets = null; this._metadataChangedHandlers = null; @@ -682,7 +701,7 @@ class NotebookWidget extends Panel { ) { switch (args.type) { case 'add': { - this._addCellWidget(args.newValues[0], args.newIndex); + this._addCellWidget(args.newValues[0], args.newIndex); break; } case 'move': { @@ -703,8 +722,8 @@ class NotebookWidget extends Panel { this._cellWidgets.get(oldCell).dispose(); this._cellWidgets.delete(oldCell); const cellWidget = this._addCellWidget(newCell, args.newIndex); - cellWidget.setActive(this._activeCell === newCell); - if (this._activeCell === newCell) { + cellWidget.setActive(this._activeCellModel === newCell); + if (this._activeCellModel === newCell) { this._scrollIntoViewNearest(cellWidget); } } @@ -712,9 +731,9 @@ class NotebookWidget extends Panel { } } - private _addCellWidget(cell: ICellModel, index = undefined as number): CellWidget { - const cellWidget = new CellWidget(cell); - this._cellWidgets.set(cell, cellWidget); + private _addCellWidget(cellModel: ICellModel, index = undefined as number): CellWidget { + const cellWidget = new CellWidget(cellModel, this._notebookPanel); + this._cellWidgets.set(cellModel, cellWidget); if (index == null) { this.addWidget(cellWidget); } @@ -723,7 +742,7 @@ class NotebookWidget extends Panel { } cellWidget.click.connect(this._activeCellWidgetListener, this); const metadataChangedHandler = this._getMetadataChangedHandler(cellWidget); - cell.metadata.changed.connect(metadataChangedHandler); + cellModel.metadata.changed.connect(metadataChangedHandler); this._metadataChangedHandlers.set(cellWidget, metadataChangedHandler); return cellWidget; } @@ -741,21 +760,22 @@ class NotebookWidget extends Panel { /** * Called when the selected cell on notebook panel changes. */ - private _onActiveCellChange(notebook: Notebook, cell: Cell) { - if (this._activeCell != null) { - const activeWidget = this._cellWidgets.get(this._activeCell); + private async _onActiveCellChange(notebook: Notebook, cell: Cell) { + if (this._activeCellModel != null) { + const activeWidget = this._cellWidgets.get(this._activeCellModel); if (activeWidget != null) { activeWidget.setActive(false); } } if (cell != null) { + await cell.ready; const activeWidget = this._cellWidgets.get(cell.model); if (activeWidget != null) { activeWidget.setActive(true); this._scrollIntoViewNearest(activeWidget); } } - this._activeCell = cell.model; + this._activeCellModel = cell.model; } /** @@ -913,7 +933,7 @@ class NotebookWidget extends Panel { } } - private _activeCell = null as ICellModel; + private _activeCellModel = null as ICellModel; private _cellMetadataChanged = new Signal(this); private _cellWidgets = new Map(); private _metadataChangedHandlers = new Map< From cd94e84c262d4ced99e136913247fc7eccc714b4 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Fri, 28 Oct 2022 15:38:03 +0200 Subject: [PATCH 09/27] Activate by default the new created tab in Notebook (assignment list, course list and formgrader) --- src/assignment_list/index.ts | 5 ++++- src/course_list/index.ts | 5 ++++- src/formgrader/index.ts | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/assignment_list/index.ts b/src/assignment_list/index.ts index 5fb879cf8..65ce26e30 100644 --- a/src/assignment_list/index.ts +++ b/src/assignment_list/index.ts @@ -210,7 +210,10 @@ export const assignment_list_extension: JupyterFrontEndPlugin = { // Attach the widget to the main area if it's not there if(!widget.isAttached){ - if (notebookTree) notebookTree.addWidget(widget); + if (notebookTree){ + notebookTree.addWidget(widget); + notebookTree.currentWidget = widget; + } else app.shell.add(widget, 'main'); } diff --git a/src/course_list/index.ts b/src/course_list/index.ts index beb8b7242..9b47b50ba 100644 --- a/src/course_list/index.ts +++ b/src/course_list/index.ts @@ -139,7 +139,10 @@ export const course_list_extension: JupyterFrontEndPlugin = { // Attach the widget to the main area if it's not there if(!widget.isAttached){ - if (notebookTree) notebookTree.addWidget(widget); + if (notebookTree){ + notebookTree.addWidget(widget); + notebookTree.currentWidget = widget; + } else app.shell.add(widget, 'main'); } diff --git a/src/formgrader/index.ts b/src/formgrader/index.ts index 9823ec73c..80ca3a1ed 100644 --- a/src/formgrader/index.ts +++ b/src/formgrader/index.ts @@ -98,7 +98,10 @@ export const formgrader_extension: JupyterFrontEndPlugin = { // Attach the widget to the main area if it's not there if(!widget.isAttached){ - if (notebookTree) notebookTree.addWidget(widget); + if (notebookTree){ + notebookTree.addWidget(widget); + notebookTree.currentWidget = widget; + } else app.shell.add(widget, 'main'); } From 16d7249e238d648145de5c0fe59a8f64561744cc Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Tue, 15 Nov 2022 20:15:20 +0100 Subject: [PATCH 10/27] add test for extensions in notebook --- .../labextension_ui-tests/run_jupyter_lab.py | 24 - .../tests/test_assignment_list.spec.ts | 713 --------------- .../tests/test_course_list.spec.ts | 212 ----- .../tests/test_create_assignement.spec.ts | 694 -------------- .../tests/test_formgrader.spec.ts | 684 -------------- .../tests/test_validate_assignment.spec.ts | 224 ----- .../tests/ui-tests/assignment_list.spec.ts | 818 +++++++++++++++++ nbgrader/tests/ui-tests/course_list.spec.ts | 258 ++++++ .../tests/ui-tests/create_assignement.spec.ts | 808 ++++++++++++++++ .../files/blank.ipynb | 0 .../files/data.txt | 0 .../files/empty.ipynb | 0 .../files/nbgrader_config.py | 0 .../files/old-schema.ipynb | 0 .../files/open_relative_file.ipynb | 0 .../submitted-answer-cell-type-changed.ipynb | 0 .../files/submitted-changed.ipynb | 0 .../files/submitted-grade-cell-changed.ipynb | 0 .../submitted-grade-cell-type-changed.ipynb | 0 .../files/submitted-locked-cell-changed.ipynb | 0 .../files/submitted-unchanged.ipynb | 0 .../files/task.ipynb | 0 nbgrader/tests/ui-tests/formgrader.spec.ts | 863 ++++++++++++++++++ .../utils/jupyter_server_config.py} | 1 - .../utils/jupyter_server_config_notebook.py | 18 + .../tests/ui-tests/utils/notebook_fixtures.ts | 10 + .../tests/ui-tests/utils/run_jupyter_lab.py | 27 + .../ui-tests/utils/run_jupyter_notebook.py | 27 + .../tests => ui-tests/utils}/test_utils.ts | 45 +- .../ui-tests/validate_assignment.spec.ts | 263 ++++++ package.json | 4 +- playwright.config.ts | 8 +- playwright.notebook.config.ts | 34 + src/create_assignment/index.ts | 2 +- tasks.py | 62 +- 35 files changed, 3186 insertions(+), 2613 deletions(-) delete mode 100644 nbgrader/tests/labextension_ui-tests/run_jupyter_lab.py delete mode 100644 nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts delete mode 100644 nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts delete mode 100644 nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts delete mode 100644 nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts delete mode 100644 nbgrader/tests/labextension_ui-tests/tests/test_validate_assignment.spec.ts create mode 100644 nbgrader/tests/ui-tests/assignment_list.spec.ts create mode 100644 nbgrader/tests/ui-tests/course_list.spec.ts create mode 100644 nbgrader/tests/ui-tests/create_assignement.spec.ts rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/blank.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/data.txt (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/empty.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/nbgrader_config.py (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/old-schema.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/open_relative_file.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/submitted-answer-cell-type-changed.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/submitted-changed.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/submitted-grade-cell-changed.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/submitted-grade-cell-type-changed.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/submitted-locked-cell-changed.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/submitted-unchanged.ipynb (100%) rename nbgrader/tests/{labextension_ui-tests => ui-tests}/files/task.ipynb (100%) create mode 100644 nbgrader/tests/ui-tests/formgrader.spec.ts rename nbgrader/tests/{labextension_ui-tests/jupyter_server_test_config.py => ui-tests/utils/jupyter_server_config.py} (94%) create mode 100644 nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py create mode 100644 nbgrader/tests/ui-tests/utils/notebook_fixtures.ts create mode 100644 nbgrader/tests/ui-tests/utils/run_jupyter_lab.py create mode 100644 nbgrader/tests/ui-tests/utils/run_jupyter_notebook.py rename nbgrader/tests/{labextension_ui-tests/tests => ui-tests/utils}/test_utils.ts (58%) create mode 100644 nbgrader/tests/ui-tests/validate_assignment.spec.ts create mode 100644 playwright.notebook.config.ts diff --git a/nbgrader/tests/labextension_ui-tests/run_jupyter_lab.py b/nbgrader/tests/labextension_ui-tests/run_jupyter_lab.py deleted file mode 100644 index f64198a00..000000000 --- a/nbgrader/tests/labextension_ui-tests/run_jupyter_lab.py +++ /dev/null @@ -1,24 +0,0 @@ -import sys -import os -from os.path import join -import shutil -import subprocess - -from tempfile import mkdtemp - -root_dir = mkdtemp(prefix="galata-test-") -env = os.environ.copy() - -shutil.copyfile("./nbgrader/tests/labextension_ui-tests/jupyter_server_test_config.py", - join(root_dir, "jupyter_server_test_config.py")) - -shutil.copyfile("./nbgrader/tests/labextension_ui-tests/files/nbgrader_config.py", - join(root_dir, "nbgrader_config.py")) - -subprocess.check_call([sys.executable, "-m", "jupyter", "server", "extension", "enable", "--user", "--py", "nbgrader"], env=env) -subprocess.check_call([sys.executable, "-m", "jupyter", "labextension", "develop", "--overwrite", "."]) - -os.chdir(root_dir) - -command = ["jupyter", "lab", "--config", "./jupyter_server_test_config.py"] -subprocess.run(command) diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts deleted file mode 100644 index 5141d44f2..000000000 --- a/nbgrader/tests/labextension_ui-tests/tests/test_assignment_list.spec.ts +++ /dev/null @@ -1,713 +0,0 @@ -import { test, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { APIRequestContext, expect, Locator, Page } from '@playwright/test'; -import { - execute_command, - create_env, - wait_for_error_modal, - close_error_modal, - wait_for_success_modal, - close_success_modal} from './test_utils'; - -import * as path from 'path'; -import * as os from 'os'; -import * as fs from 'fs'; - -test.use({ - tmpPath: 'nbgrader-assignment-list-test', - mockSettings: { - '@jupyterlab/apputils-extension:notification': { - fetchNews: 'false' - } - } -}); - -var exchange_dir:string; -var cache_dir: string; - -const is_windows = os.platform().startsWith('win') - -/* - * Create environment - */ -test.beforeEach(async ({ request, tmpPath }) => { - if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(request); - - await contents.createDirectory(tmpPath); - - if (!is_windows){ - exchange_dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nbgrader_exchange_test_')); - cache_dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nbgrader_cache_test_')); - } -}); - -/* - * delete temp directories at the end of test - */ -test.afterEach(async ({ request, tmpPath }) => { - if (!is_windows){ - fs.rmSync(exchange_dir, { recursive: true, force: true }); - fs.rmSync(cache_dir, { recursive: true, force: true }); - } - - if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(request); - await contents.deleteDirectory(tmpPath); - - if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); - contents.uploadFile(path.resolve(__dirname, "../files/nbgrader_config.py"), "nbgrader_config.py"); -}); - - -/* - * Create a nbgrader file system and modify config - */ -const add_courses = async (page:IJupyterLabPageFixture, request:APIRequestContext, tmpPath:string) => { - - const contents = galata.newContentsHelper(request); - - // copy files from the user guide - const source = path.resolve(__dirname, "..", "..", "..", "docs", "source", "user_guide", "source"); - await contents.uploadDirectory(source, `${tmpPath}/source`); - await contents.renameDirectory(`${tmpPath}/source/ps1`, `${tmpPath}/source/Problem Set 1`); - await contents.renameFile(`${tmpPath}/source/Problem Set 1/problem1.ipynb`, `${tmpPath}/source/Problem Set 1/Problem 1.ipynb`) - await contents.renameFile(`${tmpPath}/source/Problem Set 1/problem2.ipynb`, `${tmpPath}/source/Problem Set 1/Problem 2.ipynb`) - await contents.createDirectory(`${tmpPath}/source/ps.01`); - await contents.uploadFile( - path.resolve(__dirname, '..', 'files', 'empty.ipynb'), - `${tmpPath}/source/ps.01/problem 1.ipynb` - ) - - const jupyter_config_content = await page.locator('#jupyter-config-data').textContent(); - if (jupyter_config_content === null) throw new Error("Cannot get the server root directory."); - const rootDir = JSON.parse(jupyter_config_content)['serverRoot']; - - // Necessary to generate and release assignments - fs.copyFileSync(path.resolve(rootDir, "nbgrader_config.py"), path.resolve(rootDir, tmpPath, "nbgrader_config.py")); -} - -/* - * Open the assignment list tab from palette - */ -const open_assignment_list = async (page:IJupyterLabPageFixture) => { - - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(1); - - await page.keyboard.press('Control+Shift+c'); - await page.locator('#modal-command-palette li[data-command="nbgrader:open-assignment-list"]').click(); - - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(2); - - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - await expect(newTab_label).toHaveText("Assignments"); - -} - -/* - * Ensure that list of assignment has been loaded for a specific name ("released", "fetched", "submitted") - */ -const wait_for_list = async(page:IJupyterLabPageFixture, name:string, nb_rows:number): Promise => { - await expect(page.locator(`#${name}_assignments_list_loading`)).not.toBeVisible(); - await expect(page.locator(`#${name}_assignments_list_placeholder`)).not.toBeVisible(); - await expect(page.locator(`#${name}_assignments_list_error`)).not.toBeVisible(); - - const rows = page.locator(`#${name}_assignments_list > .list_item`) - await expect(rows).toHaveCount(nb_rows); - return rows; -} - -/* - * Select a course in dropdown list - */ -const select_course = async(page:IJupyterLabPageFixture, course:string) => { - await page.locator('#course_list_dropdown').click(); - await page.locator(`#course_list > li :text("${course}")`).click(); - await expect(page.locator('#course_list_default')).toHaveText(course); -} - -/* - * Expand a fetched assignment - */ -const expand_fetched = async(page:IJupyterLabPageFixture, assignment:string, item_id:string): Promise => { - await page.locator(`#fetched_assignments_list a:text("${assignment}")`).click(); - await page.waitForSelector(`${item_id}.collapse.in`); - - const rows = page.locator(`${item_id} .list_item`); - for (var i=1; i < await rows.count(); i++){ - expect(rows.nth(i)).toBeVisible(); - } - return rows; -} - -/* - * Collapse an expended fetched assignment - */ -const collapse_fetched = async(page:IJupyterLabPageFixture, assignment:string, item_id:string) => { - await page.locator(`#fetched_assignments_list a:text("${assignment}")`).click(); - await expect(page.locator(`${item_id}.collapse`)).not.toHaveClass('in'); -} - - -/* - * Test opening assignment list tab from menu - */ -test('Open assignment list tab from menu', async({ - page - }) => { - - const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel:text("Nbgrader")'); - const assignmentList_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-assignment-list"]'); - const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - - await expect(tabs).toHaveCount(1); - - // Check main menu exists - await expect(nbgrader_menu).toHaveCount(1); - - // Open assignment list from the menu - await nbgrader_menu.click(); - await assignmentList_menu.click(); - - await expect(tabs).toHaveCount(2); - await expect(lastTab_label).toHaveText("Assignments"); - - // Close the last tab - await tabs.last().locator(".jp-icon-hover.lm-TabBar-tabCloseIcon").click(); - await expect(tabs).toHaveCount(1); - - // Open again - await nbgrader_menu.click(); - await assignmentList_menu.click(); - - await expect(tabs).toHaveCount(2); - await expect(lastTab_label).toHaveText("Assignments"); -}); - -/* - * Test showing assignment list - */ -test('Show assignment list', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // Wait for DOM of each status - await page.waitForSelector('#released_assignments_list'); - await page.waitForSelector('#fetched_assignments_list'); - await page.waitForSelector('#submitted_assignments_list'); - - // release an assignment - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - - // refresh assignments - await page.locator('#refresh_assignments_list').click(); - - // expect finding the released assignment - const rows = await wait_for_list(page, 'released', 1); - expect(rows.first().locator('.item_name')).toHaveText("Problem Set 1"); - expect(rows.first().locator('.item_course')).toHaveText("abc101"); - - }); - -/* - * Test multiple released assignments - */ -test('Multiple released assignments', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release two assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignments - await page.locator('#refresh_assignments_list').click(); - - // select a course - await select_course(page, 'xyz 200'); - - // expect finding the released assignment for selected course - const rows = await wait_for_list(page, 'released', 1); - expect(rows.first().locator('.item_name')).toHaveText("ps.01"); - expect(rows.first().locator('.item_course')).toHaveText("xyz 200"); - - }); - -/* - * Test fetch assignment - */ -test('Fetch assignments', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'xyz 200'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click() - - // check that there is only one fetched - rows = await wait_for_list(page, 'fetched', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("ps.01"); - expect(rows.first().locator('.item_course').first()).toHaveText("xyz 200"); - - // check that the directory has been created - const contents = galata.newContentsHelper(request); - expect(contents.directoryExists('ps.01')); - - // expand assignment notebooks - rows = await expand_fetched(page, "ps.01", "#nbgrader-xyz_200-ps01"); - await expect(rows).toHaveCount(2); - await expect(rows.last().locator('.item_name')).toHaveText('problem 1'); - - // collapse assignments notebooks - await collapse_fetched(page, "ps.01", "#nbgrader-xyz_200-ps01"); - - }); - -/* - * Test submit assignment - */ -test('Submit assignments', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - // create directories and config files, and open assignment_list tab - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'xyz 200'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click(); - - // check that there is only one fetched and submit - rows = await wait_for_list(page, 'fetched', 1); - await rows.first().locator('.item_status button:text("Submit")').click(); - - // check that there is only one submitted - rows = await wait_for_list(page, 'submitted', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("ps.01"); - expect(rows.first().locator('.item_course').first()).toHaveText("xyz 200"); - - // check again that there is only one submitted for that course - rows = page.locator('#nbgrader-xyz_200-ps01-submissions > .list_item'); - // the first row should be empty - expect(rows).toHaveCount(2); - - // submit a second time - rows = await wait_for_list(page, 'fetched', 1); - await rows.first().locator('.item_status button:text("Submit")').click(); - - // check there are two submitted (the first row is empty) - await expect(page.locator('#nbgrader-xyz_200-ps01-submissions > .list_item')).toHaveCount(3); - rows = page.locator('#nbgrader-xyz_200-ps01-submissions > .list_item'); - - const timestamp1 = rows.nth(1).locator(".item_name").textContent(); - const timestamp2 = rows.nth(2).locator(".item_name").textContent(); - expect(timestamp1 != timestamp2); - - }); - -/* - * Test submitting assignment without notebook - */ -test('submit assignment missing notebook', async ({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - // create directories and config files, and open assignment_list tab - const rootDir = await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'xyz 200'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click(); - - // check that there is only one fetched and submit - rows = await wait_for_list(page, 'fetched', 1); - await rows.first().locator('.item_status button:text("Submit")').click(); - - // check that there is only one submitted - rows = await wait_for_list(page, 'submitted', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("ps.01"); - expect(rows.first().locator('.item_course').first()).toHaveText("xyz 200"); - rows = page.locator('#nbgrader-xyz_200-ps01-submissions > .list_item'); - expect(rows).toHaveCount(2); - - // rename the assignment notebook file - const contents = galata.newContentsHelper(request); - expect(await contents.fileExists(`${tmpPath}/ps.01/problem 1.ipynb`)); - await contents.renameFile( - `${tmpPath}/ps.01/problem 1.ipynb`, - `${tmpPath}/ps.01/my problem 1.ipynb` - ); - - // submit again and check it has submitted - rows = await wait_for_list(page, 'fetched', 1); - await rows.first().locator('.item_status button:text("Submit")').click(); - rows = await wait_for_list(page, 'submitted', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("ps.01"); - expect(rows.first().locator('.item_course').first()).toHaveText("xyz 200"); - rows = page.locator('#nbgrader-xyz_200-ps01-submissions > .list_item'); - expect(rows).toHaveCount(3); - - const timestamp1 = rows.nth(1).locator(".item_name").textContent(); - const timestamp2 = rows.nth(2).locator(".item_name").textContent(); - expect(timestamp1 != timestamp2); - - // Set strict flag - fs.appendFileSync(path.resolve(rootDir, tmpPath, "nbgrader_config.py"), 'c.ExchangeSubmit.strict = True'); - - // submit again and check that nothing changes - rows = await wait_for_list(page, 'fetched', 1); - await rows.first().locator('.item_status button:text("Submit")').click(); - - // wait for error modal and close it - await wait_for_error_modal(page); - await close_error_modal(page); - - // check that nothing has change in submitted list - rows = await wait_for_list(page, 'submitted', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("ps.01"); - expect(rows.first().locator('.item_course').first()).toHaveText("xyz 200"); - rows = page.locator('#nbgrader-xyz_200-ps01-submissions > .list_item'); - expect(rows).toHaveCount(3); - -}); - -/* - * Test fetch a second assignment - */ -test('Fetch a second assignment', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'xyz 200'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click() - - // select the other course - await select_course(page, 'abc101'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click() - - // check that there is only one fetched - rows = await wait_for_list(page, 'fetched', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("Problem Set 1"); - expect(rows.first().locator('.item_course').first()).toHaveText("abc101"); - - // check that the directory has been created - const contents = galata.newContentsHelper(request); - expect(contents.directoryExists('Problem Set 1')); - - // expand assignment notebooks - rows = await expand_fetched(page, "Problem Set 1", "#nbgrader-abc101-Problem_Set_1"); - await expect(rows).toHaveCount(3); - await expect(rows.nth(1).locator('.item_name')).toHaveText('Problem 1'); - await expect(rows.last().locator('.item_name')).toHaveText('Problem 2'); - - // collapse assignments notebooks - await collapse_fetched(page, "Problem Set 1", "#nbgrader-abc101-Problem_Set_1"); - - }); - -/* - * Test submit another assignment - */ -test('Submit another assignments', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - // create directories and config files, and open assignment_list tab - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'abc101'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click(); - - // check that there is only one fetched and submit - rows = await wait_for_list(page, 'fetched', 1); - await rows.first().locator('.item_status button:text("Submit")').click(); - - // check that there is only one submitted - rows = await wait_for_list(page, 'submitted', 1); - expect(rows.first().locator('.item_name').first()).toHaveText("Problem Set 1"); - expect(rows.first().locator('.item_course').first()).toHaveText("abc101"); - - // check again that there is only one submitted for that course - rows = page.locator('#nbgrader-abc101-Problem_Set_1-submissions > .list_item'); - // the first row should be empty - expect(rows).toHaveCount(2); - - }); - -/* - * Test validate assignment - */ -test('Validate OK', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - // create directories and config files, and open assignment_list tab - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'xyz 200'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click(); - - // check that there is only one fetched and submit - rows = await wait_for_list(page, 'fetched', 1); - - // expand assignment notebooks - rows = await expand_fetched(page, "ps.01", "#nbgrader-xyz_200-ps01"); - await expect(rows).toHaveCount(2); - await expect(rows.last().locator('.item_name')).toHaveText('problem 1'); - - // Click on validate - await rows.last().locator('.item_status button:text("Validate")').click() - - await wait_for_success_modal(page); - await close_success_modal(page); - -}); - -/* - * Test validation failure - */ -test('Validate failure', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - // create directories and config files, and open assignment_list tab - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_assignment_list(page); - - // release some assignments - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - await execute_command("nbgrader generate_assignment 'ps.01' --force"); - await execute_command("nbgrader release_assignment 'ps.01' --course 'xyz 200' --force"); - - // refresh assignment list - await page.locator('#refresh_assignments_list').click(); - - // select one course - await select_course(page, 'abc101'); - - // check that there is only one released, and fetch it - var rows = await wait_for_list(page, 'released', 1); - await rows.first().locator('.item_status button').click(); - - // check that there is only one fetched and submit - rows = await wait_for_list(page, 'fetched', 1); - - // expand assignment notebooks - rows = await expand_fetched(page, "Problem Set 1", "#nbgrader-abc101-Problem_Set_1"); - await expect(rows).toHaveCount(3); - await expect(rows.nth(1).locator('.item_name')).toHaveText('Problem 1'); - await expect(rows.last().locator('.item_name')).toHaveText('Problem 2'); - - // Click on validate - await rows.last().locator('.item_status button:text("Validate")').click() - await wait_for_error_modal(page); - await close_error_modal(page); - -}); - -/* - * Test missing exchange directory - */ -test('Missing exchange directory', async({ - page, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - if (request === undefined) throw new Error("Request is undefined."); - - // create directories and config files - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - - // delete exchange directory - fs.rmSync(exchange_dir, { recursive: true, force: true }); - - // open assignment_list tab - await open_assignment_list(page); - - // Expecting error on lists and dropdown - await expect(page.locator(`#released_assignments_list_error`)).toBeVisible(); - await expect(page.locator(`#fetched_assignments_list_error`)).toBeVisible(); - await expect(page.locator(`#submitted_assignments_list_error`)).toBeVisible(); - - await expect(page.locator('#course_list_default')).toHaveText("Error fetching courses!"); - - // create exchange directory again - fs.mkdtempSync(exchange_dir); - - // release assignment - await execute_command("nbgrader generate_assignment 'Problem Set 1' --force"); - await execute_command("nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force"); - - // refresh assignment list and expect retrieving released assignment - await page.locator('#refresh_assignments_list').click(); - const rows = await wait_for_list(page, 'released', 1); - expect(rows.first().locator('.item_name')).toHaveText("Problem Set 1"); - expect(rows.first().locator('.item_course')).toHaveText("abc101"); - -}); diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts deleted file mode 100644 index 19ef56b08..000000000 --- a/nbgrader/tests/labextension_ui-tests/tests/test_course_list.spec.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { test, galata, IJupyterLabPageFixture} from '@jupyterlab/galata'; -import { expect } from '@playwright/test'; -import { create_env } from './test_utils'; - -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; - -test.use({ - tmpPath: 'nbgrader-course-list-test', - mockSettings: { - '@jupyterlab/apputils-extension:notification': { - fetchNews: 'false' - } - } -}); - -var exchange_dir:string; -var cache_dir: string; - -const is_windows = os.platform().startsWith('win') - -/* - * Create environment - */ -test.beforeEach(async ({ request, tmpPath }) => { - if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(request); - - await contents.createDirectory(tmpPath); - - if (!is_windows){ - exchange_dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nbgrader_exchange_test_')); - cache_dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nbgrader_cache_test_')); - } -}); - -/* - * delete temp directories at the end of test - */ -test.afterEach(async ({ request, tmpPath }) => { - if (request === undefined) throw new Error("Request is undefined."); - const contents = galata.newContentsHelper(request); - await contents.deleteDirectory(tmpPath); - - if (!is_windows){ - fs.rmSync(exchange_dir, { recursive: true, force: true }); - fs.rmSync(cache_dir, { recursive: true, force: true }); - } - - if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); - contents.uploadFile(path.resolve(__dirname, "../files/nbgrader_config.py"), "nbgrader_config.py"); -}); - -/* - * Open a courses list tab - */ -const open_courses_list = async (page:IJupyterLabPageFixture) => { - - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(1); - - await page.keyboard.press('Control+Shift+c'); - await page.locator('#modal-command-palette li[data-command="nbgrader:open-course-list"]').click(); - - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(2); - - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - await expect(newTab_label).toHaveText("Courses"); - await page.waitForSelector("#formgrader_list"); -} - -/* - * Modify config file - */ -const update_config = async (page:IJupyterLabPageFixture, rootDir:string) => { - - var text_to_append = ` -c.CourseDirectory.course_id = "course101" - -` - - fs.appendFileSync(path.resolve(rootDir, "nbgrader_config.py"), text_to_append); -} - -/* - * TODO: package the 4 extensions individually to be able to install/enable/disable each. -*/ -// test('No formgrader', async ({ -// page -// }) => { - -// test.skip(is_windows, 'This feature is not implemented for Windows'); -// await open_courses_list(page); - -// } -// ); - -/* - * Test opening course list tab from menu - */ -test('Open course list tab from menu', async({ - page - }) => { - - const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel:text("Nbgrader")'); - const courseList_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-course-list"]'); - const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - - await expect(tabs).toHaveCount(1); - - // Check main menu exists - await expect(nbgrader_menu).toHaveCount(1); - - // Open course list from the menu - await nbgrader_menu.click(); - await courseList_menu.click(); - - await expect(tabs).toHaveCount(2); - await expect(lastTab_label).toHaveText("Courses"); - - // Close the last tab - await tabs.last().locator(".jp-icon-hover.lm-TabBar-tabCloseIcon").click(); - await expect(tabs).toHaveCount(1); - - // Open again - await nbgrader_menu.click(); - await courseList_menu.click(); - - await expect(tabs).toHaveCount(2); - await expect(lastTab_label).toHaveText("Courses"); - -}); - -/* - * Test a local formgrader, expecting existing courses are local and opening formgrader works - */ -test('local formgrader', async ({ - page, - tmpPath - }) => { - - test.skip(is_windows, 'This feature is not implemented for Windows'); - - const rootDir = await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - - await update_config(page, rootDir); - - await open_courses_list(page); - await expect(page.locator("#formgrader_list_loading")).not.toBeVisible(); - await expect(page.locator("#formgrader_list_placeholder")).not.toBeVisible(); - await expect(page.locator("#formgrader_list_error")).not.toBeVisible(); - await expect(page.locator("#formgrader_list > .list_item")).toHaveCount(1); - - await expect(page.locator("#formgrader_list > .list_item")).toHaveText("course101local"); - - await expect(page.locator("#formgrader_list > .list_item a")).toHaveCount(1); - - await page.locator("#formgrader_list > .list_item a").click(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(3); - - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - await expect(newTab_label).toHaveText("Formgrader"); - - } -); - - -// /* -// * Test using JupyterHub authenticator without jupyterHub, expecting same results as previous tests -// */ -// test('No jupyterhub', async ({ -// page, -// baseURL, -// tmpPath, - -// }) => { - -// test.skip(is_windows, 'This feature is not implemented for Windows'); - -// const rootDir = await create_env(page, tmpPath, exchange_dir, cache_dir); - -// await update_config(page, rootDir); - -// var text_to_append = ` -// from nbgrader.auth import JupyterHubAuthPlugin -// c.Authenticator.plugin_class = JupyterHubAuthPlugin -// `; - -// fs.appendFileSync(path.resolve(rootDir, "nbgrader_config.py"), text_to_append); - -// await open_courses_list(page); -// await expect(page.locator("#formgrader_list_loading")).not.toBeVisible(); -// await expect(page.locator("#formgrader_list_placeholder")).not.toBeVisible(); -// await expect(page.locator("#formgrader_list_error")).not.toBeVisible(); -// await expect(page.locator("#formgrader_list > .list_item")).toHaveCount(1); - -// await expect(page.locator("#formgrader_list > .list_item")).toHaveText("course101local"); - -// await expect(page.locator("#formgrader_list > .list_item a")).toHaveCount(1); - -// await page.locator("#formgrader_list > .list_item a").click(); -// await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(3); - -// var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); -// var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); -// await expect(newTab_label).toHaveText("Formgrader"); - -// } -// ); diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts deleted file mode 100644 index e4e01aa58..000000000 --- a/nbgrader/tests/labextension_ui-tests/tests/test_create_assignement.spec.ts +++ /dev/null @@ -1,694 +0,0 @@ -import { test, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { expect } from '@playwright/test'; -import * as path from 'path'; - -import { wait_for_error_modal, close_error_modal } from "./test_utils"; - -test.use({ - tmpPath: 'nbgrader-create-assignments-test', - mockSettings: { - '@jupyterlab/apputils-extension:notification': { - fetchNews: 'false' - } - } -}); - -const nb_files = ["blank.ipynb", "task.ipynb", "old-schema.ipynb"]; - -/* - * copy notebook files before each test - */ -test.beforeEach(async ({ request, tmpPath }) => { - - if (request === undefined) throw new Error("Request is undefined."); - - const contents = galata.newContentsHelper(request); - nb_files.forEach(elem => { - contents.uploadFile( - path.resolve( - __dirname, - `../files/${elem}` - ), - `${tmpPath}/${elem}` - ); - }); -}); - -/* - * delete temp directory at the end of test - */ -test.afterAll(async ({ request, tmpPath }) => { - - if (request === undefined) throw new Error("Request is undefined."); - - const contents = galata.newContentsHelper(request); - await contents.deleteDirectory(tmpPath); - - if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); - contents.uploadFile(path.resolve(__dirname, "../files/nbgrader_config.py"), "nbgrader_config.py"); -}); - - -/* - * Open a notebook file - */ -const open_notebook = async (page:IJupyterLabPageFixture, notebook:string) => { - - var filename = notebook + '.ipynb'; - var tab_count = await page.locator("#jp-main-dock-panel .lm-TabBar-tab").count(); - await page.locator(`#filebrowser .jp-DirListing-content .jp-DirListing-itemText span:text-is('${filename}')`).dblclick(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(tab_count + 1); - await page.waitForSelector(".jp-Notebook-cell"); - -} - -/* - * Save the current notebook file - */ -const save_current_notebook = async (page:IJupyterLabPageFixture) => { - return await page.evaluate(async () => { - var nb = window.jupyterapp.shell.currentWidget; - await nb.context.save(); - }); - - // TODO : ensure metadata has been saved - // Read local file ? -} - -/* - * Activate assignment toolbar in jupyterlab - */ -const activate_toolbar = async (page:IJupyterLabPageFixture) => { - - if (await page.locator('.nbgrader-NotebookWidget').count() > 0){ - if (await page.locator('.nbgrader-NotebookWidget').isVisible()) { - return; - } - } - - const widget_button = page.locator(".lm-TabBar-tab[title='nbgrader Create Assignment']"); - const button_position = await widget_button.boundingBox(); - - if (button_position === null) throw new Error("Cannot get the position of the create assignment button."); - - await page.mouse.click( - button_position.x + button_position.width/2, - button_position.y + button_position.height/2 - ); - - await expect(page.locator('.nbgrader-NotebookWidget')).toBeVisible(); -} - -/* - * Get the nbgrader's metadata of a cell - */ -const get_cell_metadata = async (page:IJupyterLabPageFixture, cell_number:Number=0) => { - - return await page.evaluate((cell_num) => { - var nb = window.jupyterapp.shell.currentWidget; - return nb.model.cells.get(cell_num).metadata.get("nbgrader"); - }, cell_number); -} - -/* - * Set points to a notebook cell - */ -const set_points = async (page:IJupyterLabPageFixture, points:number=0, index:number=0) => { - await page.locator(".nbgrader-CellPoints input").nth(index).fill(points.toString()); - await page.keyboard.press("Enter"); -} - -/* - * Set id to a notebook cell - */ -const set_id = async (page:IJupyterLabPageFixture, id:string="foo", index:number=0) => { - await page.locator(".nbgrader-CellId input").nth(index).fill(id); - await page.keyboard.press("Enter"); -} - -/* - * Select type of assignment of a cell in nbgrader toolbar - */ -const select_in_toolbar = async(page:IJupyterLabPageFixture, text:string, index:number=0) => { - var select = page.locator('.nbgrader-NotebookWidget select').nth(index); - await select.selectOption(text); -} - -/* - * Get the total points of an assignment - */ -const get_total_points = async (page:IJupyterLabPageFixture, index:number=0) => { - return parseFloat(await page.locator('.nbgrader-TotalPointsInput').nth(0).inputValue()); -} - -/* - * Create a new cell in current notebook - */ -const create_new_cell = async (page:IJupyterLabPageFixture, after:number=0) => { - await page.locator('.jp-Cell .jp-InputArea-prompt').nth(after).click(); - await page.keyboard.press('b'); -} - -/* - * Delete a cell in current notebook - */ -const delete_cell = async (page:IJupyterLabPageFixture, index:number=0) => { - await page.locator('.jp-Cell .jp-InputArea-prompt').nth(index).click(); - await page.keyboard.press('d'); - await page.keyboard.press('d'); -} - -/* - * Test manipulating a manually graded cell - */ -test('manual cell', async ({ - page - }) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - expect(await get_cell_metadata(page)).toBeUndefined(); - - await select_in_toolbar(page, 'manual'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', true); - expect(metadata).toHaveProperty('grade', true); - expect(metadata).toHaveProperty('locked', false); - - await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); - - await set_points(page, 2); - expect(await get_cell_metadata(page)).toHaveProperty('points', 2); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty("grade_id", "foo"); - - await save_current_notebook(page); - - await select_in_toolbar(page, ''); - expect(await get_cell_metadata(page)).toBeUndefined(); - - await save_current_notebook(page); -}); - -/* - * Test manipulating a task cell - */ -test('task cell', async ({ - page -}) => { - - await open_notebook(page, "task"); - await activate_toolbar(page); - - expect(await get_cell_metadata(page)).toBeUndefined(); - - await select_in_toolbar(page, 'task'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', false); - expect(metadata).toHaveProperty('grade', false); - expect(metadata).toHaveProperty('locked', true); - - await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); - - await set_points(page, 2); - expect(await get_cell_metadata(page)).toHaveProperty('points', 2); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty("grade_id", "foo"); - - await save_current_notebook(page); - - await select_in_toolbar(page, ''); - expect(await get_cell_metadata(page)).toBeUndefined(); - - await save_current_notebook(page); -}) - -/* - * Test manipulating a solution graded cell - */ -test('solution cell', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - expect(await get_cell_metadata(page)).toBeUndefined(); - - await select_in_toolbar(page, 'solution'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', true); - expect(metadata).toHaveProperty('grade', false); - expect(metadata).toHaveProperty('locked', false); - - await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty("grade_id", "foo"); - - await save_current_notebook(page); - - await select_in_toolbar(page, ''); - expect(await get_cell_metadata(page)).toBeUndefined(); - - await save_current_notebook(page); -}) - -/* - * Test manipulating a test graded cell - */ -test('tests cell', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - expect(await get_cell_metadata(page)).toBeUndefined(); - - await select_in_toolbar(page, 'tests'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', false); - expect(metadata).toHaveProperty('grade', true); - expect(metadata).toHaveProperty('locked', true); - - await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); - - await set_points(page, 2); - expect(await get_cell_metadata(page)).toHaveProperty('points', 2); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty("grade_id", "foo"); - - await save_current_notebook(page); - - await select_in_toolbar(page, ''); - expect(await get_cell_metadata(page)).toBeUndefined(); - - await save_current_notebook(page); -}) - -/* - * Test converting cell's type - */ -test('tests to solution cell', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - expect(await get_cell_metadata(page)).toBeUndefined(); - - await select_in_toolbar(page, 'tests'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', false); - expect(metadata).toHaveProperty('grade', true); - expect(metadata).toHaveProperty('locked', true); - - await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); - - await set_points(page, 2); - expect(await get_cell_metadata(page)).toHaveProperty('points', 2); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty("grade_id", "foo"); - - await save_current_notebook(page); - - await select_in_toolbar(page, 'solution'); - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', true); - expect(metadata).toHaveProperty('grade', false); - expect(metadata).toHaveProperty('locked', false); - expect(metadata['points']).toBeUndefined(); - await save_current_notebook(page); - - await select_in_toolbar(page, ''); - expect(await get_cell_metadata(page)).toBeUndefined(); - await save_current_notebook(page); -}) - -/* - * Tests on locked cell - */ -test('locked cell', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - expect(await get_cell_metadata(page)).toBeUndefined(); - - await select_in_toolbar(page, 'readonly'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', false); - expect(metadata).toHaveProperty('grade', false); - expect(metadata).toHaveProperty('locked', true); - - await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); - await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty("grade_id", "foo"); - - await save_current_notebook(page); - - await select_in_toolbar(page, ''); - expect(await get_cell_metadata(page)).toBeUndefined(); - await save_current_notebook(page); -}) - -/* - * Test focus using TAB key - */ -test('tab key', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - // make the cell manually grading - await select_in_toolbar(page, 'manual'); - - // focus on cell type - await page.locator(".nbgrader-CellType select").focus(); - await expect(page.locator('.nbgrader-CellType select')).toBeFocused(); - - // press tab and focus on ID input - await page.keyboard.press("Tab"); - await expect(page.locator('.nbgrader-CellId input')).toBeFocused(); - - // press tab again and focus on points input - await page.keyboard.press("Tab"); - await expect(page.locator('.nbgrader-CellPoints input')).toBeFocused(); - -}) - -/* - * Test the total points of a notebook - */ -test('total points', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - // make sure the total points is zero - expect(await get_total_points(page)).toBe(0); - - // make it autograder tests and set the points to two - await select_in_toolbar(page, 'tests'); - await set_points(page, 2); - await set_id(page); - expect(await get_total_points(page)).toBe(2); - - // make it manually graded - await select_in_toolbar(page, 'manual'); - expect(await get_total_points(page)).toBe(2); - - // make it a solution make sure the total points is zero - await select_in_toolbar(page, 'solution'); - expect(await get_total_points(page)).toBe(0); - - // make it task - await select_in_toolbar(page, 'task'); - expect(await get_total_points(page)).toBe(0); - await set_points(page, 2); - expect(await get_total_points(page)).toBe(2); - - // create a new cell - await create_new_cell(page) - - // make it a test cell and check if total points is 3 - await select_in_toolbar(page, 'tests', 1); - await set_points(page, 1, 1) - await set_id(page, "bar", 1); - expect(await get_total_points(page)).toBe(3); - - // delete the first cell - await delete_cell(page); - expect(await get_total_points(page)).toBe(1); - - // delete the new cell - await delete_cell(page); - expect(await get_total_points(page)).toBe(0); - -}) - -/* - * Test the total points of a notebook using task cell - */ -test('task total points', async ({ - page -}) => { - - await open_notebook(page, "task"); - await activate_toolbar(page); - - // make sure the total points is zero - expect(await get_total_points(page)).toBe(0); - - // make cell autograded task and set the points to two - await select_in_toolbar(page, 'task'); - await set_points(page, 2); - await set_id(page); - expect(await get_total_points(page)).toBe(2); - - // make cell manually graded - await select_in_toolbar(page, 'manual'); - expect(await get_total_points(page)).toBe(2); - - // make cell a none graded and make sure the total points is zero - await select_in_toolbar(page, ''); - expect(await get_total_points(page)).toBe(0); - - // make cell a task again - await select_in_toolbar(page, 'task'); - expect(await get_total_points(page)).toBe(0); - await set_points(page, 2); - expect(await get_total_points(page)).toBe(2); - - // create a new cell - await create_new_cell(page) - - // make it a test cell and check if total points is 3 - await select_in_toolbar(page, 'tests', 1); - await set_points(page, 1, 1) - await set_id(page, "bar", 1); - expect(await get_total_points(page)).toBe(3); - - // delete the first cell - await delete_cell(page); - expect(await get_total_points(page)).toBe(1); - - // delete the new cell - await delete_cell(page); - expect(await get_total_points(page)).toBe(0); - -}) - -/* - * Tests on cell ids - */ -test('cell ids', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - // turn it into a solution cell with an id - await select_in_toolbar(page, 'solution'); - await set_id(page, ""); - - // wait for error on saving with empty id - await save_current_notebook(page); - await wait_for_error_modal(page); - await close_error_modal(page); - - // set correct id - await set_id(page); - - // create a new cell - await create_new_cell(page); - - // make it a test cell and set the label - await select_in_toolbar(page, 'tests', 1); - await set_id(page, "foo", 1); - - // wait for error on saving with empty id - await save_current_notebook(page); - await wait_for_error_modal(page); - await close_error_modal(page); - -}) - -/* - * Tests on task's cell ids - */ -test('task cell ids', async ({ - page -}) => { - - await open_notebook(page, "task"); - await activate_toolbar(page); - - // turn it into a task cell with an id - await select_in_toolbar(page, 'task'); - await set_id(page, ""); - - // wait for error on saving with empty id - await save_current_notebook(page); - await wait_for_error_modal(page); - await close_error_modal(page); - - // set correct id - await set_id(page); - - // create a new cell - await create_new_cell(page); - - // make it a test cell and set the label - await select_in_toolbar(page, 'task', 1); - await set_id(page, "foo", 1); - - // wait for error on saving with empty id - await save_current_notebook(page); - await wait_for_error_modal(page); - await close_error_modal(page); - -}) - -/* - * Test attributing negative points - */ -test('negative points', async ({ - page -}) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - // make sure the total points is zero - expect(await get_total_points(page)).toBe(0); - - // make it autograder tests and set the points to two - await select_in_toolbar(page, 'tests'); - await set_points(page, 2); - await set_id(page); - expect(await get_total_points(page)).toBe(2); - expect(await get_cell_metadata(page)).toHaveProperty("points", 2); - - // set the points to negative one - await set_points(page, -1); - expect(await get_total_points(page)).toBe(0); - expect(await get_cell_metadata(page)).toHaveProperty("points", 0); - -}) - -/* - * Test attributing negative points on task's cell - */ -test('task negative points', async ({ - page -}) => { - - await open_notebook(page, "task"); - await activate_toolbar(page); - - // make sure the total points is zero - expect(await get_total_points(page)).toBe(0); - - // make it autograder tests and set the points to two - await select_in_toolbar(page, 'task'); - await set_points(page, 2); - await set_id(page); - expect(await get_total_points(page)).toBe(2); - expect(await get_cell_metadata(page)).toHaveProperty("points", 2); - - // set the points to negative one - await set_points(page, -1); - expect(await get_total_points(page)).toBe(0); - expect(await get_cell_metadata(page)).toHaveProperty("points", 0); - -}) - -/* - * Test nbgrader schema version - */ -test('schema version', async ({ - page -}) => { - - await open_notebook(page, "old-schema"); - - // activate toolbar should show an error modal - await activate_toolbar(page); - await wait_for_error_modal(page); - await close_error_modal(page); - -}) - -/* - * Test an invalid cell type - */ -test('invalid nbgrader cell type', async ({ - page - }) => { - - await open_notebook(page, "blank"); - await activate_toolbar(page); - - await select_in_toolbar(page, 'solution'); - - // make the cell a solution cell - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', true); - expect(metadata).toHaveProperty('grade', false); - expect(metadata).toHaveProperty('locked', false); - - await expect(page.locator(".nbgrader-CellId")).toBeVisible(); - - expect((await get_cell_metadata(page))['grade_id']).toEqual(expect.stringMatching('^cell\-')); - await set_id(page); - expect(await get_cell_metadata(page)).toHaveProperty('grade_id', 'foo'); - - await save_current_notebook(page); - - // change the cell to markdown - await page.locator('.jp-Cell .jp-InputArea-prompt').first().click(); - await page.keyboard.press('m'); - - var metadata = await get_cell_metadata(page); - expect(metadata).toHaveProperty('solution', false); - expect(metadata).toHaveProperty('grade', false); - expect(metadata).toHaveProperty('locked', false); - expect(metadata).toHaveProperty('grade_id', "foo"); - -}); diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts b/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts deleted file mode 100644 index ae0138a2a..000000000 --- a/nbgrader/tests/labextension_ui-tests/tests/test_formgrader.spec.ts +++ /dev/null @@ -1,684 +0,0 @@ -import { test, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { APIRequestContext, expect, Frame } from '@playwright/test'; - -import { - execute_command, - create_env -} from './test_utils'; - -// import * as sqlite3 from 'sqlite3'; -import * as path from 'path'; -import * as os from 'os'; -import * as fs from 'fs'; - -const is_windows = os.platform().startsWith('win') - -test.use({ - tmpPath: 'nbgrader-formgrader-test', - mockSettings: { - '@jupyterlab/apputils-extension:notification': { - fetchNews: 'false' - } - } -}); - -// const db = new sqlite3.Database("gradebook.db"); - -var exchange_dir:string; -var cache_dir: string; - -/* - * Create environment - */ -test.beforeEach(async ({ request, tmpPath }) => { - - if (request === undefined) throw new Error("Request is undefined."); - - const contents = galata.newContentsHelper(request); - - await contents.createDirectory(tmpPath); - - if (!is_windows){ - exchange_dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nbgrader_exchange_test_')); - cache_dir = fs.mkdtempSync(path.join(os.tmpdir(), 'nbgrader_cache_test_')); - } -}); - -/* - * delete temp directories at the end of test - */ -test.afterEach(async ({ request, tmpPath }) => { - if (!is_windows){ - fs.rmSync(exchange_dir, { recursive: true, force: true }); - fs.rmSync(cache_dir, { recursive: true, force: true }); - } - - if (request === undefined) throw new Error("Request is undefined."); - - const contents = galata.newContentsHelper(request); - await contents.deleteDirectory(tmpPath); - - if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); - contents.uploadFile(path.resolve(__dirname, "../files/nbgrader_config.py"), "nbgrader_config.py"); -}); - -/* - * Create a nbgrader file system - */ -const add_courses = async (page:IJupyterLabPageFixture, request:APIRequestContext, tmpPath:string) => { - - const contents = galata.newContentsHelper(request); - - // copy files from the user guide - const source_path = path.resolve(__dirname, "..", "..", "..", "docs", "source", "user_guide", "source"); - const submitted_path = path.resolve(__dirname, "..", "..", "..", "docs", "source", "user_guide", "submitted"); - - await contents.uploadDirectory(source_path, `${tmpPath}/source`); - - const students = ["bitdiddle", "hacker"]; - for (var i=0; i<2; i++){ - await contents.uploadDirectory( - path.resolve(submitted_path, students[i]), - `${tmpPath}/submitted/${students[i]}` - ) - } - - // Rename the files and directory to have spaces in names - await contents.renameDirectory(`${tmpPath}/source/ps1`, `${tmpPath}/source/Problem Set 1`); - await contents.renameFile(`${tmpPath}/source/Problem Set 1/problem1.ipynb`, `${tmpPath}/source/Problem Set 1/Problem 1.ipynb`); - await contents.renameFile(`${tmpPath}/source/Problem Set 1/problem2.ipynb`, `${tmpPath}/source/Problem Set 1/Problem 2.ipynb`); - await contents.renameDirectory(`${tmpPath}/submitted/bitdiddle`, `${tmpPath}/submitted/Bitdiddle`); - await contents.renameDirectory(`${tmpPath}/submitted/Bitdiddle/ps1`, `${tmpPath}/submitted/Bitdiddle/Problem Set 1`); - await contents.renameFile(`${tmpPath}/submitted/Bitdiddle/Problem Set 1/problem1.ipynb`, `${tmpPath}/submitted/Bitdiddle/Problem Set 1/Problem 1.ipynb`); - await contents.renameFile(`${tmpPath}/submitted/Bitdiddle/Problem Set 1/problem2.ipynb`, `${tmpPath}/submitted/Bitdiddle/Problem Set 1/Problem 2.ipynb`); - await contents.renameDirectory(`${tmpPath}/submitted/hacker`, `${tmpPath}/submitted/Hacker`); - await contents.renameDirectory(`${tmpPath}/submitted/Hacker/ps1`, `${tmpPath}/submitted/Hacker/Problem Set 1`); - await contents.renameFile(`${tmpPath}/submitted/Hacker/Problem Set 1/problem1.ipynb`, `${tmpPath}/submitted/Hacker/Problem Set 1/Problem 1.ipynb`); - await contents.renameFile(`${tmpPath}/submitted/Hacker/Problem Set 1/problem2.ipynb`, `${tmpPath}/submitted/Hacker/Problem Set 1/Problem 2.ipynb`); - - const jupyter_config_content = await page.locator('#jupyter-config-data').textContent(); - if (jupyter_config_content === null) throw new Error("Cannot get the server root directory."); - const rootDir = JSON.parse(jupyter_config_content)['serverRoot']; - - fs.copyFileSync(path.resolve(rootDir, "nbgrader_config.py"), path.resolve(rootDir, tmpPath, "nbgrader_config.py")); - - // generate some assignments - await execute_command(`nbgrader generate_assignment 'Problem Set 1' --IncludeHeaderFooter.header=${path.resolve(rootDir, tmpPath, "source", "header.ipynb")}`); - - // autograde assignment - await execute_command("nbgrader autograde 'Problem Set 1'"); - -} - -/* - * Open the formgrader tab - */ -const open_formgrader = async (page:IJupyterLabPageFixture) => { - - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(1); - - await page.keyboard.press('Control+Shift+c'); - await page.locator('#modal-command-palette li[data-command="nbgrader:open-formgrader"]').click(); - - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(2); - - var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - await expect(newTab_label).toHaveText("Formgrader"); - -} - -/* - * Check jupyter lab file browser breadcrumbs - */ -const check_jl_breadcrumbs = async (page:IJupyterLabPageFixture, breadcrumbs:string) => { - await page.waitForSelector(`.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${breadcrumbs}"]`); -} - -/* - * Check formgrader breadcrumbs - */ -const check_formgrader_breadcrumbs = async (iframe:Frame, breadcrumbs:string[]) => { - - await expect(iframe.locator(".breadcrumb li")).toHaveCount(breadcrumbs.length); - - const elements = iframe.locator(".breadcrumb li"); - const array: string[] = []; - for (var i=0; i { - - await expect(iframe.locator(".breadcrumb li a:visible")).toHaveCount(breadcrumbs.length); - - const elements = iframe.locator(".breadcrumb li a:visible"); - const in_page_breadcrumbs: string[] = []; - for (var i=0; i { - await iframe.click(`a:text-is('${text}')`); -} - -// /* -// * Get comment box -// */ -// const get_comment_box = async (iframe:Frame, index:number) => { -// await expect(await iframe.locator('.comment').count()).toBeGreaterThanOrEqual(index); -// await expect poll(() => iframe.locator('.comment').count()).toBeGreaterThan(3); -// } - - -/* - * Test opening formgrader tab from menu - */ -test('Open formgrader tab from menu', async({ - page - }) => { - - const nbgrader_menu = page.locator('#jp-menu-panel div.lm-MenuBar-itemLabel:text("Nbgrader")'); - const formgrader_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-formgrader"]'); - const tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); - const lastTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); - - await expect(tabs).toHaveCount(1); - - // Check main menu exists - await expect(nbgrader_menu).toHaveCount(1); - - // Open course list from the menu - await nbgrader_menu.click(); - await formgrader_menu.click(); - - await expect(tabs).toHaveCount(2); - await expect(lastTab_label).toHaveText("Formgrader"); - - // Close the last tab - await tabs.last().locator(".jp-icon-hover.lm-TabBar-tabCloseIcon").click(); - await expect(tabs).toHaveCount(1); - - // Open again - await nbgrader_menu.click(); - await formgrader_menu.click(); - - await expect(tabs).toHaveCount(2); - await expect(lastTab_label).toHaveText("Formgrader"); - -}); - -/* - * Load manage assignments - */ -test('Load manage assignments', async ({ - page, - baseURL, - request, - tmpPath - }) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe and check for breadcrumbs - const iframe = page.mainFrame().childFrames()[0]; - - await check_formgrader_breadcrumbs(iframe, ["Assignments"]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader`)); - - await page.waitForSelector(`.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${tmpPath}"]`); - - // click on the "Problem Set 1" link and check if file browser has changed of directory - click_link(iframe, "Problem Set 1"); - await page.waitForSelector(`.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${tmpPath.concat("/source/Problem Set 1")}"]`); - - // click on preview link and check if file browser has changed of directory - iframe.locator("td.preview .glyphicon").click(); - await page.waitForSelector(`.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${tmpPath.concat("/release/Problem Set 1")}"]`); - - // click on the first number of submissions and check that iframe has change URL - await iframe.click("td.num-submissions a"); - await check_formgrader_breadcrumbs(iframe, ["Assignments", "Problem Set 1"]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/manage_submissions/Problem Set 1`)); - } -); - -/* - * Load manage submissions - */ -test('Load manage submissions', async ({ - page, - baseURL, - request, - tmpPath -}) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to manage_submissions - await iframe.goto(`${baseURL}/formgrader/manage_submissions/Problem Set 1`); - - // await iframe.click("td.num-submissions a"); - await check_formgrader_breadcrumbs(iframe, ["Assignments", "Problem Set 1"]); - - // clicking on breadcrumbs should go back to manage_assignments - await click_link(iframe, "Assignments"); - await check_formgrader_breadcrumbs(iframe, ["Assignments"]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/manage_assignments`)); - - // page.goBack(); // seems endless - await iframe.goto(`${baseURL}/formgrader/manage_submissions/Problem Set 1`); - await check_formgrader_breadcrumbs(iframe, ["Assignments", "Problem Set 1"]); - - // Check students links - await expect(iframe.locator("td.student-name")).toHaveCount(2); - for (var i=0; i { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to gradebook - await iframe.goto(`${baseURL}/formgrader/gradebook`); - - // await iframe.click("td.num-submissions a"); - await check_formgrader_breadcrumbs(iframe, ["Manual Grading"]); - - // click on assignment - await click_link(iframe, "Problem Set 1"); - await check_formgrader_breadcrumbs(iframe, ["Manual Grading", "Problem Set 1"]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/gradebook/Problem Set 1`)); - - // test that the task column is present - await expect(iframe.locator('th:text-is("Avg. Task Score")')).toHaveCount(1); - -}); - -/* - * Load gradebook2 - */ -test('Load gradebook2', async ({ - page, - baseURL, - request, - tmpPath -}) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to gradebook Problem Set 1 - await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); - await check_formgrader_breadcrumbs(iframe, ["Manual Grading", "Problem Set 1"]); - - // clicking on breadcrumbs should go back to manual grading - await iframe.click('ol.breadcrumb a:text-is("Manual Grading")'); - await check_formgrader_breadcrumbs(iframe, ["Manual Grading"]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/gradebook`)); - - // Send back iframe URL to gradebook Problem Set 1 - await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); - - // test problems links - await expect(iframe.locator("td.name")).toHaveCount(2); - for (var i=0; i { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to gradebook Problem Set 1 - await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); - - // for each problem - await expect(iframe.locator("td.name")).toHaveCount(2); - for (var i=0; i { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to gradebook Problem Set 1 - await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1/Problem 1`); - await check_formgrader_breadcrumbs(iframe, ["Manual Grading", "Problem Set 1", "Problem 1"]); - - const col2 = iframe.locator("td.name").first(); - const hidden = iframe.locator("td .glyphicon.name-hidden").first(); - const shown = iframe.locator("td .glyphicon.name-shown").first(); - - // check shown and hidden elements - await expect(col2).toHaveText(/Submission #[1-2]/, {useInnerText: true}); - await expect(hidden).toBeVisible(); - await expect(shown).toBeHidden(); - - // show name - await hidden.click(); - await expect(col2).toHaveText(/(H, Alyssa|B, Ben)/, {useInnerText: true}); - await expect(hidden).toBeHidden(); - await expect(shown).toBeVisible(); - - // hide name again - await shown.click(); - await expect(col2).toHaveText(/Submission #[1-2]/, {useInnerText: true}); - await expect(hidden).toBeVisible(); - await expect(shown).toBeHidden(); - -}); - -/* - Toggle name visibility button - */ -test('Gradebook toggle names button', async ({ - page, - baseURL, - tmpPath -}) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, baseURL, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to gradebook Problem Set 1 - await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1/Problem 1`); - await check_formgrader_breadcrumbs(iframe, ["Manual Grading", "Problem Set 1", "Problem 1"]); - - const button = iframe.locator("[id='toggle_names']").first() - const hidden = iframe.locator("td .glyphicon.name-hidden").first(); - const shown = iframe.locator("td .glyphicon.name-shown").first(); - - // At the start, all names are hidden - await expect(button).toHaveText("Show All Names", {useInnerText: true}); - await expect(hidden).toBeVisible(); - await expect(shown).toBeHidden(); - - // Clicking should make names shown - await button.click(); - await expect(button).toHaveText("Hide All Names", {useInnerText: true}); - await expect(hidden).toBeHidden(); - await expect(shown).toBeVisible(); - - // If there is at least one hidden, button should default to showing all names - await shown.click(); - await expect(button).toHaveText("Show All Names", {useInnerText: true}); - await button.click(); - await expect(hidden).toBeHidden(); - await expect(shown).toBeVisible(); - -}); - -/* - * Load students and test students links - */ -test('Load students', async ({ - page, - baseURL, - request, - tmpPath -}) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - // Change iframe URL to students - await iframe.goto(`${baseURL}/formgrader/manage_students`); - await check_formgrader_breadcrumbs(iframe, ["Students"]); - - // Check students links - await expect(iframe.locator("td.name")).toHaveCount(3); - for (var i=0; i < await iframe.locator("td.name").count(); i++){ - var student_name = await iframe.locator("td.name").nth(i).getAttribute("data-order") as string; - var student_id = await iframe.locator("td.id").nth(i).getAttribute("data-order") as string; - await click_link(iframe, student_name); - await check_formgrader_breadcrumbs(iframe, ["Students", student_id]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/manage_students/${student_id}`)); - await expect(iframe.locator('th:text("Task Score")')).toHaveCount(1); - await iframe.goto(`${baseURL}/formgrader/manage_students`); - } - -}); - -/* - * Test students submissions - */ -test('Load students submissions', async ({ - page, - baseURL, - request, - tmpPath -}) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - const student_ids = ["Bitdiddle", "Hacker"]; - - for(var i=0; i<2; i++){ // foreach loop does not work (raise at goto statement) - // Change iframe URL to student - await iframe.goto(`${baseURL}/formgrader/manage_students/${student_ids[i]}`); - await check_formgrader_breadcrumbs(iframe, ["Students", student_ids[i]]); - - // Click on an assignment - await click_link(iframe, "Problem Set 1"); - // await iframe.waitForNavigation({'url': encodeURI(`${baseURL}/formgrader/manage_students/${student_ids[i]}/Problem Set 1`)}); - await check_formgrader_breadcrumbs(iframe, ["Students", student_ids[i], "Problem Set 1"]); - expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/manage_students/${student_ids[i]}/Problem Set 1`)); - await expect(iframe.locator('th:text("Task Score")')).toHaveCount(1); - } -}); - -/* - * Switch views - */ -test('Switch views', async ({ - page, - baseURL, - request, - tmpPath -}) => { - - test.skip(is_windows, 'This test does not work on Windows'); - - if (baseURL === undefined) throw new Error("BaseURL is undefined."); - - // create environment - await create_env(page, tmpPath, exchange_dir, cache_dir, is_windows); - await add_courses(page, request, tmpPath); - await open_formgrader(page); - - // get formgrader iframe - const iframe = page.mainFrame().childFrames()[0]; - - const pages = ["", "manage_assignments", "gradebook", "manage_students"]; - const links = [ - ["Manage Assignments", "Assignments", "manage_assignments"], - ["Manual Grading", "Manual Grading", "gradebook"], - ["Manage Students", "Students", "manage_students"] - ]; - - for (var i=0; i { - - if (request === undefined) throw new Error("Request is undefined."); - - const contents = galata.newContentsHelper(request); - nb_files.forEach(elem => { - contents.uploadFile( - path.resolve( - __dirname, - `../files/${elem}` - ), - `${tmpPath}/${elem}` - ); - }); -}); - -/* - * delete temp directory at the end of test - */ -test.afterAll(async ({ request, tmpPath }) => { - - if (request === undefined) throw new Error("Request is undefined."); - - const contents = galata.newContentsHelper(request); - await contents.deleteDirectory(tmpPath); - - if (await contents.fileExists("nbgrader_config.py")) contents.deleteFile("nbgrader_config.py"); - contents.uploadFile(path.resolve(__dirname, "../files/nbgrader_config.py"), "nbgrader_config.py"); -}); - - -/* - * Open a notebook file and wait for validate button - */ -const open_notebook = async (page:IJupyterLabPageFixture, notebook:string) => { - - var filename = notebook + '.ipynb'; - var tab_count = await page.locator("#jp-main-dock-panel .lm-TabBar-tab").count(); - await page.locator(`#filebrowser .jp-DirListing-content .jp-DirListing-itemText span:text-is('${filename}')`).dblclick(); - await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(tab_count + 1); - await page.waitForSelector(".jp-Notebook-cell"); - - await page.waitForSelector("button.validate-button") -} - -/* - * Test validation success - */ -test('Validation success', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "submitted-changed"); - - // click on validate, and expect a success modal - await page.locator('button.validate-button').click(); - await wait_for_success_modal(page); - - // close the modal - await close_success_modal(page); - -}); - -/* - * Test validation failure - */ -test('Validation failure', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "submitted-unchanged"); - - // click on validate, and expect an error modal - await page.locator('button.validate-button').click(); - await wait_for_error_modal(page); - - await page.waitForSelector('.nbgrader-ErrorDialog .validation-failed'); - - // close the modal - await close_error_modal(page); - -}); - - -/* - * Test validation with grade cell changed - */ -test('Validation grade cell changed', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "submitted-grade-cell-changed"); - - // click on validate, and expect an error modal - await page.locator('button.validate-button').click(); - await wait_for_error_modal(page); - - await page.waitForSelector('.nbgrader-ErrorDialog .validation-changed'); - - // close the modal - await close_error_modal(page); - -}); - -/* - * Test validation with locked cell changed - */ -test('Validation locked cell changed', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "submitted-locked-cell-changed"); - - // click on validate, and expect an error modal - await page.locator('button.validate-button').click(); - await wait_for_error_modal(page); - - await page.waitForSelector('.nbgrader-ErrorDialog .validation-changed'); - - // close the modal - await close_error_modal(page); - -}); - -/* - * Test validation opening relative file - */ -test('Validation open relative file', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "open_relative_file"); - - // click on validate, and expect a success modal - await page.locator('button.validate-button').click(); - await wait_for_success_modal(page); - - await page.waitForSelector('.nbgrader-SuccessDialog .validation-success'); - - // close the modal - await close_success_modal(page); - -}); - -/* - * Test validation with grade cell type changed - */ -test('Validation grade cell type changed', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "submitted-grade-cell-type-changed"); - - // click on validate, and expect an error modal - await page.locator('button.validate-button').click(); - await wait_for_error_modal(page); - - await page.waitForSelector('.nbgrader-ErrorDialog .validation-type-changed'); - - // close the modal - await close_error_modal(page); - -}); - -/* -* Test validation with answer cell type changed -*/ -test('Validation answer cell type changed', async ({ - page - }) => { - - // open the notebook - await open_notebook(page, "submitted-answer-cell-type-changed"); - - // click on validate, and expect an error modal - await page.locator('button.validate-button').click(); - await wait_for_error_modal(page); - - await page.waitForSelector('.nbgrader-ErrorDialog .validation-type-changed'); - - // close the modal - await close_error_modal(page); - -}); diff --git a/nbgrader/tests/ui-tests/assignment_list.spec.ts b/nbgrader/tests/ui-tests/assignment_list.spec.ts new file mode 100644 index 000000000..8356edc65 --- /dev/null +++ b/nbgrader/tests/ui-tests/assignment_list.spec.ts @@ -0,0 +1,818 @@ +import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; +import { APIRequestContext, expect, Locator, Page } from '@playwright/test'; +import * as path from 'path'; +import * as os from 'os'; +import * as fs from 'fs'; + +import { test as notebookTest } from './utils/notebook_fixtures'; +import { + executeCommand, + createEnv, + waitForErrorModal, + closeErrorModal, + waitForSuccessModal, + closeSuccessModal} from './utils/test_utils'; + +const testDir = process.env.NBGRADER_TEST_DIR || ''; +if (!testDir){ + throw new Error('Test directory not provided'); +} +if (!fs.existsSync(testDir)){ + throw new Error(`Test directory ${testDir} doesn't exists`); +} + +const isWindows = os.platform().startsWith('win'); + +const tempPath = 'nbgrader-assignment-list-test'; + +let test = jupyterLabTest; +let mainPanelId = '#jp-main-dock-panel'; +let menuPanelId = '#jp-menu-panel'; +let mainPanelTabCount = 1; + +const baseTestUse = { + tmpPath: tempPath, + mockSettings: { + '@jupyterlab/apputils-extension:notification': { + fetchNews: 'false' + } + } +} + +const isNotebook = process.env.NBGRADER_TEST_IS_NOTEBOOK; +if (isNotebook) { + test = notebookTest; + test.use({ + ...baseTestUse, + autoGoto: false + }); + mainPanelId = '#main-panel'; + menuPanelId = '#menu-panel'; + mainPanelTabCount = 2; +} +else { + test.use(baseTestUse); +} + +var exchange_dir:string; +var cache_dir: string; + +/* + * Create environment + */ +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); + + await contents.createDirectory(tmpPath); + + if (!isWindows) { + exchange_dir = fs.mkdtempSync( + path.join(os.tmpdir(), "nbgrader_exchange_test_") + ); + cache_dir = fs.mkdtempSync(path.join(os.tmpdir(), "nbgrader_cache_test_")); + } +}); + +/* + * delete temp directories at the end of test + */ +test.afterEach(async ({ request, tmpPath }) => { + if (!isWindows) { + fs.rmSync(exchange_dir, { recursive: true, force: true }); + fs.rmSync(cache_dir, { recursive: true, force: true }); + } + + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); + await contents.deleteDirectory(tmpPath); + + if (await contents.fileExists("nbgrader_config.py")) + contents.deleteFile("nbgrader_config.py"); + contents.uploadFile( + path.resolve(__dirname, "./files/nbgrader_config.py"), + "nbgrader_config.py" + ); +}); + +/* + * Create a nbgrader file system and modify config + */ +const addCourses = async (request: APIRequestContext, tmpPath: string) => { + const contents = galata.newContentsHelper(request); + + // copy files from the user guide + const source = path.resolve( + __dirname, + "..", + "..", + "docs", + "source", + "user_guide", + "source" + ); + await contents.uploadDirectory(source, `${tmpPath}/source`); + await contents.renameDirectory( + `${tmpPath}/source/ps1`, + `${tmpPath}/source/Problem Set 1` + ); + await contents.renameFile( + `${tmpPath}/source/Problem Set 1/problem1.ipynb`, + `${tmpPath}/source/Problem Set 1/Problem 1.ipynb` + ); + await contents.renameFile( + `${tmpPath}/source/Problem Set 1/problem2.ipynb`, + `${tmpPath}/source/Problem Set 1/Problem 2.ipynb` + ); + await contents.createDirectory(`${tmpPath}/source/ps.01`); + await contents.uploadFile( + path.resolve(__dirname, "files", "empty.ipynb"), + `${tmpPath}/source/ps.01/problem 1.ipynb` + ); + + // Necessary to generate and release assignments + fs.copyFileSync( + path.resolve(testDir, "nbgrader_config.py"), + path.resolve(testDir, tmpPath, "nbgrader_config.py") + ); +}; + +/* + * Open the assignment list tab from palette + */ +const openAssignmentList = async (page: IJupyterLabPageFixture) => { + await expect(page.locator(`${mainPanelId} .lm-TabBar-tab`)).toHaveCount( + mainPanelTabCount + ); + + await page.keyboard.press("Control+Shift+c"); + await page + .locator( + '#modal-command-palette li[data-command="nbgrader:open-assignment-list"]' + ) + .click(); + + var tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + await expect(tabs).toHaveCount( + mainPanelTabCount + 1 + ); + + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); + await expect(newTab_label).toHaveText("Assignments"); +}; + +/* + * Ensure that list of assignment has been loaded for a specific name ("released", "fetched", "submitted") + */ +const waitForList = async ( + page: IJupyterLabPageFixture, + name: string, + nb_rows: number +): Promise => { + await expect( + page.locator(`#${name}_assignments_list_loading`) + ).not.toBeVisible(); + await expect( + page.locator(`#${name}_assignments_list_placeholder`) + ).not.toBeVisible(); + await expect( + page.locator(`#${name}_assignments_list_error`) + ).not.toBeVisible(); + + const rows = page.locator(`#${name}_assignments_list > .list_item`); + await expect(rows).toHaveCount(nb_rows); + return rows; +}; + +/* + * Select a course in dropdown list + */ +const selectCourse = async (page: IJupyterLabPageFixture, course: string) => { + await page.locator("#course_list_dropdown").click(); + await page.locator(`#course_list > li :text("${course}")`).click(); + await expect(page.locator("#course_list_default")).toHaveText(course); +}; + +/* + * Expand a fetched assignment + */ +const expandFetched = async ( + page: IJupyterLabPageFixture, + assignment: string, + item_id: string +): Promise => { + await page + .locator(`#fetched_assignments_list a:text("${assignment}")`) + .click(); + await page.waitForSelector(`${item_id}.collapse.in`); + + const rows = page.locator(`${item_id} .list_item`); + for (var i = 1; i < (await rows.count()); i++) { + expect(rows.nth(i)).toBeVisible(); + } + return rows; +}; + +/* + * Collapse an expended fetched assignment + */ +const collapseFetched = async ( + page: IJupyterLabPageFixture, + assignment: string, + item_id: string +) => { + await page + .locator(`#fetched_assignments_list a:text("${assignment}")`) + .click(); + await expect(page.locator(`${item_id}.collapse`)).not.toHaveClass("in"); +}; + +/* + * Test opening assignment list tab from menu + */ +test("Open assignment list tab from menu", async ({ page, tmpPath }) => { + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + const nbgrader_menu = page.locator(`${menuPanelId} div.lm-MenuBar-itemLabel:text("Nbgrader")`); + const assignmentList_menu = page.locator( + '#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-assignment-list"]' + ); + const tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + const lastTab_label = tabs.last().locator('.lm-TabBar-tabLabel'); + + await expect(tabs).toHaveCount(mainPanelTabCount); + + // Check main menu exists + await expect(nbgrader_menu).toHaveCount(1); + + // Open assignment list from the menu + await nbgrader_menu.click(); + await assignmentList_menu.click(); + + await expect(tabs).toHaveCount(mainPanelTabCount + 1); + await expect(lastTab_label).toHaveText('Assignments'); + + // Close the last tab + await tabs.last().locator('.jp-icon-hover.lm-TabBar-tabCloseIcon').click(); + await expect(tabs).toHaveCount(mainPanelTabCount); + + // Open again + await nbgrader_menu.click(); + await assignmentList_menu.click(); + + await expect(tabs).toHaveCount(mainPanelTabCount + 1); + await expect(lastTab_label).toHaveText('Assignments'); +}); + +/* + * Test showing assignment list + */ +test("Show assignment list", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // Wait for DOM of each status + await page.waitForSelector("#released_assignments_list"); + await page.waitForSelector("#fetched_assignments_list"); + await page.waitForSelector("#submitted_assignments_list"); + + // release an assignment + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + + // refresh assignments + await page.locator("#refresh_assignments_list").click(); + + // expect finding the released assignment + const rows = await waitForList(page, "released", 1); + expect(rows.first().locator(".item_name")).toHaveText("Problem Set 1"); + expect(rows.first().locator(".item_course")).toHaveText("abc101"); +}); + +/* + * Test multiple released assignments + */ +test("Multiple released assignments", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release two assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignments + await page.locator("#refresh_assignments_list").click(); + + // select a course + await selectCourse(page, "xyz 200"); + + // expect finding the released assignment for selected course + const rows = await waitForList(page, "released", 1); + expect(rows.first().locator(".item_name")).toHaveText("ps.01"); + expect(rows.first().locator(".item_course")).toHaveText("xyz 200"); +}); + +/* + * Test fetch assignment + */ +test("Fetch assignments", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "xyz 200"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched + rows = await waitForList(page, "fetched", 1); + expect(rows.first().locator(".item_name").first()).toHaveText("ps.01"); + expect(rows.first().locator(".item_course").first()).toHaveText("xyz 200"); + + // check that the directory has been created + const contents = galata.newContentsHelper(request); + expect(contents.directoryExists("ps.01")); + + // expand assignment notebooks + rows = await expandFetched(page, "ps.01", "#nbgrader-xyz_200-ps01"); + await expect(rows).toHaveCount(2); + await expect(rows.last().locator(".item_name")).toHaveText("problem 1"); + + // collapse assignments notebooks + await collapseFetched(page, "ps.01", "#nbgrader-xyz_200-ps01"); +}); + +/* + * Test submit assignment + */ +test("Submit assignments", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create directories and config files, and open assignment_list tab + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "xyz 200"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched and submit + rows = await waitForList(page, "fetched", 1); + await rows.first().locator('.item_status button:text("Submit")').click(); + + // check that there is only one submitted + rows = await waitForList(page, "submitted", 1); + expect(rows.first().locator(".item_name").first()).toHaveText("ps.01"); + expect(rows.first().locator(".item_course").first()).toHaveText("xyz 200"); + + // check again that there is only one submitted for that course + rows = page.locator("#nbgrader-xyz_200-ps01-submissions > .list_item"); + // the first row should be empty + expect(rows).toHaveCount(2); + + // submit a second time + rows = await waitForList(page, "fetched", 1); + await rows.first().locator('.item_status button:text("Submit")').click(); + + // check there are two submitted (the first row is empty) + await expect( + page.locator("#nbgrader-xyz_200-ps01-submissions > .list_item") + ).toHaveCount(3); + rows = page.locator("#nbgrader-xyz_200-ps01-submissions > .list_item"); + + const timestamp1 = rows.nth(1).locator(".item_name").textContent(); + const timestamp2 = rows.nth(2).locator(".item_name").textContent(); + expect(timestamp1 != timestamp2); +}); + +/* + * Test submitting assignment without notebook + */ +test("submit assignment missing notebook", async ({ + page, + request, + tmpPath, +}) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create directories and config files, and open assignment_list tab + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "xyz 200"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched and submit + rows = await waitForList(page, "fetched", 1); + await rows.first().locator('.item_status button:text("Submit")').click(); + + // check that there is only one submitted + rows = await waitForList(page, "submitted", 1); + expect(rows.first().locator(".item_name").first()).toHaveText("ps.01"); + expect(rows.first().locator(".item_course").first()).toHaveText("xyz 200"); + rows = page.locator("#nbgrader-xyz_200-ps01-submissions > .list_item"); + expect(rows).toHaveCount(2); + + // rename the assignment notebook file + const contents = galata.newContentsHelper(request); + expect(await contents.fileExists(`${tmpPath}/ps.01/problem 1.ipynb`)); + await contents.renameFile( + `${tmpPath}/ps.01/problem 1.ipynb`, + `${tmpPath}/ps.01/my problem 1.ipynb` + ); + + // submit again and check it has submitted + rows = await waitForList(page, "fetched", 1); + await rows.first().locator('.item_status button:text("Submit")').click(); + rows = await waitForList(page, "submitted", 1); + expect(rows.first().locator(".item_name").first()).toHaveText("ps.01"); + expect(rows.first().locator(".item_course").first()).toHaveText("xyz 200"); + rows = page.locator("#nbgrader-xyz_200-ps01-submissions > .list_item"); + expect(rows).toHaveCount(3); + + const timestamp1 = rows.nth(1).locator(".item_name").textContent(); + const timestamp2 = rows.nth(2).locator(".item_name").textContent(); + expect(timestamp1 != timestamp2); + + // Set strict flag + fs.appendFileSync( + path.resolve(testDir, tmpPath, "nbgrader_config.py"), + "c.ExchangeSubmit.strict = True" + ); + + // submit again and check that nothing changes + rows = await waitForList(page, "fetched", 1); + await rows.first().locator('.item_status button:text("Submit")').click(); + + // wait for error modal and close it + await waitForErrorModal(page); + await closeErrorModal(page); + + // check that nothing has change in submitted list + rows = await waitForList(page, "submitted", 1); + expect(rows.first().locator(".item_name").first()).toHaveText("ps.01"); + expect(rows.first().locator(".item_course").first()).toHaveText("xyz 200"); + rows = page.locator("#nbgrader-xyz_200-ps01-submissions > .list_item"); + expect(rows).toHaveCount(3); +}); + +/* + * Test fetch a second assignment + */ +test("Fetch a second assignment", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "xyz 200"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // select the other course + await selectCourse(page, "abc101"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched + rows = await waitForList(page, "fetched", 1); + expect(rows.first().locator(".item_name").first()).toHaveText( + "Problem Set 1" + ); + expect(rows.first().locator(".item_course").first()).toHaveText("abc101"); + + // check that the directory has been created + const contents = galata.newContentsHelper(request); + expect(contents.directoryExists("Problem Set 1")); + + // expand assignment notebooks + rows = await expandFetched( + page, + "Problem Set 1", + "#nbgrader-abc101-Problem_Set_1" + ); + await expect(rows).toHaveCount(3); + await expect(rows.nth(1).locator(".item_name")).toHaveText("Problem 1"); + await expect(rows.last().locator(".item_name")).toHaveText("Problem 2"); + + // collapse assignments notebooks + await collapseFetched( + page, + "Problem Set 1", + "#nbgrader-abc101-Problem_Set_1" + ); +}); + +/* + * Test submit another assignment + */ +test("Submit another assignments", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create directories and config files, and open assignment_list tab + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "abc101"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched and submit + rows = await waitForList(page, "fetched", 1); + await rows.first().locator('.item_status button:text("Submit")').click(); + + // check that there is only one submitted + rows = await waitForList(page, "submitted", 1); + expect(rows.first().locator(".item_name").first()).toHaveText( + "Problem Set 1" + ); + expect(rows.first().locator(".item_course").first()).toHaveText("abc101"); + + // check again that there is only one submitted for that course + rows = page.locator( + "#nbgrader-abc101-Problem_Set_1-submissions > .list_item" + ); + // the first row should be empty + expect(rows).toHaveCount(2); +}); + +/* + * Test validate assignment + */ +test("Validate OK", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create directories and config files, and open assignment_list tab + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "xyz 200"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched and submit + rows = await waitForList(page, "fetched", 1); + + // expand assignment notebooks + rows = await expandFetched(page, "ps.01", "#nbgrader-xyz_200-ps01"); + await expect(rows).toHaveCount(2); + await expect(rows.last().locator(".item_name")).toHaveText("problem 1"); + + // Click on validate + await rows.last().locator('.item_status button:text("Validate")').click(); + + await waitForSuccessModal(page); + await closeSuccessModal(page); +}); + +/* + * Test validation failure + */ +test("Validate failure", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create directories and config files, and open assignment_list tab + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openAssignmentList(page); + + // release some assignments + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + await executeCommand("nbgrader generate_assignment 'ps.01' --force"); + await executeCommand( + "nbgrader release_assignment 'ps.01' --course 'xyz 200' --force" + ); + + // refresh assignment list + await page.locator("#refresh_assignments_list").click(); + + // select one course + await selectCourse(page, "abc101"); + + // check that there is only one released, and fetch it + var rows = await waitForList(page, "released", 1); + await rows.first().locator(".item_status button").click(); + + // check that there is only one fetched and submit + rows = await waitForList(page, "fetched", 1); + + // expand assignment notebooks + rows = await expandFetched( + page, + "Problem Set 1", + "#nbgrader-abc101-Problem_Set_1" + ); + await expect(rows).toHaveCount(3); + await expect(rows.nth(1).locator(".item_name")).toHaveText("Problem 1"); + await expect(rows.last().locator(".item_name")).toHaveText("Problem 2"); + + // Click on validate + await rows.last().locator('.item_status button:text("Validate")').click(); + await waitForErrorModal(page); + await closeErrorModal(page); +}); + +/* + * Test missing exchange directory + */ +test("Missing exchange directory", async ({ page, request, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (request === undefined) throw new Error("Request is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create directories and config files + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + + // delete exchange directory + fs.rmSync(exchange_dir, { recursive: true, force: true }); + + // open assignment_list tab + await openAssignmentList(page); + + // Expecting error on lists and dropdown + await expect(page.locator(`#released_assignments_list_error`)).toBeVisible(); + await expect(page.locator(`#fetched_assignments_list_error`)).toBeVisible(); + await expect(page.locator(`#submitted_assignments_list_error`)).toBeVisible(); + + await expect(page.locator("#course_list_default")).toHaveText( + "Error fetching courses!" + ); + + // create exchange directory again + fs.mkdtempSync(exchange_dir); + + // release assignment + await executeCommand("nbgrader generate_assignment 'Problem Set 1' --force"); + await executeCommand( + "nbgrader release_assignment 'Problem Set 1' --course 'abc101' --force" + ); + + // refresh assignment list and expect retrieving released assignment + await page.locator("#refresh_assignments_list").click(); + const rows = await waitForList(page, "released", 1); + expect(rows.first().locator(".item_name")).toHaveText("Problem Set 1"); + expect(rows.first().locator(".item_course")).toHaveText("abc101"); +}); diff --git a/nbgrader/tests/ui-tests/course_list.spec.ts b/nbgrader/tests/ui-tests/course_list.spec.ts new file mode 100644 index 000000000..5cffc828b --- /dev/null +++ b/nbgrader/tests/ui-tests/course_list.spec.ts @@ -0,0 +1,258 @@ +import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from "@jupyterlab/galata"; +import { expect } from "@playwright/test"; + +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; + +import { test as notebookTest } from './utils/notebook_fixtures'; +import { createEnv } from "./utils/test_utils"; + +const testDir = process.env.NBGRADER_TEST_DIR || ''; +if (!testDir){ + throw new Error('Test directory not provided'); +} +if (!fs.existsSync(testDir)){ + throw new Error(`Test directory ${testDir} doesn't exists`); +} + +const isWindows = os.platform().startsWith('win'); + +const tempPath = 'nbgrader-course-list-test'; + +let test = jupyterLabTest; +let mainPanelId = '#jp-main-dock-panel'; +let menuPanelId = '#jp-menu-panel'; +let mainPanelTabCount = 1; + +const baseTestUse = { + tmpPath: tempPath, + mockSettings: { + '@jupyterlab/apputils-extension:notification': { + fetchNews: 'false' + } + } +} + +const isNotebook = process.env.NBGRADER_TEST_IS_NOTEBOOK; +if (isNotebook) { + test = notebookTest; + test.use({ + ...baseTestUse, + autoGoto: false + }); + mainPanelId = '#main-panel'; + menuPanelId = '#menu-panel'; + mainPanelTabCount = 2; +} +else { + test.use(baseTestUse); +} + +var exchange_dir: string; +var cache_dir: string; + +/* + * Create environment + */ +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); + + await contents.createDirectory(tmpPath); + + if (!isWindows) { + exchange_dir = fs.mkdtempSync( + path.join(os.tmpdir(), "nbgrader_exchange_test_") + ); + cache_dir = fs.mkdtempSync(path.join(os.tmpdir(), "nbgrader_cache_test_")); + } +}); + +/* + * delete temp directories at the end of test + */ +test.afterEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + const contents = galata.newContentsHelper(request); + await contents.deleteDirectory(tmpPath); + + if (!isWindows) { + fs.rmSync(exchange_dir, { recursive: true, force: true }); + fs.rmSync(cache_dir, { recursive: true, force: true }); + } + + if (await contents.fileExists("nbgrader_config.py")) + contents.deleteFile("nbgrader_config.py"); + contents.uploadFile( + path.resolve(__dirname, "./files/nbgrader_config.py"), + "nbgrader_config.py" + ); +}); + +/* + * Open a courses list tab + */ +const openCoursesList = async (page: IJupyterLabPageFixture) => { + await expect(page.locator(`${mainPanelId} .lm-TabBar-tab`)).toHaveCount( + mainPanelTabCount + ); + + await page.keyboard.press("Control+Shift+c"); + await page + .locator( + '#modal-command-palette li[data-command="nbgrader:open-course-list"]' + ) + .click(); + + var tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + await expect(tabs).toHaveCount( + mainPanelTabCount + 1 + ); + + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); + await expect(newTab_label).toHaveText("Courses"); + await page.waitForSelector("#formgrader_list"); +}; + +/* + * Modify config file + */ +const updateConfig = async () => { + var text_to_append = ` +c.CourseDirectory.course_id = "course101" +`; + fs.appendFileSync( + path.resolve(testDir, "nbgrader_config.py"), + text_to_append + ); +}; + +/* + * TODO: package the 4 extensions individually to be able to install/enable/disable each. + */ +// test('No formgrader', async ({ +// page +// }) => { + +// test.skip(is_windows, 'This feature is not implemented for Windows'); +// await open_courses_list(page); + +// } +// ); + +/* + * Test opening course list tab from menu + */ +test("Open course list tab from menu", async ({ page, tmpPath }) => { + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + const nbgrader_menu = page.locator(`${menuPanelId} div.lm-MenuBar-itemLabel:text("Nbgrader")`); + const courseList_menu = page.locator( + '#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-course-list"]' + ); + const tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + const lastTab_label = tabs.last().locator('.lm-TabBar-tabLabel'); + + + await expect(tabs).toHaveCount(mainPanelTabCount); + + // Check main menu exists + await expect(nbgrader_menu).toHaveCount(1); + + // Open course list from the menu + await nbgrader_menu.click(); + await courseList_menu.click(); + + await expect(tabs).toHaveCount(mainPanelTabCount + 1); + await expect(lastTab_label).toHaveText('Courses'); + + // Close the last tab + await tabs.last().locator('.jp-icon-hover.lm-TabBar-tabCloseIcon').click(); + await expect(tabs).toHaveCount(mainPanelTabCount); + + // Open again + await nbgrader_menu.click(); + await courseList_menu.click(); + + await expect(tabs).toHaveCount(mainPanelTabCount + 1); + await expect(lastTab_label).toHaveText('Courses'); +}); + +/* + * Test a local formgrader, expecting existing courses are local and opening formgrader works + */ +test("local formgrader", async ({ page, tmpPath }) => { + test.skip(isWindows, "This feature is not implemented for Windows"); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + + await updateConfig(); + + await openCoursesList(page); + await expect(page.locator("#formgrader_list_loading")).not.toBeVisible(); + await expect(page.locator("#formgrader_list_placeholder")).not.toBeVisible(); + await expect(page.locator("#formgrader_list_error")).not.toBeVisible(); + await expect(page.locator("#formgrader_list > .list_item")).toHaveCount(1); + + await expect(page.locator("#formgrader_list > .list_item")).toHaveText( + "course101local" + ); + + await expect(page.locator("#formgrader_list > .list_item a")).toHaveCount(1); + + await page.locator("#formgrader_list > .list_item a").click(); + + var tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + await expect(tabs).toHaveCount( + mainPanelTabCount + 2 + ); + + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); + await expect(newTab_label).toHaveText("Formgrader"); +}); + +// /* +// * Test using JupyterHub authenticator without jupyterHub, expecting same results as previous tests +// */ +// test('No jupyterhub', async ({ +// page, +// baseURL, +// tmpPath, + +// }) => { + +// test.skip(is_windows, 'This feature is not implemented for Windows'); + +// const rootDir = await create_env(page, tmpPath, exchange_dir, cache_dir); + +// await update_config(page, rootDir); + +// var text_to_append = ` +// from nbgrader.auth import JupyterHubAuthPlugin +// c.Authenticator.plugin_class = JupyterHubAuthPlugin +// `; + +// fs.appendFileSync(path.resolve(rootDir, "nbgrader_config.py"), text_to_append); + +// await open_courses_list(page); +// await expect(page.locator("#formgrader_list_loading")).not.toBeVisible(); +// await expect(page.locator("#formgrader_list_placeholder")).not.toBeVisible(); +// await expect(page.locator("#formgrader_list_error")).not.toBeVisible(); +// await expect(page.locator("#formgrader_list > .list_item")).toHaveCount(1); + +// await expect(page.locator("#formgrader_list > .list_item")).toHaveText("course101local"); + +// await expect(page.locator("#formgrader_list > .list_item a")).toHaveCount(1); + +// await page.locator("#formgrader_list > .list_item a").click(); +// await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount(3); + +// var tabs = page.locator("#jp-main-dock-panel .lm-TabBar-tab"); +// var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); +// await expect(newTab_label).toHaveText("Formgrader"); + +// } +// ); diff --git a/nbgrader/tests/ui-tests/create_assignement.spec.ts b/nbgrader/tests/ui-tests/create_assignement.spec.ts new file mode 100644 index 000000000..e30e425be --- /dev/null +++ b/nbgrader/tests/ui-tests/create_assignement.spec.ts @@ -0,0 +1,808 @@ +import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from "@jupyterlab/galata"; +import { expect } from "@playwright/test"; +import * as path from "path"; +import * as fs from 'fs'; + +import { test as notebookTest } from './utils/notebook_fixtures'; +import { waitForErrorModal, closeErrorModal } from "./utils/test_utils"; + +const testDir = process.env.NBGRADER_TEST_DIR || ''; +if (!testDir){ + throw new Error('Test directory not provided'); +} +if (!fs.existsSync(testDir)){ + throw new Error(`Test directory ${testDir} doesn't exists`); +} + +const tempPath = 'nbgrader-create-assignments-test'; + +let test = jupyterLabTest; + +const baseTestUse = { + tmpPath: tempPath, + mockSettings: { + '@jupyterlab/apputils-extension:notification': { + fetchNews: 'false' + } + } +} + +const isNotebook = process.env.NBGRADER_TEST_IS_NOTEBOOK; +if (isNotebook) { + test = notebookTest; + test.use({ + ...baseTestUse, + autoGoto: false + }); +} +else { + test.use(baseTestUse); +} + +const nbFiles = ["blank.ipynb", "task.ipynb", "old-schema.ipynb"]; + +/* + * Copy notebook files before each test. + */ +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + + const contents = galata.newContentsHelper(request); + nbFiles.forEach((elem) => { + contents.uploadFile( + path.resolve(__dirname, `./files/${elem}`), + `${tmpPath}/${elem}` + ); + }); +}); + +/* + * Delete temp directory at the end of test. + */ +test.afterAll(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + + const contents = galata.newContentsHelper(request); + await contents.deleteDirectory(tmpPath); + + if (await contents.fileExists("nbgrader_config.py")) + contents.deleteFile("nbgrader_config.py"); + contents.uploadFile( + path.resolve(__dirname, "./files/nbgrader_config.py"), + "nbgrader_config.py" + ); +}); + +/* + * Open a notebook file. + * NOTES: + * This function is only useful if testing extension in JupyterLab. + * In Notebook tests we open a new browser tab instead. + */ +const openNotebook = async (page: IJupyterLabPageFixture, notebook: string) => { + var filename = notebook + ".ipynb"; + var tab_count = await page + .locator("#jp-main-dock-panel .lm-TabBar-tab") + .count(); + await page + .locator( + `#filebrowser .jp-DirListing-content .jp-DirListing-itemText span:text-is('${filename}')` + ) + .dblclick(); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount( + tab_count + 1 + ); + await page.waitForSelector(".jp-Notebook-cell"); +}; + +/* + * Save the current notebook file. + */ +const saveCurrentNotebook = async (page: IJupyterLabPageFixture) => { + return await page.evaluate(async () => { + var nb = window.jupyterapp.shell.currentWidget; + await nb.context.save(); + }); + + // TODO : ensure metadata has been saved + // Read local file ? +}; + +/* + * Activate assignment toolbar. + */ +const activateToolbar = async (page: IJupyterLabPageFixture) => { + if ((await page.locator(".nbgrader-NotebookWidget").count()) > 0) { + if (await page.locator(".nbgrader-NotebookWidget").isVisible()) { + return; + } + } + + if (isNotebook) { + await page.menu.clickMenuItem( + "View>Right Sidebar>Show Nbgrader Create Assignment" + ); + } else { + const widget_button = page.locator( + ".lm-TabBar-tab[title='Nbgrader Create Assignment']" + ); + const button_position = await widget_button.boundingBox(); + + if (button_position === null) + throw new Error("Cannot get the position of the create assignment button."); + + await page.mouse.click( + button_position.x + button_position.width / 2, + button_position.y + button_position.height / 2 + ); + } + + await expect(page.locator(".nbgrader-NotebookWidget")).toBeVisible(); +}; + +/* + * Get the nbgrader's metadata of a cell. + */ +const getCellMetadata = async ( + page: IJupyterLabPageFixture, + cell_number: number = 0 +) => { + return await page.evaluate((cell_num) => { + var nb = window.jupyterapp.shell.currentWidget; + return nb.model.cells.get(cell_num).metadata.get("nbgrader"); + }, cell_number); +}; + +/* + * Set points to a notebook cell. + */ +const setPoints = async ( + page: IJupyterLabPageFixture, + points: number = 0, + index: number = 0 +) => { + await page + .locator(".nbgrader-CellPoints input") + .nth(index) + .fill(points.toString()); + await page.keyboard.press("Enter"); +}; + +/* + * Set id to a notebook cell + */ +const setId = async ( + page: IJupyterLabPageFixture, + id: string = "foo", + index: number = 0 +) => { + await page.locator(".nbgrader-CellId input").nth(index).fill(id); + await page.keyboard.press("Enter"); +}; + +/* + * Select type of assignment of a cell in nbgrader toolbar + */ +const selectInToolbar = async ( + page: IJupyterLabPageFixture, + text: string, + index: number = 0 +) => { + var select = page.locator(".nbgrader-NotebookWidget select").nth(index); + await select.selectOption(text); +}; + +/* + * Get the total points of an assignment + */ +const getTotalPoints = async ( + page: IJupyterLabPageFixture, + index: number = 0 +) => { + return parseFloat( + await page.locator(".nbgrader-TotalPointsInput").nth(0).inputValue() + ); +}; + +/* + * Create a new cell in current notebook + */ +const createNewCell = async ( + page: IJupyterLabPageFixture, + after: number = 0 +) => { + await page.locator(".jp-Cell .jp-InputArea-prompt").nth(after).click(); + await page.keyboard.press("b"); +}; + +/* + * Delete a cell in current notebook + */ +const deleteCell = async (page: IJupyterLabPageFixture, index: number = 0) => { + await page.locator(".jp-Cell .jp-InputArea-prompt").nth(index).click(); + await page.keyboard.press("d"); + await page.keyboard.press("d"); +}; + +/* + * Test manipulating a manually graded cell + */ +test("manual cell", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + expect(await getCellMetadata(page)).toBeUndefined(); + + await selectInToolbar(page, "manual"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", true); + expect(metadata).toHaveProperty("grade", true); + expect(metadata).toHaveProperty("locked", false); + + await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); + + await setPoints(page, 2); + expect(await getCellMetadata(page)).toHaveProperty("points", 2); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + await selectInToolbar(page, ""); + expect(await getCellMetadata(page)).toBeUndefined(); + + await saveCurrentNotebook(page); +}); + +/* + * Test manipulating a task cell + */ +test("task cell", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/task.ipynb`); + } else { + await openNotebook(page, "task"); + } + + await activateToolbar(page); + + expect(await getCellMetadata(page)).toBeUndefined(); + + await selectInToolbar(page, "task"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", false); + expect(metadata).toHaveProperty("grade", false); + expect(metadata).toHaveProperty("locked", true); + + await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); + + await setPoints(page, 2); + expect(await getCellMetadata(page)).toHaveProperty("points", 2); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + await selectInToolbar(page, ""); + expect(await getCellMetadata(page)).toBeUndefined(); + + await saveCurrentNotebook(page); +}); + +/* + * Test manipulating a solution graded cell + */ +test("solution cell", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + expect(await getCellMetadata(page)).toBeUndefined(); + + await selectInToolbar(page, "solution"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", true); + expect(metadata).toHaveProperty("grade", false); + expect(metadata).toHaveProperty("locked", false); + + await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + await selectInToolbar(page, ""); + expect(await getCellMetadata(page)).toBeUndefined(); + + await saveCurrentNotebook(page); +}); + +/* + * Test manipulating a test graded cell + */ +test("tests cell", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + expect(await getCellMetadata(page)).toBeUndefined(); + + await selectInToolbar(page, "tests"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", false); + expect(metadata).toHaveProperty("grade", true); + expect(metadata).toHaveProperty("locked", true); + + await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); + + await setPoints(page, 2); + expect(await getCellMetadata(page)).toHaveProperty("points", 2); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + await selectInToolbar(page, ""); + expect(await getCellMetadata(page)).toBeUndefined(); + + await saveCurrentNotebook(page); +}); + +/* + * Test converting cell's type + */ +test("tests to solution cell", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + expect(await getCellMetadata(page)).toBeUndefined(); + + await selectInToolbar(page, "tests"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", false); + expect(metadata).toHaveProperty("grade", true); + expect(metadata).toHaveProperty("locked", true); + + await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-CellPoints >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); + + await setPoints(page, 2); + expect(await getCellMetadata(page)).toHaveProperty("points", 2); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + await selectInToolbar(page, "solution"); + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", true); + expect(metadata).toHaveProperty("grade", false); + expect(metadata).toHaveProperty("locked", false); + expect(metadata["points"]).toBeUndefined(); + await saveCurrentNotebook(page); + + await selectInToolbar(page, ""); + expect(await getCellMetadata(page)).toBeUndefined(); + await saveCurrentNotebook(page); +}); + +/* + * Tests on locked cell + */ +test("locked cell", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + expect(await getCellMetadata(page)).toBeUndefined(); + + await selectInToolbar(page, "readonly"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", false); + expect(metadata).toHaveProperty("grade", false); + expect(metadata).toHaveProperty("locked", true); + + await expect(page.locator(".nbgrader-CellId >> nth=0")).toBeVisible(); + await expect(page.locator(".nbgrader-LockButton >> nth=0")).toBeVisible(); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + await selectInToolbar(page, ""); + expect(await getCellMetadata(page)).toBeUndefined(); + await saveCurrentNotebook(page); +}); + +/* + * Test focus using TAB key + */ +test("tab key", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + // make the cell manually grading + await selectInToolbar(page, "manual"); + + // focus on cell type + await page.locator(".nbgrader-CellType select").focus(); + await expect(page.locator(".nbgrader-CellType select")).toBeFocused(); + + // press tab and focus on ID input + await page.keyboard.press("Tab"); + await expect(page.locator(".nbgrader-CellId input")).toBeFocused(); + + // press tab again and focus on points input + await page.keyboard.press("Tab"); + await expect(page.locator(".nbgrader-CellPoints input")).toBeFocused(); +}); + +/* + * Test the total points of a notebook + */ +test("total points", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + // make sure the total points is zero + expect(await getTotalPoints(page)).toBe(0); + + // make it autograder tests and set the points to two + await selectInToolbar(page, "tests"); + await setPoints(page, 2); + await setId(page); + expect(await getTotalPoints(page)).toBe(2); + + // make it manually graded + await selectInToolbar(page, "manual"); + expect(await getTotalPoints(page)).toBe(2); + + // make it a solution make sure the total points is zero + await selectInToolbar(page, "solution"); + expect(await getTotalPoints(page)).toBe(0); + + // make it task + await selectInToolbar(page, "task"); + expect(await getTotalPoints(page)).toBe(0); + await setPoints(page, 2); + expect(await getTotalPoints(page)).toBe(2); + + // create a new cell + await createNewCell(page); + + // make it a test cell and check if total points is 3 + await selectInToolbar(page, "tests", 1); + await setPoints(page, 1, 1); + await setId(page, "bar", 1); + expect(await getTotalPoints(page)).toBe(3); + + // delete the first cell + await deleteCell(page); + expect(await getTotalPoints(page)).toBe(1); + + // delete the new cell + await deleteCell(page); + expect(await getTotalPoints(page)).toBe(0); +}); + +/* + * Test the total points of a notebook using task cell + */ +test("task total points", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/task.ipynb`); + } else { + await openNotebook(page, "task"); + } + + await activateToolbar(page); + + // make sure the total points is zero + expect(await getTotalPoints(page)).toBe(0); + + // make cell autograded task and set the points to two + await selectInToolbar(page, "task"); + await setPoints(page, 2); + await setId(page); + expect(await getTotalPoints(page)).toBe(2); + + // make cell manually graded + await selectInToolbar(page, "manual"); + expect(await getTotalPoints(page)).toBe(2); + + // make cell a none graded and make sure the total points is zero + await selectInToolbar(page, ""); + expect(await getTotalPoints(page)).toBe(0); + + // make cell a task again + await selectInToolbar(page, "task"); + expect(await getTotalPoints(page)).toBe(0); + await setPoints(page, 2); + expect(await getTotalPoints(page)).toBe(2); + + // create a new cell + await createNewCell(page); + + // make it a test cell and check if total points is 3 + await selectInToolbar(page, "tests", 1); + await setPoints(page, 1, 1); + await setId(page, "bar", 1); + expect(await getTotalPoints(page)).toBe(3); + + // delete the first cell + await deleteCell(page); + expect(await getTotalPoints(page)).toBe(1); + + // delete the new cell + await deleteCell(page); + expect(await getTotalPoints(page)).toBe(0); +}); + +/* + * Tests on cell ids + */ +test("cell ids", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + // turn it into a solution cell with an id + await selectInToolbar(page, "solution"); + await setId(page, ""); + + // wait for error on saving with empty id + await saveCurrentNotebook(page); + await waitForErrorModal(page); + await closeErrorModal(page); + + // set correct id + await setId(page); + + // create a new cell + await createNewCell(page); + + // make it a test cell and set the label + await selectInToolbar(page, "tests", 1); + await setId(page, "foo", 1); + + // wait for error on saving with empty id + await saveCurrentNotebook(page); + await waitForErrorModal(page); + await closeErrorModal(page); +}); + +/* + * Tests on task's cell ids + */ +test("task cell ids", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/task.ipynb`); + } else { + await openNotebook(page, "task"); + } + + await activateToolbar(page); + + // turn it into a task cell with an id + await selectInToolbar(page, "task"); + await setId(page, ""); + + // wait for error on saving with empty id + await saveCurrentNotebook(page); + await waitForErrorModal(page); + await closeErrorModal(page); + + // set correct id + await setId(page); + + // create a new cell + await createNewCell(page); + + // make it a test cell and set the label + await selectInToolbar(page, "task", 1); + await setId(page, "foo", 1); + + // wait for error on saving with empty id + await saveCurrentNotebook(page); + await waitForErrorModal(page); + await closeErrorModal(page); +}); + +/* + * Test attributing negative points + */ +test("negative points", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + // make sure the total points is zero + expect(await getTotalPoints(page)).toBe(0); + + // make it autograder tests and set the points to two + await selectInToolbar(page, "tests"); + await setPoints(page, 2); + await setId(page); + expect(await getTotalPoints(page)).toBe(2); + expect(await getCellMetadata(page)).toHaveProperty("points", 2); + + // set the points to negative one + await setPoints(page, -1); + expect(await getTotalPoints(page)).toBe(0); + expect(await getCellMetadata(page)).toHaveProperty("points", 0); +}); + +/* + * Test attributing negative points on task's cell + */ +test("task negative points", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/task.ipynb`); + } else { + await openNotebook(page, "task"); + } + + await activateToolbar(page); + + // make sure the total points is zero + expect(await getTotalPoints(page)).toBe(0); + + // make it autograder tests and set the points to two + await selectInToolbar(page, "task"); + await setPoints(page, 2); + await setId(page); + expect(await getTotalPoints(page)).toBe(2); + expect(await getCellMetadata(page)).toHaveProperty("points", 2); + + // set the points to negative one + await setPoints(page, -1); + expect(await getTotalPoints(page)).toBe(0); + expect(await getCellMetadata(page)).toHaveProperty("points", 0); +}); + +/* + * Test nbgrader schema version + */ +test("schema version", async ({ page, tmpPath }) => { + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/old-schema.ipynb`); + } else { + await openNotebook(page, "old-schema"); + } + + // activate toolbar should show an error modal + await activateToolbar(page); + await waitForErrorModal(page); + await closeErrorModal(page); +}); + +/* + * Test an invalid cell type + */ +test("invalid nbgrader cell type", async ({ page, tmpPath }) => { + + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/blank.ipynb`); + } else { + await openNotebook(page, "blank"); + } + + await activateToolbar(page); + + await selectInToolbar(page, "solution"); + + // make the cell a solution cell + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", true); + expect(metadata).toHaveProperty("grade", false); + expect(metadata).toHaveProperty("locked", false); + + await expect(page.locator(".nbgrader-CellId")).toBeVisible(); + + expect((await getCellMetadata(page))["grade_id"]).toEqual( + expect.stringMatching("^cell-") + ); + await setId(page); + expect(await getCellMetadata(page)).toHaveProperty("grade_id", "foo"); + + await saveCurrentNotebook(page); + + // change the cell to markdown + await page.locator(".jp-Cell .jp-InputArea-prompt").first().click(); + await page.keyboard.press("m"); + + var metadata = await getCellMetadata(page); + expect(metadata).toHaveProperty("solution", false); + expect(metadata).toHaveProperty("grade", false); + expect(metadata).toHaveProperty("locked", false); + expect(metadata).toHaveProperty("grade_id", "foo"); +}); diff --git a/nbgrader/tests/labextension_ui-tests/files/blank.ipynb b/nbgrader/tests/ui-tests/files/blank.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/blank.ipynb rename to nbgrader/tests/ui-tests/files/blank.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/data.txt b/nbgrader/tests/ui-tests/files/data.txt similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/data.txt rename to nbgrader/tests/ui-tests/files/data.txt diff --git a/nbgrader/tests/labextension_ui-tests/files/empty.ipynb b/nbgrader/tests/ui-tests/files/empty.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/empty.ipynb rename to nbgrader/tests/ui-tests/files/empty.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/nbgrader_config.py b/nbgrader/tests/ui-tests/files/nbgrader_config.py similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/nbgrader_config.py rename to nbgrader/tests/ui-tests/files/nbgrader_config.py diff --git a/nbgrader/tests/labextension_ui-tests/files/old-schema.ipynb b/nbgrader/tests/ui-tests/files/old-schema.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/old-schema.ipynb rename to nbgrader/tests/ui-tests/files/old-schema.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/open_relative_file.ipynb b/nbgrader/tests/ui-tests/files/open_relative_file.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/open_relative_file.ipynb rename to nbgrader/tests/ui-tests/files/open_relative_file.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/submitted-answer-cell-type-changed.ipynb b/nbgrader/tests/ui-tests/files/submitted-answer-cell-type-changed.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/submitted-answer-cell-type-changed.ipynb rename to nbgrader/tests/ui-tests/files/submitted-answer-cell-type-changed.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/submitted-changed.ipynb b/nbgrader/tests/ui-tests/files/submitted-changed.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/submitted-changed.ipynb rename to nbgrader/tests/ui-tests/files/submitted-changed.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/submitted-grade-cell-changed.ipynb b/nbgrader/tests/ui-tests/files/submitted-grade-cell-changed.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/submitted-grade-cell-changed.ipynb rename to nbgrader/tests/ui-tests/files/submitted-grade-cell-changed.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/submitted-grade-cell-type-changed.ipynb b/nbgrader/tests/ui-tests/files/submitted-grade-cell-type-changed.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/submitted-grade-cell-type-changed.ipynb rename to nbgrader/tests/ui-tests/files/submitted-grade-cell-type-changed.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/submitted-locked-cell-changed.ipynb b/nbgrader/tests/ui-tests/files/submitted-locked-cell-changed.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/submitted-locked-cell-changed.ipynb rename to nbgrader/tests/ui-tests/files/submitted-locked-cell-changed.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/submitted-unchanged.ipynb b/nbgrader/tests/ui-tests/files/submitted-unchanged.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/submitted-unchanged.ipynb rename to nbgrader/tests/ui-tests/files/submitted-unchanged.ipynb diff --git a/nbgrader/tests/labextension_ui-tests/files/task.ipynb b/nbgrader/tests/ui-tests/files/task.ipynb similarity index 100% rename from nbgrader/tests/labextension_ui-tests/files/task.ipynb rename to nbgrader/tests/ui-tests/files/task.ipynb diff --git a/nbgrader/tests/ui-tests/formgrader.spec.ts b/nbgrader/tests/ui-tests/formgrader.spec.ts new file mode 100644 index 000000000..ad24f81de --- /dev/null +++ b/nbgrader/tests/ui-tests/formgrader.spec.ts @@ -0,0 +1,863 @@ +import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from "@jupyterlab/galata"; +import { APIRequestContext, expect, Frame } from "@playwright/test"; +import * as path from "path"; +import * as os from "os"; +import * as fs from "fs"; +import { test as notebookTest } from './utils/notebook_fixtures'; + +import { executeCommand, createEnv } from "./utils/test_utils"; + +const testDir = process.env.NBGRADER_TEST_DIR || ''; +if (!testDir){ + throw new Error('Test directory not provided'); +} +if (!fs.existsSync(testDir)){ + throw new Error(`Test directory ${testDir} doesn't exists`); +} + +const isWindows = os.platform().startsWith('win'); + +const tempPath = 'nbgrader-formgrader-test'; + +let test = jupyterLabTest; +let mainPanelId = '#jp-main-dock-panel'; +let menuPanelId = '#jp-menu-panel'; +let mainPanelTabCount = 1; + +const baseTestUse = { + tmpPath: tempPath, + mockSettings: { + '@jupyterlab/apputils-extension:notification': { + fetchNews: 'false' + } + } +} + +const isNotebook = process.env.NBGRADER_TEST_IS_NOTEBOOK; +if (isNotebook) { + test = notebookTest; + test.use({ + ...baseTestUse, + autoGoto: false + }); + mainPanelId = '#main-panel'; + menuPanelId = '#menu-panel'; + mainPanelTabCount = 2; +} +else { + test.use(baseTestUse); +} + +var exchange_dir:string; +var cache_dir: string; + +/* + * Create environment + */ +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + + const contents = galata.newContentsHelper(request); + + await contents.createDirectory(tmpPath); + + if (!isWindows) { + exchange_dir = fs.mkdtempSync( + path.join(os.tmpdir(), "nbgrader_exchange_test_") + ); + cache_dir = fs.mkdtempSync(path.join(os.tmpdir(), "nbgrader_cache_test_")); + } +}); + +/* + * delete temp directories at the end of test + */ +test.afterEach(async ({ request, tmpPath }) => { + if (!isWindows) { + fs.rmSync(exchange_dir, { recursive: true, force: true }); + fs.rmSync(cache_dir, { recursive: true, force: true }); + } + + if (request === undefined) throw new Error("Request is undefined."); + + const contents = galata.newContentsHelper(request); + await contents.deleteDirectory(tmpPath); + + if (await contents.fileExists("nbgrader_config.py")) + contents.deleteFile("nbgrader_config.py"); + contents.uploadFile( + path.resolve(__dirname, "./files/nbgrader_config.py"), + "nbgrader_config.py" + ); +}); + +/* + * Create a nbgrader file system + */ +const addCourses = async (request: APIRequestContext, tmpPath: string) => { + const contents = galata.newContentsHelper(request); + + // copy files from the user guide + const source_path = path.resolve( + __dirname, + "..", + "..", + "docs", + "source", + "user_guide", + "source" + ); + const submitted_path = path.resolve( + __dirname, + "..", + "..", + "docs", + "source", + "user_guide", + "submitted" + ); + + await contents.uploadDirectory(source_path, `${tmpPath}/source`); + + const students = ["bitdiddle", "hacker"]; + for (var i = 0; i < 2; i++) { + await contents.uploadDirectory( + path.resolve(submitted_path, students[i]), + `${tmpPath}/submitted/${students[i]}` + ); + } + + // Rename the files and directory to have spaces in names + await contents.renameDirectory( + `${tmpPath}/source/ps1`, + `${tmpPath}/source/Problem Set 1` + ); + await contents.renameFile( + `${tmpPath}/source/Problem Set 1/problem1.ipynb`, + `${tmpPath}/source/Problem Set 1/Problem 1.ipynb` + ); + await contents.renameFile( + `${tmpPath}/source/Problem Set 1/problem2.ipynb`, + `${tmpPath}/source/Problem Set 1/Problem 2.ipynb` + ); + await contents.renameDirectory( + `${tmpPath}/submitted/bitdiddle`, + `${tmpPath}/submitted/Bitdiddle` + ); + await contents.renameDirectory( + `${tmpPath}/submitted/Bitdiddle/ps1`, + `${tmpPath}/submitted/Bitdiddle/Problem Set 1` + ); + await contents.renameFile( + `${tmpPath}/submitted/Bitdiddle/Problem Set 1/problem1.ipynb`, + `${tmpPath}/submitted/Bitdiddle/Problem Set 1/Problem 1.ipynb` + ); + await contents.renameFile( + `${tmpPath}/submitted/Bitdiddle/Problem Set 1/problem2.ipynb`, + `${tmpPath}/submitted/Bitdiddle/Problem Set 1/Problem 2.ipynb` + ); + await contents.renameDirectory( + `${tmpPath}/submitted/hacker`, + `${tmpPath}/submitted/Hacker` + ); + await contents.renameDirectory( + `${tmpPath}/submitted/Hacker/ps1`, + `${tmpPath}/submitted/Hacker/Problem Set 1` + ); + await contents.renameFile( + `${tmpPath}/submitted/Hacker/Problem Set 1/problem1.ipynb`, + `${tmpPath}/submitted/Hacker/Problem Set 1/Problem 1.ipynb` + ); + await contents.renameFile( + `${tmpPath}/submitted/Hacker/Problem Set 1/problem2.ipynb`, + `${tmpPath}/submitted/Hacker/Problem Set 1/Problem 2.ipynb` + ); + + fs.copyFileSync( + path.resolve(testDir, "nbgrader_config.py"), + path.resolve(testDir, tmpPath, "nbgrader_config.py") + ); + + // generate some assignments + await executeCommand( + `nbgrader generate_assignment 'Problem Set 1' --IncludeHeaderFooter.header=${path.resolve( + testDir, + tmpPath, + "source", + "header.ipynb" + )}` + ); + + // autograde assignment + await executeCommand("nbgrader autograde 'Problem Set 1'"); +}; + +/* + * Open the formgrader tab + */ +const openFormgrader = async (page: IJupyterLabPageFixture) => { + await expect(page.locator(`${mainPanelId} .lm-TabBar-tab`)).toHaveCount( + mainPanelTabCount + ); + + await page.keyboard.press("Control+Shift+c"); + await page + .locator( + '#modal-command-palette li[data-command="nbgrader:open-formgrader"]' + ) + .click(); + + var tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + await expect(tabs).toHaveCount( + mainPanelTabCount + 1 + ); + + var newTab_label = tabs.last().locator(".lm-TabBar-tabLabel"); + await expect(newTab_label).toHaveText("Formgrader"); +}; + +/* + * Check formgrader breadcrumbs + */ +const checkFormgraderBreadcrumbs = async ( + iframe: Frame, + breadcrumbs: string[] +) => { + await expect(iframe.locator(".breadcrumb li")).toHaveCount( + breadcrumbs.length + ); + + const elements = iframe.locator(".breadcrumb li"); + const array: string[] = []; + for (var i = 0; i < (await elements.count()); i++) { + array.push((await elements.nth(i).textContent()) as string); + } + expect(array.sort()).toEqual(breadcrumbs.sort()); +}; + +/* + * Check formgrader breadcrumbs + */ +const checkFormgradeViewBreadcrumbs = async ( + iframe: Frame, + breadcrumbs: string[], + no_submission_count?: boolean +) => { + await expect(iframe.locator(".breadcrumb li a:visible")).toHaveCount( + breadcrumbs.length + ); + + const elements = iframe.locator(".breadcrumb li a:visible"); + const in_page_breadcrumbs: string[] = []; + for (var i = 0; i < (await elements.count()); i++) { + in_page_breadcrumbs.push( + ((await elements.nth(i).textContent()) as string).trim() + ); + } + + if (no_submission_count) { + expect(in_page_breadcrumbs.slice(0, -1).sort()).toEqual( + breadcrumbs.slice(0, -1).sort() + ); + expect( + in_page_breadcrumbs[in_page_breadcrumbs.length - 1].includes( + breadcrumbs[-1] + ) + ); + } else expect(in_page_breadcrumbs.sort()).toEqual(breadcrumbs.sort()); +}; + +/* + * Click on link by text + */ +const clickLink = async (iframe: Frame, text: string) => { + await iframe.click(`a:text-is('${text}')`); +}; + +// /* +// * Get comment box +// */ +// const get_comment_box = async (iframe:Frame, index:number) => { +// await expect(await iframe.locator('.comment').count()).toBeGreaterThanOrEqual(index); +// await expect poll(() => iframe.locator('.comment').count()).toBeGreaterThan(3); +// } + +/* + * Test opening formgrader tab from menu + */ +test("Open formgrader tab from menu", async ({ page, tmpPath }) => { + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + const nbgrader_menu = page.locator(`${menuPanelId} div.lm-MenuBar-itemLabel:text("Nbgrader")`); + const formgrader_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-formgrader"]'); + const tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); + const lastTab_label = tabs.last().locator('.lm-TabBar-tabLabel'); + + await expect(tabs).toHaveCount(mainPanelTabCount); + + // Check main menu exists + await expect(nbgrader_menu).toHaveCount(1); + + // Open formgrader from the menu + await nbgrader_menu.click(); + await formgrader_menu.click(); + + await expect(tabs).toHaveCount(mainPanelTabCount + 1); + await expect(lastTab_label).toHaveText('Formgrader'); + + // Close the last tab + await tabs.last().locator('.jp-icon-hover.lm-TabBar-tabCloseIcon').click(); + await expect(tabs).toHaveCount(mainPanelTabCount); + + // Open again + await nbgrader_menu.click(); + await formgrader_menu.click(); + + await expect(tabs).toHaveCount(mainPanelTabCount + 1); + await expect(lastTab_label).toHaveText('Formgrader'); +}); + +/* + * Load manage assignments + */ +test("Load manage assignments", async ({ page, baseURL, request, tmpPath }) => { + + /** + * Switch active tab (Notebook only) + * NOTE: + * this function must be used only for notebook tests, not for jupyterLab tests. + */ + const switchTab = async (page: IJupyterLabPageFixture, tabLabel: string) => { + if (isNotebook) { + await page.locator(`role=tab >> text=${tabLabel}`).click(); + } + }; + + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe and check for breadcrumbs + const iframe = page.mainFrame().childFrames()[0]; + + await checkFormgraderBreadcrumbs(iframe, ["Assignments"]); + expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader`)); + + // expect the current path in tree tab to be the tmpPath. + await switchTab(page, 'Files'); + await page.waitForSelector( + `.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${tmpPath}"]` + ); + + // click on the "Problem Set 1" link and check if file browser has changed of directory + await switchTab(page, 'Formgrader'); + + await clickLink(iframe, "Problem Set 1"); + await switchTab(page, 'Files'); + await page.waitForSelector( + `.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${tmpPath.concat( + "/source/Problem Set 1" + )}"]` + ); + + // click on preview link and check if file browser has changed of directory + await switchTab(page, 'Formgrader'); + await iframe.locator("td.preview .glyphicon").click(); + await switchTab(page, 'Files'); + await page.waitForSelector( + `.jp-FileBrowser-crumbs > span.jp-BreadCrumbs-item[title="${tmpPath.concat( + "/release/Problem Set 1" + )}"]` + ); + + // click on the first number of submissions and check that iframe has change URL + await switchTab(page, 'Formgrader'); + await iframe.click("td.num-submissions a"); + await checkFormgraderBreadcrumbs(iframe, ["Assignments", "Problem Set 1"]); + expect(iframe.url()).toBe( + encodeURI(`${baseURL}/formgrader/manage_submissions/Problem Set 1`) + ); +}); + +/* + * Load manage submissions + */ +test("Load manage submissions", async ({ page, baseURL, request, tmpPath }) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to manage_submissions + await iframe.goto(`${baseURL}/formgrader/manage_submissions/Problem Set 1`); + + // await iframe.click("td.num-submissions a"); + await checkFormgraderBreadcrumbs(iframe, ["Assignments", "Problem Set 1"]); + + // clicking on breadcrumbs should go back to manage_assignments + await clickLink(iframe, "Assignments"); + await checkFormgraderBreadcrumbs(iframe, ["Assignments"]); + expect(iframe.url()).toBe( + encodeURI(`${baseURL}/formgrader/manage_assignments`) + ); + + // page.goBack(); // seems endless + await iframe.goto(`${baseURL}/formgrader/manage_submissions/Problem Set 1`); + await checkFormgraderBreadcrumbs(iframe, ["Assignments", "Problem Set 1"]); + + // Check students links + await expect(iframe.locator("td.student-name")).toHaveCount(2); + for (var i = 0; i < (await iframe.locator("td.student-name").count()); i++) { + var student_name = (await iframe + .locator("td.student-name") + .nth(i) + .getAttribute("data-order")) as string; + var student_id = (await iframe + .locator("td.student-id") + .nth(i) + .getAttribute("data-order")) as string; + await clickLink(iframe, student_name); + await checkFormgraderBreadcrumbs(iframe, [ + "Students", + student_id, + "Problem Set 1", + ]); + expect(iframe.url()).toBe( + encodeURI( + `${baseURL}/formgrader/manage_students/${student_id}/Problem Set 1` + ) + ); + await iframe.goto(`${baseURL}/formgrader/manage_submissions/Problem Set 1`); + } +}); + +/* + * Load gradebook1 + */ +test("Load gradebook1", async ({ page, baseURL, request, tmpPath }) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to gradebook + await iframe.goto(`${baseURL}/formgrader/gradebook`); + + // await iframe.click("td.num-submissions a"); + await checkFormgraderBreadcrumbs(iframe, ["Manual Grading"]); + + // click on assignment + await clickLink(iframe, "Problem Set 1"); + await checkFormgraderBreadcrumbs(iframe, ["Manual Grading", "Problem Set 1"]); + expect(iframe.url()).toBe( + encodeURI(`${baseURL}/formgrader/gradebook/Problem Set 1`) + ); + + // test that the task column is present + await expect(iframe.locator('th:text-is("Avg. Task Score")')).toHaveCount(1); +}); + +/* + * Load gradebook2 + */ +test("Load gradebook2", async ({ page, baseURL, request, tmpPath }) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to gradebook Problem Set 1 + await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); + await checkFormgraderBreadcrumbs(iframe, ["Manual Grading", "Problem Set 1"]); + + // clicking on breadcrumbs should go back to manual grading + await iframe.click('ol.breadcrumb a:text-is("Manual Grading")'); + await checkFormgraderBreadcrumbs(iframe, ["Manual Grading"]); + expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/gradebook`)); + + // Send back iframe URL to gradebook Problem Set 1 + await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); + + // test problems links + await expect(iframe.locator("td.name")).toHaveCount(2); + for (var i = 0; i < (await iframe.locator("td.name").count()); i++) { + var problem_name = (await iframe + .locator("td.name") + .nth(i) + .getAttribute("data-order")) as string; + await clickLink(iframe, problem_name); + await checkFormgraderBreadcrumbs(iframe, [ + "Manual Grading", + "Problem Set 1", + problem_name, + ]); + expect(iframe.url()).toBe( + encodeURI(`${baseURL}/formgrader/gradebook/Problem Set 1/${problem_name}`) + ); + await expect(iframe.locator('th:text-is("Task Score")')).toHaveCount(1); + await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); + } +}); + +/* + * Load gradebook3 + */ +test("Load gradebook3", async ({ page, baseURL, request, tmpPath }) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to gradebook Problem Set 1 + await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1`); + + // for each problem + await expect(iframe.locator("td.name")).toHaveCount(2); + for (var i = 0; i < (await iframe.locator("td.name").count()); i++) { + var problem_name = (await iframe + .locator("td.name") + .nth(i) + .getAttribute("data-order")) as string; + await iframe.goto( + `${baseURL}/formgrader/gradebook/Problem Set 1/${problem_name}` + ); + await checkFormgraderBreadcrumbs(iframe, [ + "Manual Grading", + "Problem Set 1", + problem_name, + ]); + + // test click on breadcrumb 'Manual Grading' to change iframe URL, then go back + await iframe.click('ol.breadcrumb a:text-is("Manual Grading")'); + await checkFormgraderBreadcrumbs(iframe, ["Manual Grading"]); + expect(iframe.url()).toBe(encodeURI(`${baseURL}/formgrader/gradebook`)); + await iframe.goto( + `${baseURL}/formgrader/gradebook/Problem Set 1/${problem_name}` + ); + + // test click on breadcrumb 'Problem Set 1' to change iframe URL, then go back + await iframe.click('ol.breadcrumb a:text-is("Problem Set 1")'); + await checkFormgraderBreadcrumbs(iframe, [ + "Manual Grading", + "Problem Set 1", + ]); + await iframe.goto( + `${baseURL}/formgrader/gradebook/Problem Set 1/${problem_name}` + ); + + // test submissions links + await expect(iframe.locator("td.name")).toHaveCount(2); + for (var j = 0; j < (await iframe.locator("td.name").count()); j++) { + var submission_id = + parseInt( + (await iframe + .locator("td.name") + .nth(j) + .getAttribute("data-order")) as string + ) + 1; + await clickLink(iframe, `Submission #${submission_id.toString()}`); + await checkFormgradeViewBreadcrumbs(iframe, [ + "Manual Grading", + "Problem Set 1", + problem_name, + `Submission #${submission_id.toString()}`, + ]); + // TODO: find the submission ID to check URL ? + + if (problem_name == "Problem 1") { + await expect( + iframe.locator('span:text-is("Student\'s task")') + ).toHaveCount(1); + } + await iframe.goto( + `${baseURL}/formgrader/gradebook/Problem Set 1/${problem_name}` + ); + } + } +}); + +/* + * Gradebook3 show/hide students names + */ +test("Gradebook3 show hide names", async ({ + page, + baseURL, + request, + tmpPath, +}) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to gradebook Problem Set 1 + await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1/Problem 1`); + await checkFormgraderBreadcrumbs(iframe, [ + "Manual Grading", + "Problem Set 1", + "Problem 1", + ]); + + const col2 = iframe.locator("td.name").first(); + const hidden = iframe.locator("td .glyphicon.name-hidden").first(); + const shown = iframe.locator("td .glyphicon.name-shown").first(); + + // check shown and hidden elements + await expect(col2).toHaveText(/Submission #[1-2]/, { useInnerText: true }); + await expect(hidden).toBeVisible(); + await expect(shown).toBeHidden(); + + // show name + await hidden.click(); + await expect(col2).toHaveText(/(H, Alyssa|B, Ben)/, { useInnerText: true }); + await expect(hidden).toBeHidden(); + await expect(shown).toBeVisible(); + + // hide name again + await shown.click(); + await expect(col2).toHaveText(/Submission #[1-2]/, { useInnerText: true }); + await expect(hidden).toBeVisible(); + await expect(shown).toBeHidden(); +}); + +/* + * Toggle name visibility button + */ +test('Gradebook toggle names button', async ({ + page, + baseURL, + request, + tmpPath + }) => { + + test.skip(isWindows, 'This test does not work on Windows'); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to gradebook Problem Set 1 + await iframe.goto(`${baseURL}/formgrader/gradebook/Problem Set 1/Problem 1`); + await checkFormgraderBreadcrumbs(iframe, [ + "Manual Grading", + "Problem Set 1", + "Problem 1" + ]); + + const button = iframe.locator("[id='toggle_names']").first() + const hidden = iframe.locator("td .glyphicon.name-hidden").first(); + const shown = iframe.locator("td .glyphicon.name-shown").first(); + + // At the start, all names are hidden + await expect(button).toHaveText("Show All Names", {useInnerText: true}); + await expect(hidden).toBeVisible(); + await expect(shown).toBeHidden(); + + // Clicking should make names shown + await button.click(); + await expect(button).toHaveText("Hide All Names", {useInnerText: true}); + await expect(hidden).toBeHidden(); + await expect(shown).toBeVisible(); + + // If there is at least one hidden, button should default to showing all names + await shown.click(); + await expect(button).toHaveText("Show All Names", {useInnerText: true}); + await button.click(); + await expect(hidden).toBeHidden(); + await expect(shown).toBeVisible(); + +}); + +/* + * Load students and test students links + */ +test("Load students", async ({ page, baseURL, request, tmpPath }) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + // Change iframe URL to students + await iframe.goto(`${baseURL}/formgrader/manage_students`); + await checkFormgraderBreadcrumbs(iframe, ["Students"]); + + // Check students links + await expect(iframe.locator("td.name")).toHaveCount(3); + for (var i = 0; i < (await iframe.locator("td.name").count()); i++) { + var student_name = (await iframe + .locator("td.name") + .nth(i) + .getAttribute("data-order")) as string; + var student_id = (await iframe + .locator("td.id") + .nth(i) + .getAttribute("data-order")) as string; + await clickLink(iframe, student_name); + await checkFormgraderBreadcrumbs(iframe, ["Students", student_id]); + expect(iframe.url()).toBe( + encodeURI(`${baseURL}/formgrader/manage_students/${student_id}`) + ); + await expect(iframe.locator('th:text("Task Score")')).toHaveCount(1); + await iframe.goto(`${baseURL}/formgrader/manage_students`); + } +}); + +/* + * Test students submissions + */ +test("Load students submissions", async ({ + page, + baseURL, + request, + tmpPath, +}) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + const student_ids = ["Bitdiddle", "Hacker"]; + + for (var i = 0; i < 2; i++) { + // foreach loop does not work (raise at goto statement) + // Change iframe URL to student + await iframe.goto( + `${baseURL}/formgrader/manage_students/${student_ids[i]}` + ); + await checkFormgraderBreadcrumbs(iframe, ["Students", student_ids[i]]); + + // Click on an assignment + await clickLink(iframe, "Problem Set 1"); + // await iframe.waitForNavigation({'url': encodeURI(`${baseURL}/formgrader/manage_students/${student_ids[i]}/Problem Set 1`)}); + await checkFormgraderBreadcrumbs(iframe, [ + "Students", + student_ids[i], + "Problem Set 1", + ]); + expect(iframe.url()).toBe( + encodeURI( + `${baseURL}/formgrader/manage_students/${student_ids[i]}/Problem Set 1` + ) + ); + await expect(iframe.locator('th:text("Task Score")')).toHaveCount(1); + } +}); + +/* + * Switch views + */ +test("Switch views", async ({ page, baseURL, request, tmpPath }) => { + test.skip(isWindows, "This test does not work on Windows"); + + if (baseURL === undefined) throw new Error("BaseURL is undefined."); + + if (isNotebook) await page.goto(`tree/${tmpPath}`); + + // create environment + await createEnv(testDir, tmpPath, exchange_dir, cache_dir, isWindows); + await addCourses(request, tmpPath); + await openFormgrader(page); + + // get formgrader iframe + const iframe = page.mainFrame().childFrames()[0]; + + const pages = ["", "manage_assignments", "gradebook", "manage_students"]; + const links = [ + ["Manage Assignments", "Assignments", "manage_assignments"], + ["Manual Grading", "Manual Grading", "gradebook"], + ["Manage Students", "Students", "manage_students"], + ]; + + for (var i = 0; i < pages.length; i++) { + await iframe.goto(`${baseURL}/formgrader/${pages[i]}`); + for (var j = 0; j < links.length; j++) { + clickLink(iframe, links[j][0]); + await iframe.waitForNavigation({ + url: encodeURI(`${baseURL}/formgrader/${links[j][2]}`), + }); + await checkFormgraderBreadcrumbs(iframe, [links[j][1]]); + expect(iframe.url()).toBe( + encodeURI(`${baseURL}/formgrader/${links[j][2]}`) + ); + } + } +}); diff --git a/nbgrader/tests/labextension_ui-tests/jupyter_server_test_config.py b/nbgrader/tests/ui-tests/utils/jupyter_server_config.py similarity index 94% rename from nbgrader/tests/labextension_ui-tests/jupyter_server_test_config.py rename to nbgrader/tests/ui-tests/utils/jupyter_server_config.py index 7ebc1d00e..6d0a009e1 100644 --- a/nbgrader/tests/labextension_ui-tests/jupyter_server_test_config.py +++ b/nbgrader/tests/ui-tests/utils/jupyter_server_config.py @@ -3,7 +3,6 @@ opens the server to the world and provide access to JupyterLab JavaScript objects through the global window variable. """ -from tempfile import mkdtemp c.ServerApp.port = 8888 c.ServerApp.port_retries = 0 diff --git a/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py b/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py new file mode 100644 index 000000000..c21ee8bd8 --- /dev/null +++ b/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py @@ -0,0 +1,18 @@ +"""Server configuration for integration tests. +!! Never use this configuration in production because it +opens the server to the world and provide access to JupyterLab +JavaScript objects through the global window variable. +""" + +c.ServerApp.port = 8888 +c.ServerApp.port_retries = 0 +c.ServerApp.open_browser = False + +c.ServerApp.token = "" +c.ServerApp.password = "" +c.ServerApp.disable_check_xsrf = True + +c.JupyterNotebookApp.expose_app_in_browser = True + +# Uncomment to set server log level to debug level +# c.ServerApp.log_level = "DEBUG" diff --git a/nbgrader/tests/ui-tests/utils/notebook_fixtures.ts b/nbgrader/tests/ui-tests/utils/notebook_fixtures.ts new file mode 100644 index 000000000..1171f06e9 --- /dev/null +++ b/nbgrader/tests/ui-tests/utils/notebook_fixtures.ts @@ -0,0 +1,10 @@ +import { test as base } from '@jupyterlab/galata'; + +export const test = base.extend({ + waitForApplication: async ({ baseURL }, use, testInfo) => { + const waitIsReady = async (page): Promise => { + await page.waitForSelector('#main-panel'); + }; + await use(waitIsReady); + } +}); diff --git a/nbgrader/tests/ui-tests/utils/run_jupyter_lab.py b/nbgrader/tests/ui-tests/utils/run_jupyter_lab.py new file mode 100644 index 000000000..dc86b44df --- /dev/null +++ b/nbgrader/tests/ui-tests/utils/run_jupyter_lab.py @@ -0,0 +1,27 @@ +import sys +import os +from os.path import join +import shutil +import subprocess + +env = os.environ.copy() +root_dir = env.get("NBGRADER_TEST_DIR", '') + +if not env["NBGRADER_TEST_DIR"]: + raise Exception("Test directory not provided") +if not os.path.isdir(env["NBGRADER_TEST_DIR"]): + raise Exception(f"Test directory {env['NBGRADER_TEST_DIR']} doesn't exists") + +shutil.copyfile("./nbgrader/tests/ui-tests/utils/jupyter_server_config.py", + join(root_dir, "jupyter_server_config.py")) + +shutil.copyfile("./nbgrader/tests/ui-tests/files/nbgrader_config.py", + join(root_dir, "nbgrader_config.py")) + +subprocess.check_call([sys.executable, "-m", "jupyter", "server", "extension", "enable", "--user", "--py", "nbgrader"], env=env) +subprocess.check_call([sys.executable, "-m", "jupyter", "labextension", "develop", "--overwrite", "."]) + +os.chdir(root_dir) + +command = ["jupyter", "lab", "--config", "./jupyter_server_config.py"] +subprocess.run(command) diff --git a/nbgrader/tests/ui-tests/utils/run_jupyter_notebook.py b/nbgrader/tests/ui-tests/utils/run_jupyter_notebook.py new file mode 100644 index 000000000..550d2d1c7 --- /dev/null +++ b/nbgrader/tests/ui-tests/utils/run_jupyter_notebook.py @@ -0,0 +1,27 @@ +import sys +import os +from os.path import join +import shutil +import subprocess + +env = os.environ.copy() +root_dir = env.get("NBGRADER_TEST_DIR", '') + +if not env["NBGRADER_TEST_DIR"]: + raise Exception("Test directory not provided") +if not os.path.isdir(env["NBGRADER_TEST_DIR"]): + raise Exception(f"Test directory {env['NBGRADER_TEST_DIR']} doesn't exists") + +shutil.copyfile("./nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py", + join(root_dir, "jupyter_server_config_notebook.py")) + +shutil.copyfile("./nbgrader/tests/ui-tests/files/nbgrader_config.py", + join(root_dir, "nbgrader_config.py")) + +subprocess.check_call([sys.executable, "-m", "jupyter", "server", "extension", "enable", "--user", "--py", "nbgrader"], env=env) +subprocess.check_call([sys.executable, "-m", "jupyter", "labextension", "develop", "--overwrite", "."]) + +os.chdir(root_dir) + +command = ["jupyter", "notebook", "--config", "./jupyter_server_config_notebook.py"] +subprocess.run(command) diff --git a/nbgrader/tests/labextension_ui-tests/tests/test_utils.ts b/nbgrader/tests/ui-tests/utils/test_utils.ts similarity index 58% rename from nbgrader/tests/labextension_ui-tests/tests/test_utils.ts rename to nbgrader/tests/ui-tests/utils/test_utils.ts index b965f39a8..9b45b6618 100644 --- a/nbgrader/tests/labextension_ui-tests/tests/test_utils.ts +++ b/nbgrader/tests/ui-tests/utils/test_utils.ts @@ -6,11 +6,11 @@ import { promisify } from 'util'; import * as path from 'path'; import * as fs from 'fs'; -const async_exec = promisify(exec) +const asyncExec = promisify(exec) -export const execute_command = async (command: string) => { - const { stdout, stderr } = await async_exec(command); +export const executeCommand = async (command: string) => { + const { stdout, stderr } = await asyncExec(command); if (stderr) { if (stderr.includes("ERROR")){ console.log(`stderr: ${stderr}`); @@ -23,19 +23,13 @@ export const execute_command = async (command: string) => { /* * Create a copy of default config file, append exchange directories to config file, and populate database */ -export const create_env = async ( - page:IJupyterLabPageFixture, - tmpPath:string, - exchange_dir:string, - cache_dir:string, - is_windows:boolean - ): Promise => { - - var content = await page.locator('#jupyter-config-data').textContent(); - - if (content === null) throw new Error("Cannot get the server root directory."); - - const rootDir = JSON.parse(content)['serverRoot']; +export const createEnv = async ( + rootDir: string, + tmpPath: string, + exchange_dir: string, + cache_dir: string, + is_windows: boolean + ): Promise => { /* Add config_file to jupyter root directory, and change to that directory. TODO : test on windows, the config file may change (see nbextension test) @@ -65,39 +59,38 @@ c.Exchange.assignment_dir = r"${path.resolve(rootDir, tmpPath)}" } /* Fill database */ - await execute_command("nbgrader db assignment add 'Problem Set 1'"); - await execute_command("nbgrader db assignment add ps.01"); - await execute_command("nbgrader db student add Bitdiddle --first-name Ben --last-name B"); - await execute_command("nbgrader db student add Hacker --first-name Alyssa --last-name H"); - await execute_command("nbgrader db student add Reasoner --first-name Louis --last-name R"); + await executeCommand("nbgrader db assignment add 'Problem Set 1'"); + await executeCommand("nbgrader db assignment add ps.01"); + await executeCommand("nbgrader db student add Bitdiddle --first-name Ben --last-name B"); + await executeCommand("nbgrader db student add Hacker --first-name Alyssa --last-name H"); + await executeCommand("nbgrader db student add Reasoner --first-name Louis --last-name R"); - return rootDir; } /* * Wait for error modal */ -export const wait_for_error_modal = async (page:IJupyterLabPageFixture) => { +export const waitForErrorModal = async (page: IJupyterLabPageFixture) => { await expect(page.locator(".nbgrader-ErrorDialog")).toHaveCount(1); } /* * Close error modal */ -export const close_error_modal = async (page:IJupyterLabPageFixture) => { +export const closeErrorModal = async (page: IJupyterLabPageFixture) => { await page.locator(".nbgrader-ErrorDialog button.jp-Dialog-button").click(); } /* * Wait for success modal */ -export const wait_for_success_modal = async (page:IJupyterLabPageFixture) => { +export const waitForSuccessModal = async (page: IJupyterLabPageFixture) => { await expect(page.locator(".nbgrader-SuccessDialog")).toHaveCount(1); } /* * Close success modal */ -export const close_success_modal = async (page:IJupyterLabPageFixture) => { +export const closeSuccessModal = async (page: IJupyterLabPageFixture) => { await page.locator(".nbgrader-SuccessDialog button.jp-Dialog-button").click(); } diff --git a/nbgrader/tests/ui-tests/validate_assignment.spec.ts b/nbgrader/tests/ui-tests/validate_assignment.spec.ts new file mode 100644 index 000000000..5fcc3e754 --- /dev/null +++ b/nbgrader/tests/ui-tests/validate_assignment.spec.ts @@ -0,0 +1,263 @@ +import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from "@jupyterlab/galata"; +import { expect } from "@playwright/test"; +import * as path from "path"; +import * as fs from 'fs'; + +import { test as notebookTest } from "./utils/notebook_fixtures"; + +import { + waitForSuccessModal, + closeSuccessModal, + waitForErrorModal, + closeErrorModal, +} from "./utils/test_utils"; + +const testDir = process.env.NBGRADER_TEST_DIR || ''; +if (!testDir){ + throw new Error('Test directory not provided'); +} +if (!fs.existsSync(testDir)){ + throw new Error(`Test directory ${testDir} doesn't exists`); +} + +const tempPath = 'nbgrader-validate-assignments-test'; + +let test = jupyterLabTest; + +const baseTestUse = { + tmpPath: tempPath, + mockSettings: { + '@jupyterlab/apputils-extension:notification': { + fetchNews: 'false' + } + } +} + +const isNotebook = process.env.NBGRADER_TEST_IS_NOTEBOOK; +if (isNotebook) { + test = notebookTest; + test.use({ + ...baseTestUse, + autoGoto: false + }); +} +else { + test.use(baseTestUse); +} + +const nbFiles = [ + "data.txt", + "submitted-changed.ipynb", + "submitted-unchanged.ipynb", + "submitted-grade-cell-changed.ipynb", + "submitted-locked-cell-changed.ipynb", + "open_relative_file.ipynb", + "submitted-grade-cell-type-changed.ipynb", + "submitted-answer-cell-type-changed.ipynb", +]; + +/* + * Copy notebook files before each test + */ +test.beforeEach(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + + const contents = galata.newContentsHelper(request); + nbFiles.forEach((elem) => { + contents.uploadFile( + path.resolve(__dirname, `./files/${elem}`), + `${tmpPath}/${elem}` + ); + }); +}); + +/* + * Delete temp directory at the end of test + */ +test.afterAll(async ({ request, tmpPath }) => { + if (request === undefined) throw new Error("Request is undefined."); + + const contents = galata.newContentsHelper(request); + await contents.deleteDirectory(tmpPath); + + if (await contents.fileExists("nbgrader_config.py")) + contents.deleteFile("nbgrader_config.py"); + contents.uploadFile( + path.resolve(__dirname, "./files/nbgrader_config.py"), + "nbgrader_config.py" + ); +}); + +/* + * Open a notebook file. + * NOTES: + * This function is only useful if testing extension in JupyterLab. + * In Notebook tests we open a new browser tab instead. + */ +const openNotebook = async (page: IJupyterLabPageFixture, notebook: string) => { + var filename = notebook + ".ipynb"; + var tab_count = await page + .locator("#jp-main-dock-panel .lm-TabBar-tab") + .count(); + await page + .locator( + `#filebrowser .jp-DirListing-content .jp-DirListing-itemText span:text-is('${filename}')` + ) + .dblclick(); + await expect(page.locator("#jp-main-dock-panel .lm-TabBar-tab")).toHaveCount( + tab_count + 1 + ); + await page.waitForSelector(".jp-Notebook-cell"); +}; + +/* + * Test validation success + */ +test("Validation success", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/submitted-changed.ipynb`); + } else { + await openNotebook(page, "submitted-changed"); + } + + // click on validate, and expect a success modal + await page.locator("button.validate-button").click(); + await waitForSuccessModal(page); + + // close the modal + await closeSuccessModal(page); +}); + +/* + * Test validation failure + */ +test("Validation failure", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/submitted-unchanged.ipynb`); + } else { + await openNotebook(page, "submitted-unchanged"); + } + + // click on validate, and expect an error modal + await page.locator("button.validate-button").click(); + await waitForErrorModal(page); + + await page.waitForSelector(".nbgrader-ErrorDialog .validation-failed"); + + // close the modal + await closeErrorModal(page); +}); + +/* + * Test validation with grade cell changed + */ +test("Validation grade cell changed", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/submitted-grade-cell-changed.ipynb`); + } else { + await openNotebook(page, "submitted-grade-cell-changed"); + } + + // click on validate, and expect an error modal + await page.locator("button.validate-button").click(); + await waitForErrorModal(page); + + await page.waitForSelector(".nbgrader-ErrorDialog .validation-changed"); + + // close the modal + await closeErrorModal(page); +}); + +/* + * Test validation with locked cell changed + */ +test("Validation locked cell changed", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/submitted-locked-cell-changed.ipynb`); + } else { + await openNotebook(page, "submitted-locked-cell-changed"); + } + + // click on validate, and expect an error modal + await page.locator("button.validate-button").click(); + await waitForErrorModal(page); + + await page.waitForSelector(".nbgrader-ErrorDialog .validation-changed"); + + // close the modal + await closeErrorModal(page); +}); + +/* + * Test validation opening relative file + */ +test("Validation open relative file", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/open_relative_file.ipynb`); + } else { + await openNotebook(page, "open_relative_file"); + } + + // click on validate, and expect a success modal + await page.locator("button.validate-button").click(); + await waitForSuccessModal(page); + + await page.waitForSelector(".nbgrader-SuccessDialog .validation-success"); + + // close the modal + await closeSuccessModal(page); +}); + +/* + * Test validation with grade cell type changed + */ +test("Validation grade cell type changed", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/submitted-grade-cell-type-changed.ipynb`); + } else { + await openNotebook(page, "submitted-grade-cell-type-changed"); + } + + // click on validate, and expect an error modal + await page.locator("button.validate-button").click(); + await waitForErrorModal(page); + + await page.waitForSelector(".nbgrader-ErrorDialog .validation-type-changed"); + + // close the modal + await closeErrorModal(page); +}); + +/* + * Test validation with answer cell type changed + */ +test("Validation answer cell type changed", async ({ page, tmpPath }) => { + + // open the notebook + if (isNotebook) { + await page.goto(`notebooks/${tmpPath}/submitted-answer-cell-type-changed.ipynb`); + } else { + await openNotebook(page, "submitted-answer-cell-type-changed"); + } + + // click on validate, and expect an error modal + await page.locator("button.validate-button").click(); + await waitForErrorModal(page); + + await page.waitForSelector(".nbgrader-ErrorDialog .validation-type-changed"); + + // close the modal + await closeErrorModal(page); +}); diff --git a/package.json b/package.json index e50e9b813..d7591b8c4 100644 --- a/package.json +++ b/package.json @@ -35,8 +35,10 @@ "clean:labextension": "rimraf nbgrader/labextension", "clean:all": "jlpm clean:lib && jlpm clean:labextension", "install:labextension": "jlpm build", - "start:test": "python ./nbgrader/tests/labextension_ui-tests/run_jupyter_lab.py", + "start:test": "python ./nbgrader/tests/ui-tests/utils/run_jupyter_lab.py", + "start:test:notebook": "python ./nbgrader/tests/ui-tests/utils/run_jupyter_notebook.py", "test": "jlpm playwright test", + "test:notebook": "jlpm playwright test --config=playwright.notebook.config.ts", "watch": "run-p watch:src watch:labextension", "watch:src": "tsc -w", "watch:labextension": "jupyter labextension watch ." diff --git a/playwright.config.ts b/playwright.config.ts index fda2623b1..64b0fc504 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -5,16 +5,13 @@ import type { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { - testDir: './nbgrader/tests/labextension_ui-tests', + testDir: './nbgrader/tests/ui-tests', testMatch: '**/*.spec.ts', testIgnore: '**/node_modules/**/*', - timeout: 120000, + timeout: 60000, reporter: [[process.env.CI ? 'dot' : 'list'], ['html', { outputFolder: 'playwright-tests' }]], workers: 1, use: { - // Browser options - // headless: false, - // slowMo: 500, // Context options viewport: { width: 1024, height: 768 }, // Artifacts @@ -31,4 +28,3 @@ const config: PlaywrightTestConfig = { }; export default config; - diff --git a/playwright.notebook.config.ts b/playwright.notebook.config.ts new file mode 100644 index 000000000..457ad6ea9 --- /dev/null +++ b/playwright.notebook.config.ts @@ -0,0 +1,34 @@ +/** + * Configuration for Playwright using default from @jupyterlab/galata + */ + +import type { PlaywrightTestConfig } from '@playwright/test'; +import baseConfig from '@jupyterlab/galata/lib/playwright-config'; +import { GalataOptions } from '@jupyterlab/galata'; + +const config: PlaywrightTestConfig = { + ...baseConfig, + testDir: './nbgrader/tests/ui-tests', + testMatch: '**/*.spec.ts', + testIgnore: '**/node_modules/**/*', + timeout: 60000, + reporter: [[process.env.CI ? 'dot' : 'list'], ['html', { outputFolder: 'playwright-tests' }]], + workers: 1, + use: { + appPath: '', + // Context options + viewport: { width: 1024, height: 768 }, + // Artifacts + video: 'retain-on-failure' + }, + + webServer: { + command: 'jlpm start:test:notebook', + url: 'http://localhost:8888/tree', + timeout: 120 * 1000, + reuseExistingServer: !process.env.CI, + }, + +}; + +export default config; diff --git a/src/create_assignment/index.ts b/src/create_assignment/index.ts index 8a1727e9f..4dfb40965 100644 --- a/src/create_assignment/index.ts +++ b/src/create_assignment/index.ts @@ -47,7 +47,7 @@ function activate_extension ( panel.addWidget(createAssignmentWidget); panel.id = 'nbgrader-create_assignemnt'; panel.title.label = 'Create Assignment'; - panel.title.caption = 'nbgrader Create Assignment'; + panel.title.caption = 'Nbgrader Create Assignment'; app.shell.add(panel, 'right'); console.debug('Extension "create_assignment" activated.'); diff --git a/tasks.py b/tasks.py index dd74d38b9..68f6b5068 100755 --- a/tasks.py +++ b/tasks.py @@ -4,6 +4,7 @@ import sys import subprocess as sp import argparse +from tempfile import mkdtemp def echo(msg): @@ -31,8 +32,8 @@ def _check_if_directory_in_path(pth, target): return False -def docs(args): - del args # unused +def docs(ns, args): + del ns # unused run('git clean -fdX nbgrader/docs') if not WINDOWS: run('pytest --nbval-lax --current-env nbgrader/docs/source/user_guide/*.ipynb') @@ -42,8 +43,8 @@ def docs(args): run('make -C nbgrader/docs linkcheck') -def cleandocs(args): - del args # unused +def cleandocs(ns, args): + del ns # unused run('python nbgrader/docs/source/clear_docs.py') @@ -77,55 +78,62 @@ def _run_tests(mark, skip, junitxml, paralell=False): run("coverage combine || true") -def _run_ts_test(): - cmd = ['npx', 'playwright', 'test', '--retries=3'] +def _run_ts_test(args, notebook=False): + root_dir = mkdtemp(prefix="nbgrader-galata-") + os.environ["NBGRADER_TEST_DIR"] = root_dir + + if notebook: + os.environ["NBGRADER_TEST_IS_NOTEBOOK"] = "1" + + cmd = ['jlpm', f'test{":notebook" if notebook else ""}', '--retries=3'] + args run(" ".join(cmd)) -def tests(args): - if args.group == 'python': +def tests(ns, args): + if ns.group == 'python': _run_tests( - mark="not nbextensions", skip=args.skip, junitxml=args.junitxml, paralell=True) + mark="not nbextensions", skip=ns.skip, junitxml=ns.junitxml, paralell=True) - elif args.group == 'nbextensions': - _run_tests(mark="nbextensions", skip=args.skip, junitxml=args.junitxml) + elif ns.group == 'nbextensions': + _run_ts_test(args, notebook=True) - elif args.group =='labextensions': - _run_ts_test() + elif ns.group =='labextensions': + _run_ts_test(args) - elif args.group == 'docs': - docs(args) + elif ns.group == 'docs': + docs(ns) - elif args.group == 'all': - _run_tests(mark=None, skip=args.skip, junitxml=args.junitxml) + elif ns.group == 'all': + _run_tests(mark=None, skip=ns.skip, junitxml=ns.junitxml) _run_ts_test() + _run_ts_test(notebook=True) else: - raise ValueError("Invalid test group: {}".format(args.group)) + raise ValueError("Invalid test group: {}".format(ns.group)) -def aftersuccess(args): - if args.group in ('python', 'nbextensions'): +def aftersuccess(ns, args): + if ns.group in ('python'): run('codecov') else: echo('Nothing to do.') -def js(args): +def js(ns, args): run('npm install') run('./node_modules/.bin/bower install --config.interactive=false') - if args.clean: + if ns.clean: run('git clean -fdX nbgrader/server_extensions/formgrader/static/components') -def install(args): - if args.group == 'docs': +def install(ns, args): + if ns.group in ['docs', 'all']: cmd = 'pip install .[docs,tests]' else: cmd = 'pip install -e .[tests]' env = os.environ.copy() - if args.group not in ['all', 'labextensions']: + if ns.group not in ['all', 'labextensions', 'nbextensions']: env['SKIP_JUPYTER_BUILDER'] = '1' run(cmd, env=env) @@ -164,5 +172,5 @@ def install(args): install_parser.add_argument('--group', type=str, required=True) install_parser.set_defaults(func=install) - args = parser.parse_args() - args.func(args) + (ns, args) = parser.parse_known_args() + ns.func(ns, args) From 35949e74bf86e267f8119f9ff72b2af40fa52a0e Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 16 Nov 2022 09:13:28 +0100 Subject: [PATCH 11/27] Fix docs tests and insert nbextensions test in UI-tests --- ...-python-nbextensions.yml => test-docs-python.yml} | 12 ++---------- .../{test-labextensions.yml => test-extensions.yml} | 11 ++++++----- tasks.py | 4 ++-- 3 files changed, 10 insertions(+), 17 deletions(-) rename .github/workflows/{test-docs-python-nbextensions.yml => test-docs-python.yml} (90%) rename .github/workflows/{test-labextensions.yml => test-extensions.yml} (84%) diff --git a/.github/workflows/test-docs-python-nbextensions.yml b/.github/workflows/test-docs-python.yml similarity index 90% rename from .github/workflows/test-docs-python-nbextensions.yml rename to .github/workflows/test-docs-python.yml index 2eb7cdebb..a83597be8 100644 --- a/.github/workflows/test-docs-python-nbextensions.yml +++ b/.github/workflows/test-docs-python.yml @@ -1,7 +1,7 @@ # This is a GitHub workflow defining a set of jobs with a set of steps. # ref: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions # -name: Test python-nbextensions-doc +name: Test python-doc on: pull_request: @@ -29,7 +29,7 @@ jobs: fail-fast: false matrix: os: [windows-latest, ubuntu-22.04] - group: ["docs", "nbextensions", "python"] + group: ["docs", "python"] python: ["3.8", "3.9", "3.10", "3.11"] exclude: - os: windows-latest @@ -38,10 +38,6 @@ jobs: group: docs - python: "3.9" group: docs - - python: "3.10" - group: docs - - python: "3.8" - group: nbextensions steps: # This is how you set an environment variable in a GitHub workflow that # will be available in following steps as if you would used `export @@ -52,10 +48,6 @@ jobs: echo "GROUP=docs" >> $GITHUB_ENV echo "TIMEOUT_MINUTES=15" >> $GITHUB_ENV fi - if [ "${{ matrix.group }}" == "nbextensions" ]; then - echo "GROUP=nbextensions" >> $GITHUB_ENV - echo "TIMEOUT_MINUTES=25" >> $GITHUB_ENV - fi if [ "${{ matrix.group }}" == "python" ]; then echo "GROUP=python" >> $GITHUB_ENV echo "TIMEOUT_MINUTES=20" >> $GITHUB_ENV diff --git a/.github/workflows/test-labextensions.yml b/.github/workflows/test-extensions.yml similarity index 84% rename from .github/workflows/test-labextensions.yml rename to .github/workflows/test-extensions.yml index fc2acf5c4..0b841c301 100644 --- a/.github/workflows/test-labextensions.yml +++ b/.github/workflows/test-extensions.yml @@ -1,7 +1,7 @@ # This is a GitHub workflow defining a set of jobs with a set of steps. # ref: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions # -name: Test labextensions +name: Test extensions on: pull_request: @@ -30,13 +30,14 @@ jobs: matrix: os: [windows-latest, ubuntu-22.04] python: ["3.10", "3.11"] + group: ["labextensions", "nbextensions"] steps: # This is how you set an environment variable in a GitHub workflow that # will be available in following steps as if you would used `export # MY_ENV=my-value`. - name: Configure environment variables from job flags run: | - echo "GROUP=labextensions" >> $GITHUB_ENV + echo "GROUP=${{ matrix.group }}" >> $GITHUB_ENV - uses: actions/checkout@v2 - name: Install node uses: actions/setup-node@v1 @@ -52,18 +53,18 @@ jobs: - name: Install Python dependencies run: | python -m pip install --upgrade pip wheel setuptools - python tasks.py install --group=labextensions + python tasks.py install --group=${{ matrix.group }} pip freeze - name: Install Playwright run: | npx playwright install - name: Run playwright tests run: | - python tasks.py tests --group=labextensions + python tasks.py tests --group=${{ matrix.group }} - name: Upload Playwright Test report if: always() uses: actions/upload-artifact@v2 with: - name: nbgrader-playwright-tests-os_${{ matrix.os }}-python_${{ matrix.python }} + name: nbgrader-uitests-${{ matrix.group }}-${{ matrix.os }}-python${{ matrix.python }} path: | playwright-tests diff --git a/tasks.py b/tasks.py index 68f6b5068..4cfead1dc 100755 --- a/tasks.py +++ b/tasks.py @@ -32,7 +32,7 @@ def _check_if_directory_in_path(pth, target): return False -def docs(ns, args): +def docs(ns): del ns # unused run('git clean -fdX nbgrader/docs') if not WINDOWS: @@ -43,7 +43,7 @@ def docs(ns, args): run('make -C nbgrader/docs linkcheck') -def cleandocs(ns, args): +def cleandocs(ns): del ns # unused run('python nbgrader/docs/source/clear_docs.py') From 0fd8eccc62e91272ad2b565ecc28dfbfe488ab59 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 11 Jan 2023 11:25:54 +0100 Subject: [PATCH 12/27] Update dependencies to jupyterlab-4.0.0a32 and notebook-7.0.0a10 --- .github/workflows/test-extensions.yml | 2 +- demos/restart_demo.sh | 15 +- demos/utils.sh | 26 +- .../tests/ui-tests/assignment_list.spec.ts | 4 +- nbgrader/tests/ui-tests/course_list.spec.ts | 3 +- .../tests/ui-tests/create_assignement.spec.ts | 10 +- nbgrader/tests/ui-tests/files/blank.ipynb | 12 +- package.json | 28 +- pyproject.toml | 4 +- .../create_assignment_extension.ts | 167 ++++----- .../create_assignment_model.ts | 318 +++++++++--------- yarn.lock | 70 ++-- 12 files changed, 316 insertions(+), 343 deletions(-) diff --git a/.github/workflows/test-extensions.yml b/.github/workflows/test-extensions.yml index 0b841c301..8c2e50922 100644 --- a/.github/workflows/test-extensions.yml +++ b/.github/workflows/test-extensions.yml @@ -15,7 +15,7 @@ defaults: shell: bash jobs: - test_labextensions: + ui-test: runs-on: ${{ matrix.os }} timeout-minutes: 40 diff --git a/demos/restart_demo.sh b/demos/restart_demo.sh index ad621b72f..9a24dceae 100755 --- a/demos/restart_demo.sh +++ b/demos/restart_demo.sh @@ -69,19 +69,16 @@ install_nbgrader () { # Install global extensions, and disable them globally. We will re-enable # specific ones for different user accounts in each demo. - jupyter nbextension install --symlink --sys-prefix --py nbgrader --overwrite - jupyter nbextension disable --sys-prefix --py nbgrader jupyter labextension develop --overwrite . - jupyter labextension disable --level=sys_prefix nbgrader/assignment-list - jupyter labextension disable --level=sys_prefix nbgrader/formgrader - jupyter labextension disable --level=sys_prefix nbgrader/course-list - jupyter labextension disable --level=sys_prefix nbgrader/create-assignment - jupyter serverextension disable --sys-prefix --py nbgrader + jupyter labextension disable --level=sys_prefix nbgrader:assignment-list + jupyter labextension disable --level=sys_prefix nbgrader:formgrader + jupyter labextension disable --level=sys_prefix nbgrader:course-list + jupyter labextension disable --level=sys_prefix nbgrader:create-assignment + jupyter server extension disable --sys-prefix --py nbgrader # Everybody gets the validate extension, however. - jupyter nbextension enable --sys-prefix validate_assignment/main --section=notebook jupyter labextension enable --level=sys_prefix nbgrader/validate_assignment - jupyter serverextension enable --sys-prefix nbgrader.server_extensions.validate_assignment + jupyter server extension enable --sys-prefix nbgrader.server_extensions.validate_assignment # Reset exchange. rm -rf "${exchange_root}" diff --git a/demos/utils.sh b/demos/utils.sh index d30556591..d5259342b 100644 --- a/demos/utils.sh +++ b/demos/utils.sh @@ -69,9 +69,8 @@ enable_create_assignment () { HOME="/home/${USER}" local runas="sudo -u ${USER}" - ${runas} jupyter nbextension enable --user create_assignment/main - ${runas} jupyter labextension disable --level=user nbgrader/create-assignment - ${runas} jupyter labextension enable --level=user nbgrader/create-assignment + ${runas} jupyter labextension disable --level=user nbgrader:create-assignment + ${runas} jupyter labextension enable --level=user nbgrader:create-assignment } enable_formgrader () { @@ -79,10 +78,9 @@ enable_formgrader () { HOME="/home/${USER}" local runas="sudo -u ${USER}" - ${runas} jupyter nbextension enable --user formgrader/main --section=tree - ${runas} jupyter labextension disable --level=user nbgrader/formgrader - ${runas} jupyter labextension enable --level=user nbgrader/formgrader - ${runas} jupyter serverextension enable --user nbgrader.server_extensions.formgrader + ${runas} jupyter labextension disable --level=user nbgrader:formgrader + ${runas} jupyter labextension enable --level=user nbgrader:formgrader + ${runas} jupyter server extension enable --user nbgrader.server_extensions.formgrader } enable_assignment_list () { @@ -90,10 +88,9 @@ enable_assignment_list () { HOME="/home/${USER}" local runas="sudo -u ${USER}" - ${runas} jupyter nbextension enable --user assignment_list/main --section=tree - ${runas} jupyter labextension disable --level=user nbgrader/assignment-list - ${runas} jupyter labextension enable --level=user nbgrader/assignment-list - ${runas} jupyter serverextension enable --user nbgrader.server_extensions.assignment_list + ${runas} jupyter labextension disable --level=user nbgrader:assignment-list + ${runas} jupyter labextension enable --level=user nbgrader:assignment-list + ${runas} jupyter server extension enable --user nbgrader.server_extensions.assignment_list } enable_course_list () { @@ -101,10 +98,9 @@ enable_course_list () { HOME="/home/${USER}" local runas="sudo -u ${USER}" - ${runas} jupyter nbextension enable --user course_list/main --section=tree - ${runas} jupyter labextension disable --level=user nbgrader/course-list - ${runas} jupyter labextension enable --level=user nbgrader/course-list - ${runas} jupyter serverextension enable --user nbgrader.server_extensions.course_list + ${runas} jupyter labextension disable --level=user nbgrader:course-list + ${runas} jupyter labextension enable --level=user nbgrader:course-list + ${runas} jupyter server extension enable --user nbgrader.server_extensions.course_list } create_course () { diff --git a/nbgrader/tests/ui-tests/assignment_list.spec.ts b/nbgrader/tests/ui-tests/assignment_list.spec.ts index 8356edc65..c1deb004d 100644 --- a/nbgrader/tests/ui-tests/assignment_list.spec.ts +++ b/nbgrader/tests/ui-tests/assignment_list.spec.ts @@ -1,5 +1,5 @@ -import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from '@jupyterlab/galata'; -import { APIRequestContext, expect, Locator, Page } from '@playwright/test'; +import { test as jupyterLabTest, galata, IJupyterLabPageFixture, expect } from '@jupyterlab/galata'; +import { APIRequestContext, Locator } from '@playwright/test'; import * as path from 'path'; import * as os from 'os'; import * as fs from 'fs'; diff --git a/nbgrader/tests/ui-tests/course_list.spec.ts b/nbgrader/tests/ui-tests/course_list.spec.ts index 5cffc828b..de49f189b 100644 --- a/nbgrader/tests/ui-tests/course_list.spec.ts +++ b/nbgrader/tests/ui-tests/course_list.spec.ts @@ -1,5 +1,4 @@ -import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from "@jupyterlab/galata"; -import { expect } from "@playwright/test"; +import { test as jupyterLabTest, galata, IJupyterLabPageFixture, expect } from "@jupyterlab/galata"; import * as fs from "fs"; import * as os from "os"; diff --git a/nbgrader/tests/ui-tests/create_assignement.spec.ts b/nbgrader/tests/ui-tests/create_assignement.spec.ts index e30e425be..af4220517 100644 --- a/nbgrader/tests/ui-tests/create_assignement.spec.ts +++ b/nbgrader/tests/ui-tests/create_assignement.spec.ts @@ -1,10 +1,10 @@ -import { test as jupyterLabTest, galata, IJupyterLabPageFixture } from "@jupyterlab/galata"; -import { expect } from "@playwright/test"; +import { test as jupyterLabTest, galata, IJupyterLabPageFixture, expect } from "@jupyterlab/galata"; import * as path from "path"; import * as fs from 'fs'; import { test as notebookTest } from './utils/notebook_fixtures'; import { waitForErrorModal, closeErrorModal } from "./utils/test_utils"; +import { NotebookPanel } from "@jupyterlab/notebook"; const testDir = process.env.NBGRADER_TEST_DIR || ''; if (!testDir){ @@ -100,7 +100,7 @@ const openNotebook = async (page: IJupyterLabPageFixture, notebook: string) => { */ const saveCurrentNotebook = async (page: IJupyterLabPageFixture) => { return await page.evaluate(async () => { - var nb = window.jupyterapp.shell.currentWidget; + var nb = window.jupyterapp.shell.currentWidget as NotebookPanel; await nb.context.save(); }); @@ -148,8 +148,8 @@ const getCellMetadata = async ( cell_number: number = 0 ) => { return await page.evaluate((cell_num) => { - var nb = window.jupyterapp.shell.currentWidget; - return nb.model.cells.get(cell_num).metadata.get("nbgrader"); + var nb = window.jupyterapp.shell.currentWidget as NotebookPanel; + return nb.model?.cells.get(cell_num)?.getMetadata("nbgrader"); }, cell_number); }; diff --git a/nbgrader/tests/ui-tests/files/blank.ipynb b/nbgrader/tests/ui-tests/files/blank.ipynb index 610e781bc..29ab262ed 100644 --- a/nbgrader/tests/ui-tests/files/blank.ipynb +++ b/nbgrader/tests/ui-tests/files/blank.ipynb @@ -2,17 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "this is a cell\n" - ] - } - ], + "outputs": [], "source": [ "print(\"this is a code cell\")" ] diff --git a/package.json b/package.json index d7591b8c4..526b57da8 100644 --- a/package.json +++ b/package.json @@ -44,21 +44,21 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter-notebook/application": "^7.0.0-alpha.7", - "@jupyter-notebook/tree": "^7.0.0-alpha.7", - "@jupyterlab/application": "^4.0.0-alpha.15", - "@jupyterlab/apputils": "^4.0.0-alpha.15", - "@jupyterlab/cells": "^4.0.0-alpha.15", - "@jupyterlab/coreutils": "^6.0.0-alpha.15", - "@jupyterlab/launcher": "^4.0.0-alpha.15", - "@jupyterlab/notebook": "^4.0.0-alpha.15", - "@jupyterlab/services": "^7.0.0-alpha.15", - "@jupyterlab/settingregistry": "^4.0.0-alpha.15" + "@jupyter-notebook/application": "^7.0.0-alpha.10", + "@jupyter-notebook/tree": "^7.0.0-alpha.10", + "@jupyterlab/application": "^4.0.0-alpha.17", + "@jupyterlab/apputils": "^4.0.0-alpha.17", + "@jupyterlab/cells": "^4.0.0-alpha.17", + "@jupyterlab/coreutils": "^6.0.0-alpha.17", + "@jupyterlab/launcher": "^4.0.0-alpha.17", + "@jupyterlab/notebook": "^4.0.0-alpha.17", + "@jupyterlab/services": "^7.0.0-alpha.17", + "@jupyterlab/settingregistry": "^4.0.0-alpha.17" }, "devDependencies": { - "@jupyterlab/builder": "^4.0.0-alpha.15", - "@jupyterlab/galata": "^5.0.0-alpha.15", - "@playwright/test": "^1.21.1", + "@jupyterlab/builder": "^4.0.0-alpha.17", + "@jupyterlab/galata": "^5.0.0-alpha.17", + "@playwright/test": "^1.29.0", "@types/codemirror": "^5.60.5", "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", @@ -75,7 +75,7 @@ "stylelint-config-recommended": "^6.0.0", "stylelint-config-standard": "~24.0.0", "stylelint-prettier": "^2.0.0", - "typescript": "~4.7.3" + "typescript": "~4.9.3" }, "sideEffects": [ "style/*.css", diff --git a/pyproject.toml b/pyproject.toml index a28ea7708..6b9e32a92 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,11 +38,11 @@ dependencies = [ "jsonschema>=3", "jupyter_client<9", "jupyter_server>=1.16", - "jupyterlab>=4.0.0a30", + "jupyterlab>=4.0.0a32", "jupyterlab_server", "nbclient>=0.6.1", "nbconvert>=6", - "notebook>=7.0.0a7", + "notebook>=7.0.0a10", "python-dateutil>=2.8", "rapidfuzz>=1.8", "requests>=2.26", diff --git a/src/create_assignment/create_assignment_extension.ts b/src/create_assignment/create_assignment_extension.ts index c4488fdac..0b31ad6f8 100644 --- a/src/create_assignment/create_assignment_extension.ts +++ b/src/create_assignment/create_assignment_extension.ts @@ -1,16 +1,8 @@ import { ILabShell } from '@jupyterlab/application'; -import { - Dialog, - Styling -} from '@jupyterlab/apputils'; -import { - Cell, - ICellModel -} from '@jupyterlab/cells'; +import { Dialog, Styling } from '@jupyterlab/apputils'; +import { Cell, ICellModel } from '@jupyterlab/cells'; import { IChangedArgs } from '@jupyterlab/coreutils'; -import { - DocumentRegistry -} from '@jupyterlab/docregistry'; +import { DocumentRegistry } from '@jupyterlab/docregistry'; import { INotebookModel, INotebookTracker, @@ -18,25 +10,12 @@ import { NotebookPanel } from '@jupyterlab/notebook'; import { CellList } from '@jupyterlab/notebook/lib/celllist'; -import { - IObservableJSON, - IObservableList, - IObservableMap, -} from '@jupyterlab/observables'; -import { - ReadonlyPartialJSONValue -} from '@lumino/coreutils'; -import { - Message -} from '@lumino/messaging'; -import { - ISignal, - Signal -} from '@lumino/signaling'; -import { - Panel, - Widget -} from '@lumino/widgets'; +import { IObservableList } from '@jupyterlab/observables'; +import { IMapChange } from '@jupyter/ydoc'; +import { ReadonlyPartialJSONValue } from '@lumino/coreutils'; +import { Message } from '@lumino/messaging'; +import { ISignal, Signal} from '@lumino/signaling'; +import { Panel, Widget } from '@lumino/widgets'; import { CellModel, @@ -230,7 +209,7 @@ class CellWidget extends Panel { super(); this._notebookPanel = notebookPanel; this._cellModel = cellModel; - this._cellModel.metadata.changed.connect( + this._cellModel.metadataChanged.connect( this._onMetadataChange, this ); this._initLayout(); @@ -252,7 +231,7 @@ class CellWidget extends Panel { } private cleanNbgraderData(cellModel: ICellModel): void { - CellModel.cleanNbgraderData(cellModel.metadata, cellModel.type); + CellModel.cleanNbgraderData(cellModel, cellModel.type); } /** @@ -266,7 +245,7 @@ class CellWidget extends Panel { if (this.isDisposed) { return; } - this.cellModel?.metadata?.changed?.disconnect( + this.cellModel.metadataChanged.disconnect( this._onMetadataChange, this ); this.node.removeEventListener('click', this._onClick); @@ -337,10 +316,10 @@ class CellWidget extends Panel { } private _onMetadataChange ( - metadata: IObservableJSON, - changedArgs: IObservableMap.IChangedArgs + cellModel: ICellModel, + changedArgs: IMapChange ) { - const nbgraderData = CellModel.getNbgraderData(metadata); + const nbgraderData = CellModel.getNbgraderData(cellModel); const toolData = CellModel.newToolData(nbgraderData, this.cellModel.type); this._updateValues(toolData); } @@ -353,13 +332,12 @@ class CellWidget extends Panel { toolData.id = this._gradeIdInput.value; } else { - const nbgraderData = CellModel.getNbgraderData( - this.cellModel.metadata); - if (nbgraderData?.grade_id == null) { + const nbgraderData = CellModel.getNbgraderData(this.cellModel); + if (nbgraderData?.data.grade_id == null) { toolData.id = 'cell-' + this._randomString(16); } else { - toolData.id = nbgraderData.grade_id; + toolData.id = nbgraderData.data.grade_id; } this._gradeIdInput.value = toolData.id; } @@ -367,7 +345,7 @@ class CellWidget extends Panel { toolData.points = this._pointsInput.valueAsNumber; } const data = CellModel.newNbgraderData(toolData); - CellModel.setNbgraderData(data, this.cellModel.metadata); + CellModel.setNbgraderData(data, this.cellModel); } } @@ -413,9 +391,9 @@ class CellWidget extends Panel { private async _initMetadata(cellModel: ICellModel) { this.cleanNbgraderData(cellModel); - const nbgraderData = CellModel.getNbgraderData(cellModel.metadata); + const nbgraderData = CellModel.getNbgraderData(cellModel); const toolData = CellModel.newToolData(nbgraderData, this.cellModel.type); - CellModel.clearCellType(cellModel.metadata); + CellModel.clearCellType(cellModel); this._updateDisplayClass(); this._updateValues(toolData); } @@ -532,7 +510,7 @@ class CellWidget extends Panel { } private _updateDisplayClass(): void { - const data = CellModel.getNbgraderData(this.cellModel.metadata); + const data = CellModel.getNbgraderData(this.cellModel); if (CellModel.isRelevantToNbgrader(data)) { this.addClass(CSS_MOD_HIGHLIGHT); } @@ -658,7 +636,7 @@ class NotebookWidget extends Panel { } if (this._cellWidgets != null) { for (const widgets of this._cellWidgets) { - this._removeCellWidget(widgets[0]); + this._removeCellWidget(widgets[1]); } } this.notebookPanel?.content?.activeCellChanged?.disconnect( @@ -676,7 +654,6 @@ class NotebookWidget extends Panel { this._activeCellModel = null; this._cellMetadataChanged = null; this._cellWidgets = null; - this._metadataChangedHandlers = null; this._notebookPanel = null; super.dispose(); } @@ -710,7 +687,7 @@ class NotebookWidget extends Panel { break; } case 'remove': { - this._removeCellWidget(args.oldValues[0]); + this._cleanCellWidgets(); break; } case 'set': { @@ -742,8 +719,7 @@ class NotebookWidget extends Panel { } cellWidget.click.connect(this._activeCellWidgetListener, this); const metadataChangedHandler = this._getMetadataChangedHandler(cellWidget); - cellModel.metadata.changed.connect(metadataChangedHandler); - this._metadataChangedHandlers.set(cellWidget, metadataChangedHandler); + cellModel.metadataChanged.connect(metadataChangedHandler); return cellWidget; } @@ -760,22 +736,26 @@ class NotebookWidget extends Panel { /** * Called when the selected cell on notebook panel changes. */ - private async _onActiveCellChange(notebook: Notebook, cell: Cell) { - if (this._activeCellModel != null) { - const activeWidget = this._cellWidgets.get(this._activeCellModel); - if (activeWidget != null) { - activeWidget.setActive(false); - } + private _onActiveCellChange( + notebook: Notebook, + cell: Cell + ): void { + + if (cell !== null ){ + cell.ready.then(() => { + this._cellWidgets.get(this._activeCellModel)?.setActive(false); + this._activeCellModel = cell.model; + const activeWidget = this._cellWidgets.get(cell.model); + activeWidget?.setActive(true); + if (activeWidget) { + this._scrollIntoViewNearest(activeWidget); + } + }) } - if (cell != null) { - await cell.ready; - const activeWidget = this._cellWidgets.get(cell.model); - if (activeWidget != null) { - activeWidget.setActive(true); - this._scrollIntoViewNearest(activeWidget); - } + else { + this._cellWidgets.get(this._activeCellModel)?.setActive(false); + this._activeCellModel = null; } - this._activeCellModel = cell.model; } /** @@ -802,11 +782,14 @@ class NotebookWidget extends Panel { } } - private _getMetadataChangedHandler(cellWidget: CellWidget): - (metadata: IObservableJSON, - args: IObservableMap.IChangedArgs) => void { - return (metadata: IObservableJSON, - args: IObservableMap.IChangedArgs) => { + private _getMetadataChangedHandler(cellWidget: CellWidget): ( + cellModel: ICellModel, + changedArgs: IMapChange + ) => void { + return ( + cellModel: ICellModel, + changedArgs: IMapChange + ) => { this.cellMetadataChanged.emit(cellWidget); } } @@ -816,33 +799,35 @@ class NotebookWidget extends Panel { this.insertWidget(index, cellWidget); } - private _removeCellWidget(cell: ICellModel): void { + private _removeCellWidget(widget: CellWidget): void { + widget.click?.disconnect(this._activeCellWidgetListener, this); + this._cellWidgets.delete(widget.cellModel); + widget.dispose(); + } + + private _cleanCellWidgets(): void { if (this._cellWidgets == null) { return; } - const cellWidget = this._cellWidgets.get(cell); - if (cellWidget == null) { - return; - } - cellWidget.click?.disconnect(this._activeCellWidgetListener, this); - const handler = this._metadataChangedHandlers?.get(cellWidget); - if (handler != null) { - cell.metadata?.changed?.disconnect(handler); - } - this._cellWidgets.delete(cell); - cellWidget.dispose(); + const widgetsToRemove = Array + .from(this._cellWidgets.values()) + .filter(widget => widget.cellModel.isDisposed); + + widgetsToRemove.forEach(widget => { + this._removeCellWidget(widget); + }); } private _validateIds(): void { const set = new Set(); const valid = /^[a-zA-Z0-9_\-]+$/; for (let cellModel of this.notebookPanel.model.cells) { - const data = CellModel.getNbgraderData(cellModel.metadata); + const nbgraderData = CellModel.getNbgraderData(cellModel); - if (data == null) continue; + if (nbgraderData == null) continue; - const id = data.grade_id; + const id = nbgraderData.data.grade_id; if (!valid.test(id)) { this._warnInvalidId(true, false, id); @@ -860,8 +845,8 @@ class NotebookWidget extends Panel { private _validateSchemaVersion(): void { for (let cellModel of this.notebookPanel.model.cells) { - const data = CellModel.getNbgraderData(cellModel.metadata) - let version = data == null ? null : data.schema_version; + const nbgraderData = CellModel.getNbgraderData(cellModel) + let version = (nbgraderData === null) ? null : nbgraderData.data.schema_version; version = version === undefined ? 0 : version; if (version != null && version < NBGRADER_SCHEMA_VERSION) { this._warnSchemaVersion(version); @@ -933,13 +918,9 @@ class NotebookWidget extends Panel { } } - private _activeCellModel = null as ICellModel; + private _activeCellModel: ICellModel | null = null; private _cellMetadataChanged = new Signal(this); private _cellWidgets = new Map(); - private _metadataChangedHandlers = new Map< - CellWidget, - (metadata: IObservableJSON, - args: IObservableMap.IChangedArgs) => void>(); private _notebookPanel: NotebookPanel; } @@ -982,9 +963,9 @@ class NotebookPanelWidget extends Panel { private _calcTotalPoints(): number { let totalPoints = 0; for (let cellModel of this._notebookWidget.notebookPanel.model.cells) { - const data = CellModel.getNbgraderData(cellModel.metadata); - const points = (data == null || data.points == null - || !CellModel.isGraded(data)) ? 0 : data.points; + const nbgraderData = CellModel.getNbgraderData(cellModel); + const points = (nbgraderData === null || nbgraderData.data.points === null + || !nbgraderData?.isGradable()) ? 0 : nbgraderData.data?.points; totalPoints += points; } return totalPoints; diff --git a/src/create_assignment/create_assignment_model.ts b/src/create_assignment/create_assignment_model.ts index f707d58ea..48efd47e9 100644 --- a/src/create_assignment/create_assignment_model.ts +++ b/src/create_assignment/create_assignment_model.ts @@ -1,9 +1,6 @@ +import { ICellModel } from '@jupyterlab/cells'; import * as nbformat from '@jupyterlab/nbformat'; -import { - IObservableJSON -} from '@jupyterlab/observables'; - import { JSONObject, ReadonlyJSONObject @@ -13,7 +10,7 @@ const NBGRADER_KEY = 'nbgrader'; export const NBGRADER_SCHEMA_VERSION = 3; /** - * A namespace for conversions between {@link NbgraderData} and + * A namespace for conversions between {@link NbgraderMetadata} and * {@link ToolData} and for reading and writing to notebook cells' metadata. */ export namespace CellModel { @@ -22,19 +19,22 @@ export namespace CellModel { * * @returns Whether cleaning occurred. */ - export function cleanNbgraderData(cellMetadata: IObservableJSON, - cellType: nbformat.CellType): boolean { - const data = CellModel.getNbgraderData(cellMetadata); - if (data == null || !PrivateNbgraderData.isInvalid(data, cellType)) { + export function cleanNbgraderData( + cellModel: ICellModel, + cellType: nbformat.CellType + ): boolean { + const data = CellModel.getNbgraderData(cellModel); + if (data === null || !data?.isInvalid(cellType)) { return false; } - data.schema_version = NBGRADER_SCHEMA_VERSION; - data.solution = false; - data.grade = false; - data.locked = false; - data.task = false; - CellModel.setNbgraderData(data, cellMetadata); + data.data.schema_version= NBGRADER_SCHEMA_VERSION; + data.data.solution= false; + data.data.grade= false; + data.data.locked= false; + data.data.task= false; + + setNbgraderData(data, cellModel); return true; } @@ -42,15 +42,15 @@ export namespace CellModel { /** * Removes the "cell_type" property from the nbgrader data. */ - export function clearCellType(cellMetadata: IObservableJSON): void { - const data = cellMetadata.get(NBGRADER_KEY) as JSONObject; + export function clearCellType(cellModel: ICellModel): void { + const data = cellModel.getMetadata(NBGRADER_KEY) as JSONObject; if (data == null) { return; } if ('cell_type' in data) { data['cell_type'] = undefined; } - cellMetadata.set(NBGRADER_KEY, data); + cellModel.setMetadata(NBGRADER_KEY, data); } /** @@ -58,83 +58,82 @@ export namespace CellModel { * * @returns The nbgrader data, or null if it doesn't exist. */ - export function getNbgraderData(cellMetadata: IObservableJSON): NbgraderData { - if (cellMetadata == null) { + export function getNbgraderData(cellModel: ICellModel): NbgraderMetadata { + if (cellModel === null) { return null; } - const nbgraderValue = cellMetadata.get('nbgrader'); - if (nbgraderValue == null) { + const nbgraderValue = cellModel.getMetadata(NBGRADER_KEY); + if (nbgraderValue === undefined) { return null; } - return nbgraderValue.valueOf() as NbgraderData; + return new NbgraderMetadata(nbgraderValue.valueOf() as NbgraderData); } /** * @returns True if the cell is gradable. */ - export function isGraded(data: NbgraderData): boolean { - return PrivateNbgraderData.isGraded(data); + export function isGraded(data: NbgraderMetadata): boolean { + return data?.isGradable(); } /** * @returns True if the cell relevant to nbgrader. A cell is relevant if it is * gradable or contains autograder tests. */ - export function isRelevantToNbgrader(data: NbgraderData): boolean { - return PrivateNbgraderData.isGraded(data) - || PrivateNbgraderData.isSolution(data); + export function isRelevantToNbgrader(data: NbgraderMetadata): boolean { + return data?.isGradable() || data?.isSolution(); } /** - * Converts {@link ToolData} to {@link NbgraderData}. + * Converts {@link ToolData} to {@link NbgraderMetadata}. * * @returns The converted data, or null if the nbgrader cell type is not set. */ - export function newNbgraderData(data: ToolData): NbgraderData { + export function newNbgraderData(data: ToolData): NbgraderMetadata { if (data.type === '') { return null; } - const nbgraderData = new NbgraderData(); - nbgraderData.grade = PrivateToolData.getGrade(data); - nbgraderData.grade_id = PrivateToolData.getGradeId(data); - nbgraderData.locked = PrivateToolData.getLocked(data); - nbgraderData.points = PrivateToolData.getPoints(data); - nbgraderData.schema_version = PrivateToolData.getSchemeaVersion(); - nbgraderData.solution = PrivateToolData.getSolution(data); - nbgraderData.task = PrivateToolData.getTask(data); - return nbgraderData; + + const nbgraderData = { + grade: PrivateToolData.getGrade(data), + grade_id: PrivateToolData.getGradeId(data), + locked: PrivateToolData.getLocked(data), + points: PrivateToolData.getPoints(data), + schema_version: PrivateToolData.getSchemeaVersion(), + solution: PrivateToolData.getSolution(data), + task: PrivateToolData.getTask(data) + } + return new NbgraderMetadata(nbgraderData); } /** - * Converts {@link NbgraderData} to {@link ToolData}. + * Converts {@link NbgraderMetadata} to {@link ToolData}. * * @param data The data to convert. Can be null. * @param cellType The notebook cell widget type. */ - export function newToolData(data: NbgraderData, cellType: nbformat.CellType): + export function newToolData(data: NbgraderMetadata, cellType: nbformat.CellType): ToolData { const toolData = new ToolData; - if (PrivateNbgraderData.isInvalid(data, cellType)) { + if (data?.isInvalid(cellType)) { toolData.type = ''; return toolData; } - toolData.type = PrivateNbgraderData.getType(data, cellType); + toolData.type = data?.getType(cellType) || ''; if (toolData.type === '') { return toolData; } - if (PrivateNbgraderData.isGrade(data) - || PrivateNbgraderData.isSolution(data) - || PrivateNbgraderData.isLocked(data)) { - toolData.id = PrivateNbgraderData.getGradeId(data); + if (data?.isGrade() || data?.isSolution() || data?.isLocked()) { + toolData.id = data?.getGradeId() || ''; } - if (PrivateNbgraderData.isGraded(data)) { - toolData.points = PrivateNbgraderData.getPoints(data); + if (data?.isGradable()) { + toolData.points = data?.getPoints() || 0; } - toolData.locked = PrivateNbgraderData.isLocked(data); + toolData.locked = data?.isLocked() || false; return toolData; } @@ -145,94 +144,21 @@ export namespace CellModel { * @param data The nbgrader data. If null, the nbgrader entry, if it exists, * will be removed from the metadata. */ - export function setNbgraderData(data: NbgraderData, cellMetadata: - IObservableJSON): void { - if (data == null) { - if (cellMetadata.has(NBGRADER_KEY)) { - cellMetadata.delete(NBGRADER_KEY); + export function setNbgraderData( + data: NbgraderMetadata, + cellModel: ICellModel): void + { + if (data === null) { + if (cellModel.getMetadata(NBGRADER_KEY)) { + cellModel.deleteMetadata(NBGRADER_KEY); } return; } - const currentDataJson = cellMetadata.get(NBGRADER_KEY); - const currentData = currentDataJson == null ? null : - currentDataJson.valueOf() as NbgraderData; - if (currentData != data) { - cellMetadata.set(NBGRADER_KEY, data.toJson()); - } + cellModel.setMetadata(NBGRADER_KEY, data.toJson()); } } -namespace PrivateNbgraderData { - export function getGradeId(nbgraderData: NbgraderData): string { - if (nbgraderData == null || nbgraderData.grade_id == null) { - return ''; - } - return nbgraderData.grade_id; - } - - export function getPoints(nbgraderData: NbgraderData): number { - if (nbgraderData == null) { - return 0; - } - return PrivateNbgraderData._to_float(nbgraderData.points); - } - - export function getSchemeaVersion(nbgraderData: NbgraderData): number { - if (nbgraderData === null) { - return 0; - } - return nbgraderData.schema_version; - } - - export function getType(nbgraderData: NbgraderData, - cellType: nbformat.CellType): CellType { - if (PrivateNbgraderData.isTask(nbgraderData)) { - return 'task'; - } else if (PrivateNbgraderData.isSolution(nbgraderData) - && isGrade(nbgraderData)) { - return 'manual'; - } else if (PrivateNbgraderData.isSolution(nbgraderData) - && cellType === 'code') { - return 'solution'; - } else if (PrivateNbgraderData.isGrade(nbgraderData) - && cellType === 'code') { - return 'tests'; - } else if (PrivateNbgraderData.isLocked(nbgraderData)) { - return 'readonly'; - } else { - return ''; - } - } - - export function isGrade(nbgraderData: NbgraderData): boolean { - return nbgraderData != null && nbgraderData.grade === true; - } - - export function isGraded(nbgraderData: NbgraderData): boolean { - return PrivateNbgraderData.isGrade(nbgraderData) - || PrivateNbgraderData.isTask(nbgraderData); - } - - export function isInvalid(nbgraderData: NbgraderData, - cellType: nbformat.CellType): boolean { - return !PrivateNbgraderData.isTask(nbgraderData) && cellType !== 'code' - && (PrivateNbgraderData.isSolution(nbgraderData) - != PrivateNbgraderData.isGrade(nbgraderData)); - } - - export function isLocked(nbgraderData: NbgraderData): boolean { - return !PrivateNbgraderData.isSolution(nbgraderData) - && (PrivateNbgraderData.isGraded(nbgraderData) - || (nbgraderData != null && nbgraderData.locked === true)); - } - - export function isSolution(nbgraderData: NbgraderData): boolean { - return nbgraderData != null && nbgraderData.solution === true; - } - - export function isTask(nbgraderData: NbgraderData): boolean { - return nbgraderData != null && nbgraderData.task === true; - } +namespace Private { export function _to_float(val: any): number { if (val == null || val === '') { @@ -255,7 +181,7 @@ namespace PrivateToolData { } export function getGradeId(data: ToolData): string { - return data.id == null ? '' : data.id; + return data.id === null ? '' : data.id; } export function getLocked(data: ToolData): boolean { @@ -289,45 +215,127 @@ namespace PrivateToolData { } } +export interface INbgraderMetadata { + + isGrade(): boolean; + isGradable(): boolean; + isInvalid(cellType: nbformat.CellType): boolean; + isLocked(): boolean; + isTask(): boolean; + isSolution(): boolean; + toJson(): ReadonlyJSONObject; + + data: NbgraderData; +} /** * Dummy class for representing the nbgrader cell metadata. */ -export class NbgraderData { - grade: boolean; - grade_id: string; - locked: boolean; - points: number; - schema_version: number; - solution: boolean; - task: boolean; +export class NbgraderMetadata implements INbgraderMetadata{ + + constructor(data: NbgraderData) { + + this._data = data; + } + + get data(): NbgraderData { + return this._data; + } + set data(value: NbgraderData) { + this._data = value; + } + + getGradeId(): string { + return this.data.grade_id || ''; + } + + getPoints(): number { + return Private._to_float(this.data.points || 0); + } + + getSchemaVersion(): number { + return this.data?.schema_version || NBGRADER_SCHEMA_VERSION; + } + + getType(cellType: nbformat.CellType): CellType { + if (this.isTask()) { + return 'task'; + } else if (this.isSolution() && this.isGrade()) { + return 'manual'; + } else if (this.isSolution() && cellType === 'code') { + return 'solution'; + } else if (this.isGrade() && cellType === 'code') { + return 'tests'; + } else if (this.isLocked()) { + return 'readonly'; + } else { + return ''; + } + } + + isGrade(): boolean { + return this._data.grade || false; + } + + isGradable(): boolean { + return this.isGrade() || this.isTask(); + } + + isInvalid(cellType: nbformat.CellType): boolean { + return !this.isTask() + && cellType !== 'code' + && (this.isSolution() !== this.isGrade()); + } + + isLocked(): boolean { + return !this.isSolution() && (this.isGradable() || this._data.locked); + } + + isTask(): boolean { + return this._data.task || false; + } + + isSolution(): boolean { + return this._data.solution || false; + } toJson(): ReadonlyJSONObject { const json = {} as JSONObject; - if (this.grade != null) { - json['grade'] = this.grade; + if (this.data.grade !== undefined) { + json['grade'] = this.data.grade; } - if (this.grade_id != null) { - json['grade_id'] = this.grade_id; + if (this.data.grade_id !== undefined) { + json['grade_id'] = this.data.grade_id; } - if (this.locked != null) { - json['locked'] = this.locked; + if (this.data.locked !== undefined) { + json['locked'] = this.data.locked; } - if (this.points != null) { - json['points'] = this.points; + if (this.data.points !== undefined) { + json['points'] = this.data.points; } - if (this.schema_version != null) { - json['schema_version'] = this.schema_version; + if (this.data.schema_version !== undefined) { + json['schema_version'] = this.data.schema_version; } - if (this.solution != null) { - json['solution'] = this.solution; + if (this.data.solution !== undefined) { + json['solution'] = this.data.solution; } - if (this.task != null) { - json['task'] = this.task; + if (this.data.task !== undefined) { + json['task'] = this.data.task; } return json; } + + private _data: NbgraderData = {}; } +type NbgraderData = { + grade?: boolean; + grade_id?: string; + locked?: boolean; + points?: number; + schema_version?: number; + solution?: boolean; + task?: boolean; +} /** * Dummy class for representing the UI input/output values. */ diff --git a/yarn.lock b/yarn.lock index ce99e3697..ef82ff2ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -424,7 +424,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/application@npm:^7.0.0-alpha.7, @jupyter-notebook/application@npm:^7.0.0-beta.4": +"@jupyter-notebook/application@npm:^7.0.0-alpha.10, @jupyter-notebook/application@npm:^7.0.0-beta.4": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/application@npm:7.0.0-beta.4" dependencies: @@ -443,7 +443,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/tree@npm:^7.0.0-alpha.7": +"@jupyter-notebook/tree@npm:^7.0.0-alpha.10": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/tree@npm:7.0.0-beta.4" dependencies: @@ -481,7 +481,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application@npm:^4.0.0-alpha.15, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": +"@jupyterlab/application@npm:^4.0.0-alpha.17, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/application@npm:4.0.2" dependencies: @@ -509,7 +509,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/apputils@npm:^4.0.0-alpha.15, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": +"@jupyterlab/apputils@npm:^4.0.0-alpha.17, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": version: 4.1.2 resolution: "@jupyterlab/apputils@npm:4.1.2" dependencies: @@ -552,7 +552,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.0.0-alpha.15": +"@jupyterlab/builder@npm:^4.0.0-alpha.17": version: 4.0.2 resolution: "@jupyterlab/builder@npm:4.0.2" dependencies: @@ -593,7 +593,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/cells@npm:^4.0.0-alpha.15, @jupyterlab/cells@npm:^4.0.2": +"@jupyterlab/cells@npm:^4.0.0-alpha.17, @jupyterlab/cells@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/cells@npm:4.0.2" dependencies: @@ -721,7 +721,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.0.0-alpha.15, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": +"@jupyterlab/coreutils@npm:^6.0.0-alpha.17, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": version: 6.0.2 resolution: "@jupyterlab/coreutils@npm:6.0.2" dependencies: @@ -891,7 +891,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/galata@npm:^5.0.0-alpha.15": +"@jupyterlab/galata@npm:^5.0.0-alpha.17": version: 5.0.2 resolution: "@jupyterlab/galata@npm:5.0.2" dependencies: @@ -918,7 +918,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/launcher@npm:^4.0.0-alpha.15": +"@jupyterlab/launcher@npm:^4.0.0-alpha.17": version: 4.0.2 resolution: "@jupyterlab/launcher@npm:4.0.2" dependencies: @@ -981,7 +981,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/notebook@npm:^4.0.0-alpha.15, @jupyterlab/notebook@npm:^4.0.2": +"@jupyterlab/notebook@npm:^4.0.0-alpha.17, @jupyterlab/notebook@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/notebook@npm:4.0.2" dependencies: @@ -1082,7 +1082,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/services@npm:^7.0.0-alpha.15, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": +"@jupyterlab/services@npm:^7.0.0-alpha.17, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": version: 7.0.2 resolution: "@jupyterlab/services@npm:7.0.2" dependencies: @@ -1101,7 +1101,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^4.0.0-alpha.15, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": +"@jupyterlab/settingregistry@npm:^4.0.0-alpha.17, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/settingregistry@npm:4.0.2" dependencies: @@ -1568,7 +1568,7 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.21.1, @playwright/test@npm:^1.32.2": +"@playwright/test@npm:^1.29.0, @playwright/test@npm:^1.32.2": version: 1.35.0 resolution: "@playwright/test@npm:1.35.0" dependencies: @@ -5426,19 +5426,19 @@ __metadata: version: 0.0.0-use.local resolution: "nbgrader@workspace:." dependencies: - "@jupyter-notebook/application": ^7.0.0-alpha.7 - "@jupyter-notebook/tree": ^7.0.0-alpha.7 - "@jupyterlab/application": ^4.0.0-alpha.15 - "@jupyterlab/apputils": ^4.0.0-alpha.15 - "@jupyterlab/builder": ^4.0.0-alpha.15 - "@jupyterlab/cells": ^4.0.0-alpha.15 - "@jupyterlab/coreutils": ^6.0.0-alpha.15 - "@jupyterlab/galata": ^5.0.0-alpha.15 - "@jupyterlab/launcher": ^4.0.0-alpha.15 - "@jupyterlab/notebook": ^4.0.0-alpha.15 - "@jupyterlab/services": ^7.0.0-alpha.15 - "@jupyterlab/settingregistry": ^4.0.0-alpha.15 - "@playwright/test": ^1.21.1 + "@jupyter-notebook/application": ^7.0.0-alpha.10 + "@jupyter-notebook/tree": ^7.0.0-alpha.10 + "@jupyterlab/application": ^4.0.0-alpha.17 + "@jupyterlab/apputils": ^4.0.0-alpha.17 + "@jupyterlab/builder": ^4.0.0-alpha.17 + "@jupyterlab/cells": ^4.0.0-alpha.17 + "@jupyterlab/coreutils": ^6.0.0-alpha.17 + "@jupyterlab/galata": ^5.0.0-alpha.17 + "@jupyterlab/launcher": ^4.0.0-alpha.17 + "@jupyterlab/notebook": ^4.0.0-alpha.17 + "@jupyterlab/services": ^7.0.0-alpha.17 + "@jupyterlab/settingregistry": ^4.0.0-alpha.17 + "@playwright/test": ^1.29.0 "@types/codemirror": ^5.60.5 "@typescript-eslint/eslint-plugin": ^4.8.1 "@typescript-eslint/parser": ^4.8.1 @@ -5455,7 +5455,7 @@ __metadata: stylelint-config-recommended: ^6.0.0 stylelint-config-standard: ~24.0.0 stylelint-prettier: ^2.0.0 - typescript: ~4.7.3 + typescript: ~4.9.3 languageName: unknown linkType: soft @@ -7154,23 +7154,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~4.7.3": - version: 4.7.4 - resolution: "typescript@npm:4.7.4" +"typescript@npm:~4.9.3": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db languageName: node linkType: hard -"typescript@patch:typescript@~4.7.3#~builtin": - version: 4.7.4 - resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=65a307" +"typescript@patch:typescript@~4.9.3#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e + checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d languageName: node linkType: hard From 1b323303228abf297cf9a5585824037d85321547 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 11 Jan 2023 11:39:44 +0100 Subject: [PATCH 13/27] Downgrade dependency to Notebook as it breaks installation --- package.json | 4 ++-- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 526b57da8..b8ad0a318 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter-notebook/application": "^7.0.0-alpha.10", - "@jupyter-notebook/tree": "^7.0.0-alpha.10", + "@jupyter-notebook/application": "^7.0.0-alpha.9", + "@jupyter-notebook/tree": "^7.0.0-alpha.9", "@jupyterlab/application": "^4.0.0-alpha.17", "@jupyterlab/apputils": "^4.0.0-alpha.17", "@jupyterlab/cells": "^4.0.0-alpha.17", diff --git a/pyproject.toml b/pyproject.toml index 6b9e32a92..564fe41cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ dependencies = [ "jupyterlab_server", "nbclient>=0.6.1", "nbconvert>=6", - "notebook>=7.0.0a10", + "notebook>=7.0.0a9", "python-dateutil>=2.8", "rapidfuzz>=1.8", "requests>=2.26", From bb62fa4e6e8d9c5093a2865a62da9f0c742250e0 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 11 Jan 2023 14:13:37 +0100 Subject: [PATCH 14/27] bump to Notebook-7.0.0a10 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b8ad0a318..526b57da8 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,8 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter-notebook/application": "^7.0.0-alpha.9", - "@jupyter-notebook/tree": "^7.0.0-alpha.9", + "@jupyter-notebook/application": "^7.0.0-alpha.10", + "@jupyter-notebook/tree": "^7.0.0-alpha.10", "@jupyterlab/application": "^4.0.0-alpha.17", "@jupyterlab/apputils": "^4.0.0-alpha.17", "@jupyterlab/cells": "^4.0.0-alpha.17", From e8355919f2c757b12f88d616167a3e3c22c21a9b Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Wed, 11 Jan 2023 14:38:36 +0100 Subject: [PATCH 15/27] update dependencies --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 564fe41cf..bf40fd667 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ dependencies = [ "Jinja2>=3", "jsonschema>=3", "jupyter_client<9", - "jupyter_server>=1.16", + "jupyter_server>=2", "jupyterlab>=4.0.0a32", "jupyterlab_server", "nbclient>=0.6.1", @@ -47,7 +47,6 @@ dependencies = [ "rapidfuzz>=1.8", "requests>=2.26", "sqlalchemy>=1.4,<3", - "traitlets>5.0,<6", ] version = "0.8.4" @@ -71,6 +70,7 @@ tests = [ "jupyter_packaging", "nbval", "pytest-cov", + "pytest-jupyter", "pytest-rerunfailures", "pytest-tornasync", "pytest-xdist", From 325f0cca44eeb284496a7193448181baad2b1376 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 12 Jan 2023 13:59:15 +0100 Subject: [PATCH 16/27] Refactor the extensions for a better managment of the menu and palettecommand in Notebook --- schema/assignment-list.json | 23 -- schema/course-list.json | 23 -- schema/formgrader.json | 23 -- src/assignment_list/index.ts | 97 +---- src/course_list/index.ts | 86 +---- .../create_assignment_extension.ts | 11 + src/create_assignment/index.ts | 57 +-- src/formgrader/index.ts | 100 +---- src/index.ts | 364 +++++++++++++++++- src/validate_assignment/index.ts | 39 +- 10 files changed, 382 insertions(+), 441 deletions(-) delete mode 100644 schema/assignment-list.json delete mode 100644 schema/course-list.json delete mode 100644 schema/formgrader.json diff --git a/schema/assignment-list.json b/schema/assignment-list.json deleted file mode 100644 index 4487c2cdc..000000000 --- a/schema/assignment-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "jupyter.lab.shortcuts": [], - "title": "assignment-list", - "description": "nbgrader assignment list settings.", - "type": "object", - "properties": {}, - "jupyter.lab.menus": { - "main": [ - { - "id": "jp-mainmenu-nbgrader-menu", - "label": "Nbgrader", - "rank": 80, - "items": [ - { - "command": "nbgrader:open-assignment-list", - "rank": 0 - } - ] - } - ] - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schema/course-list.json b/schema/course-list.json deleted file mode 100644 index 566a0a241..000000000 --- a/schema/course-list.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "jupyter.lab.shortcuts": [], - "title": "assignment-list", - "description": "nbgrader assignment list settings.", - "type": "object", - "properties": {}, - "jupyter.lab.menus": { - "main": [ - { - "id": "jp-mainmenu-nbgrader-menu", - "label": "Nbgrader", - "rank": 80, - "items": [ - { - "command": "nbgrader:open-course-list", - "rank": 2 - } - ] - } - ] - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/schema/formgrader.json b/schema/formgrader.json deleted file mode 100644 index f2c16051f..000000000 --- a/schema/formgrader.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "jupyter.lab.shortcuts": [], - "title": "assignment-list", - "description": "nbgrader assignment list settings.", - "type": "object", - "properties": {}, - "jupyter.lab.menus": { - "main": [ - { - "id": "jp-mainmenu-nbgrader-menu", - "label": "Nbgrader", - "rank": 80, - "items": [ - { - "command": "nbgrader:open-formgrader", - "rank": 1 - } - ] - } - ] - }, - "additionalProperties": false -} \ No newline at end of file diff --git a/src/assignment_list/index.ts b/src/assignment_list/index.ts index 65ce26e30..a93c680b5 100644 --- a/src/assignment_list/index.ts +++ b/src/assignment_list/index.ts @@ -1,38 +1,18 @@ -import { - ILayoutRestorer, - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; - -import { - ICommandPalette, - MainAreaWidget, - WidgetTracker -} from '@jupyterlab/apputils'; +import { JupyterFrontEnd } from '@jupyterlab/application'; -import { - Widget, - // TabPanel -} from '@lumino/widgets'; +import { Widget } from '@lumino/widgets'; import { PageConfig } from '@jupyterlab/coreutils'; -import { INotebookTree } from '@jupyter-notebook/tree'; - import { requestAPI, CourseList, AssignmentList } from './assignmentlist'; - -const PLUGIN_ID = 'nbgrader:assignment-list'; -const COMMAND_NAME = "nbgrader:open-assignment-list"; - - -class AssignmentListWidget extends Widget { +export class AssignmentListWidget extends Widget { app: JupyterFrontEnd; @@ -168,74 +148,3 @@ class AssignmentListWidget extends Widget { } } - -export const assignment_list_extension: JupyterFrontEndPlugin = { - id: PLUGIN_ID, - autoStart: true, - requires: [ICommandPalette], - optional: [ILayoutRestorer, INotebookTree], - activate: ( - app: JupyterFrontEnd, - palette: ICommandPalette, - restorer: ILayoutRestorer | null, - notebookTree: INotebookTree | null - )=> { - - // Declare a widget variable - let widget: MainAreaWidget; - - // Add an application command - const command: string = COMMAND_NAME; - - // Track the widget state - let tracker = new WidgetTracker>({ - namespace: 'nbgrader-assignment-list' - }); - - app.commands.addCommand(command,{ - label: 'Assignment List', - execute: () => { - if(!widget || widget.isDisposed){ - const content = new AssignmentListWidget(app); - widget = new MainAreaWidget({content}); - widget.id = 'nbgrader-assignment-list'; - widget.addClass('nbgrader-mainarea-widget'); - widget.title.label = 'Assignments'; - widget.title.closable = true; - } - if(!tracker.has(widget)){ - // Track the state of the widget for later restoration - tracker.add(widget); - } - - // Attach the widget to the main area if it's not there - if(!widget.isAttached){ - if (notebookTree){ - notebookTree.addWidget(widget); - notebookTree.currentWidget = widget; - } - else app.shell.add(widget, 'main'); - } - - widget.content.update(); - - app.shell.activateById(widget.id); - } - }); - - // Add the command to the palette - palette.addItem({command, category: 'nbgrader'}); - - // Restore the widget state - if (restorer != null) { - restorer.restore(tracker, { - command, - name: () => 'nbgrader-assignment-list' - }); - } - - console.debug('JupyterLab extension assignment-list is activated!'); - } -}; - -export default assignment_list_extension; diff --git a/src/course_list/index.ts b/src/course_list/index.ts index 9b47b50ba..7d059319d 100644 --- a/src/course_list/index.ts +++ b/src/course_list/index.ts @@ -1,21 +1,10 @@ -import { - ILayoutRestorer, - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; - -import { ICommandPalette, MainAreaWidget, WidgetTracker } from '@jupyterlab/apputils'; +import { JupyterFrontEnd } from '@jupyterlab/application'; import { Widget } from '@lumino/widgets'; import { requestAPI, CourseList } from './courselist'; -import { INotebookTree } from '@jupyter-notebook/tree'; - -const PLUGIN_ID = "nbgrader:course-list"; -const COMMAND_NAME = "nbgrader:open-course-list"; - -class CourseListWidget extends Widget { +export class CourseListWidget extends Widget { version_alert: HTMLDivElement; courselist: CourseList; app: JupyterFrontEnd; @@ -96,74 +85,3 @@ class CourseListWidget extends Widget { }); } } - -/** - * Initialization data for the course_list extension. - */ -export const course_list_extension: JupyterFrontEndPlugin = { - id: PLUGIN_ID, - autoStart: true, - requires: [ICommandPalette], - optional: [ILayoutRestorer, INotebookTree], - - activate: ( - app: JupyterFrontEnd, - palette: ICommandPalette, - restorer: ILayoutRestorer | null, - notebookTree: INotebookTree | null - ) => { - - let widget: MainAreaWidget; - - const command:string = COMMAND_NAME; - - // Track the widget state - let tracker = new WidgetTracker>({ - namespace: 'nbgrader-course-list' - }); - - app.commands.addCommand(command, { - label: 'Course List', - execute: () => { - if (!widget || widget.isDisposed) { - const content = new CourseListWidget(app); - widget = new MainAreaWidget({content}); - widget.id = 'nbgrader-course-list'; - widget.addClass('nbgrader-mainarea-widget'); - widget.title.label = 'Courses'; - widget.title.closable = true; - } - if (!tracker.has(widget)) { - tracker.add(widget); - } - - // Attach the widget to the main area if it's not there - if(!widget.isAttached){ - if (notebookTree){ - notebookTree.addWidget(widget); - notebookTree.currentWidget = widget; - } - else app.shell.add(widget, 'main'); - } - - widget.content.update(); - - app.shell.activateById(widget.id); - } - }) - - palette.addItem({ command, category: "nbgrader" }); - - // Restore the widget state - if (restorer != null){ - restorer.restore(tracker, { - command, - name: () => 'nbgrader-course-list' - }); - } - - console.debug('JupyterLab extension course-list is activated!'); - } -}; - -export default course_list_extension; diff --git a/src/create_assignment/create_assignment_extension.ts b/src/create_assignment/create_assignment_extension.ts index 0b31ad6f8..6e92847ba 100644 --- a/src/create_assignment/create_assignment_extension.ts +++ b/src/create_assignment/create_assignment_extension.ts @@ -103,6 +103,17 @@ export class CreateAssignmentWidget extends Panel { } } + /** + * Is the widget available (is there a notebook file visible in main area) ? + */ + isAvailable(): boolean { + if (this._activeNotebook === null) { + return false; + } else { + return this._activeNotebook.isVisible; + } + } + /* * Check if the widget must be visible : * -> is there an active Notebook visible in main panel ? diff --git a/src/create_assignment/index.ts b/src/create_assignment/index.ts index 4dfb40965..f7b047680 100644 --- a/src/create_assignment/index.ts +++ b/src/create_assignment/index.ts @@ -1,56 +1 @@ -import { - JupyterFrontEnd, - JupyterFrontEndPlugin, - ILabShell -} from '@jupyterlab/application'; - -import { - INotebookTracker -} from '@jupyterlab/notebook'; - -import { - Panel -} from '@lumino/widgets'; - - -import { - CreateAssignmentWidget -} from './create_assignment_extension'; - -const PLUGIN_ID = "nbgrader:create-assignment" - -/** - * Initialization data for the create_assignment extension. - */ -export const create_assignment_extension: JupyterFrontEndPlugin = { - id: PLUGIN_ID, - autoStart: true, - requires: [INotebookTracker], - optional: [ILabShell], - activate: activate_extension -}; - -/** - * - * @param app JupyterFrontEnd - * @param tracker track any changes on the Notebook - * @param labShell used only to track if the main area of JupyterLab has a Notebook in frontend. - */ -function activate_extension ( - app: JupyterFrontEnd, - tracker: INotebookTracker, - labShell: ILabShell | null -) { - const panel = new Panel(); - panel.node.style.overflowY = 'auto'; - const createAssignmentWidget = new CreateAssignmentWidget(tracker, labShell); - panel.addWidget(createAssignmentWidget); - panel.id = 'nbgrader-create_assignemnt'; - panel.title.label = 'Create Assignment'; - panel.title.caption = 'Nbgrader Create Assignment'; - - app.shell.add(panel, 'right'); - console.debug('Extension "create_assignment" activated.'); -} - -export default create_assignment_extension; +export * from './create_assignment_extension'; diff --git a/src/formgrader/index.ts b/src/formgrader/index.ts index 80ca3a1ed..1a2b65f51 100644 --- a/src/formgrader/index.ts +++ b/src/formgrader/index.ts @@ -1,26 +1,8 @@ -import { - ILayoutRestorer, - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; +import { JupyterFrontEnd } from '@jupyterlab/application'; -import { URLExt } from '@jupyterlab/coreutils'; +import { IFrame } from '@jupyterlab/apputils'; -import { ServerConnection } from '@jupyterlab/services'; - -import { - ICommandPalette, - MainAreaWidget, - WidgetTracker, - IFrame -} from '@jupyterlab/apputils'; - -import { INotebookTree } from '@jupyter-notebook/tree'; - -const PLUGIN_ID = "nbgrader:formgrader" -const COMMAND_NAME = "nbgrader:open-formgrader" - -class FormgraderWidget extends IFrame { +export class FormgraderWidget extends IFrame { app: JupyterFrontEnd; @@ -50,79 +32,3 @@ class FormgraderWidget extends IFrame { } } }; - -/** - * Initialization data for the formfrader extension. - */ -export const formgrader_extension: JupyterFrontEndPlugin = { - id: PLUGIN_ID, - autoStart: true, - requires: [ICommandPalette], - optional: [ILayoutRestorer, INotebookTree], - activate: ( - app: JupyterFrontEnd, - palette: ICommandPalette, - restorer: ILayoutRestorer | null, - notebookTree: INotebookTree | null - )=> { - // Declare a widget variable - let widget: MainAreaWidget; - - // Add an application command - const command: string = COMMAND_NAME; - - // Track the widget state - let tracker = new WidgetTracker>({ - namespace: 'nbgrader-formgrader' - }); - - app.commands.addCommand(command,{ - label: 'Formgrader', - execute: async args => { - if(!widget || widget.isDisposed){ - const settings = ServerConnection.makeSettings(); - const url = (args.url as string) || URLExt.join(settings.baseUrl, "formgrader"); - - const content = new FormgraderWidget(app, url); - - widget = new MainAreaWidget({content}); - widget.id = 'formgrader'; - widget.title.label = 'Formgrader'; - widget.title.closable = true; - } - - if(!tracker.has(widget)){ - // Track the state of the widget for later restoration - tracker.add(widget); - } - - // Attach the widget to the main area if it's not there - if(!widget.isAttached){ - if (notebookTree){ - notebookTree.addWidget(widget); - notebookTree.currentWidget = widget; - } - else app.shell.add(widget, 'main'); - } - - widget.content.update(); - - app.shell.activateById(widget.id); - } - }); - - // Add the command to the palette - palette.addItem({command, category: 'nbgrader'}); - - // Restore the widget state - if (restorer != null){ - restorer.restore(tracker, { - command, - name: () => 'nbgrader-formgrader' - }); - } - console.debug('JupyterLab extension formgrader is activated!'); - } -}; - -export default formgrader_extension; \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index d9eed91a0..5bad19760 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,359 @@ -import { assignment_list_extension } from "./assignment_list/index"; -import { formgrader_extension } from "./formgrader/index"; -import { course_list_extension } from "./course_list/index"; -import { create_assignment_extension } from "./create_assignment/index"; -import { validate_assignment_extension } from "./validate_assignment/index"; +import { ILabShell, ILayoutRestorer, JupyterFrontEnd, JupyterFrontEndPlugin } from "@jupyterlab/application"; +import { ICommandPalette, MainAreaWidget, WidgetTracker } from "@jupyterlab/apputils"; +import { PageConfig, URLExt } from "@jupyterlab/coreutils"; +import { IMainMenu } from '@jupyterlab/mainmenu'; +import { INotebookTracker } from "@jupyterlab/notebook"; +import { ServerConnection } from "@jupyterlab/services"; +import { INotebookShell } from "@jupyter-notebook/application"; +import { INotebookTree } from "@jupyter-notebook/tree"; +import { Menu, Panel } from '@lumino/widgets'; -export default [formgrader_extension, assignment_list_extension, course_list_extension, create_assignment_extension, validate_assignment_extension] +import { AssignmentListWidget } from "./assignment_list/index"; +import { FormgraderWidget } from "./formgrader/index"; +import { CourseListWidget } from "./course_list/index"; +import { CreateAssignmentWidget } from "./create_assignment/index"; +import { ButtonExtension } from "./validate_assignment/index"; + +/** + * The plugin IDs + */ +const pluginIDs = { + menus: 'nbgrader:menu', + assignmentsList: 'nbgrader:assignment-list', + coursesList: 'nbgrader:course-list', + formgrader: 'nbgrader:formgrader', + createAssignment: 'nbgrader:create-assignment', + validateAssignment: 'nbgrader:validate-assignment' +} + +/** + * The command IDs + */ +const commandIDs = { + openAssignmentsList: 'nbgrader:open-assignment-list', + openCoursesList: 'nbgrader:open-course-list', + openFormgrader: 'nbgrader:open-formgrader', + openCreateAssignment: 'nbgrader:open-create-assignment' +} + +/** + * Manage the extensions available in Notebook. + */ +const availableExtensionsManager: JupyterFrontEndPlugin = { + id: pluginIDs.menus, + autoStart: true, + requires: [IMainMenu], + optional: [ICommandPalette, ILabShell, INotebookShell], + activate: ( + app: JupyterFrontEnd, + mainMenu: IMainMenu, + palette: ICommandPalette, + labShell: ILabShell, + notebookShell: INotebookShell + ) => { + + let mainExtensions = false; + let createExtension = false; + if (notebookShell) { + const page = PageConfig.getOption('notebookPage'); + if (page === 'tree') { + mainExtensions = true; + } else if (page === 'notebooks') { + createExtension = true; + } + } + + if (!(labShell || mainExtensions || createExtension)) { + return + } + + const nbgraderMenu = new Menu({ commands: app.commands }); + nbgraderMenu.title.label = 'Nbgrader'; + + if (mainExtensions || labShell) { + nbgraderMenu.addItem({ command: commandIDs.openAssignmentsList }); + nbgraderMenu.addItem({ command: commandIDs.openCoursesList }); + nbgraderMenu.addItem({ command: commandIDs.openFormgrader }); + + if (palette) { + palette.addItem({ + command: commandIDs.openAssignmentsList, + category: 'nbgrader' + }); + palette.addItem({ + command: commandIDs.openCoursesList, + category: 'nbgrader' + }); + palette.addItem({ + command: commandIDs.openFormgrader, + category: 'nbgrader' + }); + } + } + + if (createExtension || labShell) { + nbgraderMenu.addItem({ command: commandIDs.openCreateAssignment }); + + if (palette) { + palette.addItem({ + command: commandIDs.openCreateAssignment, + category: 'nbgrader' + }); + } + } + + mainMenu.addMenu(nbgraderMenu); + } +} + +/** + * Assignment list plugin. + */ +const assignmentListExtension: JupyterFrontEndPlugin = { + id: pluginIDs.assignmentsList, + autoStart: true, + optional: [ILayoutRestorer, INotebookTree], + activate: ( + app: JupyterFrontEnd, + restorer: ILayoutRestorer | null, + notebookTree: INotebookTree | null + ) => { + + // Declare a widget variable + let widget: MainAreaWidget; + + // Track the widget state + let tracker = new WidgetTracker>({ + namespace: 'nbgrader-assignment-list' + }); + + app.commands.addCommand(commandIDs.openAssignmentsList, { + label: 'Assignment List', + execute: () => { + if(!widget){ + const content = new AssignmentListWidget(app); + widget = new MainAreaWidget({content}); + widget.id = 'nbgrader-assignment-list'; + widget.addClass('nbgrader-mainarea-widget'); + widget.title.label = 'Assignments'; + widget.title.closable = true; + } + if(!tracker.has(widget)){ + // Track the state of the widget for later restoration + tracker.add(widget); + } + + // Attach the widget to the main area if it's not there + if(!widget.isAttached){ + if (notebookTree){ + notebookTree.addWidget(widget); + notebookTree.currentWidget = widget; + } + else app.shell.add(widget, 'main'); + } + + widget.content.update(); + + app.shell.activateById(widget.id); + } + }); + + // Restore the widget state + if (restorer != null) { + restorer.restore(tracker, { + command: commandIDs.openAssignmentsList, + name: () => 'nbgrader-assignment-list' + }); + } + + console.debug('JupyterLab extension assignment-list is activated!'); + } +}; + +/** + * Courses list plugin. + */ +const courseListExtension: JupyterFrontEndPlugin = { + id: pluginIDs.coursesList, + autoStart: true, + optional: [ILayoutRestorer, INotebookTree], + + activate: ( + app: JupyterFrontEnd, + restorer: ILayoutRestorer | null, + notebookTree: INotebookTree | null + ) => { + + let widget: MainAreaWidget; + + // Track the widget state + let tracker = new WidgetTracker>({ + namespace: 'nbgrader-course-list' + }); + + app.commands.addCommand(commandIDs.openCoursesList, { + label: 'Course List', + execute: () => { + if (!widget) { + const content = new CourseListWidget(app); + widget = new MainAreaWidget({content}); + widget.id = 'nbgrader-course-list'; + widget.addClass('nbgrader-mainarea-widget'); + widget.title.label = 'Courses'; + widget.title.closable = true; + } + if (!tracker.has(widget)) { + tracker.add(widget); + } + + // Attach the widget to the main area if it's not there + if(!widget.isAttached){ + if (notebookTree){ + notebookTree.addWidget(widget); + notebookTree.currentWidget = widget; + } + else app.shell.add(widget, 'main'); + } + + widget.content.update(); + + app.shell.activateById(widget.id); + } + }) + + // Restore the widget state + if (restorer != null){ + restorer.restore(tracker, { + command: commandIDs.openCoursesList, + name: () => 'nbgrader-course-list' + }); + } + + console.debug('JupyterLab extension course-list is activated!'); + } +}; + +/** + * Formgrader extension. + */ +const formgraderExtension: JupyterFrontEndPlugin = { + id: pluginIDs.formgrader, + autoStart: true, + optional: [ILayoutRestorer, INotebookTree], + activate: ( + app: JupyterFrontEnd, + restorer: ILayoutRestorer | null, + notebookTree: INotebookTree | null + ) => { + // Declare a widget variable + let widget: MainAreaWidget; + + // Track the widget state + let tracker = new WidgetTracker>({ + namespace: 'nbgrader-formgrader' + }); + + app.commands.addCommand(commandIDs.openFormgrader, { + label: 'Formgrader', + execute: args => { + if(!widget){ + const settings = ServerConnection.makeSettings(); + const url = (args.url as string) || URLExt.join(settings.baseUrl, "formgrader"); + + const content = new FormgraderWidget(app, url); + + widget = new MainAreaWidget({content}); + widget.id = 'formgrader'; + widget.title.label = 'Formgrader'; + widget.title.closable = true; + } + + if(!tracker.has(widget)){ + // Track the state of the widget for later restoration + tracker.add(widget); + } + + // Attach the widget to the main area if it's not there + if(!widget.isAttached){ + if (notebookTree){ + notebookTree.addWidget(widget); + notebookTree.currentWidget = widget; + } + else app.shell.add(widget, 'main'); + } + + widget.content.update(); + + app.shell.activateById(widget.id); + } + }); + + // Restore the widget state + if (restorer != null){ + restorer.restore(tracker, { + command: commandIDs.openFormgrader, + name: () => 'nbgrader-formgrader' + }); + } + console.debug('JupyterLab extension formgrader is activated!'); + } +}; + +/** + * Create assignment plugin. + */ +const createAssignmentExtension: JupyterFrontEndPlugin = { + id: pluginIDs.createAssignment, + autoStart: true, + requires: [INotebookTracker], + optional: [ILabShell], + activate: ( + app: JupyterFrontEnd, + tracker: INotebookTracker, + labShell: ILabShell | null + ) => { + const panel = new Panel(); + panel.node.style.overflowY = 'auto'; + const createAssignmentWidget = new CreateAssignmentWidget(tracker, labShell); + panel.addWidget(createAssignmentWidget); + panel.id = 'nbgrader-create_assignemnt'; + panel.title.label = 'Create Assignment'; + panel.title.caption = 'Nbgrader Create Assignment'; + + app.shell.add(panel, 'right'); + + app.commands.addCommand(commandIDs.openCreateAssignment, { + label: 'Create assignment', + isEnabled: () => { + return createAssignmentWidget.isAvailable(); + }, + execute: () => { + app.shell.activateById(panel.id); + } + }) + console.debug('Extension "create_assignment" activated.'); + } +}; + + +/** + * Validate assignment plugin. + */ +const validateAssignmentExtension: JupyterFrontEndPlugin = { + id: pluginIDs.validateAssignment, + autoStart: true, + requires: [INotebookTracker], + activate: (app: JupyterFrontEnd) => { + app.docRegistry.addWidgetExtension('Notebook', new ButtonExtension()); + console.debug('JupyterLab extension validate-assignment is activated!'); + } +}; + +export default [ + availableExtensionsManager, + formgraderExtension, + assignmentListExtension, + courseListExtension, + createAssignmentExtension, + validateAssignmentExtension +] diff --git a/src/validate_assignment/index.ts b/src/validate_assignment/index.ts index 936c49329..84c1de9cd 100644 --- a/src/validate_assignment/index.ts +++ b/src/validate_assignment/index.ts @@ -1,23 +1,10 @@ -import { - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; +import { IDisposable, DisposableDelegate } from '@lumino/disposable'; -import { - IDisposable, DisposableDelegate -} from '@lumino/disposable'; +import { ToolbarButton, Dialog } from '@jupyterlab/apputils'; -import { - ToolbarButton, Dialog -} from '@jupyterlab/apputils'; +import { DocumentRegistry } from '@jupyterlab/docregistry'; -import { - DocumentRegistry -} from '@jupyterlab/docregistry'; - -import { - NotebookPanel, INotebookModel -} from '@jupyterlab/notebook'; +import { NotebookPanel, INotebookModel } from '@jupyterlab/notebook'; import { requestAPI } from './validateassignment'; @@ -25,8 +12,6 @@ import { showNbGraderDialog, validate } from '../common/validate'; var nbgrader_version = "0.8.4"; // TODO: hardcoded value -const PLUGIN_ID = "nbgrader:validate-assignment" - class ValidateButton extends ToolbarButton { private _buttonCallback = this.newButtonCallback(); private _versionCheckCallback = this.newVersionCheckCallback(); @@ -120,11 +105,9 @@ class ValidateButton extends ToolbarButton { return; } - // tests/test-docregistry/src/context.spec.ts:98 this.setButtonDisabled(); this.setButtonLabel('Saving...'); this.panel.context.saveState.connect(this.saveCallback); - // examples/notebook/src/commands.ts:79 this.panel.context.save(); } } @@ -190,17 +173,3 @@ export class ButtonExtension implements DocumentRegistry.IWidgetExtension = { - id: PLUGIN_ID, - autoStart: true, - activate: (app: JupyterFrontEnd) => { - console.log('JupyterLab extension validate-assignment is activated!'); - app.docRegistry.addWidgetExtension('Notebook', new ButtonExtension()); - } -}; - -export default validate_assignment_extension; From 172ba40c5abf9320b6df70cef215d5822254f10f Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 23 Feb 2023 13:33:30 +0100 Subject: [PATCH 17/27] Update to Jlab 4.0.0a34 and Notebook 7.0.0a13 --- package.json | 26 ++++++++++++------------- pyproject.toml | 4 ++-- yarn.lock | 52 +++++++++++++++++++++++++------------------------- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/package.json b/package.json index 526b57da8..fa2c4d1a3 100644 --- a/package.json +++ b/package.json @@ -44,21 +44,21 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter-notebook/application": "^7.0.0-alpha.10", - "@jupyter-notebook/tree": "^7.0.0-alpha.10", - "@jupyterlab/application": "^4.0.0-alpha.17", - "@jupyterlab/apputils": "^4.0.0-alpha.17", - "@jupyterlab/cells": "^4.0.0-alpha.17", - "@jupyterlab/coreutils": "^6.0.0-alpha.17", - "@jupyterlab/launcher": "^4.0.0-alpha.17", - "@jupyterlab/notebook": "^4.0.0-alpha.17", - "@jupyterlab/services": "^7.0.0-alpha.17", - "@jupyterlab/settingregistry": "^4.0.0-alpha.17" + "@jupyter-notebook/application": "^7.0.0-alpha.13", + "@jupyter-notebook/tree": "^7.0.0-alpha.13", + "@jupyterlab/application": "^4.0.0-alpha.19", + "@jupyterlab/apputils": "^4.0.0-alpha.19", + "@jupyterlab/cells": "^4.0.0-alpha.19", + "@jupyterlab/coreutils": "^6.0.0-alpha.19", + "@jupyterlab/launcher": "^4.0.0-alpha.19", + "@jupyterlab/notebook": "^4.0.0-alpha.19", + "@jupyterlab/services": "^7.0.0-alpha.19", + "@jupyterlab/settingregistry": "^4.0.0-alpha.19" }, "devDependencies": { - "@jupyterlab/builder": "^4.0.0-alpha.17", - "@jupyterlab/galata": "^5.0.0-alpha.17", - "@playwright/test": "^1.29.0", + "@jupyterlab/builder": "^4.0.0-alpha.19", + "@jupyterlab/galata": "^5.0.0-alpha.19", + "@playwright/test": "^1.30.0", "@types/codemirror": "^5.60.5", "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", diff --git a/pyproject.toml b/pyproject.toml index bf40fd667..8390980f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,11 +38,11 @@ dependencies = [ "jsonschema>=3", "jupyter_client<9", "jupyter_server>=2", - "jupyterlab>=4.0.0a32", + "jupyterlab>=4.0.0a34", "jupyterlab_server", "nbclient>=0.6.1", "nbconvert>=6", - "notebook>=7.0.0a9", + "notebook>=7.0.0a13", "python-dateutil>=2.8", "rapidfuzz>=1.8", "requests>=2.26", diff --git a/yarn.lock b/yarn.lock index ef82ff2ee..1de5418fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -424,7 +424,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/application@npm:^7.0.0-alpha.10, @jupyter-notebook/application@npm:^7.0.0-beta.4": +"@jupyter-notebook/application@npm:^7.0.0-alpha.13, @jupyter-notebook/application@npm:^7.0.0-beta.4": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/application@npm:7.0.0-beta.4" dependencies: @@ -443,7 +443,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/tree@npm:^7.0.0-alpha.10": +"@jupyter-notebook/tree@npm:^7.0.0-alpha.13": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/tree@npm:7.0.0-beta.4" dependencies: @@ -481,7 +481,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application@npm:^4.0.0-alpha.17, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": +"@jupyterlab/application@npm:^4.0.0-alpha.19, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/application@npm:4.0.2" dependencies: @@ -509,7 +509,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/apputils@npm:^4.0.0-alpha.17, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": +"@jupyterlab/apputils@npm:^4.0.0-alpha.19, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": version: 4.1.2 resolution: "@jupyterlab/apputils@npm:4.1.2" dependencies: @@ -552,7 +552,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.0.0-alpha.17": +"@jupyterlab/builder@npm:^4.0.0-alpha.19": version: 4.0.2 resolution: "@jupyterlab/builder@npm:4.0.2" dependencies: @@ -593,7 +593,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/cells@npm:^4.0.0-alpha.17, @jupyterlab/cells@npm:^4.0.2": +"@jupyterlab/cells@npm:^4.0.0-alpha.19, @jupyterlab/cells@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/cells@npm:4.0.2" dependencies: @@ -721,7 +721,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.0.0-alpha.17, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": +"@jupyterlab/coreutils@npm:^6.0.0-alpha.19, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": version: 6.0.2 resolution: "@jupyterlab/coreutils@npm:6.0.2" dependencies: @@ -891,7 +891,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/galata@npm:^5.0.0-alpha.17": +"@jupyterlab/galata@npm:^5.0.0-alpha.19": version: 5.0.2 resolution: "@jupyterlab/galata@npm:5.0.2" dependencies: @@ -918,7 +918,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/launcher@npm:^4.0.0-alpha.17": +"@jupyterlab/launcher@npm:^4.0.0-alpha.19": version: 4.0.2 resolution: "@jupyterlab/launcher@npm:4.0.2" dependencies: @@ -981,7 +981,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/notebook@npm:^4.0.0-alpha.17, @jupyterlab/notebook@npm:^4.0.2": +"@jupyterlab/notebook@npm:^4.0.0-alpha.19, @jupyterlab/notebook@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/notebook@npm:4.0.2" dependencies: @@ -1082,7 +1082,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/services@npm:^7.0.0-alpha.17, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": +"@jupyterlab/services@npm:^7.0.0-alpha.19, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": version: 7.0.2 resolution: "@jupyterlab/services@npm:7.0.2" dependencies: @@ -1101,7 +1101,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^4.0.0-alpha.17, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": +"@jupyterlab/settingregistry@npm:^4.0.0-alpha.19, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/settingregistry@npm:4.0.2" dependencies: @@ -1568,7 +1568,7 @@ __metadata: languageName: node linkType: hard -"@playwright/test@npm:^1.29.0, @playwright/test@npm:^1.32.2": +"@playwright/test@npm:^1.30.0, @playwright/test@npm:^1.32.2": version: 1.35.0 resolution: "@playwright/test@npm:1.35.0" dependencies: @@ -5426,19 +5426,19 @@ __metadata: version: 0.0.0-use.local resolution: "nbgrader@workspace:." dependencies: - "@jupyter-notebook/application": ^7.0.0-alpha.10 - "@jupyter-notebook/tree": ^7.0.0-alpha.10 - "@jupyterlab/application": ^4.0.0-alpha.17 - "@jupyterlab/apputils": ^4.0.0-alpha.17 - "@jupyterlab/builder": ^4.0.0-alpha.17 - "@jupyterlab/cells": ^4.0.0-alpha.17 - "@jupyterlab/coreutils": ^6.0.0-alpha.17 - "@jupyterlab/galata": ^5.0.0-alpha.17 - "@jupyterlab/launcher": ^4.0.0-alpha.17 - "@jupyterlab/notebook": ^4.0.0-alpha.17 - "@jupyterlab/services": ^7.0.0-alpha.17 - "@jupyterlab/settingregistry": ^4.0.0-alpha.17 - "@playwright/test": ^1.29.0 + "@jupyter-notebook/application": ^7.0.0-alpha.13 + "@jupyter-notebook/tree": ^7.0.0-alpha.13 + "@jupyterlab/application": ^4.0.0-alpha.19 + "@jupyterlab/apputils": ^4.0.0-alpha.19 + "@jupyterlab/builder": ^4.0.0-alpha.19 + "@jupyterlab/cells": ^4.0.0-alpha.19 + "@jupyterlab/coreutils": ^6.0.0-alpha.19 + "@jupyterlab/galata": ^5.0.0-alpha.19 + "@jupyterlab/launcher": ^4.0.0-alpha.19 + "@jupyterlab/notebook": ^4.0.0-alpha.19 + "@jupyterlab/services": ^7.0.0-alpha.19 + "@jupyterlab/settingregistry": ^4.0.0-alpha.19 + "@playwright/test": ^1.30.0 "@types/codemirror": ^5.60.5 "@typescript-eslint/eslint-plugin": ^4.8.1 "@typescript-eslint/parser": ^4.8.1 From 5ce64ae939b2e85223a795de6109708214aa21f9 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 23 Feb 2023 13:34:51 +0100 Subject: [PATCH 18/27] Open the existing Formgrader tab if already loaded from courses list tab --- src/course_list/courselist.ts | 4 +++- src/index.ts | 15 ++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/course_list/courselist.ts b/src/course_list/courselist.ts index b40403a16..b3667cf73 100644 --- a/src/course_list/courselist.ts +++ b/src/course_list/courselist.ts @@ -4,6 +4,8 @@ import { URLExt } from '@jupyterlab/coreutils'; import { ServerConnection } from '@jupyterlab/services'; +import { commandIDs } from '../index'; + /** * Call the API extension * @@ -56,7 +58,7 @@ function createElementFromCourse(data: any, app: JupyterFrontEnd) { if (data['kind'] == 'local') { anchor.href = '#'; anchor.onclick = function() { - app.commands.execute('nbgrader:open-formgrader', data); + app.commands.execute(commandIDs.openFormgrader, data); } } else { diff --git a/src/index.ts b/src/index.ts index 5bad19760..cfdd0d2d4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,7 +29,7 @@ const pluginIDs = { /** * The command IDs */ -const commandIDs = { +export const commandIDs = { openAssignmentsList: 'nbgrader:open-assignment-list', openCoursesList: 'nbgrader:open-course-list', openFormgrader: 'nbgrader:open-formgrader', @@ -256,7 +256,7 @@ const formgraderExtension: JupyterFrontEndPlugin = { app.commands.addCommand(commandIDs.openFormgrader, { label: 'Formgrader', execute: args => { - if(!widget){ + if (!widget) { const settings = ServerConnection.makeSettings(); const url = (args.url as string) || URLExt.join(settings.baseUrl, "formgrader"); @@ -268,18 +268,19 @@ const formgraderExtension: JupyterFrontEndPlugin = { widget.title.closable = true; } - if(!tracker.has(widget)){ + if (!tracker.has(widget)) { // Track the state of the widget for later restoration tracker.add(widget); } // Attach the widget to the main area if it's not there - if(!widget.isAttached){ - if (notebookTree){ + if (notebookTree){ + if (!widget.isAttached){ notebookTree.addWidget(widget); - notebookTree.currentWidget = widget; } - else app.shell.add(widget, 'main'); + notebookTree.currentWidget = widget; + } else if (!widget.isAttached) { + app.shell.add(widget, 'main'); } widget.content.update(); From 479a177fb4779d63c2a38f8392b2ba540094ac92 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 2 Mar 2023 16:14:07 +0100 Subject: [PATCH 19/27] fix UI tests --- .../tests/ui-tests/assignment_list.spec.ts | 2 +- nbgrader/tests/ui-tests/course_list.spec.ts | 2 +- nbgrader/tests/ui-tests/formgrader.spec.ts | 2 +- .../ui-tests/utils/jupyter_server_config.py | 3 +++ .../utils/jupyter_server_config_notebook.py | 4 ++++ playwright.config.ts | 18 +++--------------- playwright.notebook.config.ts | 16 ++-------------- src/index.ts | 1 + tasks.py | 2 +- 9 files changed, 17 insertions(+), 33 deletions(-) diff --git a/nbgrader/tests/ui-tests/assignment_list.spec.ts b/nbgrader/tests/ui-tests/assignment_list.spec.ts index c1deb004d..87ae7d702 100644 --- a/nbgrader/tests/ui-tests/assignment_list.spec.ts +++ b/nbgrader/tests/ui-tests/assignment_list.spec.ts @@ -236,7 +236,7 @@ test("Open assignment list tab from menu", async ({ page, tmpPath }) => { const nbgrader_menu = page.locator(`${menuPanelId} div.lm-MenuBar-itemLabel:text("Nbgrader")`); const assignmentList_menu = page.locator( - '#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-assignment-list"]' + '#jp-mainmenu-nbgrader li[data-command="nbgrader:open-assignment-list"]' ); const tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); const lastTab_label = tabs.last().locator('.lm-TabBar-tabLabel'); diff --git a/nbgrader/tests/ui-tests/course_list.spec.ts b/nbgrader/tests/ui-tests/course_list.spec.ts index de49f189b..114080fc3 100644 --- a/nbgrader/tests/ui-tests/course_list.spec.ts +++ b/nbgrader/tests/ui-tests/course_list.spec.ts @@ -148,7 +148,7 @@ test("Open course list tab from menu", async ({ page, tmpPath }) => { const nbgrader_menu = page.locator(`${menuPanelId} div.lm-MenuBar-itemLabel:text("Nbgrader")`); const courseList_menu = page.locator( - '#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-course-list"]' + '#jp-mainmenu-nbgrader li[data-command="nbgrader:open-course-list"]' ); const tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); const lastTab_label = tabs.last().locator('.lm-TabBar-tabLabel'); diff --git a/nbgrader/tests/ui-tests/formgrader.spec.ts b/nbgrader/tests/ui-tests/formgrader.spec.ts index ad24f81de..6f6b211a8 100644 --- a/nbgrader/tests/ui-tests/formgrader.spec.ts +++ b/nbgrader/tests/ui-tests/formgrader.spec.ts @@ -290,7 +290,7 @@ test("Open formgrader tab from menu", async ({ page, tmpPath }) => { if (isNotebook) await page.goto(`tree/${tmpPath}`); const nbgrader_menu = page.locator(`${menuPanelId} div.lm-MenuBar-itemLabel:text("Nbgrader")`); - const formgrader_menu = page.locator('#jp-mainmenu-nbgrader-menu li[data-command="nbgrader:open-formgrader"]'); + const formgrader_menu = page.locator('#jp-mainmenu-nbgrader li[data-command="nbgrader:open-formgrader"]'); const tabs = page.locator(`${mainPanelId} .lm-TabBar-tab`); const lastTab_label = tabs.last().locator('.lm-TabBar-tabLabel'); diff --git a/nbgrader/tests/ui-tests/utils/jupyter_server_config.py b/nbgrader/tests/ui-tests/utils/jupyter_server_config.py index 6d0a009e1..4cb05f30f 100644 --- a/nbgrader/tests/ui-tests/utils/jupyter_server_config.py +++ b/nbgrader/tests/ui-tests/utils/jupyter_server_config.py @@ -3,6 +3,8 @@ opens the server to the world and provide access to JupyterLab JavaScript objects through the global window variable. """ +from pathlib import Path +import jupyterlab c.ServerApp.port = 8888 c.ServerApp.port_retries = 0 @@ -13,5 +15,6 @@ c.ServerApp.disable_check_xsrf = True c.LabApp.expose_app_in_browser = True +c.LabServerApp.extra_labextensions_path = str(Path(jupyterlab.__file__).parent / "galata") # Uncomment to set server log level to debug level # c.ServerApp.log_level = "DEBUG" diff --git a/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py b/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py index c21ee8bd8..c85e7d461 100644 --- a/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py +++ b/nbgrader/tests/ui-tests/utils/jupyter_server_config_notebook.py @@ -3,6 +3,8 @@ opens the server to the world and provide access to JupyterLab JavaScript objects through the global window variable. """ +from pathlib import Path +import jupyterlab c.ServerApp.port = 8888 c.ServerApp.port_retries = 0 @@ -14,5 +16,7 @@ c.JupyterNotebookApp.expose_app_in_browser = True +c.LabServerApp.extra_labextensions_path = str(Path(jupyterlab.__file__).parent / "galata") + # Uncomment to set server log level to debug level # c.ServerApp.log_level = "DEBUG" diff --git a/playwright.config.ts b/playwright.config.ts index 64b0fc504..5c8519e3e 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -2,22 +2,12 @@ * Configuration for Playwright using default from @jupyterlab/galata */ -import type { PlaywrightTestConfig } from '@playwright/test'; +var baseConfig = require('@jupyterlab/galata/lib/playwright-config'); -const config: PlaywrightTestConfig = { +module.exports = { + ...baseConfig, testDir: './nbgrader/tests/ui-tests', - testMatch: '**/*.spec.ts', - testIgnore: '**/node_modules/**/*', - timeout: 60000, - reporter: [[process.env.CI ? 'dot' : 'list'], ['html', { outputFolder: 'playwright-tests' }]], workers: 1, - use: { - // Context options - viewport: { width: 1024, height: 768 }, - // Artifacts - video: 'retain-on-failure' - }, - webServer: { command: 'jlpm start:test', url: 'http://localhost:8888/lab', @@ -26,5 +16,3 @@ const config: PlaywrightTestConfig = { }, }; - -export default config; diff --git a/playwright.notebook.config.ts b/playwright.notebook.config.ts index 457ad6ea9..15e8d8a85 100644 --- a/playwright.notebook.config.ts +++ b/playwright.notebook.config.ts @@ -2,26 +2,16 @@ * Configuration for Playwright using default from @jupyterlab/galata */ -import type { PlaywrightTestConfig } from '@playwright/test'; import baseConfig from '@jupyterlab/galata/lib/playwright-config'; -import { GalataOptions } from '@jupyterlab/galata'; -const config: PlaywrightTestConfig = { +module.exports = { ...baseConfig, testDir: './nbgrader/tests/ui-tests', - testMatch: '**/*.spec.ts', - testIgnore: '**/node_modules/**/*', - timeout: 60000, - reporter: [[process.env.CI ? 'dot' : 'list'], ['html', { outputFolder: 'playwright-tests' }]], workers: 1, use: { + ...baseConfig.use, appPath: '', - // Context options - viewport: { width: 1024, height: 768 }, - // Artifacts - video: 'retain-on-failure' }, - webServer: { command: 'jlpm start:test:notebook', url: 'http://localhost:8888/tree', @@ -30,5 +20,3 @@ const config: PlaywrightTestConfig = { }, }; - -export default config; diff --git a/src/index.ts b/src/index.ts index cfdd0d2d4..3667b4ce2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -68,6 +68,7 @@ const availableExtensionsManager: JupyterFrontEndPlugin = { } const nbgraderMenu = new Menu({ commands: app.commands }); + nbgraderMenu.id = 'jp-mainmenu-nbgrader'; nbgraderMenu.title.label = 'Nbgrader'; if (mainExtensions || labShell) { diff --git a/tasks.py b/tasks.py index 4cfead1dc..8f940637a 100755 --- a/tasks.py +++ b/tasks.py @@ -85,7 +85,7 @@ def _run_ts_test(args, notebook=False): if notebook: os.environ["NBGRADER_TEST_IS_NOTEBOOK"] = "1" - cmd = ['jlpm', f'test{":notebook" if notebook else ""}', '--retries=3'] + args + cmd = ['jlpm', f'test{":notebook" if notebook else ""}', '--retries=1'] + args run(" ".join(cmd)) From 481143c1e9ce1cc11547acf0722443cbe8ef337d Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Mon, 6 Mar 2023 10:05:34 +0100 Subject: [PATCH 20/27] Removal of python 3.7 support and integration of python 3.11 in tests --- .github/workflows/test-docs-python.yml | 2 ++ pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-docs-python.yml b/.github/workflows/test-docs-python.yml index a83597be8..65e83aeee 100644 --- a/.github/workflows/test-docs-python.yml +++ b/.github/workflows/test-docs-python.yml @@ -38,6 +38,8 @@ jobs: group: docs - python: "3.9" group: docs + - python: "3.10" + group: docs steps: # This is how you set an environment variable in a GitHub workflow that # will be available in following steps as if you would used `export diff --git a/pyproject.toml b/pyproject.toml index 8390980f0..21f48b345 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "hatchling.build" name = "nbgrader" description = "A system for assigning and grading notebooks" readme = "README.md" -requires-python = ">=3.7" +requires-python = ">=3.8" authors = [ { name = "Jupyter Development Team", email = "jupyter@googlegroups.com" }, ] From eb319adec16dad76b7f3fcbfa8aac9aa390494c5 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Mon, 6 Mar 2023 13:14:33 +0100 Subject: [PATCH 21/27] Update actions and node version in tests --- .github/workflows/check-release.yml | 2 +- .github/workflows/test-docs-python.yml | 6 +++--- .github/workflows/test-extensions.yml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml index 88ded8cd9..7e22430d7 100644 --- a/.github/workflows/check-release.yml +++ b/.github/workflows/check-release.yml @@ -14,7 +14,7 @@ jobs: group: [check_release, link_check] steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Check Release diff --git a/.github/workflows/test-docs-python.yml b/.github/workflows/test-docs-python.yml index 65e83aeee..cf6a7f7dc 100644 --- a/.github/workflows/test-docs-python.yml +++ b/.github/workflows/test-docs-python.yml @@ -54,11 +54,11 @@ jobs: echo "GROUP=python" >> $GITHUB_ENV echo "TIMEOUT_MINUTES=20" >> $GITHUB_ENV fi - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install node - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: - node-version: '17.x' + node-version: '18.x' # NOTE: actions/setup-python@v2 can make use of a cache within the GitHub # Action virtual environment and setup extremely fast. 3.9 isn't # available in this cache as of November 2020. diff --git a/.github/workflows/test-extensions.yml b/.github/workflows/test-extensions.yml index 8c2e50922..9df478572 100644 --- a/.github/workflows/test-extensions.yml +++ b/.github/workflows/test-extensions.yml @@ -38,11 +38,11 @@ jobs: - name: Configure environment variables from job flags run: | echo "GROUP=${{ matrix.group }}" >> $GITHUB_ENV - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install node - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: - node-version: '17.x' + node-version: '18.x' # NOTE: actions/setup-python@v2 can make use of a cache within the GitHub # Action virtual environment and setup extremely fast. 3.9 isn't # available in this cache as of November 2020. From aa4511b5712bdd54789b9f56933a7500dde256ce Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 23 Mar 2023 09:59:59 +0100 Subject: [PATCH 22/27] Update to jupyterlab 4.0.0a37 and notebook 7.0.0a17 --- .gitignore | 2 ++ .yarnrc.yml | 3 +-- package.json | 24 +++++++++--------- pyproject.toml | 4 +-- src/assignment_list/index.ts | 2 -- yarn.lock | 48 ++++++++++++++++++------------------ 6 files changed, 41 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index c3d906390..b643661f7 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ var/ # built labextension tsconfig.tsbuildinfo nbgrader/labextension/ +# Yarn cache +.yarn/ # PyInstaller # Usually these files are written by a python script from a template diff --git a/.yarnrc.yml b/.yarnrc.yml index 216c4e5c2..3186f3f07 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,2 +1 @@ -nodeLinker: pnpm - +nodeLinker: node-modules diff --git a/package.json b/package.json index fa2c4d1a3..d626461f4 100644 --- a/package.json +++ b/package.json @@ -44,20 +44,20 @@ "watch:labextension": "jupyter labextension watch ." }, "dependencies": { - "@jupyter-notebook/application": "^7.0.0-alpha.13", - "@jupyter-notebook/tree": "^7.0.0-alpha.13", - "@jupyterlab/application": "^4.0.0-alpha.19", - "@jupyterlab/apputils": "^4.0.0-alpha.19", - "@jupyterlab/cells": "^4.0.0-alpha.19", - "@jupyterlab/coreutils": "^6.0.0-alpha.19", - "@jupyterlab/launcher": "^4.0.0-alpha.19", - "@jupyterlab/notebook": "^4.0.0-alpha.19", - "@jupyterlab/services": "^7.0.0-alpha.19", - "@jupyterlab/settingregistry": "^4.0.0-alpha.19" + "@jupyter-notebook/application": "^7.0.0-alpha.17", + "@jupyter-notebook/tree": "^7.0.0-alpha.17", + "@jupyterlab/application": "^4.0.0-alpha.22", + "@jupyterlab/apputils": "^4.0.0-alpha.22", + "@jupyterlab/cells": "^4.0.0-alpha.22", + "@jupyterlab/coreutils": "^6.0.0-alpha.22", + "@jupyterlab/launcher": "^4.0.0-alpha.22", + "@jupyterlab/notebook": "^4.0.0-alpha.22", + "@jupyterlab/services": "^7.0.0-alpha.22", + "@jupyterlab/settingregistry": "^4.0.0-alpha.22" }, "devDependencies": { - "@jupyterlab/builder": "^4.0.0-alpha.19", - "@jupyterlab/galata": "^5.0.0-alpha.19", + "@jupyterlab/builder": "^4.0.0-alpha.22", + "@jupyterlab/galata": "^5.0.0-alpha.22", "@playwright/test": "^1.30.0", "@types/codemirror": "^5.60.5", "@typescript-eslint/eslint-plugin": "^4.8.1", diff --git a/pyproject.toml b/pyproject.toml index 21f48b345..1b25c2ec3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,11 +38,11 @@ dependencies = [ "jsonschema>=3", "jupyter_client<9", "jupyter_server>=2", - "jupyterlab>=4.0.0a34", + "jupyterlab>=4.0.0a37", "jupyterlab_server", "nbclient>=0.6.1", "nbconvert>=6", - "notebook>=7.0.0a13", + "notebook>=7.0.0a17", "python-dateutil>=2.8", "rapidfuzz>=1.8", "requests>=2.26", diff --git a/src/assignment_list/index.ts b/src/assignment_list/index.ts index a93c680b5..260e9f39b 100644 --- a/src/assignment_list/index.ts +++ b/src/assignment_list/index.ts @@ -20,8 +20,6 @@ export class AssignmentListWidget extends Widget { super(); this.app = app; - console.log('Initializing the assignments list widget'); - var assignment_html = ([ '
', '
', diff --git a/yarn.lock b/yarn.lock index 1de5418fa..bea375820 100644 --- a/yarn.lock +++ b/yarn.lock @@ -424,7 +424,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/application@npm:^7.0.0-alpha.13, @jupyter-notebook/application@npm:^7.0.0-beta.4": +"@jupyter-notebook/application@npm:^7.0.0-alpha.17, @jupyter-notebook/application@npm:^7.0.0-beta.4": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/application@npm:7.0.0-beta.4" dependencies: @@ -443,7 +443,7 @@ __metadata: languageName: node linkType: hard -"@jupyter-notebook/tree@npm:^7.0.0-alpha.13": +"@jupyter-notebook/tree@npm:^7.0.0-alpha.17": version: 7.0.0-beta.4 resolution: "@jupyter-notebook/tree@npm:7.0.0-beta.4" dependencies: @@ -481,7 +481,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/application@npm:^4.0.0-alpha.19, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": +"@jupyterlab/application@npm:^4.0.0-alpha.22, @jupyterlab/application@npm:^4.0.1, @jupyterlab/application@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/application@npm:4.0.2" dependencies: @@ -509,7 +509,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/apputils@npm:^4.0.0-alpha.19, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": +"@jupyterlab/apputils@npm:^4.0.0-alpha.22, @jupyterlab/apputils@npm:^4.1.1, @jupyterlab/apputils@npm:^4.1.2": version: 4.1.2 resolution: "@jupyterlab/apputils@npm:4.1.2" dependencies: @@ -552,7 +552,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.0.0-alpha.19": +"@jupyterlab/builder@npm:^4.0.0-alpha.22": version: 4.0.2 resolution: "@jupyterlab/builder@npm:4.0.2" dependencies: @@ -593,7 +593,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/cells@npm:^4.0.0-alpha.19, @jupyterlab/cells@npm:^4.0.2": +"@jupyterlab/cells@npm:^4.0.0-alpha.22, @jupyterlab/cells@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/cells@npm:4.0.2" dependencies: @@ -721,7 +721,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.0.0-alpha.19, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": +"@jupyterlab/coreutils@npm:^6.0.0-alpha.22, @jupyterlab/coreutils@npm:^6.0.1, @jupyterlab/coreutils@npm:^6.0.2": version: 6.0.2 resolution: "@jupyterlab/coreutils@npm:6.0.2" dependencies: @@ -891,7 +891,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/galata@npm:^5.0.0-alpha.19": +"@jupyterlab/galata@npm:^5.0.0-alpha.22": version: 5.0.2 resolution: "@jupyterlab/galata@npm:5.0.2" dependencies: @@ -918,7 +918,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/launcher@npm:^4.0.0-alpha.19": +"@jupyterlab/launcher@npm:^4.0.0-alpha.22": version: 4.0.2 resolution: "@jupyterlab/launcher@npm:4.0.2" dependencies: @@ -981,7 +981,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/notebook@npm:^4.0.0-alpha.19, @jupyterlab/notebook@npm:^4.0.2": +"@jupyterlab/notebook@npm:^4.0.0-alpha.22, @jupyterlab/notebook@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/notebook@npm:4.0.2" dependencies: @@ -1082,7 +1082,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/services@npm:^7.0.0-alpha.19, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": +"@jupyterlab/services@npm:^7.0.0-alpha.22, @jupyterlab/services@npm:^7.0.1, @jupyterlab/services@npm:^7.0.2": version: 7.0.2 resolution: "@jupyterlab/services@npm:7.0.2" dependencies: @@ -1101,7 +1101,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^4.0.0-alpha.19, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": +"@jupyterlab/settingregistry@npm:^4.0.0-alpha.22, @jupyterlab/settingregistry@npm:^4.0.1, @jupyterlab/settingregistry@npm:^4.0.2": version: 4.0.2 resolution: "@jupyterlab/settingregistry@npm:4.0.2" dependencies: @@ -5426,18 +5426,18 @@ __metadata: version: 0.0.0-use.local resolution: "nbgrader@workspace:." dependencies: - "@jupyter-notebook/application": ^7.0.0-alpha.13 - "@jupyter-notebook/tree": ^7.0.0-alpha.13 - "@jupyterlab/application": ^4.0.0-alpha.19 - "@jupyterlab/apputils": ^4.0.0-alpha.19 - "@jupyterlab/builder": ^4.0.0-alpha.19 - "@jupyterlab/cells": ^4.0.0-alpha.19 - "@jupyterlab/coreutils": ^6.0.0-alpha.19 - "@jupyterlab/galata": ^5.0.0-alpha.19 - "@jupyterlab/launcher": ^4.0.0-alpha.19 - "@jupyterlab/notebook": ^4.0.0-alpha.19 - "@jupyterlab/services": ^7.0.0-alpha.19 - "@jupyterlab/settingregistry": ^4.0.0-alpha.19 + "@jupyter-notebook/application": ^7.0.0-alpha.17 + "@jupyter-notebook/tree": ^7.0.0-alpha.17 + "@jupyterlab/application": ^4.0.0-alpha.22 + "@jupyterlab/apputils": ^4.0.0-alpha.22 + "@jupyterlab/builder": ^4.0.0-alpha.22 + "@jupyterlab/cells": ^4.0.0-alpha.22 + "@jupyterlab/coreutils": ^6.0.0-alpha.22 + "@jupyterlab/galata": ^5.0.0-alpha.22 + "@jupyterlab/launcher": ^4.0.0-alpha.22 + "@jupyterlab/notebook": ^4.0.0-alpha.22 + "@jupyterlab/services": ^7.0.0-alpha.22 + "@jupyterlab/settingregistry": ^4.0.0-alpha.22 "@playwright/test": ^1.30.0 "@types/codemirror": ^5.60.5 "@typescript-eslint/eslint-plugin": ^4.8.1 From bafe724385648ce794973f7f73bfa494ab4b8fdd Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 23 Mar 2023 10:56:52 +0100 Subject: [PATCH 23/27] Fix before-build-npm --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1b25c2ec3..5e6718bfd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [build-system] requires = [ "hatchling>=1.10.0", - "jupyterlab>=4.0.0a30", + "jupyterlab>=4.0.0a37", ] build-backend = "hatchling.build" @@ -147,7 +147,7 @@ after-bump-version = [ "python tools/post-bump.py", ] before-build-npm = [ - "python -m pip install 'jupyterlab<4'", + "python -m pip install 'jupyterlab>=4.0.0a37'", "jlpm", "jlpm build:prod", ] From 5c906032c04b7a36ec85633f10d6af72dddc0200 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Mon, 12 Jun 2023 15:36:05 +0200 Subject: [PATCH 24/27] Includes #1756 --- src/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3667b4ce2..44595ef62 100644 --- a/src/index.ts +++ b/src/index.ts @@ -131,7 +131,7 @@ const assignmentListExtension: JupyterFrontEndPlugin = { app.commands.addCommand(commandIDs.openAssignmentsList, { label: 'Assignment List', execute: () => { - if(!widget){ + if(!widget || widget.isDisposed){ const content = new AssignmentListWidget(app); widget = new MainAreaWidget({content}); widget.id = 'nbgrader-assignment-list'; @@ -195,7 +195,7 @@ const courseListExtension: JupyterFrontEndPlugin = { app.commands.addCommand(commandIDs.openCoursesList, { label: 'Course List', execute: () => { - if (!widget) { + if (!widget || widget.isDisposed) { const content = new CourseListWidget(app); widget = new MainAreaWidget({content}); widget.id = 'nbgrader-course-list'; @@ -257,7 +257,7 @@ const formgraderExtension: JupyterFrontEndPlugin = { app.commands.addCommand(commandIDs.openFormgrader, { label: 'Formgrader', execute: args => { - if (!widget) { + if (!widget || widget.isDisposed) { const settings = ServerConnection.makeSettings(); const url = (args.url as string) || URLExt.join(settings.baseUrl, "formgrader"); From e9b50f389dee76e8bf12943905da3a234a330fc4 Mon Sep 17 00:00:00 2001 From: Nicolas Brichet Date: Thu, 15 Jun 2023 20:19:46 +0200 Subject: [PATCH 25/27] Remove nbextensions and related code --- .gitignore | 3 - nbgrader/__init__.py | 59 - .../source/contributor_guide/releasing.rst | 12 +- .../assignment_list/assignment_list.css | 103 -- .../assignment_list/assignment_list.js | 677 -------- nbgrader/nbextensions/assignment_list/main.js | 165 -- .../nbextensions/course_list/course_list.css | 67 - .../nbextensions/course_list/course_list.js | 145 -- nbgrader/nbextensions/course_list/main.js | 101 -- .../create_assignment/create_assignment.css | 66 - .../nbextensions/create_assignment/main.js | 626 ------- nbgrader/nbextensions/formgrader/main.js | 21 - .../nbextensions/validate_assignment/main.js | 142 -- .../tests/apps/test_nbgrader_extension.py | 86 - nbgrader/tests/nbextensions/__init__.py | 0 nbgrader/tests/nbextensions/conftest.py | 215 --- nbgrader/tests/nbextensions/files/blank.ipynb | 30 - nbgrader/tests/nbextensions/files/data.txt | 4 - .../tests/nbextensions/files/old-schema.ipynb | 38 - .../files/open_relative_file.ipynb | 37 - .../submitted-answer-cell-type-changed.ipynb | 155 -- .../files/submitted-changed.ipynb | 157 -- .../files/submitted-grade-cell-changed.ipynb | 157 -- .../submitted-grade-cell-type-changed.ipynb | 155 -- .../files/submitted-locked-cell-changed.ipynb | 158 -- .../files/submitted-unchanged.ipynb | 157 -- nbgrader/tests/nbextensions/files/task.ipynb | 20 - .../tests/nbextensions/formgrade_utils.py | 289 ---- .../nbextensions/test_assignment_list.py | 504 ------ .../tests/nbextensions/test_course_list.py | 149 -- .../nbextensions/test_create_assignment.py | 918 ----------- .../tests/nbextensions/test_formgrader.py | 1450 ----------------- .../nbextensions/test_validate_assignment.py | 239 --- pyproject.toml | 10 - tasks.py | 4 +- 35 files changed, 8 insertions(+), 7111 deletions(-) delete mode 100644 nbgrader/nbextensions/assignment_list/assignment_list.css delete mode 100644 nbgrader/nbextensions/assignment_list/assignment_list.js delete mode 100644 nbgrader/nbextensions/assignment_list/main.js delete mode 100644 nbgrader/nbextensions/course_list/course_list.css delete mode 100644 nbgrader/nbextensions/course_list/course_list.js delete mode 100644 nbgrader/nbextensions/course_list/main.js delete mode 100644 nbgrader/nbextensions/create_assignment/create_assignment.css delete mode 100644 nbgrader/nbextensions/create_assignment/main.js delete mode 100644 nbgrader/nbextensions/formgrader/main.js delete mode 100644 nbgrader/nbextensions/validate_assignment/main.js delete mode 100644 nbgrader/tests/apps/test_nbgrader_extension.py delete mode 100644 nbgrader/tests/nbextensions/__init__.py delete mode 100644 nbgrader/tests/nbextensions/conftest.py delete mode 100644 nbgrader/tests/nbextensions/files/blank.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/data.txt delete mode 100644 nbgrader/tests/nbextensions/files/old-schema.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/open_relative_file.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/submitted-answer-cell-type-changed.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/submitted-changed.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/submitted-grade-cell-changed.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/submitted-grade-cell-type-changed.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/submitted-locked-cell-changed.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/submitted-unchanged.ipynb delete mode 100644 nbgrader/tests/nbextensions/files/task.ipynb delete mode 100644 nbgrader/tests/nbextensions/formgrade_utils.py delete mode 100644 nbgrader/tests/nbextensions/test_assignment_list.py delete mode 100644 nbgrader/tests/nbextensions/test_course_list.py delete mode 100644 nbgrader/tests/nbextensions/test_create_assignment.py delete mode 100644 nbgrader/tests/nbextensions/test_formgrader.py delete mode 100644 nbgrader/tests/nbextensions/test_validate_assignment.py diff --git a/.gitignore b/.gitignore index b643661f7..3cecd390f 100644 --- a/.gitignore +++ b/.gitignore @@ -64,9 +64,6 @@ target/ # Coverage files .coverage.* -.selenium.screenshot.png -nbgrader/tests/formgrader/selenium.screenshot.png -nbgrader/tests/nbextensions/selenium.screenshot.png # Autogenerated docs nbgrader/docs/build diff --git a/nbgrader/__init__.py b/nbgrader/__init__.py index 73e99144f..152087966 100644 --- a/nbgrader/__init__.py +++ b/nbgrader/__init__.py @@ -33,65 +33,6 @@ def _jupyter_server_extension_points(): "module": "nbgrader" }] - -# Classic notebook extensions -def _jupyter_nbextension_paths(): - paths = [ - dict( - section="notebook", - src=os.path.join('nbextensions', 'create_assignment'), - dest="create_assignment", - require="create_assignment/main" - ), - dict( - section="tree", - src=os.path.join('nbextensions', 'formgrader'), - dest="formgrader", - require="formgrader/main" - ), - dict( - section="notebook", - src=os.path.join('nbextensions', 'validate_assignment'), - dest="validate_assignment", - require="validate_assignment/main" - ), - ] - - if sys.platform != 'win32': - paths.append( - dict( - section="tree", - src=os.path.join('nbextensions', 'assignment_list'), - dest="assignment_list", - require="assignment_list/main" - ) - ) - paths.append( - dict( - section="tree", - src=os.path.join('nbextensions', 'course_list'), - dest="course_list", - require="course_list/main" - ) - ) - - return paths - - -# Classic notebook server extensions -def _jupyter_server_extension_paths(): - paths = [ - dict(module="nbgrader.server_extensions.formgrader"), - dict(module="nbgrader.server_extensions.validate_assignment") - ] - - if sys.platform != 'win32': - paths.append(dict(module="nbgrader.server_extensions.assignment_list")) - paths.append(dict(module="nbgrader.server_extensions.course_list")) - - return paths - - def _load_jupyter_server_extension(app): load_assignments(app) load_courses(app) diff --git a/nbgrader/docs/source/contributor_guide/releasing.rst b/nbgrader/docs/source/contributor_guide/releasing.rst index fec638699..c3a94f81a 100644 --- a/nbgrader/docs/source/contributor_guide/releasing.rst +++ b/nbgrader/docs/source/contributor_guide/releasing.rst @@ -79,9 +79,9 @@ The version number should have been changed in the following files : - ``pyproject.toml`` - ``package.json`` - ``nbgrader/_version.py`` -- ``nbgrader/nbextensions/assignment_list/main.js`` -- ``nbgrader/nbextensions/course_list/main.js`` -- ``nbgrader/nbextensions/validate_assignment/main.js`` +- ``src/assignment_list/index.ts`` +- ``src/course_list/index.ts`` +- ``src/validate_assignment/index.ts`` Rebuild the documentation ------------------------- @@ -173,6 +173,6 @@ As a reminder, the files concerned are : - ``pyproject.toml`` - ``package.json`` - ``nbgrader/_version.py`` -- ``nbgrader/nbextensions/assignment_list/main.js`` -- ``nbgrader/nbextensions/course_list/main.js`` -- ``nbgrader/nbextensions/validate_assignment/main.js`` +- ``src/assignment_list/index.ts`` +- ``src/course_list/index.ts`` +- ``src/validate_assignment/index.ts`` diff --git a/nbgrader/nbextensions/assignment_list/assignment_list.css b/nbgrader/nbextensions/assignment_list/assignment_list.css deleted file mode 100644 index e92ab3552..000000000 --- a/nbgrader/nbextensions/assignment_list/assignment_list.css +++ /dev/null @@ -1,103 +0,0 @@ -#assignments .panel-group .panel { - margin-top: 3px; - margin-bottom: 1em; -} - -#assignments .panel-group .panel .panel-heading { - background-color: #eee; - padding-top: 4px; - padding-bottom: 4px; - padding-left: 7px; - padding-right: 7px; - line-height: 22px; -} - -#assignments .panel-group .panel .panel-heading a:focus, a:hover { - text-decoration: none; -} - -#assignments .panel-group .panel .panel-body { - padding: 0; -} - -#assignments .panel-group .panel .panel-body .list_container { - margin-top: 0px; - margin-bottom: 0px; - border: 0px; - border-radius: 0px; -} - -#assignments .panel-group .panel .panel-body .list_container .list_item { - border-bottom: 1px solid #ddd; -} - -#assignments .panel-group .panel .panel-body .list_container .list_item:last-child { - border-bottom: 0px; -} - -#assignments .assignment-notebooks .list_item { - background-color: inherit !important; -} - -#assignments .assignment-notebooks .list_item:hover { - background-color: #ddd !important; -} - -#assignments .assignment-notebooks .list_item:first-child:hover { - background-color: inherit !important; -} - -#assignments .list_item { - padding-top: 4px; - padding-bottom: 4px; - padding-left: 7px; - padding-right: 7px; - line-height: 22px; -} - -#assignments .list_item > div { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; -} - -#assignments .item_status { - text-align: right; -} - -#assignments .item_status .btn { - min-width: 13ex; -} - -#assignments .list_placeholder { - display: none; -} - -#assignments .list_error, #assignments .version_error { - display: none; -} - -#submission-message p, -#validation-message p { - margin-bottom: 1em; - padding-top: 1em; -} - -#submission-message pre, -#validation-message pre { - margin-left: 1em; - margin-right: 1em; -} - -#submission-message pre { - white-space: pre; -} - -#assignments .list_placeholder, #assignments .list_loading, #assignments .list_error { - font-weight: bold; - padding-top: 4px; - padding-bottom: 4px; - padding-left: 7px; - padding-right: 7px; -} diff --git a/nbgrader/nbextensions/assignment_list/assignment_list.js b/nbgrader/nbextensions/assignment_list/assignment_list.js deleted file mode 100644 index b35cbb39c..000000000 --- a/nbgrader/nbextensions/assignment_list/assignment_list.js +++ /dev/null @@ -1,677 +0,0 @@ -// Copyright (c) Jupyter Development Team. -// Distributed under the terms of the Modified BSD License. - -define([ - 'base/js/namespace', - 'jquery', - 'base/js/utils', - 'base/js/dialog', -], function(Jupyter, $, utils, dialog) { - "use strict"; - - var ajax = utils.ajax || $.ajax; - // Notebook v4.3.1 enabled xsrf so use notebooks ajax that includes the - // xsrf token in the header data - - var CourseList = function (course_list_selector, default_course_selector, dropdown_selector, refresh_selector, assignment_list, options) { - this.course_list_selector = course_list_selector; - this.default_course_selector = default_course_selector; - this.dropdown_selector = course_list_dropdown; - this.refresh_selector = refresh_selector; - - this.course_list_element = $(course_list_selector); - this.default_course_element = $(default_course_selector); - this.dropdown_element = $(dropdown_selector); - this.refresh_element = $(refresh_selector); - - this.assignment_list = assignment_list; - this.current_course = undefined; - this.bind_events() - - options = options || {}; - this.options = options; - this.base_url = options.base_url || utils.get_body_data("baseUrl"); - - this.data = undefined; - }; - - CourseList.prototype.bind_events = function () { - var that = this; - this.refresh_element.click(function () { - that.load_list(); - }); - }; - - - CourseList.prototype.enable_list = function () { - this.dropdown_element.removeAttr("disabled"); - }; - - - CourseList.prototype.disable_list = function () { - this.dropdown_element.attr("disabled", "disabled"); - }; - - - CourseList.prototype.clear_list = function () { - // remove list items - this.course_list_element.children('li').remove(); - }; - - - CourseList.prototype.load_list = function () { - this.disable_list() - this.clear_list(); - this.assignment_list.clear_list(true); - - var settings = { - processData : false, - cache : false, - type : "GET", - dataType : "json", - success : $.proxy(this.handle_load_list, this), - error : utils.log_ajax_error, - }; - var url = utils.url_path_join(this.base_url, 'courses'); - ajax(url, settings); - }; - - CourseList.prototype.handle_load_list = function (data, status, xhr) { - if (data.success) { - this.load_list_success(data.value); - } else { - this.default_course_element.text("Error fetching courses!"); - this.enable_list(); - this.assignment_list.show_error(data.value); - } - }; - - CourseList.prototype.load_list_success = function (data) { - this.data = data; - this.disable_list() - this.clear_list(); - - if (this.data.length === 0) { - this.default_course_element.text("No courses found."); - this.assignment_list.clear_list(); - this.enable_list() - return; - } - - if ($.inArray(this.current_course, this.data) === -1) { - this.current_course = undefined; - } - - if (this.current_course === undefined) { - this.change_course(this.data[0]); - } else { - // we still want to "change" the course here to update the - // assignment list - this.change_course(this.current_course); - } - }; - - - CourseList.prototype.change_course = function (course) { - this.disable_list(); - if (this.current_course !== undefined) { - this.default_course_element.text(course); - } - this.current_course = course; - this.default_course_element.text(this.current_course); - var success = $.proxy(this.load_assignment_list_success, this); - this.assignment_list.load_list(course, success); - }; - - - CourseList.prototype.load_assignment_list_success = function () { - if (this.data) { - var that = this; - var set_course = function (course) { - return function () { that.change_course(course); }; - } - - for (var i=0; i').append($('').attr("href", "#").text(this.data[i])); - element.click(set_course(this.data[i])); - this.course_list_element.append(element); - } - - this.data = undefined; - } - - this.enable_list(); - }; - - var AssignmentList = function (released_selector, fetched_selector, submitted_selector, options) { - this.released_selector = released_selector; - this.fetched_selector = fetched_selector; - this.submitted_selector = submitted_selector; - - this.released_element = $(released_selector); - this.fetched_element = $(fetched_selector); - this.submitted_element = $(submitted_selector); - - options = options || {}; - this.options = options; - this.base_url = options.base_url || utils.get_body_data("baseUrl"); - - this.callback = undefined; - }; - - - AssignmentList.prototype.load_list = function (course, callback) { - this.callback = callback; - this.clear_list(true); - var settings = { - cache : false, - type : "GET", - dataType : "json", - data : { - course_id: course - }, - success : $.proxy(this.handle_load_list, this), - error : utils.log_ajax_error, - }; - var url = utils.url_path_join(this.base_url, 'assignments'); - ajax(url, settings); - }; - - AssignmentList.prototype.clear_list = function (loading) { - var elems = [this.released_element, this.fetched_element, this.submitted_element]; - var i; - - // remove list items - for (i = 0; i < elems.length; i++) { - elems[i].children('.list_item').remove(); - if (loading) { - // show loading - elems[i].children('.list_loading').show(); - // hide placeholders and errors - elems[i].children('.list_placeholder').hide(); - elems[i].children('.list_error').hide(); - - } else { - // show placeholders - elems[i].children('.list_placeholder').show(); - // hide loading and errors - elems[i].children('.list_loading').hide(); - elems[i].children('.list_error').hide(); - } - } - }; - - AssignmentList.prototype.show_error = function (error) { - var elems = [this.released_element, this.fetched_element, this.submitted_element]; - var i; - - // remove list items - for (i = 0; i < elems.length; i++) { - elems[i].children('.list_item').remove(); - // show errors - elems[i].children('.list_error').show(); - elems[i].children('.list_error').text(error); - // hide loading and placeholding - elems[i].children('.list_loading').hide(); - elems[i].children('.list_placeholder').hide(); - } - }; - - AssignmentList.prototype.handle_load_list = function (data, status, xhr) { - if (data.success) { - this.load_list_success(data.value); - } else { - this.show_error(data.value); - } - }; - - AssignmentList.prototype.load_list_success = function (data) { - this.clear_list(); - - var len = data.length; - for (var i=0; i'); - var item = new Assignment(element, data[i], this.fetched_selector, - $.proxy(this.handle_load_list, this), - this.options); - if (data[i]['status'] === 'released') { - this.released_element.append(element); - this.released_element.children('.list_placeholder').hide(); - } else if (data[i]['status'] === 'fetched') { - this.fetched_element.append(element); - this.fetched_element.children('.list_placeholder').hide(); - } else if (data[i]['status'] === 'submitted') { - this.submitted_element.append(element); - this.submitted_element.children('.list_placeholder').hide(); - } - } - - // Add collapse arrows. - $('.assignment-notebooks-link').each(function(index, el) { - var $link = $(el); - var $icon = $('') - .addClass('fa fa-caret-down') - .css('transform', 'rotate(-90deg)') - .css('borderSpacing', '90') - .css('margin-left', '3px'); - $link.append($icon); - $link.down = false; - $link.click(function () { - if ($link.down) { - $link.down = false; - // jQeury doesn't know how to animate rotations. Abuse - // jQueries animate function by using an unused css attribute - // to do the animation (borderSpacing). - $icon.animate({ borderSpacing: 90 }, { - step: function(now,fx) { - $icon.css('transform','rotate(-' + now + 'deg)'); - } - }, 250); - } else { - $link.down = true; - // See comment above. - $icon.animate({ borderSpacing: 0 }, { - step: function(now,fx) { - $icon.css('transform','rotate(-' + now + 'deg)'); - } - }, 250); - } - }); - }); - - if (this.callback) { - this.callback(); - this.callback = undefined; - } - }; - - - var Assignment = function (element, data, parent, on_refresh, options) { - this.element = $(element); - this.data = data; - this.parent = parent; - this.on_refresh = on_refresh; - this.options = options; - this.base_url = options.base_url || utils.get_body_data("baseUrl"); - this.style(); - this.make_row(); - }; - - Assignment.prototype.style = function () { - this.element.addClass('list_item').addClass("row"); - }; - - Assignment.prototype.escape_id = function () { - // construct the id from the course id and the assignment id, and also - // prepend the id with "nbgrader" (this also ensures that the first - // character is always a letter, as required by HTML 4) - var id = "nbgrader-" + this.data.course_id + "-" + this.data.assignment_id; - - // replace spaces with '_' - id = id.replace(/ /g, "_"); - - // remove any characters that are invalid in HTML div ids - id = id.replace(/[^A-Za-z0-9\-_]/g, ""); - - return id; - }; - - Assignment.prototype.make_row = function () { - var row = $('
').addClass('col-md-12'); - var link = this.make_link(); - row.append(link); - row.append($('').addClass('item_course col-sm-2').text(this.data.course_id)); - - var id, children, element, child; - if (this.data.status === 'submitted') { - id = this.escape_id() + "-submissions"; - children = $('
') - .attr("id", id) - .addClass("panel-collapse list_container assignment-notebooks") - .attr("role", "tabpanel"); - - children.append($('
').addClass('list_item row')); - for (var i=0; i'); - child = new Submission(element, this.data.submissions[i], this.options); - children.append(element); - } - - } else if (this.data.status === 'fetched') { - id = this.escape_id(); - children = $('
') - .attr("id", id) - .addClass("panel-collapse collapse list_container assignment-notebooks") - .attr("role", "tabpanel"); - - children.append($('
').addClass('list_item row')); - for (var i=0; i'); - this.data.notebooks[i].course_id = this.data.course_id; - this.data.notebooks[i].assignment_id = this.data.assignment_id; - child = new Notebook(element, this.data.notebooks[i], this.options); - children.append(element); - } - } - - row.append(this.make_button()); - this.element.empty().append(row).append(children); - }; - - Assignment.prototype.make_link = function () { - var container = $('').addClass('item_name col-sm-6'); - var link; - - if (this.data.status === 'fetched') { - var id = this.escape_id(); - link = $('') - .addClass("collapsed assignment-notebooks-link") - .attr("role", "button") - .attr("data-toggle", "collapse") - .attr("data-parent", this.parent) - .attr("href", "#" + id) - .attr("aria-expanded", "false") - .attr("aria-controls", id) - } else { - link = $(''); - } - - link.text(this.data.assignment_id); - container.append(link); - return container; - }; - - Assignment.prototype.submit_error = function (data) { - var body = $('
').attr('id', 'submission-message'); - - body.append( - $('
').append( - $('

').text('Assignment not submitted:') - ) - ); - body.append( - $('

').text(data.value)
-        );
-
-        dialog.modal({
-            title: "Invalid Submission",
-            body: body,
-            buttons: { OK: { class : "btn-primary" } }
-        });
-    };
-
-    Assignment.prototype.make_button = function () {
-        var that = this;
-        var container = $('').addClass('item_status col-sm-4');
-        var button = $('',
-        '        ',
-        '        ',
-        '      
', - '
', - '
', - ' ', - ' ', - ' ', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - ' Released assignments', - '
', - '
', - '
', - '
', - '
There are no assignments to fetch.
', - '
', - '
', - '
Loading, please wait...
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - ' Downloaded assignments', - '
', - '
', - '
', - '
', - '
There are no downloaded assignments.
', - '
', - '
', - '
Loading, please wait...
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - ' Submitted assignments', - '
', - '
', - '
', - '
', - '
There are no submitted assignments.
', - '
', - '
', - '
Loading, please wait...
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - '
', - '
' - ].join('\n')); - - function checkNbGraderVersion(base_url) { - var settings = { - cache : false, - type : "GET", - dataType : "json", - data : { - version: nbgrader_version - }, - success : function (response) { - if (!response['success']) { - var err = $("#assignments .version_error"); - err.text(response['message']); - err.show(); - } - }, - error : utils.log_ajax_error, - }; - var url = utils.url_path_join(base_url, 'nbgrader_version'); - ajax(url, settings); - } - - function load() { - if (!Jupyter.notebook_list) return; - var base_url = Jupyter.notebook_list.base_url; - $('head').append( - $('') - .attr('rel', 'stylesheet') - .attr('type', 'text/css') - .attr('href', base_url + 'nbextensions/assignment_list/assignment_list.css') - ); - $(".tab-content").append(assignment_html); - $("#tabs").append( - $('
  • ') - .append( - $('') - .attr('href', '#assignments') - .attr('data-toggle', 'tab') - .text('Assignments') - .click(function (e) { - window.history.pushState(null, null, '#assignments'); - course_list.load_list(); - }) - ) - ); - var assignment_list = new AssignmentList.AssignmentList( - '#released_assignments_list', - '#fetched_assignments_list', - '#submitted_assignments_list', - { - base_url: Jupyter.notebook_list.base_url, - notebook_path: Jupyter.notebook_list.notebook_path, - } - ); - var course_list = new AssignmentList.CourseList( - '#course_list', - '#course_list_default', - '#course_list_dropdown', - '#refresh_assignments_list', - assignment_list, - { - base_url: Jupyter.notebook_list.base_url, - } - ); - checkNbGraderVersion(base_url); - } - return { - load_ipython_extension: load - }; -}); diff --git a/nbgrader/nbextensions/course_list/course_list.css b/nbgrader/nbextensions/course_list/course_list.css deleted file mode 100644 index 19e775422..000000000 --- a/nbgrader/nbextensions/course_list/course_list.css +++ /dev/null @@ -1,67 +0,0 @@ -#courses .panel-group .panel { - margin-top: 3px; - margin-bottom: 1em; -} - -#courses .panel-group .panel .panel-heading { - background-color: #eee; - padding-top: 4px; - padding-bottom: 4px; - padding-left: 7px; - padding-right: 7px; - line-height: 22px; -} - -#courses .panel-group .panel .panel-heading a:focus, a:hover { - text-decoration: none; -} - -#courses .panel-group .panel .panel-body { - padding: 0; -} - -#courses .panel-group .panel .panel-body .list_container { - margin-top: 0px; - margin-bottom: 0px; - border: 0px; - border-radius: 0px; -} - -#courses .panel-group .panel .panel-body .list_container .list_item { - border-bottom: 1px solid #ddd; -} - -#courses .panel-group .panel .panel-body .list_container .list_item:last-child { - border-bottom: 0px; -} - -#courses .list_item { - padding-top: 4px; - padding-bottom: 4px; - padding-left: 7px; - padding-right: 7px; - line-height: 22px; -} - -#courses .list_item > div { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; -} - -#courses .list_placeholder { - display: none; -} - -#courses .list_placeholder, #courses .list_loading, #courses .list_error { - font-weight: bold; - padding-top: 4px; - padding-bottom: 4px; - padding-left: 7px; - padding-right: 7px; -} - -#courses .list_error, #courses .version_error { - display: none; -} diff --git a/nbgrader/nbextensions/course_list/course_list.js b/nbgrader/nbextensions/course_list/course_list.js deleted file mode 100644 index 5bd8a044f..000000000 --- a/nbgrader/nbextensions/course_list/course_list.js +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) Jupyter Development Team. -// Distributed under the terms of the Modified BSD License. - -define([ - 'base/js/namespace', - 'jquery', - 'base/js/utils', - 'base/js/dialog', -], function(Jupyter, $, utils, dialog) { - "use strict"; - - var ajax = utils.ajax || $.ajax; - // Notebook v4.3.1 enabled xsrf so use notebooks ajax that includes the - // xsrf token in the header data - - var CourseList = function (course_list_selector, refresh_selector, options) { - this.course_list_selector = course_list_selector; - this.refresh_selector = refresh_selector; - - this.course_list_element = $(course_list_selector); - this.refresh_element = $(refresh_selector); - - this.current_course = undefined; - this.bind_events() - - options = options || {}; - this.options = options; - this.base_url = options.base_url || utils.get_body_data("baseUrl"); - - this.data = undefined; - }; - - CourseList.prototype.bind_events = function () { - var that = this; - this.refresh_element.click(function () { - that.load_list(); - }); - }; - - - CourseList.prototype.clear_list = function (loading) { - this.course_list_element.children('.list_item').remove(); - if (loading) { - // show loading - this.course_list_element.children('.list_loading').show(); - // hide placeholders and errors - this.course_list_element.children('.list_placeholder').hide(); - this.course_list_element.children('.list_error').hide(); - - } else { - // show placeholders - this.course_list_element.children('.list_placeholder').show(); - // hide loading and errors - this.course_list_element.children('.list_loading').hide(); - this.course_list_element.children('.list_error').hide(); - } - }; - - CourseList.prototype.show_error = function (error) { - this.course_list_element.children('.list_item').remove(); - // show errors - this.course_list_element.children('.list_error').show(); - this.course_list_element.children('.list_error').text(error); - // hide loading and placeholding - this.course_list_element.children('.list_loading').hide(); - this.course_list_element.children('.list_placeholder').hide(); - }; - - CourseList.prototype.load_list = function () { - this.clear_list(true); - - var settings = { - processData : false, - cache : false, - type : "GET", - dataType : "json", - success : $.proxy(this.handle_load_list, this), - error : utils.log_ajax_error, - }; - var url = utils.url_path_join(this.base_url, 'formgraders'); - ajax(url, settings); - }; - - CourseList.prototype.handle_load_list = function (data, status, xhr) { - if (data.success) { - this.load_list_success(data.value); - } else { - this.show_error(data.value); - } - }; - - CourseList.prototype.load_list_success = function (data) { - this.clear_list(); - var len = data.length; - for (var i=0; i'); - var item = new Course(element, data[i], this.course_list_selector, $.proxy(this.handle_load_list, this), this.options); - this.course_list_element.append(element); - this.course_list_element.children('.list_placeholder').hide() - } - - if (this.callback) { - this.callback(); - this.callback = undefined; - } - }; - - var Course = function (element, data, parent, on_refresh, options) { - this.element = $(element); - this.course_id = data['course_id']; - this.formgrader_kind = data['kind']; - this.url = data['url']; - this.parent = parent; - this.on_refresh = on_refresh; - this.options = options; - this.style(); - this.make_row(); - }; - - Course.prototype.style = function () { - this.element.addClass('list_item').addClass("row"); - }; - - Course.prototype.make_row = function () { - var row = $('
    ').addClass('col-md-12'); - var course_id = this.course_id; - - if(course_id === '') { - course_id = 'Default formgrader'; - } - - var container = $('').addClass('item_name col-sm-2').append( - $('') - .attr('href', this.url) - .attr('target', '_blank') - .text(course_id)); - row.append(container); - row.append($('').addClass('item_course col-sm-2').text(this.formgrader_kind)); - this.element.empty().append(row); - }; - - return { - 'CourseList': CourseList - }; -}); diff --git a/nbgrader/nbextensions/course_list/main.js b/nbgrader/nbextensions/course_list/main.js deleted file mode 100644 index 7e20e99ff..000000000 --- a/nbgrader/nbextensions/course_list/main.js +++ /dev/null @@ -1,101 +0,0 @@ -define([ - 'base/js/namespace', - 'jquery', - 'base/js/utils', - './course_list' -], function(Jupyter, $, utils, CourseList) { - "use strict"; - - var nbgrader_version = "0.8.4"; - - var ajax = utils.ajax || $.ajax; - // Notebook v4.3.1 enabled xsrf so use notebooks ajax that includes the - // xsrf token in the header data - - var course_html = $([ - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - ' Available formgraders', - ' ', - ' ', - ' ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    There are no available formgrader services.
    ', - '
    ', - '
    ', - '
    Loading, please wait...
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ' - ].join('\n')); - - function checkNbGraderVersion(base_url) { - var settings = { - cache : false, - type : "GET", - dataType : "json", - data : { - version: nbgrader_version - }, - success : function (response) { - if (!response['success']) { - var err = $("#courses .version_error"); - err.text(response['message']); - err.show(); - } - }, - error : utils.log_ajax_error, - }; - var url = utils.url_path_join(base_url, 'nbgrader_version'); - ajax(url, settings); - } - - function load() { - if (!Jupyter.notebook_list) return; - var base_url = Jupyter.notebook_list.base_url; - $('head').append( - $('') - .attr('rel', 'stylesheet') - .attr('type', 'text/css') - .attr('href', base_url + 'nbextensions/course_list/course_list.css') - ); - $(".tab-content").append(course_html); - $("#tabs").append( - $('
  • ') - .append( - $('') - .attr('href', '#courses') - .attr('data-toggle', 'tab') - .text('Courses') - .click(function (e) { - window.history.pushState(null, null, '#courses'); - course_list.load_list(); - }) - ) - ); - var course_list = new CourseList.CourseList( - '#formgrader_list', - '#refresh_formgrader_list', - { - base_url: Jupyter.notebook_list.base_url - } - ); - checkNbGraderVersion(base_url); - } - return { - load_ipython_extension: load - }; -}); diff --git a/nbgrader/nbextensions/create_assignment/create_assignment.css b/nbgrader/nbextensions/create_assignment/create_assignment.css deleted file mode 100644 index 6234a00b3..000000000 --- a/nbgrader/nbextensions/create_assignment/create_assignment.css +++ /dev/null @@ -1,66 +0,0 @@ -div.nbgrader-points, div.nbgrader-id { - margin-right: 0.5em; -} - -input.nbgrader-points-input { - width: 3.5em; - height: 22px; - text-align: right; - line-height: 10px; - color: black; -} - -input.nbgrader-id-input { - height: 22px; - text-align: left; - color: black; -} - -#nbgrader-total-points { - width: 3em; - height: 24px; - text-align: right; - line-height: 10px; - margin-left: 0.3em; - margin-right: 0.3em; -} - -div.nbgrader-highlight div.celltoolbar { - color: white; - background-color: #337ab7; - border: 1px solid #337ab7; -} - -div.nbgrader-highlight div.text_cell_render, div.nbgrader-highlight div.input_area { - border: 1px solid #337ab7 !important; -} - -.celltoolbar { - /* safari fix, we cannot use -webkit-flex on hbox - and vbox either or all css get borked - cf https://github.com/jupyter/nbgrader/issues/394. - manual workaround while #370 is not released. */ - display: -webkit-flex; -} - -div.lock-cell-container { - margin-right: auto; - padding-left: 0.5em; - line-height: 25px; - font-size: 1.4em; -} - -.tooltip-inner { - max-width: 300px; -} - -a.lock-button { - color: black -} -div.nbgrader-highlight a.lock-button { - color: white; -} - -a.lock-editable:hover { - cursor: pointer; -} diff --git a/nbgrader/nbextensions/create_assignment/main.js b/nbgrader/nbextensions/create_assignment/main.js deleted file mode 100644 index 00dbd3de4..000000000 --- a/nbgrader/nbextensions/create_assignment/main.js +++ /dev/null @@ -1,626 +0,0 @@ -define([ - 'require', - 'jquery', - 'base/js/namespace', - 'base/js/dialog', - 'notebook/js/celltoolbar', - 'base/js/events' - -], function (require, $, Jupyter, dialog, celltoolbar, events) { - "use strict"; - - var nbgrader_preset_name = "Create Assignment"; - var nbgrader_highlight_cls = "nbgrader-highlight"; - var nbgrader_cls = "nbgrader-cell"; - var nbgrader_schema_version = 3; - var warning; - - var CellToolbar = celltoolbar.CellToolbar; - - // trigger an event when the toolbar is being rebuilt - CellToolbar.prototype._rebuild = CellToolbar.prototype.rebuild; - CellToolbar.prototype.rebuild = function () { - events.trigger('toolbar_rebuild.CellToolbar', this.cell); - this._rebuild(); - }; - - // trigger an event when the toolbar is being (globally) hidden - CellToolbar._global_hide = CellToolbar.global_hide; - CellToolbar.global_hide = function () { - $("#nbgrader-total-points-group").hide(); - - CellToolbar._global_hide(); - for (var i=0; i < CellToolbar._instances.length; i++) { - events.trigger('global_hide.CellToolbar', CellToolbar._instances[i].cell); - } - }; - - // show the total points when the preset is activated - events.on('preset_activated.CellToolbar', function(evt, preset) { - validate_schema_version(); - clear_cell_types(); - - var elem = $("#nbgrader-total-points-group"); - if (preset.name === nbgrader_preset_name) { - if (elem.length == 0) { - elem = $("
    ").attr("id", "nbgrader-total-points-group"); - elem.addClass("btn-group"); - elem.append($("").text("Total points:")); - elem.append($("") - .attr("disabled", "disabled") - .attr("type", "number") - .attr("id", "nbgrader-total-points")); - $("#maintoolbar-container").append(elem); - } - elem.show(); - update_total(); - } else { - elem.hide(); - } - }); - - // remove nbgrader class when the cell is either hidden or rebuilt - events.on("global_hide.CellToolbar toolbar_rebuild.CellToolbar", function (evt, cell) { - if (cell.element && cell.element.hasClass(nbgrader_cls)) { - cell.element.removeClass(nbgrader_cls); - } - if (cell.element && cell.element.hasClass(nbgrader_highlight_cls)) { - cell.element.removeClass(nbgrader_highlight_cls); - } - }); - - // update total points when a cell is deleted - events.on("delete.Cell", function (evt, info) { - update_total(); - }); - - // validate cell ids on save - events.on("before_save.Notebook", function (evt) { - validate_ids(); - }); - - var randomString = function(length) { - var result = ''; - var chars = 'abcdef0123456789'; - var i; - for (i=0; i < length; i++) { - result += chars[Math.floor(Math.random() * chars.length)]; - } - return result; - }; - - var to_float = function(val) { - if (val === undefined || val === "") { - return 0; - } - return parseFloat(val); - }; - - var update_total = function() { - var total_points = 0; - var cells = Jupyter.notebook.get_cells(); - for (var i=0; i < cells.length; i++) { - if (is_graded(cells[i])) { - total_points += to_float(cells[i].metadata.nbgrader.points); - } - } - $("#nbgrader-total-points").attr("value", total_points); - }; - - var validate_ids = function() { - var elems, set, i, label; - - if (warning !== undefined) { - return; - } - - var valid = /^[a-zA-Z0-9_\-]+$/; - var modal_opts = { - notebook: Jupyter.notebook, - keyboard_manager: Jupyter.keyboard_manager, - buttons: { - OK: { - class: "btn-primary", - click: function () { - warning = undefined; - } - } - } - }; - - elems = $(".nbgrader-id-input"); - set = new Object(); - for (i = 0; i < elems.length; i++) { - label = $(elems[i]).val(); - if (!valid.test(label)) { - modal_opts.title = "Invalid nbgrader cell ID"; - modal_opts.body = "At least one cell has an invalid nbgrader ID. Cell IDs must contain at least one character, and may only contain letters, numbers, hyphens, and/or underscores."; - warning = dialog.modal(modal_opts); - break; - } else if (label in set) { - modal_opts.title = "Duplicate nbgrader cell ID"; - modal_opts.body = "The nbgrader ID \"" + label + "\" has been used for more than one cell. Please make sure all grade cells have unique ids."; - warning = dialog.modal(modal_opts); - break; - } else { - set[label] = true; - } - } - }; - - var validate_schema_version = function() { - var i, cells, schema; - - if (warning !== undefined) { - return; - } - - var modal_opts = { - notebook: Jupyter.notebook, - keyboard_manager: Jupyter.keyboard_manager, - buttons: { - OK: { - class: "btn-primary", - click: function () { - warning = undefined; - } - } - } - }; - - cells = Jupyter.notebook.get_cells(); - for (i = 0; i < cells.length; i++) { - schema = get_schema_version(cells[i]); - if (schema !== undefined && schema < nbgrader_schema_version) { - modal_opts.title = "Outdated schema version"; - modal_opts.body = $("

    ").html( - "At least one cell has an old version (" + schema + ") of the " + - "nbgrader metadata. Please back up this notebook and then " + - "update the metadata on the command " + - "line using the following command: nbgrader update " + - Jupyter.notebook.notebook_path + ""); - warning = dialog.modal(modal_opts); - break; - } - } - }; - - var clear_cell_types = function() { - var cells = Jupyter.notebook.get_cells(); - var i; - for (i = 0; i < cells.length; i++) { - if (cells[i].metadata.nbgrader !== undefined && cells[i].metadata.nbgrader.hasOwnProperty("cell_type")) { - delete cells[i].metadata.nbgrader.cell_type; - } - } - }; - - /** - * Remove all nbgrader metadata - */ - var remove_metadata = function (cell) { - if (cell.metadata.hasOwnProperty("nbgrader")) { - delete cell.metadata.nbgrader; - } - }; - - /** - * Set nbgrader schema version - */ - var set_schema_version = function (cell) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - cell.metadata.nbgrader.schema_version = nbgrader_schema_version; - }; - - /** - * Get nbgrader schema version - */ - var get_schema_version = function (cell) { - if (cell.metadata.nbgrader === undefined) { - return undefined; - } - if (!cell.metadata.nbgrader.hasOwnProperty("schema_version")) { - return 0; - } - return cell.metadata.nbgrader.schema_version; - }; - - /** - * Is the cell a solution cell? - */ - var is_solution = function (cell) { - if (cell.metadata.nbgrader === undefined) { - return false; - } else if (cell.metadata.nbgrader.solution === undefined) { - return false; - } else { - return cell.metadata.nbgrader.solution; - } - }; - - /** - * Set whether this cell is or is not a solution cell. - */ - var set_solution = function (cell, val) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - cell.metadata.nbgrader.solution = val; - }; - - /** - * Is the cell a grade cell? - */ - var is_grade = function (cell) { - if (cell.metadata.nbgrader === undefined) { - return false; - } else if (cell.metadata.nbgrader.grade === undefined) { - return false; - } else { - return cell.metadata.nbgrader.grade; - } - }; - - /** - * Set whether this cell is or is not a grade cell. - */ - var set_grade = function (cell, val) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - cell.metadata.nbgrader.grade = val; - if (val === false && cell.metadata.nbgrader.hasOwnProperty("points")) { - delete cell.metadata.nbgrader.points; - } - }; - - /** - * Is the cell a task cell? - */ - var is_task = function (cell) { - if (cell.metadata.nbgrader === undefined) { - return false; - } else if (cell.metadata.nbgrader.task === undefined) { - return false; - } else { - return cell.metadata.nbgrader.task; - } - }; - - /** - * Set whether this cell is or is not a grade cell. - */ - var set_task = function (cell, val) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - cell.metadata.nbgrader.task = val; - }; - - var is_graded = function (cell) { - return ( is_grade(cell) || is_task(cell) ); - }; - - - var get_points = function (cell) { - if (cell.metadata.nbgrader === undefined) { - return 0; - } else { - return to_float(cell.metadata.nbgrader.points); - } - }; - - var set_points = function (cell, val) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - var points = to_float(val); - if (points < 0) points = 0; - cell.metadata.nbgrader.points = points; - }; - - var get_grade_id = function (cell) { - if (cell.metadata.nbgrader === undefined) { - return "cell-" + randomString(16); - } else if (cell.metadata.nbgrader.grade_id === undefined) { - return "cell-" + randomString(16); - } else { - return cell.metadata.nbgrader.grade_id; - } - }; - - var set_grade_id = function (cell, val) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - if (val === undefined) { - cell.metadata.nbgrader.grade_id = ''; - } else { - cell.metadata.nbgrader.grade_id = val; - } - }; - - var is_locked = function (cell) { - if (is_solution(cell)) { - return false; - } else if (is_graded(cell)) { - return true; - } else if (cell.metadata.nbgrader === undefined) { - return false; - } else if (cell.metadata.nbgrader.locked === undefined) { - return false; - } else { - return cell.metadata.nbgrader.locked; - } - }; - - var set_locked = function (cell, val) { - if (cell.metadata.nbgrader === undefined) { - cell.metadata.nbgrader = {}; - } - if (is_solution(cell)) { - cell.metadata.nbgrader.locked = false; - } else if (is_graded(cell)) { - cell.metadata.nbgrader.locked = true; - } else { - cell.metadata.nbgrader.locked = val; - } - }; - - var is_invalid = function (cell) { - if (is_task(cell)) { - return false; - } else if (is_solution(cell) && is_grade(cell)) { - return false; - } else if (is_solution(cell) && cell.cell_type !== "code") { - return true; - } else if (is_grade(cell) && cell.cell_type !== "code") { - return true; - } else { - return false; - } - }; - - /** - * Add a display class to the cell element, depending on the - * nbgrader cell type. - */ - var display_cell = function (cell) { - if (is_graded(cell) || is_solution(cell)) { - if (cell.element && !cell.element.hasClass(nbgrader_highlight_cls)) { - cell.element.addClass(nbgrader_highlight_cls); - } - } - if (is_graded(cell) || is_solution(cell) || is_locked(cell)) { - if (cell.element && !cell.element.hasClass(nbgrader_cls)) { - cell.element.addClass(nbgrader_cls); - } - } - - if (is_task(cell) ){ - if (cell.element && !cell.element.hasClass("nbgrader_task")) { - cell.element.addClass("nbgrader_task"); - } - } else { - if (cell.element && cell.element.hasClass("nbgrader_task")) { - cell.element.removeClass("nbgrader_task"); - } - } - }; - - var create_celltype_select = function (div, cell, celltoolbar) { - // hack -- the DOM element for the celltoolbar is created before the - // cell type is actually set, so we need to wait until the cell type - // has been set before we can actually create the select menu - if (cell.cell_type === null) { - setTimeout(function () { - create_celltype_select(div, cell, celltoolbar); - }, 100); - - } else { - - if (is_invalid(cell)) { - set_schema_version(cell); - set_solution(cell, false); - set_grade(cell, false); - set_locked(cell, false); - set_task(cell, false); - celltoolbar.rebuild(); - return; - } - - var options_list = []; - options_list.push(["-", ""]); - options_list.push(["Manually graded answer", "manual"]); - options_list.push(["Manually graded task", "task"]); - if (cell.cell_type == "code") { - options_list.push(["Autograded answer", "solution"]); - options_list.push(["Autograder tests", "tests"]); - } - options_list.push(["Read-only", "readonly"]); - var setter = function (cell, val) { - if (val === "") { - remove_metadata(cell); - } else if (val === "manual") { - set_schema_version(cell); - set_solution(cell, true); - set_grade(cell, true); - set_locked(cell, false); - set_task(cell, false); - } else if (val === "task") { - set_schema_version(cell); - set_solution(cell, false); - set_grade(cell, false); - set_locked(cell, true); - set_task(cell, true); - if (cell.get_text() === ''){ - cell.set_text('Describe the task here!') - } - } else if (val === "solution") { - set_schema_version(cell); - set_solution(cell, true); - set_grade(cell, false); - set_locked(cell, false); - set_task(cell, false); - } else if (val === "tests") { - set_schema_version(cell); - set_solution(cell, false); - set_grade(cell, true); - set_locked(cell, true); - set_task(cell, false); - } else if (val === "readonly") { - set_schema_version(cell); - set_solution(cell, false); - set_grade(cell, false); - set_locked(cell, true); - set_task(cell, false); - } else { - throw new Error("invalid nbgrader cell type: " + val); - } - }; - - var getter = function (cell) { - if (is_task(cell)) { - return "task"; - } else if (is_solution(cell) && is_grade(cell)) { - return "manual"; - } else if (is_solution(cell) && cell.cell_type === "code") { - return "solution"; - } else if (is_grade(cell) && cell.cell_type === "code") { - return "tests"; - } else if (is_locked(cell)) { - return "readonly"; - } else { - return ""; - } - }; - - var select = $('').attr('type', 'text'); - var lbl = $('

  • ").addClass("fa fa-lock")); - lock.tooltip({ - placement: "right", - title: "Student changes will be overwritten" - }); - } - - $(div).addClass("lock-cell-container").append(lock); - }; - - /** - * Load custom css for the nbgrader toolbar. - */ - var load_css = function () { - var link = document.createElement('link'); - link.type = 'text/css'; - link.rel = 'stylesheet'; - link.href = require.toUrl('./create_assignment.css'); - document.getElementsByTagName('head')[0].appendChild(link); - }; - - /** - * Load the nbgrader toolbar extension. - */ - var load_extension = function () { - load_css(); - CellToolbar.register_callback('create_assignment.grading_options', create_celltype_select); - CellToolbar.register_callback('create_assignment.id_input', create_id_input); - CellToolbar.register_callback('create_assignment.points_input', create_points_input); - CellToolbar.register_callback('create_assignment.lock_cell', create_lock_cell_button); - - var preset = [ - 'create_assignment.lock_cell', - 'create_assignment.points_input', - 'create_assignment.id_input', - 'create_assignment.grading_options', - ]; - CellToolbar.register_preset(nbgrader_preset_name, preset, Jupyter.notebook); - console.log('nbgrader extension for metadata editing loaded.'); - }; - - return { - 'load_ipython_extension': load_extension - }; -}); diff --git a/nbgrader/nbextensions/formgrader/main.js b/nbgrader/nbextensions/formgrader/main.js deleted file mode 100644 index bb85a78b8..000000000 --- a/nbgrader/nbextensions/formgrader/main.js +++ /dev/null @@ -1,21 +0,0 @@ -define(function(require) { - var $ = require('jquery'); - var Jupyter = require('base/js/namespace'); - - function load() { - if (!Jupyter.notebook_list) return; - var base_url = Jupyter.notebook_list.base_url; - $("#tabs").append( - $('
  • ') - .append( - $('') - .attr('href', base_url + 'formgrader') - .attr('target', '_blank') - .text('Formgrader') - ) - ); - } - return { - load_ipython_extension: load - }; -}); diff --git a/nbgrader/nbextensions/validate_assignment/main.js b/nbgrader/nbextensions/validate_assignment/main.js deleted file mode 100644 index 7fa8657fb..000000000 --- a/nbgrader/nbextensions/validate_assignment/main.js +++ /dev/null @@ -1,142 +0,0 @@ -define([ - 'jquery', - 'base/js/namespace', - 'base/js/dialog', - 'base/js/utils' - -], function ($, Jupyter, dialog, utils) { - "use strict"; - - var nbgrader_version = "0.8.4"; - - var ajax = utils.ajax || $.ajax; - // Notebook v4.3.1 enabled xsrf so use notebooks ajax that includes the - // xsrf token in the header data - - var checkNbGraderVersion = function (callback) { - var settings = { - cache : false, - type : "GET", - dataType : "json", - data : { - version: nbgrader_version - }, - success : function (response) { - if (!response['success']) { - var body = $("
    ").text(response['message']); - dialog.modal({ - title: "Version Mismatch", - body: body, - buttons: { OK: { class : "btn-primary" } } - }); - } else { - callback(); - } - }, - error : utils.log_ajax_error, - }; - var url = utils.url_path_join(Jupyter.notebook.base_url, 'nbgrader_version'); - ajax(url, settings); - }; - - var add_button = function () { - var maintoolbar = $("#maintoolbar-container"); - var btn_group = $("
    ").attr("class", "btn-group") - var btn = $("